Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(4)Cookies免登錄+抓包下載

上一篇文章提到了使用Selenium模擬操作進(jìn)行下載的一些缺點(diǎn)砰粹,包括文本框輸入令人抓狂等等唧躲,這一篇文章將介紹使用Cookies免登錄、抓包分析來進(jìn)行下載碱璃、查詢等功能弄痹。

成功的效果圖

喂喂!你丫這也算司機(jī)嵌器?肛真??爽航?蚓让?


且慢且慢,這一條下載成功看似軟弱無力宛若咸魚讥珍,實(shí)則大智若愚历极,是通過Python發(fā)送數(shù)據(jù)包下載而來,并不是常人的操作衷佃,可大有所為趟卸!
本文分為以下幾個(gè)部分

  • 自動(dòng)登錄——Cookies
    自動(dòng)登錄的原理與抓包分析
  • Python自動(dòng)登錄網(wǎng)盤
    自動(dòng)登錄部分的測試
  • 查詢磁力鏈接、下載與狀態(tài)查詢抓包
    后續(xù)部分的抓包分析
  • 整體實(shí)現(xiàn)與缺點(diǎn)
    整體代碼及需要改進(jìn)的地方

自動(dòng)登錄——Cookies

Cookie,有時(shí)也用其復(fù)數(shù)形式 Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 session 跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)锄列。

自動(dòng)登錄

這是百度登錄界面图云,勾選之后我們每次輸入pan.baidu.com都能自動(dòng)進(jìn)入到自己的網(wǎng)盤界面,都是Cookies
的功勞啦邻邮。所以我們只要拿到登錄之后的Cookies竣况,不就直接告訴網(wǎng)站“就是你大爺我!”饶囚,進(jìn)而實(shí)現(xiàn)免登錄了嗎帕翻?

Cookies的獲取

登陸之后F12控制臺切換至Network開始抓包,新建一個(gè)磁力鏈接并下載萝风,我們來觀察一下抓到的包嘀掸。

抓到的包

嘿嘿,右下角的數(shù)據(jù)(上面的Query String Parameters則是從POST的URL中提取出來的)已經(jīng)告訴我們這個(gè)query_magnetinfo是如何查詢磁力鏈接信息的了规惰,構(gòu)造一個(gè)包睬塌,包含磁力鏈接和保存地址save_path即可。然而上面的bdstokenlogid需不需要呢歇万?我實(shí)驗(yàn)的過程中費(fèi)了好大的周折給搞出來揩晴,最后卻發(fā)現(xiàn)并不需要這兩個(gè)玩意兒QAQ!所以大家測試其他網(wǎng)站的時(shí)候只加上自己覺得必要的贪磺,失敗再接著加參數(shù)就好硫兰。
接著看上面的信息,

Cookies:我才是主角昂劫映!

我們就把這一大段文本給復(fù)制下來備用。
(為什么非要是這個(gè)包的Cookies呢刹前?……因?yàn)榘l(fā)現(xiàn)后續(xù)抓的包Cookies都是它……)

Python自動(dòng)登陸網(wǎng)盤

先構(gòu)造一個(gè)Header

header

然后發(fā)送出去查看效果

    # 登錄需要POST一個(gè)包泳赋,其中包含帳號信息的Cookie
    def login(self):
        self.loginurl="http://pan.baidu.com/disk/home"
        try:
            req = urllib.request.Request(self.loginurl, headers=self.headers)
            sourcecode = urllib.request.urlopen(req)
        except Exception as e:
            print('Error ', str(e))
        else:
            #如果出現(xiàn)該字眼說明登錄成功
            htmlcode=(sourcecode.read().decode())
            print(htmlcode)
            if(htmlcode.find('initPrefetch')!=-1):
                print('OK!')
返回的源代碼 說明登陸成功

顯示的是登錄成功之后的網(wǎng)盤部分的Html代碼,說明登錄成功啦喇喉。

查詢磁力鏈接祖今、下載與狀態(tài)查詢抓包

