Czy istnieje sposób, aby uzyskać zdjęcie dnia Binga?


89

Czy jest jakiś sposób, aby uzyskać programowy obraz tła usługi Bing?

Wygląda na to, że API Bing nie zapewnia takiej funkcjonalności, może jest inny sposób?

Odpowiedzi:


111

Myślę, że najlepszym sposobem jest naśladowanie sposobu, w jaki robią to sami za pomocą połączeń AJAX.

Wywołują ten adres URL i wyodrębniają informacje za pomocą deserializacji XML.

XML: http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US

JSON: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US

RSS: http://www.bing.com/HPImageArchive.aspx?format=rss&idx=0&n=1&mkt=en-US

mktAtrybut może być oczywiście zmieniona na innym regionie niż'En-US', ale może być również zrezygnowali z całkowicie, jeśli nie dbają o określonym regionie.

Zwróć uwagę, że _1366x768.jpgsufiks dodawany do nazw obrazów wydaje się być modyfikowalny w różnych rozdzielczościach (jak _1920x1080.jpgdla Full HD i prawdopodobnie innych).

Oto zrzut danych z dnia 28.09.2013 w formacie XML.

<?xml version="1.0" encoding="utf-8"?>
<images>
    <image>
        <startdate>20130928</startdate>
        <fullstartdate>201309280000</fullstartdate>
        <enddate>20130929</enddate>
        <url>/az/hprichbg/rb/LakeTurkana_EN-US15976511099_1366x768.jpg</url>
        <urlBase>/az/hprichbg/rb/LakeTurkana_EN-US15976511099</urlBase>
        <copyright>Lava rock pools at the southern end of Lake Turkana, in Kenya (© Nigel Pavitt/Corbis)</copyright>
        <copyrightlink>http://www.bing.com/search?q=Lake+Turkana%2C+Kenya&amp;form=hpcapt</copyrightlink>
        <drk>1</drk>
        <top>1</top>
        <bot>1</bot>
        <hotspots>
            <hotspot>
                <desc>These are the southern reaches of a lake...</desc>
                <link>http://www.bing.com/maps/?v=2&amp;cp=2.794725~37.335197&amp;lvl=7&amp;dir=0&amp;sty=b&amp;q=Lake%20Turkana%2C%20Kenya&amp;form=hphot1</link>
                <query>That stretches for 180 miles, up into another country</query>
                <LocX>15</LocX>
                <LocY>33</LocY>
            </hotspot>
            <hotspot>
                <desc>This body of water was once called the Jade Sea.</desc>
                <link>http://www.bing.com/search?q=green+algae&amp;form=hphot2</link>
                <query>What gives the water here its sometimes vibrant hue?</query>
                <LocX>37</LocX>
                <LocY>42</LocY>
            </hotspot>
            <hotspot>
                <desc>One of the world's most powerful predators lives here.</desc>
                <link>http://www.bing.com/videos/search?q=Underwater+Croc+Cams+National+Geographic&amp;FORM=hphot3#view=detail&amp;mid=D25E1909D3514A8732C5D25E1909D3514A8732C5</link>
                <query>See some rare underwater footage of the beast</query>
                <LocX>66</LocX>
                <LocY>33</LocY>
            </hotspot>
            <hotspot>
                <desc>Many fossils of ancient human ancestors have been uncovered in the surrounding area.</desc>
                <link>http://www.bing.com/search?q=Turkana+Boy&amp;form=hphot4</link>
                <query>One skeleton was so complete, paleoanthropologists gave him a name</query>
                <LocX>82</LocX>
                <LocY>41</LocY>
            </hotspot>
        </hotspots>
        <messages></messages>
    </image>
    <tooltips>
        <loadMessage>
            <message>Indlæser...</message>
        </loadMessage>
        <previousImage>
            <text>Forrige</text>
        </previousImage>
        <nextImage>
            <text>Næste</text>
        </nextImage>
        <play>
            <text>Afspil</text>
        </play>
        <pause>
            <text>Pause</text>
        </pause>
    </tooltips>
</images>

11
FYI - możesz go również pobrać w formacie JSON! bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
JustMaier

2
BTW: Rozdzielczość jest zmienna, wszystko _1920x1200działa, czyli też 1920x1080i inne.
jmiserez

1
Okay, więc wygląda na to, że Bing Desktop używa bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 , czyli bez &mkt=en-USczęści. Dzieje się tak, mimo że mam ustawioną aplikację na „English-United States”.
jmiserez

1
@darksoulsong Sure. Możesz stworzyć usługę sieciową, która przekazuje dane za Ciebie. Zwykle by się to przydało jsonp, ale wydaje się, że nie pozwalają na to.
Mathias Lykkegaard Lorenzen

