#!/usr/bin/env python # -*- coding: utf-8 -*- # Create By Doracoin # Github: https://github.com/doracoin import json import os import sys import urllib.error import urllib.request # 要查询的天数(尽量写大点, 反正最多只能查询到当天和过去7天的) days = 1 # 超时时间 time_out = 10 # 是否下载全部可能支持的分辨率(大部分图片都有三个分辨率, 1920x1200, 1920x1080, 1366x768, 其中只有1920x1200有水印) all_px = True # 默认保存路径 down_dir = "." + os.path.sep + "bing_wallpaper" # 接口地址 data_url = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=' bingUrl = "".join([data_url, str(days)]) for i in range(0, len(sys.argv)): if i == len(sys.argv) - 1: key = sys.argv[i] value = "" else: key = sys.argv[i] value = sys.argv[i + 1] # print "key: %s, value: %s" % (key, value) if "-d" == key: days = value bingUrl = "".join([data_url, str(days)]) if "-t" == key: ime_out = int(value) if "-a" == key: if "yes" == str(value).lower() or "y" == str(value).lower(): all_px = True else: all_px = False if "-p" == key: down_dir = value if i < 2 and ("-h" == key or "-help" == key or "--help" == key): print(" -d (number) 指定查询的天数, 最多只能查询到当天和过去7天的") print(" -t (number) 请求超时时间, 单位:秒") print(" -a (y/n, Y/N) 是否尝试下载所有分辨率的图片, 默认 yes") print(" -p (string) 指定图片保存路径, 注意你的系统的分隔符 '\\' or '/'") print(" -h 显示帮助") exit(0) def download_img(url): try: target_file_path = down_dir + os.path.sep + check_base_url(os.path.basename(url)) if not os.path.exists(target_file_path): img_data = urllib.request.urlopen(url).read() fp = open(target_file_path, 'wb') fp.write(img_data) fp.close() print(url, "图片下载成功") else: print(url, "该图片已存在,跳过") except urllib.error.HTTPError as err: print(url, "该图片无法下载:", err.code, "" if err.reason is None else err.reason) except OSError: print("发生异常") def get_bing_wallpaper(): global res_data if not os.path.exists(down_dir): os.makedirs(down_dir) req = urllib.request.urlopen(url=bingUrl, timeout=time_out) try: res_data = req.read() print("请求壁纸信息成功,正在解析\n") except urllib.error.URLError as err: print("查询接口失败,有可能是网络问题,或是Bing官方关闭了这个接口,请稍后重试", "" if err.reason is None else err.reason) exit() s = json.loads(res_data) img_counts = len(s["images"]) for index in range(0, img_counts): # item_url = s["images"][index]["url"] # 默认1920x1080分辨率: 2019-5-6:接口数据变动,该字段不便直接使用 item_url_base = s["images"][index]["urlbase"] # 图片baseurl,可以拼接分辨率 # 1920x1080 download_img("http://www.bing.com" + item_url_base + "_1920x1080.jpg") if all_px: # 1366x768 download_img("http://www.bing.com" + item_url_base + "_1366x768.jpg") # 1920x1200 (有水印) download_img("http://www.bing.com" + item_url_base + "_1920x1200.jpg") print("\n") # 该接口返回BaseUrl格式曾经有过变动, # 为了防止以后再次遇到变动, # 所以此处单独写一个函数方便扩展 def check_base_url(base_url): base_url = str.replace(base_url, 'th?id=OHR.', '') return base_url if __name__ == '__main__': print("\nWelcome to use \n") if down_dir.startswith('.'): print("文件将会被下载到: ", os.path.dirname(sys.argv[0]) + down_dir[1:]) else: print("文件将会被下载到: ", down_dir) print("是否尝试多分辨率: ", "是" if all_px is True else "否") print("尝试查询天数: ", days, "\n") # 开始下载 get_bing_wallpaper()