使用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中的reduce内建函数使用方法指南
Aug 31 Python
Python heapq使用详解及实例代码
Jan 25 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
Python文件的读写和异常代码示例
Oct 31 Python
对python的输出和输出格式详解
Dec 08 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
Mar 25 Python
jupyter notebook 的工作空间设置操作
Apr 20 Python
Win10下配置tensorflow-gpu的详细教程(无VS2015/2017)
Jul 14 Python
python 5个顶级异步框架推荐
Sep 09 Python
Python机器学习三大件之一numpy
May 10 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
星际原理概述
2020/03/04 星际争霸
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
js loading加载效果实现代码
2009/11/24 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
JavaScript中变量声明有var和没var的区别示例介绍
2014/09/15 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python将unicode转为str的方法
2017/06/21 Python
python中实现k-means聚类算法详解
2017/11/11 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python代码实现图书管理系统
2020/11/30 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
致接力运动员广播稿
2014/02/17 职场文书
团拜会策划方案
2014/06/07 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
安全月宣传标语
2014/10/07 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL