Last active 1701134026

download-bing-py2.py Raw
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3# Create By Doracoin
4# Github: https://github.com/doracoin
5
6import json, urllib2, os, sys
7
8# 要查询的天数(尽量写大点, 反正最多只能查询到当天和过去7天的)
9days = 30
10# 超时时间
11time_out = 10
12# 是否下载全部可能支持的分辨率(大部分图片都有三个分辨率, 1920x1200, 1920x1080, 1366x768, 其中只有1920x1200有水印)
13# 2023-11-28 发现图片分辨率新增了 UHD 版本,根据文件大小和分辨率来看可能是原图,具体什么时候新增的无法确定
14all_px = False
15# 默认保存路径
16down_dir = "." + os.path.sep + "bing_wallpaper"
17# 接口地址
18bingUrl = "".join(['http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=', str(days), '&mkt=zh-cn'])
19
20for i in range(0, len(sys.argv)):
21 if (i == len(sys.argv) - 1):
22 key = sys.argv[i]
23 value = ""
24 else:
25 key = sys.argv[i]
26 value = sys.argv[i + 1]
27 # print ("key: %s, value: %s" % (key, value))
28 if ("-d" == key):
29 days = value
30 bingUrl = "".join(['http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=', str(days), '&mkt=zh-cn'])
31 if ("-t" == key):
32 time_out = int(value)
33 if ("-a" == key):
34 if ("yes" == str(value).lower() or "y" == str(value).lower()):
35 all_px = True
36 else:
37 all_px = False
38 if ("-p" == key):
39 down_dir = value
40 if (i < 2 and ("-h" == key or "-help" == key or "--help" == key)):
41 print (" -d (number) 指定查询的天数, 最多只能查询到当天和过去7天的")
42 print (" -t (number) 请求超时时间, 单位:秒")
43 print (" -a (y/n, Y/N) 是否尝试下载所有分辨率的图片, 默认 yes")
44 print (" -p (string) 指定图片保存路径, 注意你的系统的分隔符 '\\' or '/'")
45 print (" -h 显示帮助")
46 exit(0)
47
48
49def download_img(url):
50 try:
51 target_file_path = down_dir + os.path.sep + check_base_url(os.path.basename(url))
52 if (os.path.exists(target_file_path) == False):
53 img_data = urllib2.urlopen(urllib2.Request(url)).read()
54 fp = open(target_file_path, 'wb')
55 fp.write(img_data)
56 fp.close()
57 print (url, "图片下载成功")
58 else:
59 print (url, "该图片已存在,跳过")
60 except urllib2.URLError, e:
61 if isinstance(e, urllib2.HTTPError):
62 print (url, "该图片无法下载:", e.code, "" if e.reason == None else e.reason)
63 else:
64 print (url, "该图片无法下载", "" if e.reason == None else e.reason)
65
66
67def get_bing_wallpaper():
68 if (os.path.exists(down_dir) == False):
69 os.makedirs(down_dir)
70 req = urllib2.Request(bingUrl)
71 try:
72 res_data = urllib2.urlopen(req, timeout=time_out).read()
73 print ("请求壁纸信息成功,正在解析\n")
74 except urllib2.URLError, e:
75 print ("查询接口失败,有可能是网络问题,或是Bing官方关闭了这个接口,请稍后重试", "" if e.reason == None else e.reason)
76 exit()
77 s = json.loads(res_data)
78 img_counts = len(s["images"])
79 for i in range(0, img_counts):
80 item = s["images"][i]["url"] # 默认1920x1080分辨率
81 item_base = s["images"][i]["urlbase"] # 图片baseurl,可以拼接分辨率
82 # UHD
83 download_img("http://www.bing.com" + item_base + "_UHD.jpg")
84 # 1920x1080
85 download_img("http://www.bing.com" + item_base + "_1920x1080.jpg")
86 if bool(all_px):
87 # 1366x768
88 download_img("http://www.bing.com" + item_base + "_1366x768.jpg")
89 # 1920x1200 (有水印)
90 download_img("http://www.bing.com" + item_base + "_1920x1200.jpg")
91 print ("\n")
92
93
94def check_base_url(base_url):
95 base_url = base_url.replace('th?id=OHR.', '')
96 return base_url
97
98
99if __name__ == '__main__':
100 print ("\nWelcome to use < Bing Wallpaper Downloader 1.0 >\n")
101 print ("文件将会被下载到: ", down_dir)
102 print ("是否尝试多分辨率: ", "" if all_px == True else "")
103 print ("尝试查询天数: ", days, "\n")
104
105 # 开始下载
106 get_bing_wallpaper()
107