Python簡(jiǎn)單實(shí)現(xiàn)微博自動(dòng)點(diǎn)贊
覺(jué)得微博手動(dòng)點(diǎn)贊太過(guò)麻煩?其實(shí)自動(dòng)點(diǎn)贊的實(shí)現(xiàn)并不困難!
本篇會(huì)有Cookie、session和token方面的知識(shí),不太了解的可以先看下
我們先通過(guò)前兩個(gè)小節(jié)大概了解一下我們Python登錄微博的原理,然后第三小節(jié)就會(huì)跟大家介紹微博自動(dòng)點(diǎn)贊的代碼。
目錄
一、實(shí)現(xiàn)登陸微博功能
首先進(jìn)入后按F12打開(kāi)開(kāi)發(fā)者工具,將如圖的按鈕點(diǎn)擊后,在瀏覽器中手動(dòng)登陸一次,在Network 標(biāo)簽的XHR類型中找到Login請(qǐng)求標(biāo)簽,在Form data下我們可以看到username(用戶名)和password(密碼),并知道了請(qǐng)求方式是POST,請(qǐng)求的參數(shù)有很多我們直接照搬就是。
「網(wǎng)頁(yè)截圖↓」 
這時(shí),可能學(xué)過(guò)一些爬蟲(chóng)的同學(xué)便會(huì)直接上手寫(xiě)出如上雷同的代碼,但發(fā)現(xiàn)出不來(lái)結(jié)果
「會(huì)報(bào)錯(cuò)的代碼↓」
import?requests
?
headers?=?{
???'user-agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like????Gecko)?Chrome/76.0.3809.132?Safari/537.36'
?}
login_data?=?{
???'username':?'你的用戶名',
???'password':?'你的密碼',
??'savestate':?'1',
??'r':?'https://m.weibo.cn/?jumpfrom=weibocom',
??'ec':?'0',
??'pagerefer':?'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
????'entry':?'mweibo',
??'wentry':?'',
??'loginfrom':?'',
??'client_id':?'',
??'code':?'',
??'qq':?'',
???'mainpageflag':?'1',
??'hff':?'',
??'hfp':?'',
?}
login_req?=?requests.post('https://passport.weibo.cn/sso/login',?data=login_data,?headers=headers)
print(login_req.status_code)
這是因?yàn)橛行┚W(wǎng)站并不只是按照’user-agent’判斷用戶的正常訪問(wèn)的。那我們還需點(diǎn)開(kāi)Request Headers(請(qǐng)求頭)檢查可能還有什么字段會(huì)用來(lái)判斷用戶正常訪問(wèn)
一般 referer(請(qǐng)求來(lái)源頁(yè)面)、origin(誰(shuí)發(fā)起的請(qǐng)求)、host(主機(jī)名及端口號(hào)) 字段也常被用于反爬蟲(chóng),當(dāng)我們的爬蟲(chóng)無(wú)法正常獲取數(shù)據(jù)時(shí),我們可以將請(qǐng)求頭里的這些字段照搬進(jìn)去試試。經(jīng)過(guò)驗(yàn)證,微博網(wǎng)頁(yè)是以referer 來(lái)判斷是否是用戶正常訪問(wèn)。最后我們還可以把Cookie放進(jìn)代碼里,這樣就不用在代碼里輸入賬號(hào)密碼了。
要注意Cookie并不是永久有效的,若發(fā)現(xiàn)自動(dòng)登錄失敗,可以重新上網(wǎng)頁(yè)把新的Cookie復(fù)制下來(lái)更換
「完整的代碼如下↓」
import?requests
headers?=?{
???'user-agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/76.0.3809.132?Safari/537.36',
???'referer':?'https://passport.weibo.cn/signin/login???entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
???'cookie':?'你的cookie'
?}
login_data?=?{
???'savestate':?'1',
???'r':?'https://m.weibo.cn/?jumpfrom=weibocom',
???'ec':?'0',
???'pagerefer':?'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
???'entry':?'mweibo',
???'wentry':?'',
???'loginfrom':?'',
???'client_id':?'',
???'code':?'',
???'qq':?'',
???'mainpageflag':?'1',
???'hff':?'',
???'hfp':?'',
?}
login_req?=?requests.post('https://passport.weibo.cn/sso/login',?data=login_data,?headers=headers)
print(login_req.status_code)?#輸出200則代表登錄成功
二、實(shí)現(xiàn)發(fā)送微博
既然都登陸微博了,我們先試試能不能順便發(fā)微博吧
同樣的,在微博編輯頁(yè)面點(diǎn)擊F12進(jìn)入開(kāi)發(fā)者工具,我們先試試發(fā)送一個(gè)微博,Network標(biāo)簽會(huì)出現(xiàn)什么新的內(nèi)容吧
「網(wǎng)頁(yè)截圖↓」 
當(dāng)微博界面點(diǎn)擊發(fā)送之后,Network標(biāo)簽就會(huì)出現(xiàn)update的請(qǐng)求,點(diǎn)進(jìn)去可以看到,請(qǐng)求地址是https://m.weibo.cn/api/statuses/update,請(qǐng)求方法是 POST。參數(shù)有兩個(gè)一個(gè)是content 也就是發(fā)送的微博內(nèi)容,另一個(gè)是st,這里的st通過(guò)幾次的檢驗(yàn),猜測(cè)應(yīng)該是網(wǎng)站的反爬蟲(chóng)措施。這里獲得st的方法是通過(guò)同為Network標(biāo)簽下的config請(qǐng)求,里面存放了st值,我們將 JSON 格式的字符串轉(zhuǎn)換為字典,然后取到 st 的值
「方法↓」
config_req?=?session.get('https://m.weibo.cn/api/config')
config?=?config_req.json()
st?=?config['data']['st']
print(st)???#每隔一段時(shí)間st值會(huì)改變
「登錄和發(fā)送微博的完整代碼如↓」
import?requests
headers?=?{
???'user-agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/76.0.3809.132?Safari/537.36',
???'referer':?'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
???'cookie':?'你的cookie'
?}
login_data?=?{
???'savestate':?'1',
???'r':?'https://m.weibo.cn/?jumpfrom=weibocom',
???'ec':?'0',
???'pagerefer':?'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
???'entry':?'mweibo',
???'wentry':?'',
???'loginfrom':?'',
???'client_id':?'',
???'code':?'',
???'qq':?'',
???'mainpageflag':?'1',
???'hff':?'',
???'hfp':?'',
?}
?
#?使用?session來(lái)保留登錄狀態(tài)
session?=?requests.Session()
session.headers.update(headers)
login_req?=?session.post('https://passport.weibo.cn/sso/login',?data=login_data)
#?獲取?st?請(qǐng)求
config_req?=?session.get('https://m.weibo.cn/api/config')
config?=?config_req.json()
st?=?config['data']['st']
compose_data?=?{
???'content':?input("請(qǐng)輸入發(fā)送的內(nèi)容:"),,
???'st':?st
}
compose_req?=?session.post('https://m.weibo.cn/api/statuses/update',?data=compose_data)
print(compose_req.json())?#?輸出:{'ok': 1, 'data':?省略部分內(nèi)容...}
「調(diào)整結(jié)構(gòu)后的代碼(功能一樣)如↓」
import?requests
class?WeiboSpider:
?def?__init__(self):
?????self.session?=?requests.Session()
?????self.headers?=?{
??????'user-agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/76.0.3809.132?Safari/537.36',
??????'referer':?'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
??????'cookie':?'你的Cookie'
????}
????self.session.headers.update(self.headers)
?def?login(self):
?????login_data?=?{
??????'savestate':?'1',
??????'r':?'https://m.weibo.cn/?jumpfrom=weibocom',
??????'ec':?'0',
??????'pagerefer':?'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
??????'entry':?'mweibo',
??????'wentry':?'',
??????'loginfrom':?'',
??????'client_id':?'',
??????'code':?'',
??????'qq':?'',
??????'mainpageflag':?'1',
??????'hff':?'',
??????'hfp':?'',
?}
?self.session.post('https://passport.weibo.cn/sso/login',?data=login_data)
?def?get_st(self):
?????config_req?=?self.session.get('https://m.weibo.cn/api/config')
?????config?=?config_req.json()
?????st?=?config['data']['st']
?????return?st
??def?compose(self,?content):
?????compose_data?=?{
??????'content':?content,
??????'st':?self.get_st()
????}
????compose_req?=?self.session.post('https://m.weibo.cn/api/statuses/update',?data=compose_data)
????print(compose_req.json())
??def?send(self,?content):
?????self.login()
?????self.compose(content)
weibo?=?WeiboSpider()
weibo.send(input("請(qǐng)輸入發(fā)送的內(nèi)容:"))
三、實(shí)現(xiàn)微博自動(dòng)點(diǎn)贊
完整的代碼↓
import?requests
class?WeiboSpider:
??def?__init__(self):
????self.session?=?requests.Session()
????self.headers?=?{
??????'user-agent':?'Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_13_6)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/76.0.3809.132?Safari/537.36',
??????'referer':?'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom',
??????'cookie':?'你的cookie'
????}
????self.session.headers.update(self.headers)
??def?login(self):
????login_data?=?{
??????'savestate':?'1',
??????'r':?'https://m.weibo.cn/?jumpfrom=weibocom',
??????'ec':?'0',
??????'pagerefer':?'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom',
??????'entry':?'mweibo',
??????'wentry':?'',
??????'loginfrom':?'',
??????'client_id':?'',
??????'code':?'',
??????'qq':?'',
??????'mainpageflag':?'1',
??????'hff':?'',
??????'hfp':?'',
????}
????self.session.post('https://passport.weibo.cn/sso/login',?data=login_data)
??def?get_st(self):
????config_req?=?self.session.get('https://m.weibo.cn/api/config')
????config?=?config_req.json()
????st?=?config['data']['st']
????return?st
??def?compose(self,?content):
????compose_data?=?{
??????'content':?content,
??????'st':?self.get_st()
????}
????compose_req?=?self.session.post('https://m.weibo.cn/api/statuses/update',?data=compose_data)
????print(compose_req.json())
??def?send(self,?content):
????self.login()
????self.compose(content)
??#?獲取微博列表
??def?get_weibo_list(self):
????params?=?{
??????'type':?'uid',
??????'value':?'2139359753',?
??????'containerid':?'1076032139359753'
????}
????weibo_list_req?=?self.session.get('https://m.weibo.cn/api/container/getIndex',?params=params)
????weibo_list_data?=?weibo_list_req.json()
????weibo_list?=?weibo_list_data['data']['cards']
????return?weibo_list
??#?點(diǎn)贊微博
??def?vote_up(self,?id):
????vote_up_data?=?{
??????'id':?id,??#?要點(diǎn)贊的微博?id
??????'attitude':?'heart',
??????'st':?self.get_st()
????}
????vote_up_req?=?self.session.post('https://m.weibo.cn/api/attitudes/create',?data=vote_up_data)
????json?=?vote_up_req.json()
????print(json['msg'])
??#?批量點(diǎn)贊微博
??def?vote_up_all(self):
????self.login()
????weibo_list?=?self.get_weibo_list()
????for?i?in?weibo_list:
??????#?card_type?為?9?是正常微博
??????if?i['card_type']?==?9:
????????self.vote_up(i['mblog']['id'])
weibo?=?WeiboSpider()
weibo.vote_up_all()
謝謝大家,Python的分享就到此為止,以后如果有好玩的Python程序,我還會(huì)繼續(xù)向大家分享的。