1
Jeśli ktoś szuka rynków ... możesz go wyodrębnić ze strony microsoft.com/en-in/locale.aspx
Amar Palsapure,

31

FORMAT JSON OBRAZU BING

Znalazłem sposób, aby pobrać w formacie JSON z Bing obrazu dnia

http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1

Uwaga

      n=Liczba żądanych obrazów (możesz użyć liczb całkowitych ),
      mkt=Twoja lokalizacja (przykład: en-PL )


Oto wyjście JSON, jak wygląda

  {
  "images": [
    {
      "startdate": "20141214",
      "fullstartdate": "201412141830",
      "enddate": "20141215",
      "url": "\/az\/hprichbg\/rb\/BlackButte_EN-IN7038391888_1920x1080.jpg",
      "urlbase": "\/az\/hprichbg\/rb\/BlackButte_EN-IN7038391888",
      "copyright": "Black Butte, seen from the Mount Jefferson Wilderness, Oregon, USA (\u00a9 Marc Adamus\/Aurora Photos)",
      "copyrightlink": "http:\/\/www.bing.com\/search?q=Black+Butte&qs=n&form=hpcapt&mkt=en-in&pq=black+butte&sc=8-11&sp=-1&sk=&cvid=228ac7f125f94bbaafd4a4abd4f9a32d",
      "wp": true,
      "hsh": "94156ae1e2e1be49f9b739d2b7bff65c",
      "drk": 1,
      "top": 1,
      "bot": 1,
      "hs": [

      ],
      "msg": [
        {
          "title": "How does it feel\u2026",
          "link": "http:\/\/www.bing.com\/videos\/search?q=Climbing+Black+Butte&FORM=pgbar1&mkt=en-in#view=detail&mid=58BDB2F2B9FCB85D597558BDB2F2B9FCB85D5975",
          "text": "To climb 1961.7 m?"
        },
        {
          "title": "On top of the world",
          "link": "http:\/\/www.bing.com\/images\/search?q=Pictures+From+the+Top+of+Mount+Everest&FORM=pgbar2&mkt=en-in",
          "text": "It's mountaineer's dream view"
        }
      ]
    }
  ],
  "tooltips": {
    "loading": "Loading...",
    "previous": "Previous",
    "next": "Next",
    "walle": "This image is not available to download as wallpaper.",
    "walls": "Download this image. Use of this image is restricted to wallpaper only."
  }
}

użyj urlzimages[]

i dodaj do 'http://bing.com'

tutaj jest adres URL "url": "\/az\/hprichbg\/rb\/DayGecko_EN-US8730336235_1366x768.jpg"


Wygląda na to, że usługa Bing ogranicza łączną liczbę odpowiedzi do 8 naraz. 8 można zebrać przy n = 8, a 8 poprzednich można zebrać, ustawiając idx = 8 i n = 8. Nie widzę sposobu, aby to rozwinąć.
The Fluffy Robot,

Dlaczego to daje błąd Unexpected token :whttps://www.bing.com/HPImageArchive.aspx?format=js&idx=8&n=8&mkt=en-US&callback=jQuery111100034959779751375653_1518009655771&_=1518009655772
Rohit Sharma

10

Firma Microsoft niedawno opublikowała dynamiczny motyw Bing dla systemu Windows 7, który zawiera kanał RSS z łączami do tapet Bing .

Istnieje również skrypt w języku Python, który próbuje załadować witrynę Bing i odgadnąć prawidłowy adres URL obrazu, ale z mojego doświadczenia wynika, że ​​zwykle powoduje to obraz o niższej rozdzielczości niż te oferowane przez kanał RSS.


+1 za link do rss, myślę, że to jest właściwa odpowiedź na pytanie
David Conde

3
Niestety motyw został wycofany lub, jak to ujął Microsoft: „Ten motyw został wycofany”. RSS wciąż tam jest, ale nie jest już aktualizowany.
karafior


6

One liner PowerShell (3.0 lub nowszy)

irm jest aliasem dla Invoke-RestMethod

irm "bing.com$((irm "bing.com/HPImageArchive.aspx?format=js&mkt=en-IN&n=1").images[0].url)" -OutFile bing.jpg

2
Znakomity!
Udało

4

Lubię też obrazy Bing, ale ich aplikacja jest zbyt nadęta, aby pobierać obrazy. Po przeanalizowaniu połączenia ze skrzypkiem napisałem ten kod. 1920x1200 ma osadzone logo Bing, ale nie ma go w niższych rozdzielczościach.

