Preparatory Work
Analysis of Bing wallpaper web elements and API
To create an automated wallpaper downloader using Bing, we need to understand how to interact with the Bing API. The goal is to fetch wallpaper URLs and save them locally in the desired format. We'll also explore the relevant API, image elements, and URL patterns.
Key Components:
1. Bing's Wallpaper API:
Bing provides an endpoint to access its wallpaper metadata, including image URLs, titles, and descriptions. The primary endpoint we use is:
https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=en-US
-
idx=0
: The index of the wallpaper (starting from today). -
n=1
: The number of wallpapers to fetch (in this case, just one). -
mkt=en-US
: The market/language code (in this case, English - US).
2. Image URL and Download:
The image URLs provided by the API are often in a relative format (starting with /th?id=...
). To download the image, we'll need to prepend the base URL https://www.bing.com
.
Format and Naming Convention:
The image URL will often be in the form:
/th?id=OHR.SouthPadre_ZH-CN8788572569_1920x1080.jpg
We will process this to extract the necessary information, such as the image name and file extension, and save it accordingly.
Process
1. Fetching Data from Bing API:
The first step is to send a GET request to the Bing API. This returns a JSON object containing the metadata of the wallpaper for a given day.
import requests
import os
# Simulate browser request headers
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36"
}
# Directory to save wallpapers
default_pictures_dir = os.path.join(os.path.expanduser("~"), "Pictures")
picture_path = os.path.join(default_pictures_dir, "bing")
# Create the directory if it doesn't exist
if not os.path.exists(picture_path):
os.makedirs(picture_path)
# Fetch wallpapers (last 4 days including today)
for idx in range(4):
# Request Bing's wallpaper metadata
api_url = f"https://www.bing.com/HPImageArchive.aspx?format=js&idx={idx}&n=1&mkt=en-US"
response = requests.get(api_url, headers=headers)
if response.status_code != 200:
print(f"Failed to fetch data for idx={idx}, skipping.")
continue
data = response.json()
if not data.get("images"):
print(f"No images found for idx={idx}, skipping.")
continue
# Extract image details
image_info = data["images"][0]
image_url = "https://www.bing.com" + image_info["url"]
image_name = image_info["urlbase"].split("/")[-1] + ".jpg"
save_path = os.path.join(picture_path, image_name)
# Download the image
image_response = requests.get(image_url, headers=headers)
if image_response.status_code == 200:
with open(save_path, "wb") as f:
f.write(image_response.content)
print(f"Downloaded: {save_path}")
else:
print(f"Failed to download image for idx={idx}.")
Online Test
python3 -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/Excalibra/scripts/refs/heads/main/d-python/get_bing_wallpapers.py)"
Top comments (0)