Existe uma maneira de obter a foto do dia do Bing?


89

Existe alguma maneira de obter a imagem de plano de fundo do Bing programaticamente?

A API do Bing não parece fornecer tal funcionalidade, talvez haja outra maneira?

Respostas:


111

Acho que a melhor maneira é imitar a maneira como eles fazem isso por meio de chamadas AJAX.

Eles chamam esse URL e extraem as informações por meio da desserialização de 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

O mktatributo pode obviamente ser alterado para uma região diferente de ´en-US´, mas também pode ser totalmente desativado se você não se importar com uma região específica.

Observe que o _1366x768.jpgsufixo adicionado aos nomes das imagens parece ser modificável em diferentes resoluções (como _1920x1080.jpgfull HD e possivelmente outros).

Aqui está um dump dos dados de 28/09/2013, em formato 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
Para sua informação - você também pode obtê-lo no formato JSON! bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
JustMaier

1
BTW: A resolução é mutável, qualquer coisa _1920x1200funciona, ou seja, também 1920x1080e outros.
jmiserez

1
Ok, então parece que o Bing Desktop usa bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 , ou seja, sem nenhuma &mkt=en-USparte. Isso ocorre mesmo que eu tenha o aplicativo definido como "Inglês-Estados Unidos".
jmiserez

1
@darksoulsong Claro. Você poderia fazer um serviço da web que procurava os dados para você. Normalmente, alguém usaria jsonp, mas não parece que eles permitem isso.
Mathias Lykkegaard Lorenzen

1
Se alguém estiver procurando por mercados ... você pode extraí-lo de microsoft.com/en-in/locale.aspx
Amar Palsapure

30

JSON FORMAT de BING IMAGE

Eu encontrei uma maneira de buscar o formato JSON da imagem do Bing do dia

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

Nota

      n=O número de imagens que você deseja (você pode usar números inteiros ),
      mkt=sua localização (exemplo: en-US )


Aqui está a saída JSON que parece

  {
  "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."
  }
}

use o urldeimages[]

e adicione a 'http://bing.com'

aqui está url "url": "\/az\/hprichbg\/rb\/DayGecko_EN-US8730336235_1366x768.jpg"


Parece que o Bing restringe o número total de respostas a 8 por vez. 8 podem ser reunidos com n = 8, e os 8 anteriores a isso podem ser reunidos definindo idx = 8 e n = 8. Não vejo uma maneira de expandir isso.
The Fluffy Robot

Por que ele está dando erro Unexpected token :nahttps://www.bing.com/HPImageArchive.aspx?format=js&idx=8&n=8&mkt=en-US&callback=jQuery111100034959779751375653_1518009655771&_=1518009655772
Rohit Sharma

10

A Microsoft publicou recentemente um Tema Dinâmico do Bing para Windows 7, que contém um RSS Feed com links para papéis de parede do Bing .

Há também um script Python que tenta carregar o site do Bing e adivinhar a URL correta da imagem, mas, pela minha experiência, geralmente resulta em uma imagem de resolução inferior às oferecidas pelo feed RSS.


+1 para o link para o rss, acho que é a verdadeira resposta à pergunta
David Conde

3
Infelizmente, o tema foi descontinuado, ou como a Microsoft coloca: "Este tema foi retirado". O RSS ainda está lá, mas não está mais sendo atualizado.
karafior


6

Um liner PowerShell (3.0 ou superior)

irm é um apelido para Invoke-RestMethod

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

2
Brilhante! Funcionou perfeitamente para mim :)
LiamHarries

4

Eu gosto de imagens do Bing também, mas seu aplicativo é muito inchado para o propósito de baixar imagens. Depois de analisar a conexão com o fiddler, escrevi este código. O 1920x1200 vem com o logotipo do Bing incorporado, mas as resoluções mais baixas não o possuem.