Możesz ustawić okna, aby wyświetlały losowe obrazy z ustawionego folderu obrazów, więc jeśli będziesz je codziennie pobierać, pokaże Ci więcej losowych obrazów. Jeśli zachowasz "imageDir", musisz zmienić uprawnienia do tego folderu, bo inaczej się zawiesi, nie zawracałem sobie głowy wyłapywaniem błędów. Na koniec usuń komentarz w wierszach, jeśli chcesz ustawić tapetę na dzisiejszy obraz lub możesz utworzyć zadanie uruchamiania programu, powiedzmy minutę po zalogowaniu.

using System;
using System.IO;
using System.Net;
//using System.Runtime.InteropServices;

namespace Bing
{
    class Program
    {
      //  [DllImport("user32.dll", CharSet = CharSet.Auto)]
      //  private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam, String pvParam, UInt32 fWinIni);
        private static String imgDir = @"C:\Windows\Web\Wallpaper\Bing\";

        static void Main(string[] args)
        {
            String imageFileName;
            if (!Directory.Exists(imgDir))
                Directory.CreateDirectory(imgDir);

            for (byte i = 6; i >= 0; i--)
            {
                imageFileName = imgDir + DateTime.Today.AddDays(-i).ToString("yyy-MM-dd") + ".jpg";

                if (!File.Exists(imageFileName))
                {
                    string response = null;
                    Connect(ref response, i);
                    ProcessXml(ref response);
                    using (WebClient client = new WebClient())
                        client.DownloadFile("http://www.bing.com" + response + "_1920x1200.jpg", imageFileName);
                }                
            }
            //SystemParametersInfo(20, 0, imageFileName, 0x01 | 0x02);
        }

        private static void Connect(ref string res, byte i)
        {
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create("http://www.bing.com/hpimagearchive.aspx?format=xml&idx=" + i + "&n=1&mbl=1&mkt=en-ww");
            webrequest.KeepAlive = false;
            webrequest.Method = "GET";
            using (HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse())
                using (StreamReader loResponseStream = new StreamReader(webresponse.GetResponseStream()))
                    res = loResponseStream.ReadToEnd();                
        }

        private static void ProcessXml(ref string xmlString)
        {
            using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new StringReader(xmlString)))
            {
                reader.ReadToFollowing("urlBase");
                xmlString = reader.ReadElementContentAsString();
            }
        }        
    }
}


2

Ten JavaScript odpowie na pytanie „co zrobić z interfejsem API”, zmieniając obraz tła elementu div na tło obrazu Bing z bieżącego dnia.

function PullBackground() {
    var ajaxRequest = new XMLHttpRequest(), background = ''; 
    ajaxRequest.open('POST', "http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US", true);
    ajaxRequest.setRequestHeader("Connection", "close");
    ajaxRequest.send('');
    ajaxRequest.onreadystatechange = function () {
        if (ajaxRequest.readyState == 4) {
            background = ajaxRequest.responseText;
            var res = background.split("<url>"); 
            var res1 = res[1].split("</url>");
            background = res1[0];

            document.getElementById('NameOfTheDivToChange').style.backgroundImage = "url('http://bing.com" + background + "')"
            document.getElementById('NameOfTheDivToChange').style.backgroundSize = "100%";
        }
    }
}

5
Naprawdę chciałem tego użyć, ale nie wydaje się, aby obejść brak ustawienia „Access-Control-Allow-Origin” przez Bing.
addMitt

2

Na wypadek, gdyby ktoś szukał możliwych implementacji, napisałem mały program wiersza poleceń w C #, aby pobrać, zapisać i ustawić moje tło jako obraz dnia Bing. Zapraszam do modyfikacji go do własnych potrzeb. https://github.com/josueespinosa/BingBackground

