php微信獲取mediaid超出限制_Python實現每日微信自動打卡

9736e6148aad509b6fad3897f89ed6bf.png

眾所周知,因為疫情的原因,很多高校和公司都要求員工每日在微信上進行打卡,來匯報自己的當前身體狀態和所處地區。但絕大多數情況下,每天打卡的信息其實是不會變的,我們要做的就是進入公眾號——自動登錄點進打卡頁面——完成打卡,這樣重復的操作。

這樣的操作在手機上需要花費的時間應該不足一分鐘,但依舊每天都會有懶得或者忘了進行操作的人。所以就想到能不能用python寫一個腳本,在PC端進行自動打卡呢。

(本操作僅提供思路參考,大家還是要重視防疫打卡操作)

以下所有操作均以某高校頁面為例


1.代碼前準備

由于微信的普及,所以基本各高校和公司每日打卡都是在微信端進行,所以我們需要通過微信找到我們的登錄頁。

360b9e382ff3f280d8fa74e08402f438.png
公眾號進入打卡頁面

ae6c9e8fa8d6c2742865350654549726.png
選擇復制鏈接地址

我們最終希望用Requests模擬發包登錄,而平時都是直接用微信進行自動登錄。顯然在只用腳本的情況下沒辦法實現微信自動登錄跳轉,所以我們需要先找到能輸入賬號密碼的頁面。(此時沒有用Cookie是因為實驗之后發現,Cookie有效期不到2小時,沒辦法支撐每日用同一個Cookie登錄打卡)

此時,我們通過PC微信找到該鏈接:http://****app.i****.info/NYDXY/#/,但是如果直接用瀏覽器打開該鏈接,會跳轉”請用微信客戶端打開鏈接“的頁面。

c6ff073ff37b96e38b37fa78138b1c62.png
直接用瀏覽器打開出錯

因此,需要想辦法繞過該限制,思路有兩個:1.通過Fiddler等抓包軟件,找找有沒有其他登錄頁面。2.模擬微信瀏覽器的請求頭和Cookie進入。但是正如前文所說,經過嘗試思路2,確實能夠完成全流程,但該頁面Cookie有效期很短,沒辦法每日均進行自動打卡,因此我們選擇嘗試思路1,還是通過賬號密碼登錄。

沿著思路1,我們打開Fiddler,啟動抓包。然后回到PC微信,和剛才同樣的操作進入打卡頁面自動登錄,再回到Fiddler,發現剛才進入打卡頁面的所有操作已經被記錄在軟件里了。接下來就是通過url和請求頭等信息,來判斷是否存在其他的登錄頁面。

e312574a9db59e3af3fe847638fe0395.png
紅框所示為抓包所得

經過分析和嘗試,前兩個鏈接都會提示400或其他錯誤,但嘗試到第三個鏈接https://authserver.******.edu.cn/authserver/login時,會跳轉到學校的統一登陸頁面,同時還在下方發現微信快捷登錄圖表。通過該頁面輸入賬號密碼后,瀏覽器自動跳轉到了我們所需的打卡頁面了。此時,我們實現了PC端模擬登錄微信打卡頁面。

5e9cd211cadf8a89d31b6088138b287c.png
統一登錄頁面

20e75a98b387c2630346dfab4a202a00.png
瀏覽器成功登入打卡頁面

第二步,我們需要看我們打卡到底在瀏覽器端是如何完成的。在手動進行打卡操作之后,經過瀏覽器的F12,看到有四個php提供了post操作,而通常我們的表單數據都是由post方法完成的。排除掉之前就存在的第一二個php,所以我們強烈懷疑就是通過這剩余兩個php完成的打卡操作。

83d4daac459a9a32aef92d45a8d9e92f.png

具體來看發現,最后一個jump.php實際上返回的是個人基本信息,以供自動填充用的,提交的表單也與打卡無關。

16eeb1725c12639594c32e280d7933e8.png
最后的jump.php返回的結果

但到了倒數第二個jump.php,通過其提交的Form數據,我們發現就是通過這個php我們完成了打卡操作。因此,我們最終的目標,就是通過該php來完成我們的自動打卡。至此,我們的代碼前分析全部完成,接下來進入代碼環節。

39217fd595ecaf758d489ee4f1cb9724.png
倒數第二個php提交的表單

2.代碼實現(Cookie+純requests版本)

( 本文使用requests包進行python代碼實現。)

因為我們已經通過瀏覽器進行過登錄,獲得了Cookie,所以我們先嘗試通過Cookie進行直接打卡。先通過瀏覽器F12獲得Cookie和其余請求頭,然后根據需要放在Python文件中。(這里的請求頭大家可以選擇需要的來放,一般加上Cookie和User-Agent即可,如果失敗還可以嘗試將User-Agent換為Android或ios的模擬請求)