我們接著來抓包了哈。和上面一小節(jié)是同樣的方法拣技,需要關(guān)注的地方包括:

  • POST的URL(即圖中的Query String Parameters)
  • 包的數(shù)據(jù)(Form Data)
  • 網(wǎng)頁的回應(yīng)

依次查看自己覺得可疑的包千诬,下面我們逐個(gè)來分析啦。

query_magnetinfo 查詢磁力鏈接

上一小節(jié)query_magnetinfo的Response如下:

網(wǎng)頁中返回的Response

Python中返回的消息

還有文件大小呢膏斤!

size
query_magnetinfo包的Response

Add_task 添加下載任務(wù)

比較重要的信息已經(jīng)用紅框標(biāo)注出來嘞

Request

主要需要確定selected_index徐绑,我們需要下載哪些文件呢?
嘿嘿掸绞,上面不是有size返回給我們了嗎泵三!大的就是視頻文件了!
添加任務(wù)成功的情況:

成功會返回task_id

添加失斚蔚А:

咳咳烫幕,你懂的

需要驗(yàn)證碼

總之,返回task_id就是成功了敞映!

list_task和query_task

這兩個(gè)感覺是差不多的包较曼,返回的信息都是關(guān)于任務(wù)進(jìn)度的信息。

list_task
query_task(還記得add_task里返回的task_ids嗎)

于是我找了不同類型的任務(wù)觀察query_task(list_task也行)返回的信息振愿。

這是界面上顯示的信息

這是包里面返回的信息

嗯捷犹!就是說Status為0就是成功了!

整體實(shí)現(xiàn)與缺點(diǎn)

整體代碼在這里冕末!
baidudisk_github
不想點(diǎn)開的就看下面啦萍歉。



#! -*- coding:utf-8 -*-
# 本模塊用來離線下載資源到網(wǎng)盤
import urllib.request
import urllib.parse
import json
import execjs

class bdsaver:
    def __init__(self,cookie):
        self.cookie = cookie
        self.headers = {
            'Host': 'pan.baidu.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Referer': 'http://pan.baidu.com/',
            'Cookie': self.cookie,
            'Connection': 'keep-alive'
        }

    # 登錄需要POST一個(gè)包,其中包含帳號信息的Cookie
    def login(self):
        self.loginurl="http://pan.baidu.com/disk/home"
        try:
            req = urllib.request.Request(self.loginurl, headers=self.headers)
            sourcecode = urllib.request.urlopen(req)
        except Exception as e:
            print('Error ', str(e))
        else:
            #如果出現(xiàn)該字眼說明登錄成功
            htmlcode=(sourcecode.read().decode())
            print(htmlcode)
            if(htmlcode.find('initPrefetch')!=-1):
                print('OK!')
    def query(self,magneturl):
        self.magneturl=magneturl
        self.headers = {
            'Host': 'pan.baidu.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Referer': 'http://pan.baidu.com/disk/home?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0',
            'Cookie': self.cookie,
            'Connection': 'keep-alive',
            'Pragma': 'no - cache',
            'Cache - Control': 'no - cache',
        }

        self.queryurl = 'http://pan.baidu.com/rest/2.0/services/cloud_dl?channel=chunlei&web=1&app_id=250528&clienttype=0'
        self.data ={
            'method': 'query_magnetinfo',
            'app_id': '250528',
            'source_url':self.magneturl ,
            'save_path': '/',
            'type': '4'
        }
        req = urllib.request.Request(self.queryurl, headers=self.headers, data=urllib.parse.urlencode(self.data).encode(encoding='UTF8') )
        sourcecode = urllib.request.urlopen(req)
        result=(sourcecode.read().decode('unicode_escape'))
        print(result)
        result=json.loads(result)['magnet_info']
        download_list=''
        for i in range(len(result)):
            #文件大于50MB
            if (int(result[i]['size'])>1024*1024*50):
                download_list=download_list+str(i+1)+','
        if download_list!='':
            return download_list
        else:
            return '1'
    def save(self,selidx):
        # self.queryurl = 'http://pan.baidu.com/rest/2.0/services/cloud_dl?channel=chunlei&web=1&app_id=250528&bdstoken=efbd0c8c5eb658ea804bea857c9ad213&clienttype=0'
        self.queryurl = 'http://pan.baidu.com/rest/2.0/services/cloud_dl?channel=chunlei&web=1&app_id=250528&clienttype=0'
        self.data = {
            'method': 'add_task',
            'app_id': '250528',
            'save_path': '/',
            'selected_idx': selidx,
            'task_from': '1',
            'source_url':self.magneturl ,
            # 't':'1501251100480'
        }
        req = urllib.request.Request(self.queryurl, headers=self.headers,
                                     data=urllib.parse.urlencode(self.data).encode(encoding='UTF8'))
        sourcecode = urllib.request.urlopen(req)
        print(sourcecode.read().decode('unicode_escape'))



