使用python實現(xiàn)微信小程序自動簽到功能
功能描述目標
完成多賬號微信小程序每天自動簽到
輸出
簽到成功則向微信群發(fā)送簽到成功的信息
否則提示用戶簽到失敗,需手動簽到
包管理
requests
itchat
time
threading
程序的結(jié)構(gòu)設(shè)計步驟1
獲取要發(fā)送的json數(shù)據(jù):地址
步驟2
向服務(wù)器發(fā)送請求
步驟3
根據(jù)服服務(wù)器響應(yīng)判斷簽到是否完成
步驟4
微信交互
代碼實現(xiàn)使用findler抓包工具查看請求類型
https://reserve.25team.com/wxappv1/yi/index?version=13
可以看到,該小程序使用的是https,因此可以使用python爬蟲來實現(xiàn)模擬用戶簽到的功能
我們先對該url發(fā)送一次請求,查看服務(wù)器返回的內(nèi)容
import requests
def 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請求欄查看自己的token",
"Connection": "keep - alive",
"Host": "reserve.25team.com"
}
r = requests.get(url, headers=headers, json=json)
return r
if __name__ == '__main__':
url = "https://reserve.25team.com/wxappv1/yi/addReport"
res = request_h(url)
print(res.text)在代碼當中,最主要的部分是請求頭的設(shè)置,其中token尤為重要,它是服務(wù)器檢驗用戶身份的一個重要手段,當然它的功能不僅于此
什么是token
請求發(fā)出后,服務(wù)器返回內(nèi)容是一個json數(shù)據(jù),我們在小程序中所看到的內(nèi)容就是由這些json數(shù)據(jù)組成的,我們在實現(xiàn)簽到功能的時候,也是由客戶端向服務(wù)器發(fā)送一段json數(shù)據(jù),我們先來看看我們要發(fā)送的json數(shù)據(jù)的結(jié)構(gòu)
再次使用findler抓包,查看請求內(nèi)容
https:reserve.25team.com/wxappv1/y1/adReport
當我們點擊信息上報的時候,實際上就是向上面的網(wǎng)站發(fā)送了一段json數(shù)據(jù),具體內(nèi)容如下

我們可以看到,客戶端是使用post請求發(fā)送數(shù)據(jù)的,在findler中點擊請求欄上面的JSON,就可以看到我們所發(fā)送的JSON數(shù)據(jù),如下:
# json = {"content":{"0":"否","1":"","2":"","3":"","4":"","5":"否","6":"否","7":"否","8":"正常","9":"37.2及以下","10":"陜西省延安市子長市子長市統(tǒng)計局政法大樓 經(jīng)緯度:109.67538,37.14258","11":"否","12":"","13":"","14":""},"version":13,"stat_content":{"今日是否在京":"否","今日是否在湖北?":"否","今日是否“密切接觸”疑似或確診人群?":"否","今日是否在集中隔離點隔離":"否","身體情況(多選)":"正常"},"location":{"province":"陜西省","country":"中國","city":"延安市","longitude":109.67538,"latitude":37.14258},"sick":"","accept_templateid":""}
這段json數(shù)據(jù)中,除地址以外,其他的數(shù)據(jù)都是服務(wù)器默認填好的,因此我們在發(fā)送數(shù)據(jù)時,只需要改動一下json數(shù)據(jù)當中的location即可
那么怎么獲取位置呢,騰訊給我我們提供了一個接口,我們可以使用這個接口查看自己的位置信息,代碼如下:
# 獲取定位信息的.py
import requests
import json
url = "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是我點擊小程序當中的獲取當前位置時,使用findler抓包工具抓取的
同樣,這個地址接口也向我們響應(yīng)了一個json數(shù)據(jù)

我們直接將返回的json數(shù)據(jù)插入到要發(fā)送的json數(shù)據(jù)中即可
使用多線程完成多用戶提交的功能
代碼如下
import requests
from threading import Thread
import time
def 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": "陜西省延安市子長市子長市統(tǒng)計局政法大樓 經(jīng)緯度:109.67538,37.14258", "11": "否", "12": "",
"13": "", "14": ""}, "version": 13,
"stat_content": {"今日是否在京": "否", "今日是否在湖北?": "否", "今日是否“密切接觸”疑似或確診人群?": "否", "今日是否在集中隔離點隔離": "否",
"身體情況(多選)": "正常"},
"location": {"province": "陜西省", "country": "中國", "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()其中,因為服務(wù)器根據(jù)token來分辨用戶,要注意token和json數(shù)據(jù)的一一對應(yīng)
使用itchat第三方庫實現(xiàn)微信自動回復
因為微信官方的原因,有些用戶無法使用itchat來進行自動回復,因此這部分代碼我就不寫了,大家可以再網(wǎng)上查到itchat文檔
具體實現(xiàn)如下:
- 微信自動登錄
- 根據(jù)服務(wù)器返回的json數(shù)據(jù)判斷是否簽到成功
- 簽到成功則在對應(yīng)群里發(fā)送成功標志
- 簽到失敗則向文件傳輸助手發(fā)送失敗原因
正好之前我在阿里云買了一年的服務(wù)器,可以將程序安裝到服務(wù)器上,再設(shè)置后臺運行,這樣的話就可以實現(xiàn)每天自動簽到了
沒有服務(wù)器的話,大家可以將程序部署到自己的電腦上,但是因為程序耗時較長,所以我不建議這么做
使用scp命令將程序發(fā)送到 遠程 家目錄下的 Documents
scp -r app_sign.py root@47.105.49.126:/Documents
使用ssh命令打開遠程服務(wù)器
這里不需要密碼是因為我之前設(shè)置過免密登陸
如何設(shè)置免密登陸
進入到以下頁面說明連接成功了

可以看到我之前發(fā)送的.py文件已經(jīng)發(fā)送到了服務(wù)器目錄下

設(shè)置程序后臺運行
nohup python3 app_sign.py > run.log 2>& 1
nohup是永久執(zhí)行的命令,如果疫情結(jié)束不需要簽到的話,需要使用kiil命令關(guān)閉進程
OK,這就是整個程序的實現(xiàn)過程
到此這篇關(guān)于使用python實現(xiàn)微信小程序自動簽到功能的文章就介紹到這了,更多相關(guān)python 微信小程序簽到內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python獲取本機所有網(wǎng)卡ip,掩碼和廣播地址實例代碼
這篇文章主要介紹了Python獲取本機所有網(wǎng)卡ip,掩碼和廣播地址實例代碼,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01

