Có cách nào để có được bức ảnh trong ngày của Bing không?


89

Có cách nào tôi có thể lấy hình nền Bing theo lập trình không?

API của Bing dường như không cung cấp chức năng như vậy, có lẽ có một cách khác?

Câu trả lời:


110

Tôi nghĩ cách tốt nhất là bắt chước cách họ tự làm thông qua các lệnh gọi AJAX của họ.

Họ gọi URL này và trích xuất thông tin thông qua giải mã 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

Các mktthuộc tính rõ ràng có thể được thay đổi thành một khu vực khác nhau hơn'en-US', nhưng cũng có thể chọn không tham gia hoàn toàn nếu bạn không quan tâm đến một khu vực cụ thể.

Lưu ý rằng _1366x768.jpghậu tố được thêm vào tên hình ảnh dường như có thể sửa đổi thành các độ phân giải khác nhau (như _1920x1080.jpgcho full HD và có thể là các phần khác).

Đây là kết xuất dữ liệu kể từ ngày 28 tháng 9 năm 2013, ở định dạng 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 - bạn cũng có thể lấy nó ở định dạng JSON! bing.com/HPImageArchive.aspx?format=js&idx=0&n=1
JustMaier

1
BTW: Độ phân giải có thể thay đổi, bất cứ thứ gì có thể _1920x1200hoạt động, tức là cũng 1920x1080như những thứ khác.
jmiserez

1
Được rồi, có vẻ như Bing Desktop sử dụng bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1 , tức là không có &mkt=en-USphần nào . Điều này mặc dù tôi đã đặt ứng dụng thành "English-United States".
jmiserez

1
@darksoulsong Chắc chắn rồi. Bạn có thể tạo một dịch vụ web ủy nhiệm dữ liệu cho bạn. Thông thường, người ta sẽ sử dụng jsonp, nhưng có vẻ như họ không cho phép điều đó.
Mathias Lykkegaard Lorenzen

1
Nếu bất cứ ai tìm kiếm chợ ... bạn có thể trích xuất nó từ microsoft.com/en-in/locale.aspx
Amar Palsapure

30

ĐỊNH DẠNG JSON của BING IMAGE

Tôi đã tìm ra cách để tìm nạp định dạng JSON của Hình ảnh Bing trong ngày

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

Ghi chú

      n=Không có hình ảnh nào bạn muốn (bạn có thể sử dụng Số nguyên ),
      mkt=Vị trí của bạn (ví dụ: en-US )


Đây là đầu ra JSON trông như thế nào

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

sử dụng urltừimages[]

và thêm nó vào 'http://bing.com'

url đây là "url": "\/az\/hprichbg\/rb\/DayGecko_EN-US8730336235_1366x768.jpg"


Có vẻ như Bing giới hạn tổng số câu trả lời tại một thời điểm là 8. 8 có thể được tập hợp với n = 8 và 8 cái trước đó có thể được tập hợp bằng cách đặt idx = 8 và n = 8. Tôi không thấy có cách nào để mở rộng điều này.
Các Fluffy Robot

Tại sao nó đem lại cho lỗi Unexpected token :tronghttps://www.bing.com/HPImageArchive.aspx?format=js&idx=8&n=8&mkt=en-US&callback=jQuery111100034959779751375653_1518009655771&_=1518009655772
Rohit Sharma

10

Microsoft gần đây đã xuất bản Chủ đề động Bing cho Windows 7, chứa Nguồn cấp dữ liệu RSS với các liên kết đến hình nền Bing .

Ngoài ra còn có một tập lệnh Python cố gắng tải trang web Bing và đoán URL hình ảnh chính xác, nhưng theo kinh nghiệm của tôi, nó thường dẫn đến hình ảnh có độ phân giải thấp hơn so với những gì được cung cấp bởi nguồn cấp dữ liệu RSS.