using Microsoft.Win32;
using Newtonsoft.Json;
using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace BingBackground
{
    class BingBackground
    {
        private static void Main(string[] args)
        {
            string urlBase = GetBackgroundUrlBase();
            Image background = DownloadBackground(urlBase + GetResolutionExtension(urlBase));
            SaveBackground(background);
            SetBackground(background, PicturePosition.Fill);
        }

        private static dynamic DownloadJson()
        {
            using (WebClient webClient = new WebClient())
            {
                Console.WriteLine("Downloading JSON...");
                string jsonString = webClient.DownloadString("https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US");
                return JsonConvert.DeserializeObject<dynamic>(jsonString);
            }
        }

        private static string GetBackgroundUrlBase()
        {
            dynamic jsonObject = DownloadJson();
            return "https://www.bing.com" + jsonObject.images[0].urlbase;
        }

        private static string GetBackgroundTitle()
        {
            dynamic jsonObject = DownloadJson();
            string copyrightText = jsonObject.images[0].copyright;
            return copyrightText.Substring(0, copyrightText.IndexOf(" ("));
        }

        private static bool WebsiteExists(string url)
        {
            try
            {
                WebRequest request = WebRequest.Create(url);
                request.Method = "HEAD";
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                return response.StatusCode == HttpStatusCode.OK;
            }
            catch
            {
                return false;
            }
        }

        private static string GetResolutionExtension(string url)
        {
            Rectangle resolution = Screen.PrimaryScreen.Bounds;
            string widthByHeight = resolution.Width + "x" + resolution.Height;
            string potentialExtension = "_" + widthByHeight + ".jpg";
            if (WebsiteExists(url + potentialExtension))
            {
                Console.WriteLine("Background for " + widthByHeight + " found.");
                return potentialExtension;
            }
            else
            {
                Console.WriteLine("No background for " + widthByHeight + " was found.");
                Console.WriteLine("Using 1920x1080 instead.");
                return "_1920x1080.jpg";
            }
        }

        private static Image DownloadBackground(string url)
        {
            Console.WriteLine("Downloading background...");
            WebRequest request = WebRequest.Create(url);
            WebResponse reponse = request.GetResponse();
            Stream stream = reponse.GetResponseStream();
            return Image.FromStream(stream);
        }

        private static string GetBackgroundImagePath()
        {
            string directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Bing Backgrounds", DateTime.Now.Year.ToString());
            Directory.CreateDirectory(directory);
            return Path.Combine(directory, DateTime.Now.ToString("M-d-yyyy") + ".bmp");
        }

        private static void SaveBackground(Image background)
        {
            Console.WriteLine("Saving background...");
            background.Save(GetBackgroundImagePath(), System.Drawing.Imaging.ImageFormat.Bmp);
        }

        private enum PicturePosition
        {
            Tile,
            Center,
            Stretch,
            Fit,
            Fill
        }

        internal sealed class NativeMethods
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            internal static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);
        }

        private static void SetBackground(Image background, PicturePosition style)
        {
            Console.WriteLine("Setting background...");
            using (RegistryKey key = Registry.CurrentUser.OpenSubKey(Path.Combine("Control Panel", "Desktop"), true))
            {
                switch (style)
                {
                    case PicturePosition.Tile:
                        key.SetValue("PicturePosition", "0");
                        key.SetValue("TileWallpaper", "1");
                        break;
                    case PicturePosition.Center:
                        key.SetValue("PicturePosition", "0");
                        key.SetValue("TileWallpaper", "0");
                        break;
                    case PicturePosition.Stretch:
                        key.SetValue("PicturePosition", "2");
                        key.SetValue("TileWallpaper", "0");
                        break;
                    case PicturePosition.Fit:
                        key.SetValue("PicturePosition", "6");
                        key.SetValue("TileWallpaper", "0");
                        break;
                    case PicturePosition.Fill:
                        key.SetValue("PicturePosition", "10");
                        key.SetValue("TileWallpaper", "0");
                        break;
                }
            }
            const int SetDesktopBackground = 20;
            const int UpdateIniFile = 1;
            const int SendWindowsIniChange = 2;
            NativeMethods.SystemParametersInfo(SetDesktopBackground, 0, GetBackgroundImagePath(), UpdateIniFile | SendWindowsIniChange);
        }
    }
}

2

Prosty PowerShell, umieść w folderze, utwórz codzienne zadanie w Harmonogramie zadań systemu Windows, skrypt zapisuje obrazy w swoim folderze uruchamiania, a następnie w ustawieniach tła pulpitu wybierz ten folder jako tło.

[xml]$doc = (New-Object System.Net.WebClient).DownloadString("https://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=ru-RU")
$url = $doc.images.image.url
$url = "https://www.bing.com/" + $url -replace "_1366x768","_1920x1200"

Write-Output $url

$fileName = Split-Path $url -leaf
$output = "$PSScriptRoot\$fileName"

$start_time = Get-Date
Invoke-WebRequest -Uri $url -OutFile $output
Write-Output "Saved to: $output Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

Działa jeszcze lepiej jako zaplanowane zadanie w systemie Windows, aby automatycznie pobierać obraz Bing dnia do katalogu docelowego. Świetny.
nieistniejący

2

Oto prosty skrypt w Pythonie do pobierania zdjęcia dnia z usługi Bing przy użyciu tylko requestsi json:

import requests
import json

BING_URI_BASE = "http://www.bing.com"
BING_WALLPAPER_PATH = "/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US"

# open the Bing HPImageArchive URI and ask for a JSON response
resp = requests.get(BING_URI_BASE + BING_WALLPAPER_PATH)