b4ef69b2817642243133fe1bb778538d.png
右側為請求頭
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'
}

然后再根據From Data的數據,按照字典格式一一放進Python文件中去。

ca7e3b088163cc46fa7ae9d13754a2aa.png
From Data數據

98c5100cb5b02819c9798a05e03f06df.png
Python文件格式

最后再嘗試post即可。發現最后返回值和瀏覽器返回值相同,打卡成功。

c60ac4fd473b6c6bdbf403eb0fe34738.png
Python返回值

cc9c6cf7c6a0529b28cf718d009230e4.png
瀏覽器返回值

3.代碼實現(賬號密碼+Selenium+Requests版本)

前文已經實現在知道Cookie的前提下,可以直接通過固定php頁面進行表單上傳打卡。但是由于Cookie有效期極短,所以我們明顯需要有一個每次打卡前自動獲取Cookie的方法。

回到一開始的Login頁面,同樣我們通過F12抓包,看每次登錄時提交的表單具體值有些什么。在用戶名和密碼,我們嘗試性的輸入123456之后點擊提交,會發現在login文件下會POST一個表單,里面所包含的就是每次登錄要傳給服務器的信息了。

38ae2ac80a5606a4c1ddb26761e960fd.png
登錄信息

但是從表單我們看到,除了我們填寫的賬號密碼,還有包括lt,execution等信息。經過查找,我們發現這些信息是在加載網頁時就自動生成的,所以我們可以通過request.session()的方法進入頁面后,再通過正則表達式將所需信息找出來,和賬號密碼一起形成表單。

5e3e09ad40d78da70abf4b45e6265293.png
頁面隱藏的元素

但是我們還可以看到,password明顯是經過加密處理后的信息,所以我們不能直接明文提交密碼,要想辦法將密碼進行處理。而這個加密后的密碼,是我們點擊提交后網頁自動將我們的明文密碼進行的加密,所以大概率就是一個js的處理,因此需要找到網頁上加密的js文件。查找login頁面和js之后,最終找到是encrypt.js這個文件完成了明文密碼的加密。

80cbb177a3f88738250615dc1418b94a.png
加密js

按邏輯來說,我們此時就可以查找傳遞該js所需參數,得到加密后的密碼,連同其他信息一起post給login就可以完成我們的登錄和cookie獲取了。但是這個js真是又長又混淆,以現在的水平暫時不能找到其所需參數。所以換了個思路,通過Selenium來模擬登錄,直接獲取Cookie。

(這里如果可以看懂這個js加密的話,是完全可以不依靠Selenium獲取Cookie的,大家有興趣可以嘗試一下)

Selenium就比較簡單了,通過分析登錄頁面,找到需要Input的地方,獲取Xpath,再通過Selenium填寫,并獲取Cookie就可以了。

637a6387d858db6bbc9d8b15bfc8b505.png
通過F12得到元素的Xpath
def 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.總結

其實在類似需求中,代碼部分相對而言占比更少,重要的地方在于找到提交的表單數據和頁面鏈接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379019.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[原創]INI文件的讀寫操作

INI文件的讀寫操作在程序開發中,很多人會把參數保存為ini文件格式,ini文件的一個好處是可以保存為一個結構體主結構,如 [User] Nametest UserIdtest [Server] ServerIp127.0.0.1 ServerPort80 …… 很方便也很容易區分,而且不同節…

Java ResourceBundle keySet()方法及示例

ResourceBundle類keySet()方法 (ResourceBundle Class keySet() method) keySet() method is available in java.util package. keySet()方法在java.util包中可用。 keySet() method is used to get all the existing keys from this ResourceBundle and its super bundles to …

ffplay 分析(音頻從Frame(解碼后)隊列取數據到SDL輸出)