+1 cho liên kết đến rss, tôi nghĩ đó là câu trả lời thực sự cho câu hỏi
David Conde.

3
Thật không may, chủ đề này đã bị ngừng sản xuất, hoặc như Microsoft nói: "Chủ đề này đã bị gỡ bỏ". RSS vẫn ở đó, nhưng nó không được cập nhật nữa.
karafior


6

Một lớp lót PowerShell (3.0 hoặc cao hơn)

irm là một bí danh cho Invoke-RestMethod

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

2
Xuất sắc! Làm việc hoàn hảo cho tôi :)
LiamHarries

4

Tôi cũng thích hình ảnh Bing nhưng ứng dụng của họ quá cồng kềnh cho mục đích tải xuống hình ảnh. Sau khi phân tích kết nối với fiddler, tôi đã viết mã này. 1920x1200 đi kèm với logo Bing được nhúng nhưng độ phân giải thấp hơn thì không có.

Bạn có thể có các cửa sổ hiển thị cho bạn các hình ảnh ngẫu nhiên từ thư mục hình ảnh bạn đã đặt, vì vậy khi bạn tải xuống hàng ngày, nó sẽ hiển thị cho bạn nhiều hình ảnh ngẫu nhiên hơn. Nếu bạn vẫn giữ "imageDir", bạn cần phải thay đổi quyền trên thư mục đó nếu không nó sẽ bị lỗi, tôi không bận tâm đến việc bắt lỗi. Cuối cùng, hãy bỏ nhận xét các dòng nếu bạn muốn đặt hình nền của mình thành hình ảnh hôm nay hoặc bạn có thể tạo tác vụ để chạy chương trình, chẳng hạn như một phút sau khi đăng nhập.

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 này sẽ trả lời câu hỏi 'phải làm gì với api' bằng cách thay đổi hình nền của div thành hình nền của hình ảnh bing của ngày hiện tại.

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
Tôi thực sự muốn sử dụng điều này nhưng dường như không tránh khỏi việc thiếu 'Access-Control-Allow-Origin' do Bing thiết lập.
addMitt

2

Trong trường hợp bất kỳ ai đang tìm kiếm các triển khai khả thi, tôi đã viết một chương trình dòng lệnh nhỏ trong C # để tải xuống, lưu và đặt nền của tôi làm Hình ảnh Bing trong ngày. Hãy tự do sửa đổi nó theo nhu cầu cá nhân của bạn. 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 đơn giản, đặt vào một thư mục, tạo công việc hàng ngày trong Windows Task Scheduler, tập lệnh lưu hình ảnh tại thư mục đang chạy của nó, sau đó trong cài đặt Nền máy tính của bạn chọn thư mục đó làm nền.

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

Hoạt động thậm chí còn tốt hơn như một tác vụ được lên lịch trong Windows để tự động tải hình ảnh Bing trong ngày vào thư mục đích. Thông minh.
nonbeing

2

Đây là một tập lệnh Python đơn giản để tìm nạp ảnh Bing trong ngày chỉ bằng requestsjson:

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

Thao tác này sẽ ghi một tệp TurtleTears_EN-US7942276596_1920x1080.jpgvào cùng một thư mục nơi tập lệnh được thực thi. Tất nhiên, có thể điều chỉnh toàn bộ nhiều thứ ở đây, nhưng hoàn thành công việc một cách hợp lý dễ dàng.


2

Hãy để tôi cho bạn biết làm thế nào để có được hình nền bing hàng ngày trong ngày bằng javascript và php,

Hãy thử mã js này:

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

Tập lệnh này đặt hình ảnh bing hàng ngày trong ngày làm nền cho tài liệu html của bạn (bạn có thể sửa đổi thêm tùy theo nhu cầu sử dụng của mình).

Liên kết này- https://techytricks97.000webhostapp.com trả về hình nền bing trong ngày, hàng ngày.