if resp.status_code == 200:
    json_response = json.loads(resp.content)
    wallpaper_path = json_response['images'][0]['url']
    filename = wallpaper_path.split('/')[-1]
    wallpaper_uri = BING_URI_BASE + wallpaper_path

    # open the actual wallpaper uri, and write the response as an image on the filesystem
    response = requests.get(wallpaper_uri)
    if resp.status_code == 200:
        with open(filename, 'wb') as f:
            f.write(response.content)
    else:
        raise ValueError("[ERROR] non-200 response from Bing server for '{}'".format(wallpaper_uri))
else: 
    raise ValueError("[ERROR] non-200 response from Bing server for '{}'".format(BING_URI_BASE + BING_WALLPAPER_PATH))

Spowoduje to zapisanie pliku, takiego jak, TurtleTears_EN-US7942276596_1920x1080.jpgw tym samym katalogu, w którym wykonywany jest skrypt. Oczywiście można tutaj zmienić całą masę rzeczy, ale wykonuje zadanie dość łatwo.


2

Pozwól, że powiem ci, jak uzyskać codzienną tapetę Bing dnia za pomocą JavaScript i PHP,

Wypróbuj ten kod js:

<script>
      fetch('https://techytricks97.000webhostapp.com/')
      .then(response => response.text())
      .then(text=>{document.body.style.background="url('"+text+"')";document.body.style.backgroundSize='cover';});
</script>

Ten skrypt ustawia codzienny obraz dnia jako tło twojego dokumentu HTML (możesz go dalej modyfikować zgodnie ze swoim użyciem).

Ten link - https://techytricks97.000webhostapp.com codziennie zwraca tapetę Bing dnia.

fetch()pobiera adres URL dzisiejszego obrazu Bing https://techytricks97.000webhostapp.comi text=>{document.body.style.background="url('"+text+"')";document.body.style.backgroundSize='cover';}ustawia go jako tło.

Uwaga: Microsoft nie zezwala na używanie obrazów Bing Daily jako tła Twojej witryny, możesz używać ich jako tapety telefonu / pulpitu lub do innych rzeczy, wspominając o prawach autorskich.

Oto kod php, który jest używany na http://techytricks97.000webhostapp.com :

<?php
header('Access-Control-Allow-Origin: *');
ini_set('display_errors', 1);
$reg=file_get_contents('https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-IN');
$reg=json_decode($reg);
$meka=$reg->images[0]->url;
echo('http://www.bing.com'.$meka);
?>

Możesz używać http://techytricks97.000webhostapp.comtylko lub możesz skonfigurować własny plik php na serwerze.

Kolejna uwaga: nie użyłem tylko javascript, ponieważ polityka tego samego pochodzenia przeglądarki ogranicza to, ale pobieranie z mojego pliku php jest dozwolone, ponieważ umieściłem header('Access-Control-Allow-Origin: *');w swoim kodzie php. Mógłbym użyć innych serwerów proxy, ale mają duży ruch (moja witryna prawie nie otrzymuje kliknięć w ciągu dnia).

Jeśli używasz innego języka, wystarczy przeczytać ten plik ( http://techytricks97.000webhostapp.com )



1

Zajrzyj na bing-desktop-wallpaper-changer na Github . Skrypt został napisany w języku Python i mam nadzieję, że znajdziesz tam odpowiedź.

#!/usr/bin/python
#-*- coding: utf-8 -*-

import os
import urllib
import urllib2
from bs4 import BeautifulSoup

# Get BingXML file which contains the URL of the Bing Photo of the day
# idx = Number days previous the present day. 0 means current day, 1 means       yesterday, etc
# n = Number of images predious the day given by idx
# mkt denotes your location. e.g. en-US means United States. Put in your  country code
BingXML_URL = "http://www.bing.com/HPImageArchive.aspx?     format=xml&idx=0&n=1&mkt=en-US"
page = urllib2.urlopen(BingXML_URL)
BingXML = BeautifulSoup(page, "lxml")

# For extracting complete URL of the image
Images = BingXML.find_all('image')
ImageURL = "https://www.bing.com" + Images[0].url.text
ImageName = Images[0].startdate.text+".jpg"

urllib.urlretrieve(ImageURL, ImageName)

Zajrzyj do projektu Github, aby uzyskać szczegółowy kod


1
Dobra robota! Zostało to również przedstawione w artykule omgubuntu
Wtower

@Wtower Wielkie dzięki za poinformowanie mnie! :)
Utkarsh Gupta,

1

W końcu zdecydowałem się napisać skrypt w Pythonie 3, aby uzyskać jak najwięcej obrazów (16) z archiwum xml.