if __name__ == '__main__':
    #填入自己截獲到的cookies
    bdtest = bdsaver(cookie='')
    bdtest.login()
    dllist=bdtest.query(magneturl='magnet:?xt=urn:btih:459E0DD6DCE56845BE3C72368797481F0B8C0216&xl=3391547763&dn=%E7%94%9F%E5%8C%96%E5%8D%B1%E6%9C%BA%E7%B3%BB%E5%88%97%E4%B8%89%E9%83%A8+%E7%94%9F%E5%8C%964%E9%A2%84%E5%91%8A%E7%89%87')
    bdtest.save(dllist)

相比上一部分文章的Selenium档桃,優(yōu)點(diǎn)自然是再也不用那么慢的輸入文本了枪孩,也不用管它頁面有沒有跟上速度,但缺點(diǎn)卻依然還在藻肄!那就是萬惡的驗(yàn)證碼蔑舞!

不過!似乎百度網(wǎng)盤的客戶端并不需要驗(yàn)證碼嘹屯,于是又一個(gè)大膽的想法萌生了……

歡迎關(guān)注下一篇文章:
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(番外)Pywinauto操縱網(wǎng)盤客戶端批量離線下載
(番外篇)Python操縱網(wǎng)盤客戶端批量離線下載小電影

過往文章
網(wǎng)易云音樂評論抓取實(shí)驗(yàn)(1)接口獲取
Python自動(dòng)生成簡書過往文章鏈接Markdown格式文本
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(4)Cookies免登錄+抓包下載
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(3)Selenium離線下載
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(2)Scrapy深入 “打包員”“快遞員”
Python實(shí)現(xiàn)電影排行榜自動(dòng)網(wǎng)盤下載(1)Scrapy爬蟲框架

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攻询,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子州弟,更是在濱河造成了極大的恐慌钧栖,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆馁,死亡現(xiàn)場離奇詭異桐经,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浙滤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門阴挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纺腊,你說我怎么就攤上這事畔咧。” “怎么了揖膜?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵誓沸,是天一觀的道長。 經(jīng)常有香客問我壹粟,道長拜隧,這世上最難降的妖魔是什么宿百? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮洪添,結(jié)果婚禮上垦页,老公的妹妹穿的比我還像新娘。我一直安慰自己干奢,他們只是感情好痊焊,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忿峻,像睡著了一般薄啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛尚,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天垄惧,我揣著相機(jī)與錄音,去河邊找鬼绰寞。 笑死赘艳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的克握。 我是一名探鬼主播蕾管,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼菩暗!你這毒婦竟也來了掰曾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤停团,失蹤者是張志新(化名)和其女友劉穎旷坦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佑稠,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秒梅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌胶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捆蜀。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幔嫂,靈堂內(nèi)的尸體忽然破棺而出辆它,到底是詐尸還是另有隱情,我是刑警寧澤履恩,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布锰茉,位于F島的核電站,受9級特大地震影響切心,放射性物質(zhì)發(fā)生泄漏飒筑。R本人自食惡果不足惜片吊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望协屡。 院中可真熱鬧定鸟,春花似錦、人聲如沸著瓶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽材原。三九已至,卻和暖如春季眷,著一層夾襖步出監(jiān)牢的瞬間余蟹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工子刮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留威酒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓挺峡,卻偏偏與公主長得像葵孤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子橱赠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容