自动爬取bing壁纸并上传百度网盘:使用Python和GitHub轻松实现

admin
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

温馨提示:这篇文章已超过521天没有更新,请注意相关的内容是否还可用!

import requests

import base64

from datetime import datetime

from datetime import timedelta

from datetime import timezone

from bs4 import BeautifulSoup

import time

import ddddocr

import os

bAIdu_cookie = os.environ["BAIDU_COOKIE"]


SHA_TZ = timezone(

timedelta(hours=8),

name='Asia/Shanghai',

)

utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)

beijing_now = utc_now.astimezone(SHA_TZ)



# 定义headers

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',

}

# 定义baidu_headers,cookie需要 BAIDUID BDUSS ,STOKEN

baidu_headers = {

"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"

"97.0.4692.99 Safari/537.36 Edg/97.0.1072.69",

"Referer": "httPs://pan.baidu.com/disk/home?from=newversion&stayAtHome=true",

"cookie": baidu_cookie,

'Connection': 'close'

}



# 获取bing每日一图

def get_bing_pic():

url = 'https://cn.bing.com/'

r = requests.get(url, headers=headers)

soup = BeautifulSoup(r.text, 'html.parser')

# 寻找link标签,preloadBg图片的url

link = soup.find('link', id='preloadBg')

# 获取图片url

img_url = link['href']

# 分割url通过&分割

img_url = img_url.split('&')[0]

# 判断url是否有'1920x1080' 如果有则替换为'UHD',UHD为4K图片标识

if '1920x1080' in img_url:

img_url = img_url.replace('1920x1080', 'UHD')

img_url = "https://s.cn.bing.net" + img_url

# 获取图片名称

img_name = img_url.split('=')[1]

# 返回图片url

return img_url, img_name



# 判断网盘是否登录

def is_login():

url = 'https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true#/all?path=%2F&vmode=list'

r = requests.get(url, headers=baidu_headers)

# 通过网页源码判断是否登录

if '百度网盘-全部文件' in r.text:

print('网盘登录成功')

return True

else:

print("更换COOKIE")

return False



# 获取logid,bdstoken

def get_logid_bdstoken():

# 获取bdstoken的url

get_bdstoken_url = "http://pan.baidu.com/api/gettemplatevariable?clienttype=0&app_id=250528&web=1&fields=[%22bdstoken%22]"

bdstoken = requests.get(get_bdstoken_url, headers=baidu_headers).json().get('result').get('bdstoken')

# 获取logid

logid = str(base64.b64encode(

requests.get(get_bdstoken_url, headers=baidu_headers).request.headers.get('cookie').split(';')[0].strip(

"BAIDUID=").encode(

'utf-8'))).replace("b'", "").replace("'", "")

return logid, bdstoken


# 验证网盘目标目录文件夹是否存在

def is_dir_exist(logid, bdstoken):

url = f"https://pan.baidu.com/api/list?clienttype=0&app_id=250528&web=1&dp-logid={logid}&order=time&desc=1&dir=/图片&num=100&page=1"

url1 = f"https://pan.baidu.com/api/create?a=commit&channel=chunlei&web=1&app_id=250528&bdstoken={bdstoken}&logid={logid}&clienttype=0"

data = {

"path": "/图片/" + str(beijing_now.date()),

"isdir": 1,

'block_list': []

}

r = requests.get(url, headers=baidu_headers)

for i in r.json().get('list'):

if str(beijing_now.date()) in i.get('server_filename'):

return True

else:

requests.post(url1, headers=baidu_headers, data=data)

return is_dir_exist(logid, bdstoken)

def is_file_exist(logid, img_name):

url = f"https://pan.baidu.com/api/list?clienttype=0&app_id=250528&web=1&dp-logid={logid}&order=time&desc=1&dir=/图片/{str(beijing_now.date())}&num=100&page=1"

# 发送请求

r = requests.get(url=url, headers=baidu_headers)

# 判断是否下载成功

if len(r.json().get("list")) == 0:

print("今日未下载")

return True

for i in r.json().get('list'):

if img_name in i.get('path'):

print('今天图片下载完成')

return False


# 网盘离线下载,参数为logid,bdstoken,图片url

def download_offline(logid, bdstoken, img_url):

# 拼接网盘离线下载url

download_offline_url = f"https://pan.baidu.com/rest/2.0/services/cloud_dl?channel=chunlei&web=1&app_id=250528&bdstoken={bdstoken}&logid={logid}&clienttype=0"

# 定义data

data = {

"method": "add_task",

"app_id": "250528",

"source_url": img_url,

"save_path": f"/图片/{str(beijing_now.date())}" # 网盘目录

}

# 发送请求

r = requests.post(download_offline_url, headers=baidu_headers, data=data)

if "Invalid source url" in r.json():

print("重新下载 下载地址无效,请核对")

download_offline(logid, bdstoken, img_url)

if 'vcode' in r.json():

print("需要验证码调用")

download_offline_captcha(logid, bdstoken, img_url, r)



# 需要验证码的离线下载

def download_offline_captcha(logid, bdstoken, img_url, request):

# 拼接网盘离线下载url

download_offline_url = f"https://pan.baidu.com/rest/2.0/services/cloud_dl?channel=chunlei&web=1&app_id=250528&bdstoken={bdstoken}&logid={logid}&clienttype=0"

# 通过ddddocr库识别验证码

ocr = ddddocr.DdddOcr()

# 验证码图片

captcha_img = requests.get(request.json()['img'], headers=baidu_headers).content

# 验证码ocr

captcha = ocr.classification(captcha_img)

print(captcha)


# 定义data

data = {

"method": "add_task",

"app_id": "250528",

"source_url": img_url,

"save_path": f"/图片/{str(beijing_now.date())}", # 网盘目录

"input": captcha,

"vcode": request.json()['vcode']


}

# 发送请求

r = requests.post(download_offline_url, headers=baidu_headers, data=data)

print(r.json())

if 'vcode' in r.json():

time.sleep(3)

print('重新验证')

download_offline_captcha(logid, bdstoken, img_url, request)



# 判断是否下载成功

def is_download_success(logid, img_name):

time.sleep(2)

# 拼接判断是否下载成功的url

url = f"https://pan.baidu.com/api/list?clienttype=0&app_id=250528&web=1&dp-logid={logid}&order=time&desc=1&dir=/图片/{str(beijing_now.date())}&num=100&page=1"

# 发送请求

r = requests.get(url, headers=baidu_headers)


# 判断是否下载成功

if len(r.json().get("list")) == 0:

print("未下载完成")

time.sleep(2)

return is_download_success(logid, img_name)

for ii in r.json().get('list'):

if img_name in ii.get('path'):

print('今天图片下载完成')

return False

for i in r.json().get('list'):

if "th.jpg" in i.get('path'):

print('下载完成')

return True

else:

print(i)

print("有其他图片,继续下载")

return is_download_success(logid, img_name)



def rechristen(logid, bdstoken, img_name):

# 拼接改名url

name_url = f"https://pan.baidu.com/api/filemanager?opera=rename&async=2&onnest=fail&channel=chunlei&web=1&app_id=250528&bdstoken={bdstoken}&logid={logid}&clienttype=0"

# 定义data

data = {

"filelist": '[{"path":"' + f"/图片/{str(beijing_now.date())}" + '/th.jpg","newname":"' + img_name + '"}]'

}

# 发送请求

requests.post(name_url, data, headers=baidu_headers)

print("改名完成")



if __name__ == '__main__':

img_url, img_name = get_bing_pic()

if is_login():

logid, bdstoken = get_logid_bdstoken()

if is_dir_exist(logid, bdstoken) and is_file_exist(logid, img_name):

download_offline(logid, bdstoken, img_url)

if is_download_success(logid, img_name):

rechristen(logid, bdstoken, img_name)


文章版权声明:除非注明,否则均为执刀人的工具库原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,210人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码