Bing の壁紙を自動的にクロールし、Baidu ネットワーク ディスクをアップロード: Python と GitHub で簡単に実現

インポートリクエスト日時から
base64をインポート 日時から日時をインポート日時からタイムデルタをインポートbs4からタイムゾーンをインポート ビューティフルスープのインポート時刻インポートdddocrインポートos baidu_cookie = os.environ["BAIDU_COOKIE"]







SHA_TZ = timezone(
timedelta(hours=8),
name='アジア/上海',
)
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 (Gecko のような KHTML) Chrome/" "97.0.4692.99 Safari/537.36 Edg/97.0. 1072.69", "リファラー": "https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true", "cookie": baidu_cookie, '接続': '閉じる' }










# bing の毎日の画像を取得します
def get_bing_pic():
url = 'https://cn.bing.com/'
r =requests.get(url, headers=headers)
Soup = BeautifulSoup(r.text, 'html.parser ')
# リンクタグ、preloadBg 画像の URL を検索します
link =Soup.find('link', id='preloadBg')
#画像の URL を取得します
img_url = link['href']
# URL を分割 & 分割
img_url = img_url .split ('&')[0]
# URL に '1920x1080' があるかどうかを判断します。そうであれば、それを 'UHD' に置き換えます。img_url に '1920x1080' がある場合、UHD は 4K 画像 ID です: 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,画像名


# ネットワーク ディスクがログインしているかどうかを確認します
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)
# Web ページのソース コードを介してログインするかどうかを決定します
if 'Baidu ネットワーク ディスク-すべてのファイル' in r.text:
print('ネットワーク ディスク ログイン成功')
return True
else:
print (「Cookie の変更」)
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 = リクエスト.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=/image&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": "/image/" + 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'): True を返すelse:リクエスト。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=/image/{str (beijing_now.date())}&num=100&page=1"
# リクエストを送信
r = request.get(url=url, headers=baidu_headers)
# ダウンロードが成功したかどうかを判断する
if len(r.json().get(" list" )) == 0:
print("今日はダウンロードされていません") r.json().get('list') の i に対して
True を返します: if img_name in i.get('path'): print('Download今日の画像 完了') 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 = { "method": "add_task", "app_id": "250528",
"
source_url " : img_url , "save_path": f"/pictures/{str(beijing_now.date())}" # ネットワーク ディスク ディレクトリ} #リクエストを送信r = request.post(download_offline_url, headers=baidu_headers, data=data) if "ソース 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 = { "method": "add_task", "app_id": "250528", "source_url": img_url, "save_path": f"/image/{str(beijing_now.date())}", #ネットワーク ディスク ディレクトリ"input": captcha、"vcode": request.json()['vcode']





}
# リクエストを送信します
r = request.post(download_offline_url, headers=baidu_headers, data=data)
print(r.json())
if 'vcode' in r.json():
time.sleep(3)
print('re-認証 ')
download_offline_captcha(logid、bdstoken、img_url、リクエスト)


# ダウンロードが成功したかどうかを判定
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=/image/{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 = { "filelist": '[{"path":"' + f"/image/{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) および is_file_exist(logid, img_name):
download_offline(logid, bdstoken, img_url)
is_download_success(logid, img_name) の場合:
rechristen(logid, bdstoken, img_name)
 

おすすめ

転載: blog.csdn.net/winkexin/article/details/131324404