吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4699|回复: 56
收起左侧

[Python 原创] 浙江/上海青年大学习一键打卡

[复制链接]
Lthero 发表于 2022-10-1 17:51
本帖最后由 Lthero 于 2023-3-12 10:44 编辑

帖子因为不符版规,被删除了,我纠正后重新发一次

仅限浙江、上海地区使用!!!禁止商用!!!仅用于学习讨论!!!

感谢吾爱用户:ahov 提供上海大学习接口,具体请查看一楼目前已经添加上海青年大学习打卡脚本:ShangHaiAuto.py


完整项目请查看https://github.com/lthero-big/ZheJiangYouthstudyAutoSign

使用
运行代码前,需要先获得openid,每个账号只要获得一次openid即可,以后无需重复抓包

安卓获得openId流程【部分手机无法用】
视频教程:https://wwd.lanzouy.com/isVnb0cc5jba 密码:bcg5
  • 安卓下载抓包软件 httpcanary,安装并打开软件,有三步骤:1、同意条款 2、允许安装证书 3、root可以跳过
  • 微信:打开大学习
  • 软件httpcanary:点击右下角小飞机图标开始抓包
  • 微信:点击“立即参与”->点击“去学习”。随后切到httpcanary,再点击右下角小飞机图标停止抓包。
  • 软件httpcanary:点击右上角,找到“搜索”,直接搜索“openId”,注意:只要url是qczj.h5yunban.com的包。一般可以在包名为“qczj.h5yunban.com/qczj-youth-learning/cgi-bin/user-api/course/last-info”的响应中,找到openId
  • 注意:记录openId,因为以后没必要再次抓包!!!

PC获得openid教程【推荐】

视频教程:https://wwd.lanzouy.com/isVnb0cc5jba 密码:bcg5
  • 需要的软件:Fiddler、电脑版微信
  • 打开Fiddler,安装证书
  • 切换到微信,点击大学习,此时弹窗需要授权,点击“同意”。
  • 点击“同意”后,切换到Fiddler,按“ctrl+f”,搜索openid,双击标黄处的包,并点击“WebForms”,在里面找到openid即可
  • 注意:记录openId,因为以后没必要再次抓包!!!

运行代码
  • 获得openid后,将openid填入config.yml【请查看github项目  】,运行index.py即可。config.yml里面的name用来标识不同的openid,无实际意义。


注意

  • 如果没有需要第2步授权步骤,而是直接进入大学习页面,则无法获得openid。需要彻底关掉微信,并重新打开微信,再尝试。
  • 无论手机端或电脑端,如果实现得不到openid,需要点击“开始学习”进入到选择省市的选项。再切到Fiddler或httpcanary,按“ctrl+f”,搜索accessToken。得到accessToken后,比如accessToken为xxxx-xxxx-xxxx-xxxx,
  • 将其合并到下面的链接 https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/user-api/info?accessToken=xxxx-xxxx-xxxx-xxxx替换上面的xxxx-xxxx-xxxx-xxxx。随后进行访问此链接,可以在返回的结果里面,找到openid

config.yml文件
[XML] 纯文本查看 复制代码
users:
  - user:
      name: '张三'
      openid: 'oO-a2t6Z_awwxOby5Y9eO5VL9Rqg'
  - user:
      name: '李四'
      openid: 'oO-a2t7bkGObaacIOd4U1Bpaf1l0'



index.py文件
[Python] 纯文本查看 复制代码
import re
import requests
import json
import yaml

getToken_url = 'https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/login/we-chat/callback'
getUserInfo_url = 'https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/user-api/course/last-info'
getClass_url = 'https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/common-api/course/current'
checkin_url = 'https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/user-api/course/join'

headers = {
    'Content-Type': 'text/plain'
}

def getYmlConfig(yaml_file='config.yml'):
    with open(yaml_file, 'r', encoding='utf-8') as f:
        file_data = f.read()
    return dict(yaml.load(file_data, Loader=yaml.FullLoader))


def getToken(openId):
    # 根据openId获得token
    try:
        getToken = requests.get(url=getToken_url, params=openId, headers=headers)
        Token_raw = getToken.text
        Token = re.findall('[A-Z0-9]{8}[-][A-Z0-9]{4}[-][A-Z0-9]{4}[-][A-Z0-9]{4}[-][A-Z0-9]{12}', Token_raw)[0]
        print('获取Token为:' + Token)
        accessToken = {
            'accessToken': Token
        }
        return accessToken
    except:
        print('获取Token失败,请检查openId是否正确')


def getinfo(accessToken):
    # 根据accessToken获得用户信息
    try:
        getUserInfo = requests.get(getUserInfo_url, params=accessToken, headers=headers)
        userInfo = getUserInfo.json()
        cardNo = userInfo["result"]["cardNo"]
        nid = userInfo["result"]["nid"]
        getClass = requests.get(getClass_url, params=accessToken, headers=headers)
        Class = getClass.json()
        classId = Class["result"]["id"]
        infos: list = userInfo['result']['nodes']
        Faculty = [item['title'] for item in infos]
        print('签到课程为:' + classId, '\n您填写的个人信息为:' + cardNo, '\n您的签到所属组织为:' + str(Faculty))
        checkinData = {
            'course': classId,
            'subOrg': None,
            'nid': nid,
            'cardNo': cardNo
        }
        return checkinData
    except Exception as e:
        if "is not subscriptable" in str(e):
            print("openid出错,无法获得您的信息")
        print(f'获取历史信息失败,请您手动打卡:{e}')