Teraz mogę bez wysiłku archiwizować obrazy. Po prostu uruchom skrypt Pythona.
Porządkuję obrazy w folderach roku / miesiąca w następujący sposób: 2018> 12 grudnia> 2018-12-06.jpg

Ten skrypt znajduje się w moim folderze Tapety Bing. (który znajduje się w moim folderze Zdjęcia)

import urllib.request as urllib
import json
from datetime import date
from dateutil import parser
import sys,os

months = "January","Febuary","March","April","May","June","July","August","September","October","November","December"

def downloadBingImages(start):
    try: data = urllib.urlopen("https://www.bing.com/hpimagearchive.aspx?format=js&idx=%i&n=8&mkt=en-NZ"%start).read()
    except: sys.exit()
    e = json.loads(data.decode())
    images = e["images"]

    for image in images:
        d = parser.parse(image["startdate"]) # parse("20181206")

        filename = str(d.date())+".jpg"                         #                  2018-12-06.jpg
        folder = "%i/%i %s/"%(d.year,d.month,months[d.month-1]) # 2018/12 December/
        file = folder+filename                                  # 2018/12 December/2018-12-06.jpg

        if not os.path.exists(folder): os.makedirs(folder)
        exists = os.path.isfile(file)

        url = "https://www.bing.com"+image["urlbase"]+"_1920x1200.jpg"
        print(("downloading","exists")[exists],filename,url)
        if not exists:
            try: urllib.urlretrieve(url,file)
            except: sys.exit()

    print()

# downloads the 16 latest bing images
downloadBingImages(-1)
downloadBingImages(7)

Opcjonalny dodatkowy kod do aktualizacji tapety: (umieść pod downloadBingImages (7))

import ctypes,win32con

def getWallpaper():
    ubuf = ctypes.create_unicode_buffer(512)
    ctypes.windll.user32.SystemParametersInfoW(win32con.SPI_GETDESKWALLPAPER,len(ubuf),ubuf,0)
    return ubuf.value

def setWallpaper(path):
    changed = win32con.SPIF_UPDATEINIFILE | win32con.SPIF_SENDCHANGE
    ctypes.windll.user32.SystemParametersInfoW(win32con.SPI_SETDESKWALLPAPER,0,path,changed)

# update wallpaper after a week from current
wallpaper = getWallpaper()
if wallpaper.startswith(os.getcwd()): # has to be in script directory
    try: wallpaperDate = parser.parse(os.path.splitext(os.path.basename(wallpaper))[0])
    except: sys.exit() # not using an image with a parsable date

    t = date.today()
    if (t-wallpaperDate.date()).days>=7: # been a week or longer
        setWallpaper(os.path.abspath("%i/%i %s/"%(t.year,t.month,months[t.month-1])+str(t)+".jpg")) # .../2018/12 December/2018-12-14.jpg

przykładowe dane wyjściowe:

exists 2018-12-15.jpg https://www.bing.com/az/hprichbg/rb/YosemiteBridge_ROW11493343707_1920x1200.jpg
exists 2018-12-14.jpg https://www.bing.com/az/hprichbg/rb/CardinalBerries_ROW13321753978_1920x1200.jpg
exists 2018-12-13.jpg https://www.bing.com/az/hprichbg/rb/ReykjavikYuleLads_ROW12406174277_1920x1200.jpg
exists 2018-12-12.jpg https://www.bing.com/az/hprichbg/rb/PoinsettiaBuds_ROW14015106672_1920x1200.jpg
exists 2018-12-11.jpg https://www.bing.com/az/hprichbg/rb/KilimanjaroMawenzi_ROW12001033920_1920x1200.jpg
exists 2018-12-10.jpg https://www.bing.com/az/hprichbg/rb/ChristmasIslandCrab_ROW12174154872_1920x1200.jpg
exists 2018-12-09.jpg https://www.bing.com/az/hprichbg/rb/JohnDaySnow_ROW10922424229_1920x1200.jpg
exists 2018-12-08.jpg https://www.bing.com/az/hprichbg/rb/BanffEvergreens_ROW13248925556_1920x1200.jpg

