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


Posted in Python onApril 27, 2020

功能描述目标

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

输出

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

包管理

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数据,具体内容如下

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

我们可以看到,客户端是使用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数据

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

我们直接将返回的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  root@47.105.49.126:/Documents

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

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

如何设置免密登陆

ssh root@47.105.49.126

进入到以下页面说明连接成功了

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

可以看到我之前发送的.py文件已经发送到了服务器目录下

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

设置程序后台运行

nohup python3 app_sign.py  > run.log 2>& 1

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

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

到此这篇关于使用python实现微信小程序自动签到功能的文章就介绍到这了,更多相关python 微信小程序签到内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 快速排序代码
Nov 23 Python
从零学Python之hello world
May 21 Python
通过C++学习Python
Jan 20 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
libreoffice python 操作word及excel文档的方法
Jul 04 Python
Python实现最大子序和的方法示例
Jul 05 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
Python 用__new__方法实现单例的操作
Dec 11 Python
Python进阶学习之带你探寻Python类的鼻祖-元类
May 08 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 Python
Python日志:自定义输出字段 json格式输出方式
Apr 27 #Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 #Python
python logging通过json文件配置的步骤
Apr 27 #Python
Python垃圾回收机制三种实现方法
Apr 27 #Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
Apr 27 #Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 #Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
Apr 27 #Python
You might like
如何使用PHP往windows中添加用户
2006/12/06 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
2013/05/06 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
javascript cookie基础应用之记录用户名的方法
2016/09/20 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
原生js实现抽奖小游戏
2019/06/27 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python中线程编程之threading模块的使用详解
2015/06/23 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
python爬虫基本知识
2018/03/05 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
2020/10/10 Python
Python爬取梨视频的示例
2021/01/29 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
网络事业创业计划书范文
2014/01/09 职场文书
python基础详解之if循环语句
2021/04/24 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js