fetch()lấy url của hình ảnh bing ngày hôm nay https://techytricks97.000webhostapp.comtext=>{document.body.style.background="url('"+text+"')";document.body.style.backgroundSize='cover';}đặt nó làm nền.

Lưu ý: Microsoft không cho phép sử dụng hình ảnh bing daily làm hình nền trang web của bạn, bạn có thể sử dụng nó làm hình nền điện thoại / máy tính để bàn hoặc vào những thứ khác có đề cập đến bản quyền.

Đây là mã php được sử dụng trên 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);
?>

Bạn chỉ có thể sử dụng http://techytricks97.000webhostapp.comhoặc có thể thiết lập tệp php của riêng bạn trên máy chủ của bạn.

Một lưu ý khác: Tôi không chỉ sử dụng javascript, bởi vì chính sách cùng nguồn gốc của trình duyệt hạn chế nó, nhưng việc tìm nạp từ tệp php của tôi được cho phép vì tôi đã nhập header('Access-Control-Allow-Origin: *');mã php của mình. Tôi có thể đã sử dụng một proxy khác nhưng chúng có lưu lượng truy cập cao (trang web của tôi hầu như không nhận được bất kỳ nhấp chuột nào trong một ngày).

Nếu bạn đang sử dụng bất kỳ ngôn ngữ nào khác, bạn chỉ cần đọc tệp này ( http://techytricks97.000webhostapp.com )



1

Hãy xem bing-desktop-wallpaper-changer trên Github . Tập lệnh đã được viết bằng python và tôi hy vọng bạn tìm thấy câu trả lời của mình ở đó.

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

Hãy xem dự án Github để biết mã chi tiết


1
Bạn đã làm rất tốt! Điều này cũng đã được tương lai trong một bài báo trên omgubuntu
Wtower

@Wtower Cảm ơn rất nhiều vì đã cho tôi biết! :)
Utkarsh Gupta

1

Cuối cùng tôi đã quyết định viết một tập lệnh bằng Python 3 để có được nhiều hình ảnh nhất (16) từ kho lưu trữ xml.

Vì vậy, bây giờ tôi có thể lưu trữ các hình ảnh mà không cần nỗ lực. Chỉ cần chạy tập lệnh Python.
Tôi sắp xếp các hình ảnh thành các thư mục Năm / Tháng như sau: 2018> 12 tháng 12> 2018-12-06.jpg

Tập lệnh này nằm trong thư mục Hình nền Bing của tôi. (nằm trong thư mục Ảnh của tôi)

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)

