使用python实现微信小程序自动签到2.0

您所在的位置:网站首页 自动签到的脚本软件 使用python实现微信小程序自动签到2.0

使用python实现微信小程序自动签到2.0

2023-08-15 22:23| 来源: 网络整理| 查看: 265

微信小程序自动签到 功能描述目标输出包管理 程序的结构设计步骤1步骤2步骤3步骤4 代码实现使用findler抓包工具查看请求类型再次使用findler抓包,查看请求内容使用多线程完成多用户提交的功能使用itchat第三方库实现微信自动回复 将程序部署到服务器中使用scp命令将程序发送到 远程 家目录下的 Documents使用ssh命令打开远程服务器设置程序后台运行 之前的程序存在一些限制和不合理的地方2.0版在之前的基础上进行了一些修改和功能的添加支持用户数量增加完成测温照片的发送多线程新的后台运行命令-screen

功能描述 目标

完成多账号微信小程序每天自动签到

输出

签到成功则向微信群发送签到成功的信息 否则提示用户签到失败,需手动签到

包管理

requests itchat time threading

程序的结构设计 步骤1

获取要发送的json数据:地址

步骤2

向服务器发送请求

步骤3

根据服务器响应判断签到是否完成

步骤4

微信交互

代码实现 使用findler抓包工具查看请求类型 https://reserve.25team.com/wxappv1/yi/index?version=13

可以看到,该小程序使用的是https,因此可以使用python爬虫来实现模拟用户签到的功能 我们先对该url发送一次请求,查看服务器返回的内容

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", # 设置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)

在代码当中,最主要的部分是请求头的设置,其中token尤为重要,它是服务器检验用户身份的一个重要手段,当然它的功能不仅于此 什么是token 请求发出后,服务器返回内容是一个json数据,我们在小程序中所看到的内容就是由这些json数据组成的,我们在实现签到功能的时候,也是由客户端向服务器发送一段json数据,我们先来看看我们要发送的json数据的结构

再次使用findler抓包,查看请求内容 https:reserve.25team.com/wxappv1/y1/adReport

当我们点击信息上报的时候,实际上就是向上面的网站发送了一段json数据,具体内容如下 这张图片是客户端的请求信息 我们可以看到,客户端是使用post请求发送数据的,在findler中点击请求栏上面的JSON,就可以看到我们所发送的JSON数据,如下:

# json = {"content":{"0":"否","1":"","2":"","3":"","4":"","5":"否","6":"否","7":"否","8":"正常","9":"37.2及以下","10":"陕西省延安市子长市子长市统计局政法大楼 经纬度: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数据中,除地址以外,其他的数据都是服务器默认填好的,因此我们在发送数据时,只需要改动一下json数据当中的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抓包工具抓取的 同样,这个地址接口也向我们响应了一个json数据 在这里插入图片描述 我们直接将返回的json数据插入到要发送的json数据中即可

使用多线程完成多用户提交的功能

代码如下

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": "陕西省延安市子长市子长市统计局政法大楼 经纬度: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()

其中,因为服务器根据token来分辨用户,要注意token和json数据的一一对应

使用itchat第三方库实现微信自动回复

因为微信官方的原因,有些用户无法使用itchat来进行自动回复,因此这部分代码我就不写了,大家可以再网上查到itchat文档 具体实现如下:

微信自动登录根据服务器返回的json数据判断是否签到成功签到成功则在对应群里发送成功标志签到失败则向文件传输助手发送失败原因 将程序部署到服务器中

正好之前我在阿里云买了一年的服务器,可以将程序安装到服务器上,再设置后台运行,这样的话就可以实现每天自动签到了 没有服务器的话,大家可以将程序部署到自己的电脑上,但是因为程序耗时较长,所以我不建议这么做

使用scp命令将程序发送到 远程 家目录下的 Documents scp -r app_sign.py [email protected]:/Documents 使用ssh命令打开远程服务器

这里不需要密码是因为我之前设置过免密登陆 如何设置免密登陆

ssh [email protected]

进入到以下页面说明连接成功了 在这里插入图片描述 可以看到我之前发送的.py文件已经发送到了服务器目录下 在这里插入图片描述

设置程序后台运行 nohup python3 app_sign.py > run.log 2>& 1

nohup是永久执行的命令,如果疫情结束不需要签到的话,需要使用kiil命令关闭进程

OK,这就是整个程序的实现过程

之前的程序存在一些限制和不合理的地方 2.0版在之前的基础上进行了一些修改和功能的添加 支持用户数量增加

自动

