Есть ли способ получить фотографию дня в Bing?


89

Есть ли способ получить фоновое изображение Bing программно?

API Bing, похоже, не обеспечивает такой функциональности, возможно, есть другой способ?

Ответы:


111

Я думаю, что лучший способ - имитировать то, как они это делают сами, с помощью вызовов AJAX.

Они вызывают этот URL-адрес и извлекают информацию посредством десериализации 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

mktАтрибут , очевидно , может быть изменен на другую область , чем'en-US', но также может быть выбран из полностью , если вы не заботитесь о конкретном регионе.

Обратите внимание, что _1366x768.jpgсуффикс, добавляемый к именам изображений, может быть изменен для разных разрешений (например, _1920x1080.jpgдля Full HD и, возможно, других).

Вот дамп данных по состоянию на 28.09.2013 в формате 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
К вашему сведению - вы также можете получить его в формате JSON! bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
JustMaier 08

2
Кстати: разрешение можно менять, работает все что угодно _1920x1200, т.е. так же 1920x1080и другие.
jmiserez

1
Итак, похоже, что Bing Desktop использует bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 , то есть без &mkt=en-USчасти. Это даже при том, что у меня приложение настроено на «Английский - США».
jmiserez

1
@darksoulsong Конечно. Вы можете создать веб-сервис, который будет проксировать данные за вас. Обычно можно использовать jsonp, но не похоже, что они позволяют это.
Матиас Ликкегаард Лоренцен

1
Если кто-то ищет торговые
площадки

31

ФОРМАТ JSON ИЗОБРАЖЕНИЯ BING

Я нашел способ , чтобы принести формат JSON в Bing Image дня

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

Заметка

      n=Количество изображений, которые вы хотите (вы можете использовать целые числа ),
      mkt=ваше местоположение (пример: en-US )


Вот результат JSON выглядит как

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

использовать urlизimages[]

и добавить его в 'http://bing.com'

здесь URL "url": "\/az\/hprichbg\/rb\/DayGecko_EN-US8730336235_1366x768.jpg"


Похоже, Bing ограничивает общее количество ответов до 8 за раз. 8 можно собрать с n = 8, а 8 до этого можно собрать, установив idx = 8 и n = 8. Я не вижу возможности расширить это.
The Fluffy Robot

Почему это дает ошибку Unexpected token :вhttps://www.bing.com/HPImageArchive.aspx?format=js&idx=8&n=8&mkt=en-US&callback=jQuery111100034959779751375653_1518009655771&_=1518009655772
Рохит Шарма

10

Microsoft недавно опубликовала динамическую тему Bing для Windows 7, которая содержит RSS-канал со ссылками на обои Bing .

Существует также сценарий Python, который пытается загрузить веб-сайт Bing и угадать правильный URL-адрес изображения, но, по моему опыту, это обычно приводит к изображению с более низким разрешением, чем те, которые предлагает RSS-канал.


+1 за ссылку на rss, думаю, это собственно ответ на вопрос
Дэвид Конде

3
К сожалению, тема больше не поддерживается, или, как говорит Microsoft: «Эта тема удалена». RSS все еще существует, но больше не обновляется.
karafior


6

One liner PowerShell (3.0 или выше)

irm это псевдоним для Invoke-RestMethod

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

2
Гениально! У меня отлично
сработало

4

Мне тоже нравятся изображения Bing, но их приложение слишком раздуто для загрузки изображений. Проанализировав связь со скрипачом, я написал этот код. 1920x1200 поставляется со встроенным логотипом Bing, но в более низких разрешениях его нет.

Вы можете настроить окна для отображения случайных изображений из заданной вами папки изображений, чтобы при их ежедневной загрузке вы получали больше случайных изображений. Если вы сохраните «imageDir», вам необходимо изменить права доступа к этой папке, иначе произойдет сбой, я не стал беспокоиться об обнаружении ошибок. Наконец, не комментируйте строки, если вы хотите установить обои на сегодняшнее изображение, или вы можете создать задачу для запуска программы, скажем, через минуту после входа в систему.

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

