搜索

查看: 3244|回复: 11

[Python] 利用github的Actions,每天爬取bing壁纸上传的百度网盘

[复制链接]
发表于 2022-6-25 22:52:34 | 显示全部楼层 |阅读模式
Editor 2022-6-25 22:52:34 3244 11 看全部
  1. import requests
  2. import base64
  3. from datetime import datetime
  4. from datetime import timedelta
  5. from datetime import timezone
  6. from bs4 import BeautifulSoup
  7. import time
  8. import ddddocr
  9. import os
  10. baidu_cookie = os.environ["BAIDU_COOKIE"]

  11. SHA_TZ = timezone(
  12.     timedelta(hours=8),
  13.     name='Asia/Shanghai',
  14. )
  15. utc_now = datetime.utcnow().replace(tzinfo=timezone.utc)
  16. beijing_now = utc_now.astimezone(SHA_TZ)


  17. # 定义headers
  18. headers = {
  19.     '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',
  20. }
  21. # 定义baidu_headers,cookie需要 BAIDUID  BDUSS ,STOKEN
  22. baidu_headers = {
  23.      "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"
  24.                   "97.0.4692.99 Safari/537.36 Edg/97.0.1072.69",
  25.     "Referer": "https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true",
  26.     "cookie": baidu_cookie,
  27.     'Connection': 'close'
  28. }


  29. # 获取bing每日一图
  30. def get_bing_pic():
  31.     url = 'https://cn.bing.com/'
  32.     r = requests.get(url, headers=headers)
  33.     soup = BeautifulSoup(r.text, 'html.parser')
  34.     # 寻找link标签,preloadBg图片的url
  35.     link = soup.find('link', id='preloadBg')
  36.     # 获取图片url
  37.     img_url = link['href']
  38.     # 分割url通过&分割
  39.     img_url = img_url.split('&')[0]
  40.     # 判断url是否有'1920x1080' 如果有则替换为'UHD',UHD为4K图片标识
  41.     if '1920x1080' in img_url:
  42.         img_url = img_url.replace('1920x1080', 'UHD')
  43.         img_url = "https://s.cn.bing.net" + img_url
  44.     # 获取图片名称
  45.     img_name = img_url.split('=')[1]
  46.     # 返回图片url
  47.     return img_url, img_name


  48. # 判断网盘是否登录
  49. def is_login():
  50.     url = 'https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true#/all?path=%2F&vmode=list'
  51.     r = requests.get(url, headers=baidu_headers)
  52.     # 通过网页源码判断是否登录
  53.     if '百度网盘-全部文件' in r.text:
  54.         print('网盘登录成功')
  55.         return True
  56.     else:
  57.         print("更换COOKIE")
  58.         return False


  59. # 获取logid,bdstoken
  60. def get_logid_bdstoken():
  61.     # 获取bdstoken的url
  62.     get_bdstoken_url = "http://pan.baidu.com/api/gettemplatevariable?clienttype=0&app_id=250528&web=1&fields=[%22bdstoken%22]"
  63.     bdstoken = requests.get(get_bdstoken_url, headers=baidu_headers).json().get('result').get('bdstoken')
  64.     # 获取logid
  65.     logid = str(base64.b64encode(
  66.         requests.get(get_bdstoken_url, headers=baidu_headers).request.headers.get('cookie').split(';')[0].strip(
  67.             "BAIDUID=").encode(
  68.             'utf-8'))).replace("b'", "").replace("'", "")
  69.     return logid, bdstoken

  70. # 验证网盘目标目录文件夹是否存在
  71. def is_dir_exist(logid, bdstoken):
  72.     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"
  73.     url1 = f"https://pan.baidu.com/api/create?a=commit&channel=chunlei&web=1&app_id=250528&bdstoken={bdstoken}&logid={logid}&clienttype=0"
  74.     data = {
  75.         "path": "/图片/" + str(beijing_now.date()),
  76.         "isdir": 1,
  77.         'block_list': []
  78.     }
  79.     r = requests.get(url, headers=baidu_headers)
  80.     for i in r.json().get('list'):
  81.         if str(beijing_now.date()) in i.get('server_filename'):
  82.             return True
  83.         else:
  84.             requests.post(url1, headers=baidu_headers, data=data)
  85.             return is_dir_exist(logid, bdstoken)
  86. def is_file_exist(logid, img_name):
  87.     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"
  88.     # 发送请求
  89.     r = requests.get(url=url, headers=baidu_headers)
  90.     # 判断是否下载成功
  91.     if len(r.json().get("list")) == 0:
  92.         print("今日未下载")
  93.         return True
  94.     for i in r.json().get('list'):
  95.         if img_name in i.get('path'):
  96.             print('今天图片下载完成')
  97.             return False

  98. # 网盘离线下载,参数为logid,bdstoken,图片url
  99. def download_offline(logid, bdstoken, img_url):
  100.     # 拼接网盘离线下载url
  101.     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"
  102.     # 定义data
  103.     data = {
  104.         "method": "add_task",
  105.         "app_id": "250528",
  106.         "source_url": img_url,
  107.         "save_path": f"/图片/{str(beijing_now.date())}"  # 网盘目录
  108.     }
  109.     # 发送请求
  110.     r = requests.post(download_offline_url, headers=baidu_headers, data=data)
  111.     if "Invalid source url" in r.json():
  112.         print("重新下载 下载地址无效,请核对")
  113.         download_offline(logid, bdstoken, img_url)
  114.     if 'vcode' in r.json():
  115.         print("需要验证码调用")
  116.         download_offline_captcha(logid, bdstoken, img_url, r)


  117. # 需要验证码的离线下载
  118. def download_offline_captcha(logid, bdstoken, img_url, request):
  119.     # 拼接网盘离线下载url
  120.     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"
  121.     # 通过ddddocr库识别验证码
  122.     ocr = ddddocr.DdddOcr()
  123.     # 验证码图片
  124.     captcha_img = requests.get(request.json()['img'], headers=baidu_headers).content
  125.     # 验证码ocr
  126.     captcha = ocr.classification(captcha_img)
  127.     print(captcha)

  128.     # 定义data
  129.     data = {
  130.         "method": "add_task",
  131.         "app_id": "250528",
  132.         "source_url": img_url,
  133.         "save_path": f"/图片/{str(beijing_now.date())}",  # 网盘目录
  134.         "input": captcha,
  135.         "vcode": request.json()['vcode']

  136.     }
  137.     # 发送请求
  138.     r = requests.post(download_offline_url, headers=baidu_headers, data=data)
  139.     print(r.json())
  140.     if 'vcode' in r.json():
  141.         time.sleep(3)
  142.         print('重新验证')
  143.         download_offline_captcha(logid, bdstoken, img_url, request)


  144. # 判断是否下载成功
  145. def is_download_success(logid, img_name):
  146.     time.sleep(2)
  147.     # 拼接判断是否下载成功的url
  148.     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"
  149.     # 发送请求
  150.     r = requests.get(url, headers=baidu_headers)

  151.     # 判断是否下载成功
  152.     if len(r.json().get("list")) == 0:
  153.         print("未下载完成")
  154.         time.sleep(2)
  155.         return is_download_success(logid, img_name)
  156.     for ii in r.json().get('list'):
  157.         if img_name in ii.get('path'):
  158.             print('今天图片下载完成')
  159.             return False
  160.     for i in r.json().get('list'):
  161.         if "th.jpg" in i.get('path'):
  162.             print('下载完成')
  163.             return True
  164.         else:
  165.             print(i)
  166.             print("有其他图片,继续下载")
  167.     return is_download_success(logid, img_name)


  168. def rechristen(logid, bdstoken, img_name):
  169.     # 拼接改名url
  170.     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"
  171.     # 定义data
  172.     data = {
  173.         "filelist": '[{"path":"' + f"/图片/{str(beijing_now.date())}" + '/th.jpg","newname":"' + img_name + '"}]'
  174.     }
  175.     # 发送请求
  176.     requests.post(name_url, data, headers=baidu_headers)
  177.     print("改名完成")


  178. if __name__ == '__main__':
  179.     img_url, img_name = get_bing_pic()
  180.     if is_login():
  181.         logid, bdstoken = get_logid_bdstoken()
  182.         if is_dir_exist(logid, bdstoken) and is_file_exist(logid, img_name):
  183.             download_offline(logid, bdstoken, img_url)
  184.             if is_download_success(logid, img_name):
  185.                 rechristen(logid, bdstoken, img_name)