# 微信接收图片 @itchat.msg_register([PICTURE,TEXT],isGroupChat=True) def text_reply(msg): # 是否为测试群的消息 if msg.User["NickName"] == '测试': if msg['FileName'][-4:] == '.png' or msg['FileName'][-4:] == '.jpg': try: # 查看是谁发的图片 name = msg['FromUserName'] print(name) name = str(name) print(name) name_act = msg['ActualUserName'] name_search = itchat.search_friends(userName=name_act) print(name_search) # 用户微信名 nick_name = name_search['NickName'] # print(name_search['NickName']) # 用户真实名称 true_name = name_dict[nick_name] print(true_name) itchat.send_msg(true_name + ':你的邮件正在发送', toUserName=msg['FromUserName']) # 下载图片 msg.download(msg['FileName']) # 图片名称 file_name = str(msg['FileName']) # 等待下载 time.sleep(2) # 发完邮件后删除图片 mail = Mail() str_send = mail.send(true_name,file_name) print(str_send) itchat.send_msg(true_name+":"+str_send, toUserName=msg['FromUserName']) # 发完邮件后删除图片 os.remove(file_name) except: itchat.send_msg('邮件发送失败!', toUserName=msg['FromUserName']) # 如果测试群收到打卡,则运行打卡程序 if msg['Text'] == '打卡': name_list = daka() if name_list: for name_l in name_list: date = datetime.datetime.now() print(1) itchat.send_msg(name_l+":"+"打卡成功"+"\n"+str(date.month)+'月'+\ str(date.day)+'日',toUserName=msg['FromUserName']) else: print(2) date = datetime.datetime.now() itchat.send_msg("请勿重复打卡!" + "\n" + str(date.month) + '月' + \ str(date.day) + '日', toUserName=msg['FromUserName'])

手动

def daka(): token_list = [ {姓名:token}, {姓名:token}, {姓名:token}, {姓名:token}, ] headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat", "Referer": "https://servicewechat.com/wxd2bebfc67ee4a7eb/63/page-frame.html", "token": {} } send_str = {"content": {"0": "在京,在校集中住宿", "1": "之前已返校或未离校", "2": "", "3": "", "4": "", "5": "低风险", "6": "北京市东城区东华门街道正义路北京市人民政府(旧址) 经纬度:116.40717,39.90469", "7": "正常", "8": "37.3以下", "9": "绿色", "10": "均正常", "11": "无", "12": "否", "13": "", "14": ""}, "version": 16, "stat_content": {}, "location": {"province": "北京市", "country": "中国", "city": "", "longitude": 116.40717, "latitude": 39.90469}, "sick": "", "accept_templateid": ""} # name_list name_list = [] print(token_list) for name_token in token_list: print(name_token) for key in name_token: # 获取姓名 name = key # print(name) # 获取对应的token token = name_token[key] # print(token) headers["token"] = token res = requests.post(url='https://reserve.25team.com/wxappv1/yi/addReport', headers=headers, json=send_str) if res.json()['code'] == 200: name_list.append(name) if name_list: print(name_list) return name_list else: return [] 完成测温照片的发送 # 下午邮件体温打卡 class Mail(): def __init__(self): self.mail_host = "smtp.qq.com" self.mail_pass = "asdasas" self.sender = '[email protected]' self.receivers = '[email protected]' def send(self,name,filename): # 设置总的邮件体对象,类型为MIXED date = datetime.datetime.now() msg_root = MIMEMultipart('mixed') # 邮件添加的头尾信息等 msg_root['From'] = '[email protected]' msg_root['To'] = self.receivers # 邮件的主题,显示在接收邮件的预览页面 subject = name+'+'+str(date.month)+'月' + str(date.day)+'日'+'+36.5' msg_root['subject'] = Header(subject, 'utf-8') # 构造图片 image_file = open(filename, 'rb').read() image = MIMEImage(image_file) image.add_header('Content-ID', '') # 如果不加下边这行代码的话,会在收件方方面显示乱码的bin文件,下载之后也不能正常打开 image["Content-Disposition"] = 'attachment; filename="red_people.png"' msg_root.attach(image) try: sftp_obj = smtplib.SMTP('smtp.qq.com', 25) sftp_obj.login(self.sender, self.mail_pass) sftp_obj.sendmail(self.sender, self.receivers, msg_root.as_string()) sftp_obj.quit() print('sendemail successful!') return '邮件发送成功' except Exception as e: print('sendemail failed next is the reason') print(e) return '邮件发送失败' 多线程 # 登陆微信 def wechat_run(): itchat.auto_login(enableCmdQR=2) itchat.run() # 自动打卡 def daka_run(): # 等待微信登陆 time.sleep(30) group_name = itchat.get_chatrooms(update=True) for g in group_name: if g['NickName'] == u'测试': to_group = g['UserName'] while True: time_now = time.strftime("%H%M", time.localtime()) if time_now == "0001": print(time_now) name_list = daka() if name_list: for name_l in name_list: date = datetime.datetime.now() print(1) itchat.send(name_l + ":" + "打卡成功" + "\n" + str(date.month) + '月' + \ str(date.day) + '日', to_group) else: print(2) date = datetime.datetime.now() itchat.send_msg("请勿重复打卡!" + "\n" + str(date.month) + '月' + \ str(date.day) + '日', to_group) time.sleep(60) # 保持微信处于登陆状态 def daka_conti(): time.sleep(30) group_name = itchat.get_chatrooms(update=True) for g in group_name: if g['NickName'] == u'程序测试': to_group = g['UserName'] while True: date = datetime.datetime.now() itchat.send_msg("请勿重复打卡helloday) + '日', to_group) time.sleep(7200) 新的后台运行命令-screen

之前的nohup命令,运行后登陆二维码看不见 新的命令: 首先在ubuntu中下载screen

apt get screen

创建新的窗口

screen -S my screen

在新的窗口运行程序

python3 app_update.py

完整程序如下: 链接:https://pan.baidu.com/s/11Ei3m03o67wOEetNzSvB2Q 提取码:4mhz



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3