Mã bổ sung tùy chọn để cập nhật hình nền: (đặt bên dưới tải xuốngBingImages (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

đầu ra ví dụ:

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 tập lệnh trên đang sử dụng &mkt=en-NZcho các hình ảnh New Zealand.
Bạn có thể xem mã thị trường cho các quốc gia khác tại đây .

Bạn cũng có thể xem tất cả các hình ảnh được lưu trữ từ năm 2009 cho các quốc gia khác nhau tại đây .
(chỉ ở 1366x768)

PS chính thêm tập lệnh vào Task Scheduler để chạy khi đăng nhập. (hoặc hàng ngày / hàng tuần)

Tạo
Chương trình Tác vụ Cơ bản / script: python (hoặc C: \ Python34 \ python.exe nếu nó không có trong đường dẫn env của bạn)
đối số: "path / to / your / script.py"
start in: "path / to / your"

CẬP NHẬT! (Tháng 3 năm 2019)
Hình ảnh cho ngày 03 tháng 10 năm 2019 đã bị cung cấp sai ngày bắt đầu (20190309) ở cả định dạng xml và rss.
Sử dụng định dạng Json để thay thế. (vì nó cung cấp ngày chính xác)



1

Bash một lớp lót (cần bash, curl và jq), hữu ích để đưa vào 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

Bạn có thể cân nhắc lấy file_content của url đó và tìm kiếm hình ảnh trong tệp. Không chắc đó là cách tốt nhất, nhưng đó là một cách.


0

Sử dụng URL từ @Siv, đây là một ví dụ về JavaScript cập nhật <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 cho lớp này là:

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

Điều này không hiệu quả với tôi vì chính sách nguồn gốc giống nhau của trình duyệt ...
John

0

Bạn có thể làm điều đó bằng cách sử dụng python và wget trên máy 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

Nó tải xuống nền bing hàng ngày trong thư mục cục bộ với tên daily_im.jpg. Bạn có thể đặt mọi thứ trên script.py và khởi chạy nó theo chương trình.


0

CHỈNH SỬA 27/09/2018: http://www.istartedsomething.com/bingimages phản hồi 404 trong nhiều tuần. Nó có thể không tồn tại nữa. :-(

Bạn có thể sử dụng Kho lưu trữ hình ảnh Bing của istartedsomething.com . Đây là một Kho lưu trữ hình ảnh Bing không chính thức. Nó sử dụng một điểm cuối tự chế rất hữu ích để truy xuất hình ảnh:

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

idlà một chuỗi chứa ngày hình ảnh được xuất bản và quốc gia nơi hình ảnh được xuất bản. idphải tuân thủ định dạng sau:, YYYYMMDD-xxtrong đó:

  • YYYY là năm, được viết bằng bốn chữ số.
  • MM là tháng, được viết bằng hai chữ số.
  • DD là ngày, được viết bằng hai chữ số.
  • xxlà chỉ số quốc gia. Bing Image Archive hiện hỗ trợ các quốc gia sau:
    • au: Châu Úc.
    • br: Braxin.
    • ca: Canada.
    • cn: Trung Quốc.
    • de: Deutschland.
    • fr: Pháp.
    • gb: Nước Anh.
    • jp: Nhật Bản.
    • nz: New Zealand.
    • uk: Vương quốc Anh.
    • us: Nước Mỹ.

Nó trả về một đối tượng JSON hữu ích nếu nó có một số thông tin hoặc sai nếu nó không có bất cứ thứ gì.

Ví dụ 1: Lấy lại hình ảnh hàng ngày Bing được xuất bản vào ngày 24 tháng 5 năm 2014 tại New Zealand

ID hình ảnh là 20140524-nzdo hình ảnh được yêu cầu đã được xuất bản vào ngày 24/05/2014 và nó được xuất bản ở New Zealand, có chỉ số quốc gia là nz.

http://www.istartedsomething.com/bingimages/getimage.php?id=20140524-nz trả về đoạn JSON sau:

{
    "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":[]
}

Bạn có thể sử dụng imageurltrường hoặc trường url(đường dẫn URL Bing) để lấy hình ảnh của mình.

Ví dụ 2: Lấy lại hình ảnh hàng ngày Bing được xuất bản vào ngày 12 tháng 7 năm 1998 tại Pháp

ID hình ảnh là 19980712-frdo hình ảnh được yêu cầu được xuất bản vào ngày 7 tháng 12 năm 1998 và nó được xuất bản ở Pháp, có chỉ số quốc gia là fr.

http://www.istartedsomething.com/bingimages/getimage.php?id=19980712-fr trả lại falsevì không có Bing Daily Image cho Pháp vào ngày 07/12/1998 (Bing thậm chí không tồn tại vào thời điểm này).


Liên kết đã chết, Và tôi không tìm thấy bất kỳ điều gì tương tự để cập nhật câu trả lời.
subdeveloper

0

OP không chỉ định hệ điều hành, vì vậy đây là một để sử dụng trong Linux. Tôi đã sửa đổi từ kịch bản được cung cấp ở đây .

Về cơ bản, nó tìm nạp url của hình ảnh trong ngày, tải xuống hình ảnh và lưu vào một tệp cố định ~/.config/wallpaper.jpgvà sử dụng fehđể đặt hình nền. Đồng thời gửi thông bá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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.