php微信获取mediaid超出限制_Python实现每日微信自动打卡
眾所周知,因?yàn)橐咔榈脑?#xff0c;很多高校和公司都要求員工每日在微信上進(jìn)行打卡,來(lái)匯報(bào)自己的當(dāng)前身體狀態(tài)和所處地區(qū)。但絕大多數(shù)情況下,每天打卡的信息其實(shí)是不會(huì)變的,我們要做的就是進(jìn)入公眾號(hào)——自動(dòng)登錄點(diǎn)進(jìn)打卡頁(yè)面——完成打卡,這樣重復(fù)的操作。
這樣的操作在手機(jī)上需要花費(fèi)的時(shí)間應(yīng)該不足一分鐘,但依舊每天都會(huì)有懶得或者忘了進(jìn)行操作的人。所以就想到能不能用python寫一個(gè)腳本,在PC端進(jìn)行自動(dòng)打卡呢。
(本操作僅提供思路參考,大家還是要重視防疫打卡操作)
以下所有操作均以某高校頁(yè)面為例
1.代碼前準(zhǔn)備
由于微信的普及,所以基本各高校和公司每日打卡都是在微信端進(jìn)行,所以我們需要通過(guò)微信找到我們的登錄頁(yè)。
公眾號(hào)進(jìn)入打卡頁(yè)面選擇復(fù)制鏈接地址我們最終希望用Requests模擬發(fā)包登錄,而平時(shí)都是直接用微信進(jìn)行自動(dòng)登錄。顯然在只用腳本的情況下沒(méi)辦法實(shí)現(xiàn)微信自動(dòng)登錄跳轉(zhuǎn),所以我們需要先找到能輸入賬號(hào)密碼的頁(yè)面。(此時(shí)沒(méi)有用Cookie是因?yàn)閷?shí)驗(yàn)之后發(fā)現(xiàn),Cookie有效期不到2小時(shí),沒(méi)辦法支撐每日用同一個(gè)Cookie登錄打卡)
此時(shí),我們通過(guò)PC微信找到該鏈接:http://****app.i****.info/NYDXY/#/,但是如果直接用瀏覽器打開該鏈接,會(huì)跳轉(zhuǎn)”請(qǐng)用微信客戶端打開鏈接“的頁(yè)面。
直接用瀏覽器打開出錯(cuò)因此,需要想辦法繞過(guò)該限制,思路有兩個(gè):1.通過(guò)Fiddler等抓包軟件,找找有沒(méi)有其他登錄頁(yè)面。2.模擬微信瀏覽器的請(qǐng)求頭和Cookie進(jìn)入。但是正如前文所說(shuō),經(jīng)過(guò)嘗試思路2,確實(shí)能夠完成全流程,但該頁(yè)面Cookie有效期很短,沒(méi)辦法每日均進(jìn)行自動(dòng)打卡,因此我們選擇嘗試思路1,還是通過(guò)賬號(hào)密碼登錄。
沿著思路1,我們打開Fiddler,啟動(dòng)抓包。然后回到PC微信,和剛才同樣的操作進(jìn)入打卡頁(yè)面自動(dòng)登錄,再回到Fiddler,發(fā)現(xiàn)剛才進(jìn)入打卡頁(yè)面的所有操作已經(jīng)被記錄在軟件里了。接下來(lái)就是通過(guò)url和請(qǐng)求頭等信息,來(lái)判斷是否存在其他的登錄頁(yè)面。
紅框所示為抓包所得經(jīng)過(guò)分析和嘗試,前兩個(gè)鏈接都會(huì)提示400或其他錯(cuò)誤,但嘗試到第三個(gè)鏈接https://authserver.******.edu.cn/authserver/login時(shí),會(huì)跳轉(zhuǎn)到學(xué)校的統(tǒng)一登陸頁(yè)面,同時(shí)還在下方發(fā)現(xiàn)微信快捷登錄圖表。通過(guò)該頁(yè)面輸入賬號(hào)密碼后,瀏覽器自動(dòng)跳轉(zhuǎn)到了我們所需的打卡頁(yè)面了。此時(shí),我們實(shí)現(xiàn)了PC端模擬登錄微信打卡頁(yè)面。
統(tǒng)一登錄頁(yè)面瀏覽器成功登入打卡頁(yè)面第二步,我們需要看我們打卡到底在瀏覽器端是如何完成的。在手動(dòng)進(jìn)行打卡操作之后,經(jīng)過(guò)瀏覽器的F12,看到有四個(gè)php提供了post操作,而通常我們的表單數(shù)據(jù)都是由post方法完成的。排除掉之前就存在的第一二個(gè)php,所以我們強(qiáng)烈懷疑就是通過(guò)這剩余兩個(gè)php完成的打卡操作。
具體來(lái)看發(fā)現(xiàn),最后一個(gè)jump.php實(shí)際上返回的是個(gè)人基本信息,以供自動(dòng)填充用的,提交的表單也與打卡無(wú)關(guān)。
最后的jump.php返回的結(jié)果但到了倒數(shù)第二個(gè)jump.php,通過(guò)其提交的Form數(shù)據(jù),我們發(fā)現(xiàn)就是通過(guò)這個(gè)php我們完成了打卡操作。因此,我們最終的目標(biāo),就是通過(guò)該php來(lái)完成我們的自動(dòng)打卡。至此,我們的代碼前分析全部完成,接下來(lái)進(jìn)入代碼環(huán)節(jié)。
倒數(shù)第二個(gè)php提交的表單2.代碼實(shí)現(xiàn)(Cookie+純r(jià)equests版本)
( 本文使用requests包進(jìn)行python代碼實(shí)現(xiàn)。)
因?yàn)槲覀円呀?jīng)通過(guò)瀏覽器進(jìn)行過(guò)登錄,獲得了Cookie,所以我們先嘗試通過(guò)Cookie進(jìn)行直接打卡。先通過(guò)瀏覽器F12獲得Cookie和其余請(qǐng)求頭,然后根據(jù)需要放在Python文件中。(這里的請(qǐng)求頭大家可以選擇需要的來(lái)放,一般加上Cookie和User-Agent即可,如果失敗還可以嘗試將User-Agent換為Android或ios的模擬請(qǐng)求)
右側(cè)為請(qǐng)求頭headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36','Cookie': '瀏覽器上找到的Cookie' }然后再根據(jù)From Data的數(shù)據(jù),按照字典格式一一放進(jìn)Python文件中去。
From Data數(shù)據(jù)Python文件格式最后再嘗試post即可。發(fā)現(xiàn)最后返回值和瀏覽器返回值相同,打卡成功。
Python返回值瀏覽器返回值3.代碼實(shí)現(xiàn)(賬號(hào)密碼+Selenium+Requests版本)
前文已經(jīng)實(shí)現(xiàn)在知道Cookie的前提下,可以直接通過(guò)固定php頁(yè)面進(jìn)行表單上傳打卡。但是由于Cookie有效期極短,所以我們明顯需要有一個(gè)每次打卡前自動(dòng)獲取Cookie的方法。
回到一開始的Login頁(yè)面,同樣我們通過(guò)F12抓包,看每次登錄時(shí)提交的表單具體值有些什么。在用戶名和密碼,我們嘗試性的輸入123456之后點(diǎn)擊提交,會(huì)發(fā)現(xiàn)在login文件下會(huì)POST一個(gè)表單,里面所包含的就是每次登錄要傳給服務(wù)器的信息了。
登錄信息但是從表單我們看到,除了我們填寫的賬號(hào)密碼,還有包括lt,execution等信息。經(jīng)過(guò)查找,我們發(fā)現(xiàn)這些信息是在加載網(wǎng)頁(yè)時(shí)就自動(dòng)生成的,所以我們可以通過(guò)request.session()的方法進(jìn)入頁(yè)面后,再通過(guò)正則表達(dá)式將所需信息找出來(lái),和賬號(hào)密碼一起形成表單。
頁(yè)面隱藏的元素但是我們還可以看到,password明顯是經(jīng)過(guò)加密處理后的信息,所以我們不能直接明文提交密碼,要想辦法將密碼進(jìn)行處理。而這個(gè)加密后的密碼,是我們點(diǎn)擊提交后網(wǎng)頁(yè)自動(dòng)將我們的明文密碼進(jìn)行的加密,所以大概率就是一個(gè)js的處理,因此需要找到網(wǎng)頁(yè)上加密的js文件。查找login頁(yè)面和js之后,最終找到是encrypt.js這個(gè)文件完成了明文密碼的加密。
加密js按邏輯來(lái)說(shuō),我們此時(shí)就可以查找傳遞該js所需參數(shù),得到加密后的密碼,連同其他信息一起post給login就可以完成我們的登錄和cookie獲取了。但是這個(gè)js真是又長(zhǎng)又混淆,以現(xiàn)在的水平暫時(shí)不能找到其所需參數(shù)。所以換了個(gè)思路,通過(guò)Selenium來(lái)模擬登錄,直接獲取Cookie。
(這里如果可以看懂這個(gè)js加密的話,是完全可以不依靠Selenium獲取Cookie的,大家有興趣可以嘗試一下)
Selenium就比較簡(jiǎn)單了,通過(guò)分析登錄頁(yè)面,找到需要Input的地方,獲取Xpath,再通過(guò)Selenium填寫,并獲取Cookie就可以了。
通過(guò)F12得到元素的Xpathdef get_cookie(url_, user_):driver = webdriver.Chrome()driver.get(url_)driver.find_element_by_xpath('//*[@id="username"]').send_keys(user_['name'])driver.find_element_by_xpath('//*[@id="password"]').send_keys(user_['password'])driver.find_element_by_xpath('//*[@id="casLoginForm"]/p[4]/button').click()sleep(3)cookie_ = driver.get_cookies()[0]driver.quit()return cookie_['name']+'='+cookie_['value']獲取cookie后,和之前操作相同,提交表單即可,完整代碼如下。
import requests from selenium import webdriver from time import sleepdef get_cookie(url_, user_):driver = webdriver.Chrome()driver.get(url_)driver.find_element_by_xpath('//*[@id="username"]').send_keys(user_['name'])driver.find_element_by_xpath('//*[@id="password"]').send_keys(user_['password'])driver.find_element_by_xpath('//*[@id="casLoginForm"]/p[4]/button').click()sleep(2)cookie_ = driver.get_cookies()[0]driver.quit()return cookie_['name']+'='+cookie_['value']user = {'name': ******', 'password': '******'} cookie = get_cookie('https://authserver.******.edu.cn/authserver/login?service=http://s******app.i******.info/jinzhi/index.php', user)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36','Cookie': cookie }data = {'mymethod': 'POST','myurl': '','id': '','t1': '否','t2': '','t3': '否','stsfyc': '否','stsfycxq': '','dqszdpro': '','dqszdcity': '','dqszdreg': '','sfdgyq': '否','dgyqqt': '[]' }url = 'http://******app.i******.info/jinzhi/jump.php' s = requests.session() response = s.post(url=url, headers=headers, data=data) html = response.text print(html)4.總結(jié)
其實(shí)在類似需求中,代碼部分相對(duì)而言占比更少,重要的地方在于找到提交的表單數(shù)據(jù)和頁(yè)面鏈接
總結(jié)
以上是生活随笔為你收集整理的php微信获取mediaid超出限制_Python实现每日微信自动打卡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 梦三国之暖男事务所剧情介绍
- 下一篇: 无限流量卡多少钱一张啊?