Você pode fazer com que o Windows mostre imagens aleatórias da pasta de imagens que você definiu, de modo que, à medida que você as baixa diariamente, ela mostra mais imagens aleatórias. Se você mantiver o "imageDir", você precisa alterar as permissões dessa pasta ou ele irá travar, não me preocupei em detectar erros. Por último, descomente as linhas se quiser definir seu papel de parede com a imagem de hoje ou pode criar uma tarefa para executar o programa, digamos um minuto após o logon.

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

Este JavaScript responderá a 'o que fazer com a api' alterando a imagem de fundo de um div para o fundo da imagem bing do dia atual.

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
Eu realmente queria usar isso, mas não parece contornar a falta de 'Access-Control-Allow-Origin' sendo definido pelo Bing.
addMitt

2

Caso alguém esteja procurando por possíveis implementações, escrevi um pequeno programa de linha de comando em C # para baixar, salvar e definir meu plano de fundo como a Imagem do Dia do Bing. Sinta-se à vontade para modificá-lo de acordo com suas necessidades pessoais. 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

PowerShell simples, coloque em uma pasta, crie uma tarefa diária no Agendador de Tarefas do Windows, o script salva imagens em sua pasta de execução e, em seguida, nas configurações do Plano de Fundo da Área de Trabalho, escolha essa pasta como plano de fundo.

[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)"

Funciona ainda melhor como uma tarefa agendada no Windows para baixar automaticamente a imagem do dia do Bing em um diretório de destino. Excelente.
não ser

2

Aqui está um script Python simples para buscar a foto do dia do Bing usando apenas requestse 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))

Isso gravará um arquivo TurtleTears_EN-US7942276596_1920x1080.jpgno mesmo diretório onde o script é executado. Claro, pode ajustar um monte de coisas aqui, mas faz o trabalho com razoável facilidade.


2

Deixe-me dizer como obter um papel de parede diário do dia usando javascript e php,

Experimente este código 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>

Este script define a imagem diária do dia como plano de fundo do seu documento html (você pode modificá-lo ainda mais de acordo com o seu uso).

Este link- https://techytricks97.000webhostapp.com retorna o papel de parede bing do dia, todos os dias.

fetch()obtém o url da imagem bing de hoje https://techytricks97.000webhostapp.come a text=>{document.body.style.background="url('"+text+"')";document.body.style.backgroundSize='cover';}define como plano de fundo.

Nota: a Microsoft não permite o uso de imagens do bing daily como plano de fundo do seu site, você pode usá-lo como papel de parede do telefone / desktop ou em outras coisas com a menção de direitos autorais.

Aqui está o código php que é usado em 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);
?>

Você pode usar http://techytricks97.000webhostapp.comapenas ou pode configurar seu próprio arquivo php em seu servidor.

Outra observação: eu não usei apenas javascript, porque a política de mesma origem do navegador o restringe, mas a busca do meu arquivo php é permitida conforme coloquei header('Access-Control-Allow-Origin: *');no meu código php. Eu poderia ter usado outros proxies, mas eles têm alto tráfego (meu site quase não recebe cliques em um dia).

Se você estiver usando qualquer outro idioma, basta ler este arquivo ( http://techytricks97.000webhostapp.com )



1

Dê uma olhada no bing-desktop-wallpaper-changer no Github . O script foi escrito em python e espero que você encontre sua resposta aí.

#!/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)

Dê uma olhada no projeto Github para código detalhado


1
Bom trabalho! Isso também foi discutido em um artigo do omgubuntu
Wtower

@Wtower Muito obrigado por me avisar! :)
Utkarsh Gupta

1

Eu finalmente decidi escrever um script em Python 3 para obter o máximo de imagens (16) do arquivo xml.

Agora posso arquivar as imagens sem esforço. Basta executar o script Python.
Organizo as imagens em pastas de ano / mês como esta: 2018> 12 de dezembro> 06-12-2018.jpg

Este script vai para minha pasta de papéis de parede do Bing. (que está na minha pasta Imagens)

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)