复制代码


回复

使用道具 举报

发表于 2023-6-28 23:38:15 | 显示全部楼层
123456823 2023-6-28 23:38:15 看全部
论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
回复

使用道具 举报

发表于 2023-6-29 13:39:47 | 显示全部楼层
幸福341 2023-6-29 13:39:47 看全部
楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
回复

使用道具 举报

发表于 2023-6-29 13:55:08 | 显示全部楼层
风来时狂放 2023-6-29 13:55:08 看全部
我看不错噢 谢谢楼主!知鸟论坛越来越好!
回复

使用道具 举报

发表于 2023-6-29 17:22:28 | 显示全部楼层
dxf17 2023-6-29 17:22:28 看全部
这东西我收了!谢谢楼主!知鸟论坛真好!
回复

使用道具 举报

发表于 2023-6-29 23:12:12 | 显示全部楼层
贺老师 2023-6-29 23:12:12 看全部
论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
回复

使用道具 举报

发表于 2023-6-30 09:35:19 | 显示全部楼层
六翼天使494 2023-6-30 09:35:19 看全部
这东西我收了!谢谢楼主!知鸟论坛真好!
回复

使用道具 举报

发表于 2023-7-3 16:57:08 | 显示全部楼层
永远爱你冰塘 2023-7-3 16:57:08 看全部
论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
回复

使用道具 举报

发表于 2023-7-3 17:20:46 | 显示全部楼层
心随674 2023-7-3 17:20:46 看全部
其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
回复

使用道具 举报

发表于 2023-7-3 17:57:48 | 显示全部楼层
永远就三年疗 2023-7-3 17:57:48 看全部
感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
回复

使用道具 举报

  • 您可能感兴趣
点击右侧快捷回复 【请勿灌水】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

RSS订阅| SiteMap| 小黑屋| 知鸟论坛
联系邮箱E-mail:zniao@foxmail.com
快速回复 返回顶部 返回列表