Этот JavaScript ответит на вопрос «что делать с api», заменив фоновое изображение div на фон изображения bing текущего дня.

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
Я действительно хотел использовать это, но, похоже, он не может решить проблему отсутствия «Access-Control-Allow-Origin», установленного Bing.
addMitt

2

На случай, если кто-то ищет возможные реализации, я написал небольшую программу командной строки на C #, чтобы загрузить, сохранить и установить свой фон в качестве изображения дня Bing. Не стесняйтесь изменять его в соответствии со своими потребностями. 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, поместите в папку, создайте ежедневную задачу в планировщике задач Windows, сценарий сохраняет изображения в своей папке запуска, а затем в настройках фона рабочего стола выберите эту папку в качестве фона.

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

Еще лучше работает в Windows как запланированная задача для автоматической загрузки образа дня Bing в целевой каталог. Превосходно.
небытие

2

Вот простой скрипт Python для получения фотографии дня в Bing, используя только requestsи 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))

Это запишет файл, например, в TurtleTears_EN-US7942276596_1920x1080.jpgтот же каталог, где выполняется сценарий. Конечно, здесь можно настроить множество вещей, но справляется со своей работой довольно легко.


2

Позвольте мне рассказать вам, как получить ежедневные обои дня bing с помощью javascript и php,

Попробуйте этот код 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>

Этот скрипт устанавливает ежедневное изображение дня в bing в качестве фона вашего html-документа (вы можете дополнительно изменить его в соответствии с вашими потребностями).

Эта ссылка - https://techytricks97.000webhostapp.com каждый день возвращает обои дня Bing.

fetch()получает URL-адрес сегодняшнего изображения Bing https://techytricks97.000webhostapp.comи text=>{document.body.style.background="url('"+text+"')";document.body.style.backgroundSize='cover';}устанавливает его в качестве фона.

Примечание. Microsoft не позволяет использовать изображения bing daily в качестве фона вашего сайта, вы можете использовать их в качестве обоев телефона / рабочего стола или для других целей с упоминанием авторских прав.

Вот код php, который используется на 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);
?>

Вы можете использовать http://techytricks97.000webhostapp.comтолько или можете настроить свой собственный файл php на своем сервере.

Еще одно замечание: я не использовал только javascript, потому что политика одинакового происхождения в браузере ограничивает его, но выборка из моего файла php разрешена, поскольку я вставил header('Access-Control-Allow-Origin: *');свой код php. Я мог бы использовать другие прокси, но у них высокий трафик (мой сайт почти не получает кликов в день).

Если вы используете другой язык, вам просто нужно прочитать этот файл ( http://techytricks97.000webhostapp.com )



1

Взгляните на bing-desktop-wallpaper-changer на Github . Скрипт написан на Python, и я надеюсь, что вы найдете там свой ответ.

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

Взгляните на проект Github для получения подробного кода


1
Прекрасная работа! Об этом также говорится в статье omgubuntu
Wtower,

@Wtower Спасибо, что сообщили мне об этом! :)
Уткарш Гупта

1

Я наконец-то решил написать сценарий на Python 3, чтобы получить как можно больше изображений (16) из xml-архива.

Так что теперь я могу архивировать изображения без каких-либо усилий. Просто запустите скрипт Python.
Я упорядочиваю изображения по папкам «Год / Месяц» следующим образом: 2018> 12 декабря> 2018-12-06.jpg

Этот сценарий находится в моей папке Bing Wallpapers. (который находится в моей папке изображений)

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)