def signup(accessToken, checkinData):
    # 根据token和data完成打卡
    checkin = requests.post(checkin_url, params=accessToken, data=json.dumps(checkinData), headers=headers)
    result = checkin.json()

    if result["status"] == 200:
        print("签到成功")
    else:
        print('出现错误,错误码:' + result["status"])
        print('错误信息:' + result["message"])


if __name__ == "__main__":
    config = getYmlConfig()
    for index, user in enumerate(config['users']):
        print(user['user']['name'], 'openId为 ', user['user']['openid'])
        openid = {
            'appid': 'wx56b888a1409a2920',
            'openid': user['user']['openid']
        }
        accesstoken = getToken(openid)
        checkindata = getinfo(accesstoken)
        if checkindata is not None:
            signup(accesstoken, checkindata)
        print('===========================================')

免费评分

参与人数 5吾爱币 +12 热心值 +5 收起 理由
meng16015 + 1 + 1 热心回复!
二胡独奏演员 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
sfl4800 + 3 + 1 我很赞同!
lingweiqiu + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ahov 发表于 2023-3-11 15:39
本帖最后由 ahov 于 2023-3-11 16:03 编辑

搞定了,上海的已经测试成功

需要将所有的qczj.h5yunban.com/qczj-youth-learning字段修改为qcsh.h5yunban.com/youth-learning字段
然后再将第81行的'appid': 'wx56b888a1409a2920',(浙江青年大学习专用),修改为'appid': 'wxa693f4127cc93fad',(上海青年大学习专用),可以通过以下步骤获取该appid:
点击“开始学习”进入到选择省市的选项。再切到Fiddler或httpcanary,按“ctrl+f”,搜索accessToken。得到accessToken后,比如accessToken为xxxx-xxxx-xxxx-xxxx
将其合并到下面的链接 https://qczj.h5yunban.com/qczj-youth-learning/cgi-bin/user-api/info?accessToken=xxxx-xxxx-xxxx-xxxx替换上面的xxxx-xxxx-xxxx-xxxx

随后进行访问此链接,可以在返回的结果里面,找到该appid

如果报错:
Traceback (most recent call last):
  File "C:\新建文件夹\1\index.py", line 87, in <module>
    signup(accesstoken, checkindata)
  File "C:\新建文件夹\1\index.py", line 72, in signup
    print('出现错误,错误码:' + result["status"])
TypeError: can only concatenate str (not "int") to str
这个是程序的Bug,需要将72行的print('出现错误,错误码:' + result["status"]),修改为print('出现错误,错误码:' + str(result["status"]))
因为从69行的if result["status"] == 200:就可以看出,200上面不带引号,说明result["status"]是一个int整型数据,而非str字符串型
在print()里面的必须都是字符串或者字符串与字符串相加连接多个字符串
73行可改可不改,因为result["message"]本来默认就是一个str字符串型
(经核实,在作者最新GitHub中更新的代码已修复该Bug)

上面那个bug修改之后,如果报错:
出现错误,错误码400
错误信息:请输入所在四级组织
就需要看下原始的提交页面
如果你所在的系统有个“请输入所在社区(村)/班级/单位(部门)”(必填项目),如下图所示形式:
IMG_9319.jpg
IMG_9321.jpg
那么:
请在41-42行之间添加一行subOrg = userInfo["result"]["subOrg"]
并将51行修改为'subOrg': subOrg,

如果你所在的系统没有“请输入所在社区(村)/班级/单位(部门)”,如下图所示形式:
IMG_9320.JPG
则41-42行之间与51行直接按照原先的代码无需修改即可
 楼主| Lthero 发表于 2022-11-8 18:37
dying084 发表于 2022-11-8 01:43
请问请求中哪一项是表示青年大学习期数的,或者是默认最新?
还有包里不是需要一个token吗,为什么可以只 ...

默认只有最新一期。token每次请求时会变化,而openid是微信号对应是唯一不变的。
人在江湖飘 发表于 2022-10-1 21:34
囚徒灬 发表于 2023-3-22 20:53
本帖最后由 囚徒灬 于 2023-3-22 21:12 编辑

image.png
到填信息画面
image.png
搜索openid= 地址+7  长度=28
image.png

头像被屏蔽
轩辕剑syz 发表于 2022-10-1 18:19
提示: 作者被禁止或删除 内容自动屏蔽
sfl4800 发表于 2022-10-1 18:40
将openid填入config.yml

这个好像打开后。没找到可以填OPENID的地方?
bearkr 发表于 2022-10-1 19:36
fiddle是个好东西啊!
用他修改发包很方便
头像被屏蔽
轩辕剑syz 发表于 2022-10-1 19:39
提示: 作者被禁止或删除 内容自动屏蔽
dvcd 发表于 2022-10-1 19:48
先学习下
myself123 发表于 2022-10-1 20:14
什么意思啊。是自动刷大学习的视频吗,题目也会自动选?
 楼主| Lthero 发表于 2022-10-1 21:14
myself123 发表于 2022-10-1 20:14
什么意思啊。是自动刷大学习的视频吗,题目也会自动选?

是直接让后台更新数据库,认为学习完成。不刷题目,不放视频

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
myself123 + 1 + 1 我很赞同!

查看全部评分

 楼主| Lthero 发表于 2022-10-1 21:15
轩辕剑syz 发表于 2022-10-1 19:39
我想知道如何 批量?有没有随机的openid?

每个账号的openid唯一固定,需要自行获得openid,随机的openid没有意义,基本不可能随机出来的是个正常用户
 楼主| Lthero 发表于 2022-10-1 21:16
sfl4800 发表于 2022-10-1 18:40
将openid填入config.yml

这个好像打开后。没找到可以填OPENID的地方?

openid在config.yml里面填写,项目一共两个文件:index.py和config.yml。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-27 06:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表