Pastwill 发表于 2022-3-1 16:03

【Python】学习通自动签到2.0 · 新增设定运行时间

一.前言

脚本用于学习通签到,暂仅支持普通签到,接口较为稳定,支持微信接收签到信息,设定运行时间(新增),自动更新cookie(有效期30天),app接口出现频繁自动切换老网页接口,支持指定课程自动签到

如若认为有些用处请给予回复与评分,欢迎指出不足缺点,共同进步。

仅做个人学习使用,严禁用于其他用途。

二.开发环境

windows 10 Python 3.6 x86

三.调用模块

import datetime
from asyncio.windows_events import NULL
import requests
import json
import time
import os
import random
from lxml import etree
import sys


四.代码


'''
Author: 过往 Past
Date: 2022-02-22 21:12:32
'''
import datetime
from asyncio.windows_events import NULL
import requests
import json
import time
import os
import random
from lxml import etree
import sys

#用户区开始
name=""#用户名,必填
passwd=""#密码,必填
itime="4"#基础延时
token=''#push+ token,选填
starttime="6:00"#程序运行范围
closetime="18:00"#程序运行范围
#用户区结束

#全局区开始
okcookie={}#经过验证的cookie
uid=''#唯一id
classini=[]#课程信息
headers = {'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 11; M2007J3SC Build/RKQ1.200826.002) (device:M2007J3SC) Language/zh_CN com.chaoxing.mobile/ChaoXingStudy_3_5.1.3_android_phone_613_74 '}#超星app原生ua
#全局区结束

#第一个函数 实现登录,验证cookie,保存cookie,获取cookie各功能
def login():#使用超星app登录api,测试多次获取没遇到过验证,比较稳定
    print("登录模块启动")
    data = {'uname': name,'code': passwd,'loginType': '1','roleSelect': 'true'}
    r = requests.post('https://passport2-api.chaoxing.com/v11/loginregister', headers=headers, data=data)
    load_cookies = requests.utils.dict_from_cookiejar(r.cookies)
    #转换为字符串保存到文件
    fo = open("cookie.txt", "w")
    fo.write(str(json.dumps(load_cookies)))
    print("cookie保存成功")
    fo.close()
    print("重启程序")
    restart_program()
   

#第二个函数 实现验证cookie,如果失效便启动再次登录获取新cookie
def cookie_check():
    if os.path.exists("cookie.txt") == True:
      f=open('cookie.txt','r',encoding="utf-8")
      dic = json.loads(f.read())
      response = requests.get('https://mooc1-api.chaoxing.com/mycourse/backclazzdata', headers=headers,cookies=dic)
      if '成功' in response.text:
                return ]
                #get_class()
      else:
            print("cookie好像失效了,启动重新获取")
            login()
    else:
      print("未找到cookie文件呀启动登录")
      login()


#第三个函数 实现获取待查询是否有签到的课程,这个api也没有发现请求次数限制
#课程的选择:
#1.‘-1’这个是跟目录下
#2.‘目录参数’ 可以填写你的目录参数过滤掉其他的课程:浏览器f12即可

def get_class():
    r = requests.get('https://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&mcode=', headers=headers, cookies= okcookie)
    classinfo =json.loads(r.text)
    for i in classinfo['channelList']:
      if "course" not in str(i):
            continue
      if str("-1") in str(i["cfid"]):#这里可以实现对课程的选择
            classini.append(['course']['data']['name'],i['content']['course']['data']['id'],i['key']])
    print("\n\n"+"*"*5+"课程获取成功"+"*"*5+"\n\n")
   


def sign(id):#第四个函数,发出签到请求,推送push+
    response = requests.get('https://mobilelearn.chaoxing.com/pptSign/stuSignajax?activeId='+str(id)+'&uid='+uid, headers=headers,cookies= okcookie)
    if 'succ' in response.text:
      print("\n\n"+"*"*5+"成功"+"*"*5+"\n\n")
      if token ==NULL:
            return
      response = requests.get("https://www.pushplus.plus/send?token="+token+"&title="+str(random.randint(0,100))+"您的学习通&content=成功签到")
      print(response.text)



def get_active_one():#第五个函数 实现查询活动(核心),这个超星api有访问次数限制,这里用网页版和app版的活动获取两种api,交替并演示使用
    for i in classini:
      print("查询"+i+"....")
      r = requests.get('https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist?courseId='+str(i)+'&classId='+str(i), headers=headers, cookies=okcookie)
      a =json.loads(r.text)
      #print(a)
      if str("频繁") in str(a):
                print("\n\n\n出现频繁自动跳转备用接口\n\n\n")
                get_active_two()
                break
      if str("进行中(0)") in str(a["groupList"]['name']):
                print("无活动跳过\n")
                continue
      for o in a['activeList']:
            if str("1") not in str(o["status"]):
                print("不是进行中的跳过\n")
                continue         
            if str("2") not in str(o["activeType"]):
                print("不是进行中的签到任务\n")
                continue
            sign(o["id"])
      time.sleep(random.randint(2,10))


         
def get_active_two():#备用网页端接口
      for i in classini:
            print("查询"+i+"....")
            r = requests.get('https://mobilelearn.chaoxing.com/widget/pcpick/stu/index?courseId='+str(i)+'&jclassId='+str(i), headers=headers, cookies=okcookie)
            if str("频繁") in r.text:
                print("\n\n\n出现频繁\n\n\n")
                return
            html = etree.HTML(r.text)
            act=html.xpath('//*[@id="startList"]/div/div/@onclick')
            if len(act)==0:
                print("无活动跳过\n")
                continue
            if str(",2,") not in str(act):
                print("不是进行中的签到任务\n")
                continue
            for i in act:
                go=i
                go=go.replace('activeDetail(','')
                go=go.replace(',2,null)','')
                sign(go)
                time.sleep(random.randint(2,10))

def restart_program():#重启
    python = sys.executable
    os.execl(python, python, * sys.argv)



def timeing():#时间判断
    d_time = datetime.datetime.strptime(str(datetime.datetime.now().date()) + str(starttime), '%Y-%m-%d%H:%M')
    d_time1 = datetime.datetime.strptime(str(datetime.datetime.now().date()) + str(closetime), '%Y-%m-%d%H:%M')
    n_time = datetime.datetime.now()
    if n_time > d_time and n_time < d_time1:
      return True
    else:
         return False

if __name__ == '__main__':
    if timeing() == True:
      if cookie_check() ==True:
            print("cookie检测成功")
            okcookie=cookie_check()
            uid=cookie_check()
            print("进入课程获取")
            get_class()
            get_active_one()
    else:
      print("非程序启动时间")

五.快速开始

github链接:
https://github.com/Past-GuoWang/chaoxing-sign

Pastwill 发表于 2022-3-1 20:19

欢迎提供功能新增和代码建议!

ytlk0535 发表于 2022-3-1 20:35

具体怎么使用?bat吗?

zjk414 发表于 2022-3-1 21:37

我是小白 请问有成品吗

dft2010 发表于 2022-3-1 21:38

注释比较全,mark学习一下。。。明天再来细读,感谢楼主!

逝去的初夏 发表于 2022-3-2 08:56

整个在岗实习签到,每天都要位置打卡 生怕忘了

yxrhy_ming 发表于 2022-3-2 14:51

进来学习一个

吾爱侠客 发表于 2022-3-2 15:29

py不错,有手机版的快捷指令就更nice

leis00 发表于 2022-3-12 11:24

这下省事多了

Lengxue 发表于 2022-4-6 15:21

怎么用,有教程吗
页: [1] 2
查看完整版本: 【Python】学习通自动签到2.0 · 新增设定运行时间