Необязательный дополнительный код для обновления обоев: (поместите под 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

пример вывода:

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 приведенный выше сценарий используется &mkt=en-NZдля изображений Новой Зеландии.
Вы можете проверить рыночный код для других стран здесь .

Вы также можете увидеть все изображения архивируются с 2009 года для разных стран здесь .
(правда, только в разрешении 1366x768)

Major PS добавляет сценарий в планировщик заданий для запуска при входе в систему. (или ежедневно / еженедельно)

Создать базовую задачу
Программа / скрипт: python (или C: \ Python34 \ python.exe, если его нет в вашем пути env)
аргументы: «путь / к / вашему / script.py»
начать с: «путь / к / вашему»

ОБНОВИТЬ! (Март 2019 г.)
Для изображения за 2019-03-10 была указана неправильная дата начала (20190309) как в формате xml, так и в формате rss.
Вместо этого используется формат Json. (поскольку он дает точную дату)



1

Bash one liner (требуется bash, curl и jq), полезный для вставки 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

Вы можете подумать о том, чтобы получить file_content этого URL-адреса и выполнить поиск в файле изображения. Не уверен, что это лучший способ, но это способ.


0

Используя URL-адрес из @Siv, вот пример 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 для этого класса:

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

У меня это не работает из-за той же политики происхождения в браузере ...
Джон,

0

Вы можете сделать это с помощью python и wget на 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

Он загружает ежедневный фон Bing в локальный каталог под именем daily_im.jpg. Вы можете поместить все в script.py и запустить его программно.


0

РЕДАКТИРОВАТЬ 27.09.2018: http://www.istartedsomething.com/bingimages отвечает 404 в течение нескольких недель. Возможно, его больше не существует. :-(

Вы можете использовать архив изображений Bing на istartedsomething.com . Это неофициальный архив изображений Bing. Он использует самодельную конечную точку, которая полезна для получения изображений:

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

id- строка, содержащая дату публикации изображения и страну, в которой оно было опубликовано. idдолжен соответствовать следующему формату:, YYYYMMDD-xxгде:

  • YYYY год, записанный четырьмя цифрами.
  • MM это месяц, записанный двумя цифрами.
  • DD день, записанный двумя цифрами.
  • xxиндикатор страны. Bing Image Archive в настоящее время поддерживает следующие страны:
    • au: Австралия.
    • br: Бразилия.
    • ca: Канада.
    • cn: Китай.
    • de: Deutschland.
    • fr: Франция.
    • gb: Великобритания.
    • jp: Япония.
    • nz: Новая Зеландия.
    • uk: Объединенное Королевство.
    • us: Соединенные Штаты Америки.

Он возвращает полезный объект JSON, если в нем есть некоторая информация, или false, если у него ничего нет.

Пример 1. Получение ежедневного изображения Bing, опубликованного 24 мая 2014 г. в Новой Зеландии.

Идентификатор изображения 20140524-nzсвязан с тем, что требуемое изображение было опубликовано 24.05.2014, и оно было опубликовано в Новой Зеландии, индикатор страны которой nz.

http://www.istartedsomething.com/bingimages/getimage.php?id=20140524-nz возвращает следующий фрагмент 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":[]
}

Вы можете использовать imageurlполе или поле url(Путь к URL-адресу Bing), чтобы получить изображение.

Пример 2: получение ежедневного изображения Bing, опубликованного 12 июля 1998 г. во Франции.

Идентификатор изображения связан с 19980712-frтем, что требуемое изображение было опубликовано 12.07.1998, и оно было опубликовано во Франции, индикатор страны которой fr.

http://www.istartedsomething.com/bingimages/getimage.php?id=19980712-fr возвращается, falseпотому что нет изображения Bing Daily Image для Франции от 12.07.1998 (Bing в то время даже не существовал).


Ссылки мертвы, и я не нашел ничего похожего на обновление ответа.
subdeveloper

0

OP не указывает операционную систему, поэтому вот она для использования в Linux. Я модифицировал предложенный здесь сценарий .

В основном он получает URL-адрес изображения дня, загружает изображение и сохраняет его в фиксированный файл ~/.config/wallpaper.jpgи использует fehдля установки обоев. Одновременно отправляет уведомление.

#!/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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.