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

article/2025/5/25 13:32:58

微信小程序自动签到

  • 功能描述
    • 目标
    • 输出
    • 包管理
  • 程序的结构设计
    • 步骤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 rif __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 = 0for js in jsons:t = Thread(target=request_h, args=(url, js, tokens[n]))n += 1t.start()threads.append(t)for t in threads:t.join()

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

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

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

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

将程序部署到服务器中

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

使用scp命令将程序发送到 远程 家目录下的 Documents

scp -r app_sign.py  root@47.105.49.126:/Documents

使用ssh命令打开远程服务器

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

ssh root@47.105.49.126

进入到以下页面说明连接成功了
在这里插入图片描述
可以看到我之前发送的.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_listname_list = []print(token_list)for name_token in token_list:print(name_token)for key in name_token:# 获取姓名name = key# print(name)# 获取对应的tokentoken = name_token[key]# print(token)headers["token"] = tokenres = 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_listelse:return []

完成测温照片的发送

# 下午邮件体温打卡
class Mail():def __init__(self):self.mail_host = "smtp.qq.com"self.mail_pass = "asdasas"self.sender = '847671929@qq.com'self.receivers = 'cupjgtw2017@163.com'def send(self,name,filename):# 设置总的邮件体对象,类型为MIXEDdate = datetime.datetime.now()msg_root = MIMEMultipart('mixed')# 邮件添加的头尾信息等msg_root['From'] = '847671929@qq.com<847671929@qq.com>'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', '<image1>')# 如果不加下边这行代码的话,会在收件方方面显示乱码的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


http://chatgpt.dhexx.cn/article/EM9iisB1.shtml

相关文章

并行程序设计——OMP编程

并行程序设计——OMP编程 实验一 实验内容 分别实现课件中的梯形积分法的Pthread、OpenMP版本&#xff0c;熟悉并掌握OpenMP编程方法&#xff0c;探讨两种编程方式的异同。 实验代码 OpenMP编程 #include <stdio.h> #include <stdlib.h> #include <omp.h&g…

利用中国知网快速自动生成参考文献

1.打开知网 2.输入引用的文献名称 3.点击文章 4.点击“导出/参考文献” 5.自动生成参考文献

知网导出外文参考文献格式和下载文章(2019.5)

如果不弹出页面&#xff0c;是网络的原因&#xff0c;等一等

谷歌学术、中国知网生成参考文献

谷歌学术 step1.登陆谷歌学术 step2.查找需要的文献 step3.点击引用标志 step4.生成相关引用 step5.选择不同的标准复制粘贴 中国知网 step1.在知网搜索需要的论文 step2.点击导出参考文献 step3.生成参考文献引用

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

文章目录 一、EndNote导入文献的以下几种格式1.1 中国知网1.2web of science1.3 谷歌学术 一、EndNote导入文献的以下几种格式 all as we konow&#xff0c;引用参考文献也就是如下三个&#xff0c;那么分别导入endnote改怎么使用呢&#xff1f; 1.1 中国知网 在你想要的文献里…

在CNKI上导出TXT文件

在使用CiteSpace之前要先下载数据源&#xff0c;今天就来讲一讲从CNKI上导出txt文件。 1、从学校官网进入中国知网CNKI&#xff0c;单击高级检索 2、输入关键字&#xff0c;可以选择组合输入&#xff0c;单击搜索 3、在每页显示处选择50 4、勾选所有所有记录&#xff08;每次导…

EndNote20导入知网文献和导出BibTeX于TexStudio

第一步&#xff1a;在知网官网中找到一篇论文并点击引号键 第二步&#xff1a;点击EndNote下载该txt文件 第三步&#xff1a;在EndNote20中点击File->Import->File&#xff0c;引入刚刚下载的txt文件 注意Import Option选择的是EndNote Import&#xff0c;点击import导入…

知网导出之Excel

背景&#xff1a;需要整理知网XX方向的论文&#xff0c;包括题目&#xff0c;内容&#xff0c;发表时间等等信息。但是一个个写也太麻烦了&#xff0c;所以&#xff0c;一些不需要人总结的东西&#xff0c;就直接导出好了。 流程&#xff1a; 选择好文献之后&#xff0c;选择自…