Código extra opcional para atualizar o papel de parede: (colocado abaixo de 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

exemplo de saída:

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, o script acima está usando &mkt=en-NZpara as imagens da Nova Zelândia.
Você pode verificar o código de mercado para outros países aqui .

Você também pode ver todas as imagens arquivadas desde 2009 para diferentes países aqui .
(embora apenas em 1366 x 768)

O PS principal adiciona o script ao Agendador de tarefas para executar ao fazer logon. (ou diário / semanal)

Crie um
programa / script de tarefa básica : python (ou C: \ Python34 \ python.exe se não estiver em seu caminho env)
argumentos: "caminho / para / seu / script.py"
comece em: "caminho / para / seu"

ATUALIZAR! (Março de 2019)
A imagem de 10/03/2019 recebeu uma data de início incorreta (20190309) no formato xml e rss.
Usando o formato Json. (uma vez que fornece uma data precisa)



1

Bash one liner (precisa de bash, curl e jq), útil para colocar em um 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

Você pode considerar obter o file_content desse url e pesquisar o arquivo da imagem. Não tenho certeza se essa é a melhor maneira, mas é uma maneira.


0

Usando o URL de @Siv, aqui está um exemplo de JavaScript que atualiza <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()
}

O css para esta classe é:

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

Isso não funciona para mim por causa da política de mesma origem do navegador ...
João

0

Você pode fazer isso usando python e wget em uma máquina 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

Ele baixa o background do Daily BING no diretório local com o nome daily_im.jpg. Você pode colocar tudo em um script.py e iniciá-lo programaticamente.


0

EDITAR 27/09/2018: http://www.istartedsomething.com/bingimages responde 404 por semanas. Pode não existir mais. :-(

Você pode usar o arquivo de imagens do Bing de istartedsomething.com . É um arquivo de imagens do Bing não oficial. Ele usa um endpoint caseiro que é útil para recuperar imagens:

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

idé uma string que contém a data em que a imagem foi publicada e o país onde foi publicada. iddeve estar de acordo com o seguinte formato:, YYYYMMDD-xxonde:

  • YYYY é o ano, escrito com quatro dígitos.
  • MM é o mês, escrito com dois dígitos.
  • DD é o dia, escrito com dois dígitos.
  • xxé o indicador do país. Atualmente, o arquivo de imagens do Bing oferece suporte aos seguintes países:
    • au: Austrália.
    • br: Brasil.
    • ca: Canadá.
    • cn: China.
    • de: Deutschland.
    • fr: França.
    • gb: Grã Bretanha.
    • jp: Japão.
    • nz: Nova Zelândia.
    • uk: Reino Unido.
    • us: Estados Unidos da America.

Ele retorna um objeto JSON útil se tiver alguma informação ou false se não tiver nada.

Exemplo 1: Recuperando a imagem diária do Bing publicada em 24 de maio de 2014 na Nova Zelândia

A identificação da imagem é 20140524-nzporque a imagem exigida foi publicada em 24/05/2014 e foi publicada na Nova Zelândia, cujo indicador de país é nz.

http://www.istartedsomething.com/bingimages/getimage.php?id=20140524-nz retorna a seguinte parte de 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":[]
}

Você pode usar o imageurlcampo ou o campo url(caminho de URL do Bing) para obter sua imagem.

Exemplo 2: Recuperando a imagem diária do Bing publicada em 12 de julho de 1998 na França

A identificação da imagem é 19980712-frporque a imagem exigida foi publicada em 12/07/1998 e foi publicada na França, cujo indicador de país é fr.

http://www.istartedsomething.com/bingimages/getimage.php?id=19980712-fr retorna falseporque não há Imagem Diária do Bing para a França em 12/07/1998 (o Bing nem existia neste momento).


Links mortos, e não achei nada parecido para atualizar a resposta.
subdeveloper

0

OP não especifica o sistema operacional, então aqui está um para uso no Linux. Eu modifiquei o script oferecido aqui .

Basicamente, ele busca a url da imagem do dia, baixa a imagem e salva em um arquivo fixo ~/.config/wallpaper.jpg, e usa fehpara definir o papel de parede. Ao mesmo tempo, envia uma notificação.

#!/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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.