exists 2018-12-07.jpg https://www.bing.com/az/hprichbg/rb/TaisetsuShirakawago_ROW12053480529_1920x1200.jpg
exists 2018-12-06.jpg https://www.bing.com/az/hprichbg/rb/Huuhkajat_ROW11700922065_1920x1200.jpg
exists 2018-12-05.jpg https://www.bing.com/az/hprichbg/rb/SurfersBronteBeach_ROW9358782018_1920x1200.jpg
exists 2018-12-04.jpg https://www.bing.com/az/hprichbg/rb/SphinxObservatory_ROW9691446114_1920x1200.jpg
exists 2018-12-03.jpg https://www.bing.com/az/hprichbg/rb/HussarPoint_ROW8654856850_1920x1200.jpg
exists 2018-12-02.jpg https://www.bing.com/az/hprichbg/rb/Nuuk_ROW12381573676_1920x1200.jpg
exists 2018-12-01.jpg https://www.bing.com/az/hprichbg/rb/RedAntarctica_ROW12620598839_1920x1200.jpg
exists 2018-11-30.jpg https://www.bing.com/az/hprichbg/rb/KilchurnSky_ROW9474162800_1920x1200.jpg

PS Powyższy skrypt używa &mkt=en-NZdo obrazów Nowej Zelandii.
Możesz sprawdzić kod rynku dla innych krajów tutaj .

Możesz również zobaczyć wszystkie obrazy archiwizowane od 2009 roku dla różnych krajów tutaj .
(choć tylko w 1366x768)

Major PS dodaje skrypt do Harmonogramu zadań, aby był uruchamiany podczas logowania. (lub codziennie / co tydzień)

Utwórz podstawowy
program zadań / skrypt: python (lub C: \ Python34 \ python.exe, jeśli nie ma go w ścieżce env)
argumenty: "ścieżka / do / twój / skrypt.py"
zacznij w: "ścieżka / do / twój"

AKTUALIZACJA! (Marzec 2019)
Obraz z 2019-03-10 otrzymał nieprawidłową datę początkową (20190309) zarówno w formacie xml, jak i rss.
Zamiast tego używam formatu Json. (ponieważ podaje dokładną datę)



1

Bash one liner (wymaga bash, curl i jq), przydatne do wprowadzenia cronjob:

BACKGROUND_META=$(curl 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US'); curl -o $(echo $BACKGROUND_META | jq -r '.images[0].urlbase' | sed s/.*=//).jpg "https://bing.com$(echo $BACKGROUND_META| jq -r '.images[0].url')"

0

Możesz rozważyć pobranie file_content z tego adresu URL i przeszukać plik w poszukiwaniu obrazu. Nie jestem pewien, czy to najlepszy sposób, ale tak jest.


0

Korzystając z adresu URL z @Siv, oto przykład aktualizowanego kodu JavaScript <div class="bgimg" id="background">

function GetImageURL(ans) {
    var suffix = ans.images[0].url 
    document.getElementById("background").style.backgroundImage = 'url("' + 
    'http://bing.com/' + suffix + '"'
}

function GetJSON() {
    var xmlhttp = new XMLHttpRequest()
    var url = "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1"

    xmlhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
            var ans = JSON.parse(this.responseText);
            GetImageURL(ans);
        }
    };
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}


window.onload = function () {
    GetJSON()
}

CSS dla tej klasy to:

.bgimg {
    height: 100%;
    position: relative;
    opacity: 0.95;
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
}

To nie działa dla mnie z powodu tej samej polityki pochodzenia przeglądarki ...
John

0

Możesz to zrobić za pomocą Pythona i wget na komputerze z systemem Linux:

import os # import the os package
os.system("wget -O index.html http://www.bing.com") # download the bing index
str1 = open('index.html', 'r').read() # extract the file path using split
str2=str1.split("g_img={url: \"")[1]
str3=str2.split(".jpg")[0]
os.system("wget -O daily_im.jpg http://www.bing.com" + str3 + ".jpg") # donwload the daily image

Pobiera codzienne tło bing w katalogu lokalnym pod nazwą daily_im.jpg. Możesz umieścić wszystko w pliku script.py i uruchomić go programowo.


0

EDYCJA 27.09.2018: http://www.istartedsomething.com/bingimages odpowiada 404 przez tygodnie. Może już nie istnieć. :-(

Możesz skorzystać z archiwum obrazów Bing istartedsomething.com . To nieoficjalne archiwum obrazów Bing. Używa domowego punktu końcowego, który jest pomocny przy pobieraniu obrazów:

GET /bingimages/getimage.php?id=<image_id>

idto ciąg zawierający datę publikacji obrazu i kraj, w którym został opublikowany. idmusi być zgodny z następującym formatem:, YYYYMMDD-xxgdzie:

  • YYYY to rok zapisany czterema cyframi.
  • MM to miesiąc zapisany dwoma cyframi.
  • DD to dzień zapisany dwoma cyframi.
  • xxjest wskaźnikiem kraju. Archiwum obrazów Bing obsługuje obecnie następujące kraje:
    • au: Australia.
    • br: Brazylia.
    • ca: Kanada.
    • cn: Chiny.
    • de: Deutschland.
    • fr: Francja.
    • gb: Wielka Brytania.
    • jp: Japonia.
    • nz: Nowa Zelandia.
    • uk: Zjednoczone Królestwo.
    • us: Stany Zjednoczone Ameryki.