知网如何快速引用参考文献

1.在知网搜索界面&#xff0c;搜索自己想搜的内容&#xff0c;然后点击下图引号位置 2.在弹框中选择你要引用的格式 复制粘贴到自己论文中即可

知网 BibTeX自动生成(使用BibTeX引用中文参考文献)

前言 谷歌学术具备生成英文文献的bibtex文献引用代码的功能&#xff0c;而知网里不具备生成中文文献的bibtex引用代码的功能。因此&#xff0c;本文将生成中文文献bibtex引用代码的操作过程简单记录便于自己再次翻阅&#xff0c;操作方法源自知乎作者 上官无忌 &#xff0c;具…

知网导出引用文件,插入到Endnote管理文献

直接选endnote是txt格式 改格式也没用&#xff0c;endnote改也不行 这里选择refworks 导出txt之后 选择refworks import即可

Web of Science如何导出参考文献

Web of Science&#xff08;WOS&#xff09;是大型综合性、多学科、核心期刊引文索引数据库。 Endnote是一款可以有效管理参考文献的软件&#xff0c;并且在论文写作时&#xff0c;利用endnote可以很方便的修改引用格式。 1.进入论文界面 2.点击查看PDF,然后点击红圈 3. 可以…

Endnote导出目标期刊的参考文献的格式

Endnote导出目标期刊的参考文献的格式 1、知网文献与endnote的操作流程2、其他的参考文件来源&#xff08;如bib、ris等&#xff09;及导出格式选择 1、知网文献与endnote的操作流程 导出的格式为txt格式&#xff0c;这时候打开endnote&#xff0c;导入choose你的txt文件就可以…

知网论文参考文献导入到Endnote方法

第一步下载参考文献文件第二步&#xff1a;右键->打开方式->选择endnote 3. 导入结果

知网获取论文参考文献

知网获取论文参考文献 进入知网搜索相应材料普通检索高级检索 选择相应的文献点击右上角左边双引号“凑”参考文献 进入知网 中国知网官方网址&#xff1a;https://www.cnki.net/ 搜索相应材料 搜素一般可分为普通检索和高级检索。 一般而言&#xff0c;普通检索即可完成我…

Endnote 导出英文、中文(知网)参考文献进入Word

1、英文文献 从Google Scholar 搜索需要的参考文献&#xff0c;然后点击“引用”按钮&#xff0c;导出Endnote的格式&#xff0c;例如scholar.enw。 在Endnote中File-->Import-->File...-->Import File-->Import 参考文献导入完毕 进行参考文献在word中的导出…

将CNKI知网文献条目导出,并导入到Endnote内

将CNKI知网文献条目导出&#xff0c;并导入到Endnote内 目录 将CNKI知网文献条目导出&#xff0c;并导入到Endnote内一、从知网上导出参考文献二、将知网导出的参考文献导入到Endnote 一、从知网上导出参考文献 从知网上导出参考文献过程和步骤如图1所示。 图1 导出的参考文献…

中文参考文献如何导出+如何插入参考文献

很多小白不清楚如何导出中英文的参考文献&#xff0c;如何插入参考文献 来源公众号【学术点滴】 小编写第一篇论文是踩过了两个坑&#xff1a; ①手工一个个编写的参考文献 ②在Word中采用最原始方式插入参考文献&#xff0c;当增加或删除一篇参考文献时&#xff0c;需要手…

LaTeX插入知网参考文献

方式1&#xff1a;直接使用bibtem 新建一个 .tex文档&#xff0c;加入以下语句 \begin{thebibliography}{1} \bibitem{RN1}唐志刚. 基于YOLO V3的航拍车辆图像检测方法研究[D].江西理工大学,2020. \end{thebibliography} RN1是引用名&#xff0c;自定义&#xff1b;后面直接粘…

指令重排详解

指令重排&#xff1a; 编译器指令重排&#xff0c;cpu指令重排&#xff0c;内存指令重排。 编译器可能会调整顺序&#xff0c;如下图&#xff0c;左边是c源码&#xff0c;右边是优化后顺序 一条汇编指令的执行是可以分为很多步骤的, 分为不同的硬件执行 取指 IF 译码和取寄存…