使用python實(shí)現(xiàn)微信小程序自動(dòng)簽到功能
功能描述目標(biāo)
完成多賬號(hào)微信小程序每天自動(dòng)簽到
輸出
簽到成功則向微信群發(fā)送簽到成功的信息否則提示用戶簽到失敗,需手動(dòng)簽到
包管理
requestsitchattimethreading
程序的結(jié)構(gòu)設(shè)計(jì)步驟1
獲取要發(fā)送的json數(shù)據(jù):地址
步驟2
向服務(wù)器發(fā)送請(qǐng)求
步驟3
根據(jù)服服務(wù)器響應(yīng)判斷簽到是否完成
步驟4
微信交互
代碼實(shí)現(xiàn)使用findler抓包工具查看請(qǐng)求類型
https://reserve.25team.com/wxappv1/yi/index?version=13
可以看到,該小程序使用的是https,因此可以使用python爬蟲來實(shí)現(xiàn)模擬用戶簽到的功能我們先對(duì)該url發(fā)送一次請(qǐng)求,查看服務(wù)器返回的內(nèi)容
import requestsdef request_h(url): headers = { 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla / 5.0', 'content-type': 'application / json', 'Referer': 'https: // servicewechat.com / wxd2bebfc67ee4a7eb / 45 / page - frame.html', # 設(shè)置token 'token': '可以再findler請(qǐng)求欄查看自己的token', 'Connection': 'keep - alive', 'Host': 'reserve.25team.com' } r = requests.get(url, headers=headers, json=json) return rif __name__ == ’__main__’: url = 'https://reserve.25team.com/wxappv1/yi/addReport' res = request_h(url) print(res.text)
在代碼當(dāng)中,最主要的部分是請(qǐng)求頭的設(shè)置,其中token尤為重要,它是服務(wù)器檢驗(yàn)用戶身份的一個(gè)重要手段,當(dāng)然它的功能不僅于此
什么是token
請(qǐng)求發(fā)出后,服務(wù)器返回內(nèi)容是一個(gè)json數(shù)據(jù),我們?cè)谛〕绦蛑兴吹降膬?nèi)容就是由這些json數(shù)據(jù)組成的,我們?cè)趯?shí)現(xiàn)簽到功能的時(shí)候,也是由客戶端向服務(wù)器發(fā)送一段json數(shù)據(jù),我們先來看看我們要發(fā)送的json數(shù)據(jù)的結(jié)構(gòu)
再次使用findler抓包,查看請(qǐng)求內(nèi)容
https:reserve.25team.com/wxappv1/y1/adReport
當(dāng)我們點(diǎn)擊信息上報(bào)的時(shí)候,實(shí)際上就是向上面的網(wǎng)站發(fā)送了一段json數(shù)據(jù),具體內(nèi)容如下
我們可以看到,客戶端是使用post請(qǐng)求發(fā)送數(shù)據(jù)的,在findler中點(diǎn)擊請(qǐng)求欄上面的JSON,就可以看到我們所發(fā)送的JSON數(shù)據(jù),如下:
# json = {'content':{'0':'否','1':'','2':'','3':'','4':'','5':'否','6':'否','7':'否','8':'正常','9':'37.2及以下','10':'陜西省延安市子長(zhǎng)市子長(zhǎng)市統(tǒng)計(jì)局政法大樓 經(jīng)緯度:109.67538,37.14258','11':'否','12':'','13':'','14':''},'version':13,'stat_content':{'今日是否在京':'否','今日是否在湖北?':'否','今日是否“密切接觸”疑似或確診人群?':'否','今日是否在集中隔離點(diǎn)隔離':'否','今日本人身體情況(多選)':'正常'},'location':{'province':'陜西省','country':'中國(guó)','city':'延安市','longitude':109.67538,'latitude':37.14258},'sick':'','accept_templateid':''}
這段json數(shù)據(jù)中,除地址以外,其他的數(shù)據(jù)都是服務(wù)器默認(rèn)填好的,因此我們?cè)诎l(fā)送數(shù)據(jù)時(shí),只需要改動(dòng)一下json數(shù)據(jù)當(dāng)中的location即可那么怎么獲取位置呢,騰訊給我我們提供了一個(gè)接口,我們可以使用這個(gè)接口查看自己的位置信息,代碼如下:
# 獲取定位信息的.pyimport requestsimport jsonurl = 'https://restapi.amap.com/v3/geocode/regeo?location=109.67538,37.14258&key=a0599c316b9533a47162b9044a64f659&extensions=base'headers = { 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla/5.0', 'content-type': 'application/json', 'Referer': 'https://servicewechat.com/wxd2bebfc67ee4a7eb/45/page-frame.html', 'Connection': 'keep-alive', 'Host': 'restapi.amap.com'}r = requests.get(url, headers=headers)print(r.json())
這里的url是我點(diǎn)擊小程序當(dāng)中的獲取當(dāng)前位置時(shí),使用findler抓包工具抓取的同樣,這個(gè)地址接口也向我們響應(yīng)了一個(gè)json數(shù)據(jù)
我們直接將返回的json數(shù)據(jù)插入到要發(fā)送的json數(shù)據(jù)中即可
使用多線程完成多用戶提交的功能
代碼如下
import requestsfrom threading import Threadimport timedef request_h(url,json,token): headers = { 'Accept-Encoding': 'gzip, deflate, br', 'User-Agent': 'Mozilla / 5.0', 'content-type': 'application / json', 'Referer': 'https: // servicewechat.com / wxd2bebfc67ee4a7eb / 45 / page - frame.html', 'token': token, 'Connection': 'keep - alive', 'Host': 'reserve.25team.com' } while True: r = requests.post(url, headers=headers, json=json) print(r.text) time.sleep(60*60*24)if __name__ == ’__main__’: url = ’https://reserve.25team.com/wxappv1/yi/addReport’ jsons = [{'content': {'0': '否', '1': '', '2': '', '3': '', '4': '', '5': '否', '6': '否', '7': '否', '8': '正常', '9': '37.2及以下', '10': '陜西省延安市子長(zhǎng)市子長(zhǎng)市統(tǒng)計(jì)局政法大樓 經(jīng)緯度:109.67538,37.14258', '11': '否', '12': '', '13': '', '14': ''}, 'version': 13, 'stat_content': {'今日是否在京': '否', '今日是否在湖北?': '否', '今日是否“密切接觸”疑似或確診人群?': '否', '今日是否在集中隔離點(diǎn)隔離': '否', '今日本人身體情況(多選)': '正常'}, 'location': {'province': '陜西省', 'country': '中國(guó)', 'city': '延安市', 'longitude': 109.67538, 'latitude': 37.14258}, 'sick': '', 'accept_templateid': ''}] tokens = ['eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjo1MjQzMSwiZXhwIjoxNjg1MDY2MTQ1LCJpc3MiOiJnaW4tYmxvZyJ9.2PB-82BkbgUI6pOzglN6oMP8KpiHJhmu8KF1iilWAgc'] threads = [] n = 0 for js in jsons: t = Thread(target=request_h, args=(url, js, tokens[n])) n += 1 t.start() threads.append(t) for t in threads: t.join()
其中,因?yàn)榉?wù)器根據(jù)token來分辨用戶,要注意token和json數(shù)據(jù)的一一對(duì)應(yīng)
使用itchat第三方庫(kù)實(shí)現(xiàn)微信自動(dòng)回復(fù)
因?yàn)槲⑿殴俜降脑?,有些用戶無法使用itchat來進(jìn)行自動(dòng)回復(fù),因此這部分代碼我就不寫了,大家可以再網(wǎng)上查到itchat文檔具體實(shí)現(xiàn)如下:
微信自動(dòng)登錄 根據(jù)服務(wù)器返回的json數(shù)據(jù)判斷是否簽到成功 簽到成功則在對(duì)應(yīng)群里發(fā)送成功標(biāo)志 簽到失敗則向文件傳輸助手發(fā)送失敗原因正好之前我在阿里云買了一年的服務(wù)器,可以將程序安裝到服務(wù)器上,再設(shè)置后臺(tái)運(yùn)行,這樣的話就可以實(shí)現(xiàn)每天自動(dòng)簽到了沒有服務(wù)器的話,大家可以將程序部署到自己的電腦上,但是因?yàn)槌绦蚝臅r(shí)較長(zhǎng),所以我不建議這么做
使用scp命令將程序發(fā)送到 遠(yuǎn)程 家目錄下的 Documents
scp -r app_sign.py root@47.105.49.126:/Documents
使用ssh命令打開遠(yuǎn)程服務(wù)器
這里不需要密碼是因?yàn)槲抑霸O(shè)置過免密登陸
如何設(shè)置免密登陸
ssh root@47.105.49.126
進(jìn)入到以下頁(yè)面說明連接成功了
可以看到我之前發(fā)送的.py文件已經(jīng)發(fā)送到了服務(wù)器目錄下
設(shè)置程序后臺(tái)運(yùn)行
nohup python3 app_sign.py > run.log 2>& 1
nohup是永久執(zhí)行的命令,如果疫情結(jié)束不需要簽到的話,需要使用kiil命令關(guān)閉進(jìn)程
OK,這就是整個(gè)程序的實(shí)現(xiàn)過程
到此這篇關(guān)于使用python實(shí)現(xiàn)微信小程序自動(dòng)簽到功能的文章就介紹到這了,更多相關(guān)python 微信小程序簽到內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