Zwraca przydatny obiekt JSON, jeśli zawiera jakieś informacje, lub fałsz, jeśli nie ma nic.

Przykład 1: Pobieranie codziennego obrazu Bing opublikowanego 24 maja 2014 roku w Nowej Zelandii

Identyfikator obrazu wynika z 20140524-nztego, że żądany obraz został opublikowany 24.05.2014 i został opublikowany w Nowej Zelandii, której wskaźnikiem kraju jest nz.

http://www.istartedsomething.com/bingimages/getimage.php?id=20140524-nz zwraca następujący fragment JSON:

{
    "url":"\/az\/hprichbg\/rb\/LakeMagadiFlamingos_ROW9792683076_1366x768.jpg",
    "region":"nz",
    "date":"2014-05-24",
    "copyright":"Flamingos take flight, Lake Magadi, Kenya (\u00a9 Bobby Haas\/Getty Images)(Bing New Zealand)",
    "imageurl":"http:\/\/www.istartedsomething.com\/bingimages\/cache\/LakeMagadiFlamingos_ROW9792683076_1366x768.jpg",
    "hotspots":[],
    "video":[]
}

Możesz użyć imageurlpola lub pola url(ścieżka adresu URL Bing), aby pobrać obraz.

Przykład 2: Pobieranie codziennego obrazu Bing opublikowanego 12 lipca 1998 r. We Francji

Identyfikator obrazu wynika z 19980712-frtego, że żądane zdjęcie zostało opublikowane 07/12/1998 i zostało opublikowane we Francji, której wskaźnikiem kraju jest fr.

http://www.istartedsomething.com/bingimages/getimage.php?id=19980712-fr powraca, falseponieważ nie ma Bing Daily Image dla Francji w dniu 12.07.1998 r. (Bing jeszcze nie istniał).


Linki martwe i nie znalazłem nic podobnego do aktualizacji odpowiedzi.
subdeveloper

0

OP nie określa systemu operacyjnego, więc tutaj jest jeden do użytku w systemie Linux. Zmodyfikowałem z oferowanego tutaj skryptu .

Zasadniczo pobiera adres URL obrazu dnia, pobiera obraz i zapisuje w stałym pliku ~/.config/wallpaper.jpg, a następnie używa fehdo ustawienia tapety. Jednocześnie wysyła powiadomienie.

#!/bin/sh

WP_FILE=$HOME/.config/wallpaper.jpg

bing="www.bing.com"

# $xmlURL is needed to get the xml data from which
# the relative URL for the Bing pic of the day is extracted
#
# The mkt parameter determines which Bing market you would like to
# obtain your images from.
# Valid values are: en-US, zh-CN, ja-JP, en-AU, en-UK, de-DE, en-NZ, en-CA or opted out.
#
# The idx parameter determines where to start from. 0 is the current day,
# 1 the previous day, etc.
xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US"

# The desired Bing picture resolution to download
# Valid options: "_1024x768" "_1280x720" "_1366x768" "_1920x1200"
desiredPicRes="_1920x1080"

# The file extension for the Bing pic
picExt=".jpg"

# Extract the relative URL of the Bing pic of the day from
# the XML data retrieved from xmlURL, form the fully qualified
# URL for the pic of the day, and store it in $picURL

# Form the URL for the desired pic resolution
desiredPicURL=$bing$(curl -s $xmlURL | grep -oP "(?<=<urlBase>)(.*?)(?=</urlBase>)")$desiredPicRes$picExt

# Form the URL for the default pic resolution
defaultPicURL=$bing$(curl -s $xmlURL | grep -oP "(?<=<url>)(.*?)(?=</url>)")

# $picName contains the filename of the Bing pic of the day

# Attempt to download the desired image resolution. If it doesn't
# exist then download the default image resolution
if wget --quiet --spider "$desiredPicURL"
then

    # Download the Bing pic of the day at desired resolution
    curl -s -o "$WP_FILE" "$desiredPicURL"
else
    # Download the Bing pic of the day at default resolution
    curl -s -o "$WP_FILE" "$defaultPicURL"
fi

if [[ -f "${WP_FILE}" ]]; then
    feh --bg-scale "$WP_FILE" && \
        notify-send -i emblem-photos "Wallpaper" "Wallpaper changed" \
        -h int:suppress-sound:1 -h int:transient:1
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.