《ffplay的數據結構分析》 《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay分析 (視頻從Frame(解碼后)隊列取數據到…

緒論(一)

一、問題驅動—>畫出唯一的邏輯結構—>定義存儲結構—>實現相應的操作 二、算法—>(定義\特點)步驟—>實現—>評價標準 算法有五大特點: 可行性確定性有窮性(有限性)0個或0個以上的輸入至少一個以上的輸出 評價標準: 時間復雜度 …

利用 dbghelp.dll 生成 dump 文件

dbghelp.dll windows的系統目錄system32下,都有dbghelp.dll,但在實際使用時,往往會讓exe加載自己目錄下的dll,以避免系統目錄下的dll版本不一導致的程序異常。 故一般都是用LoadLibrary()的方式加載Dll,先加載當前目錄…

pandas 根據列名索引多列數據_Pandas 數據聚合與分組運算[groupby+apply]速查筆記

利用Pandas將數據進行分組,并將各組進行聚合或自定義函數處理。Pandas中Groupby分組與聚合過程導入模塊import pandas as pd縮寫df表示Dataframe對象分組df.groupby(col1): 根據col1列將df全部列分組(默認:axis0行)df[…

殺毒軟件對InstallShield編譯過程以及安裝包運行的影響

版權聲明: 可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息。在某些情況下,殺毒軟件會導致InstallShield編譯過程崩潰。比如 McAfee VirusScan Enterprise 8.5.0i版本,在某些情況下會在InstallScript工程編譯過程中,將ISSe…

Java FileInputStream close()方法與示例

FileInputStream類close()方法 (FileInputStream Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this FileInputStream and free all system resources linked with this stream. c…

ffplay分析 (視頻從Frame(解碼后)隊列取數據到SDL輸出)

《ffplay的數據結構分析》 《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay 分析(音頻從Frame(解碼后)隊列取數據到…

線性結構節點類型(三)

一、線性結構 特點 第一個數據元素沒有前驅最后一個數據元素沒有后繼1:1邏輯上相鄰、物理上也相鄰 類型 線性表(就是一張二維表)(為主研究對象)棧隊列 學習方法 畫邏輯結構—>定義存儲結構—>實現相應的操作 二、線性表 線性結構 邏輯上的1:1存儲結構 順序存儲結…

PL/SQL詳細介紹

PL/SQL筆記PL/SQL塊中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事務控制語句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DDL語句(CREATE,ALTER,DROP)和DCL語句(GRANT,REVOKE) 1.檢索單行數據 1.1使用標量變量接受數據 v_ename emp.ename%type; v_sal emp.sal%…

redis 備份導出rdb_Redis數據遷移利器之redisshake

“當需要進行Redis實例或集群數據遷移時,我們可以采用導出/導入的方式進行數據遷移,但當需要做數據異地災備或雙活時,再使用傳統的方式就不合適了,我們需要借助工具(如redis-port/redis-shake)來完成。”redis-shake介紹redis-sha…

從Live Space搬家到這里

聽說Live Space很快要關閉了,所以從http://peking2toronto.spaces.live.com/搬家到這里。轉載于:https://www.cnblogs.com/pentest/archive/2010/08/29/1811726.html

java 方法 示例_Java Collectionsfrequency()方法與示例

java 方法 示例集合類的frequency()方法 (Collections Class frequency() method) frequency() method is available in java.util package. frequency()方法在java.util包中可用。 frequency() method is used to return the frequency of the given Object (obj) to the give…

線性結構常規操作(四)

定義存儲結構(以單向鏈表為主) 對于鏈表的定義,通過結構體進行定義,包括兩部分,一是數據域,另一個就是指針,用于指向下一個節點。 1,創建鏈表 定義鏈表: struct nodesq{int data;//數據域&a…

ffplay分析 (暫停 / 播放處理)

《ffplay的數據結構分析》 《ffplay分析(從啟動到讀取線程的操作)》 《ffplay分析(視頻解碼線程的操作)》 《ffplay分析(音頻解碼線程的操作)》 《ffplay 分析(音頻從Frame(解碼后)隊列取數據到…

源碼 狀態機_[源碼閱讀] 阿里SOFA服務注冊中心MetaServer(1)

[源碼閱讀] 阿里SOFA服務注冊中心MetaServer(1)0x00 摘要0x01 服務注冊中心1.1 服務注冊中心簡介1.2 SOFARegistry 總體架構1.3 為什么要分層0x02 MetaServer2.1簡介2.2 問題0x03 代碼結構0x04 啟動運行4.1 集成部署4.2 獨立部署0x05 總體邏輯5.1 程序主體5.2 配置0x06 啟動6.1…

HttpService遠程校驗

今天學了下HttpService,和大家分享一下。HttpService是用來讀取遠程數據的一個對象,數據格式為XML。 我做了一個登陸校驗的功能,主要是通過HttpService將服務器端的用戶數據得到,然后在客戶端判斷輸入的用戶名和密碼是否存在。 主…

免費開源FTP Server軟件FileZilla Server

很多朋友在實際應用中都可能需要用到FTP Server類的軟件,這類軟件有很多,比較知名的有Serv-U、G6等,這里向大家介紹一下FileZilla Server,Windows平臺下一款不錯的FTP Server軟件,而且是免費的、開源的。 S…

Java BigDecimal floatValue()方法與示例

BigDecimal類floatValue()方法 (BigDecimal Class floatValue() method) floatValue() method is available in java.math package. floatValue()方法在java.math包中可用。 floatValue() method is used to convert a BigDecimal to a float value and when this BigDecimal m…