吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3735|回复: 5
收起左侧

[求助] [云函数]学习通自动签到(求解)

[复制链接]
zxljhy 发表于 2022-2-20 05:08
本帖最后由 zxljhy 于 2022-2-20 05:13 编辑

如题所示收集各位大佬的代码求实现云端自动签到出现以下情况


目标代码页:https://github.com/shiyuecamusz/LollipopKitu

实践平台腾讯云函数

main.py文件详情:
# -*- coding:utf-8 -*-
import multiprocessing
import random
from datetime import datetime, time
from time import sleep
from time import time as times
import os
from urllib import parse
import json
import requests
# !!!请填写下面的参数
# 填写用户名和密码,以便登录
username = '15555xxxxxx'
password = 'xxxxx'
# uid为用户id
uid = 'xxxx'
# 此三项为签到参数,经纬度和真实姓名
latitude = '1xxxxx'
longitude = 'xxxxxx'
name = 'xxxxxxx'
# 下面三项一般不需要修改
clientip = ''
signuseragent = ''
# 图片签到所需要的objectId,具体ID可抓包获得
objectId = 'xxxxxxxxx'
# 每次课的上课时间
start_time = {
    time(8, 0),
    time(10, 0),
    time(13, 30),
    time(15, 30),
}
# 监听时长,例如设为20,就从每次上课开始监听20分钟
listen_time = 10
# 星期几上课,特殊:星期天是0
start_day = [1, 2, 3, 4, 5]
# 从这里开始不需要修改
useragent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) ' \
            'AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 ' \
            'ChaoXingStudy/ChaoXingStudy_3_4.4.1_ios_phone_202004111750_39 (@Kalimdor)_4375872153618237766 ' \
            'ChaoXingStudy/ChaoXingStudy_3_4.4.1_ios_phone_202004111750_39 (@Kalimdor)_4375872153618237766'
encode_name = parse.quote(name)
cookie_filename = 'chaoxing_cookies'
header = {
    'Cookie': '',
    'User-Agent': useragent
}
def myprint(string):
    print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S') + '  ' + string)
def getCookies():
    myprint('正在登录,获取新Cookie')
    if username and password:
        url = 'https://passport2-api.chaoxing.com/v11/loginregister'
        payload = {
            'uname': username,
            'code': password
        }
        cookie_jar = requests.session().post(url=url, data=payload, headers={'User-Agent': useragent}).cookies
        cookie_dict = requests.utils.dict_from_cookiejar(cookie_jar)
        cookie_str = ''
        for key in cookie_dict:
            cookie_str += key + '=' + cookie_dict[key] + '; '
        header['cookie'] = cookie_str
        with open(cookie_filename, 'w', encoding='utf-8')as file:
            file.write(cookie_str)
        myprint('获取Cookie成功')
    else:
        myprint('plz edit username and password in this python file')
def loadCookie():
    if os.path.exists(cookie_filename):
        with open(cookie_filename, 'r', encoding='utf-8') as f:
            data = f.read().strip()
            if data:
                header['cookie'] = data
            else:
                getCookies()
    else:
        getCookies()
should_run = False
coursedata = []
activates = []
timestamp: float = 0
def listenThread():
    global should_run
    while should_run:
        def backClassData():
            cdata = {}
            url = 'http://mooc1-api.chaoxing.com/mycourse/backclazzdata?view=json&rss=1'
            while not cdata:
                res = requests.get(url, headers=header)
                res_data = res.text
                if '请重新登录' in res_data:
                    getCookies()
                    continue
                try:
                    cdata = json.loads(res_data)
                except json.JSONDecodeError:
                    myprint('Cookie已失效,将重新获取')
                    getCookies()
                    continue
                if not cdata:
                    getCookies()
                    continue
                if cdata['result'] != 1:
                    myprint('课程列表获取失败')
                    sleep(10)
                    continue
                for item in cdata['channelList']:
                    if 'course' not in item['content']:
                        continue
                    pushdata = {'courseid': item['content']['course']['data'][0]['id'],
                                'name': item['content']['course']['data'][0]['name'],
                                'imageurl': item['content']['course']['data'][0]['imageurl'],
                                'classid': item['content']['id']}
                    coursedata.append(pushdata)
                myprint('课程获取成功\n')
                printCourseData()
        def printCourseData():
            global coursedata
            for index, item in enumerate(coursedata):
                print(str(index + 1) + "." + item['name'])
            startSign()
        def taskActiveList(courseId, classId):
            url = 'https://mobilelearn.chaoxing.com/ppt/activeAPI/taskactivelist?' \
                  'courseId=' + str(courseId) + \
                  '&classId=' + str(classId) + \
                  '&uid=' + uid
            res = requests.get(url, headers=header)
            data_json = json.loads(res.text)
            activeList = data_json['activeList']
            for item in activeList:
                if 'nameTwo' not in item:
                    continue
                if item['activeType'] == 2 and item['status'] == 1:
                    signurl = item['url']
                    aid = getVar(signurl)
                    if aid not in activates:
                        myprint('待签到活动 名称:%s 状态:%s 时间:%s ' % (item['nameOne'], item['nameTwo'], item['nameFour']))
                        sign(aid, uid, courseId)
        def getVar(url):
            var1 = url.split('&')
            for var in var1:
                var2 = var.split('=')
                if var2[0] == 'activePrimaryId':
                    return var2[1]
            return 'notfound'
        def sign(aid, uid, courseid):
            global should_run, activates
            url = 'https://mobilelearn.chaoxing.com/pptSign/stuSignajax?' \
                  'activeId=' + aid + \
                  '&uid=' + uid + \
                  '&clientip=' + clientip + \
                  '&useragent=' + signuseragent +\
                  '&latitude=' + latitude + \
                  '&longitude=' + longitude + \
                  '&appType=15' + \
                  '&fid=2378' + \
                  '&objectId=' + objectId + \
                  '&name=' + encode_name
            res = requests.get(url, headers=header)
            course_name = ''
            for item in coursedata:
                if item['courseid'] == courseid:
                    course_name = item['name']
            if res.text == 'success':
                myprint(course_name + ': 签到成功!')
                activates.append(aid)
                sleep(60)
                should_run = False
            elif res.text == '您已签到过了':
                myprint(course_name + ': 您已签到过了')
                activates.append(aid)
                sleep(60)
                should_run = False
            else:
                myprint(course_name + ': 签到失败')
                activates.append(aid)
        def startSign():
            global should_run
            while should_run:
                print('\n')
                for item in coursedata:
                    myprint('正在监听: ' + str(item['name']))
                    taskActiveList(item['courseid'], item['classid'])
                    sleep(3.7)
                    if not should_run:
                        break
                if should_run:
                    sleep(random.randint(37, 88))
            myprint('任务结束')
        backClassData()
def listen():
    myprint('主程序启动')
    child_process = None
    global should_run, timestamp
    loadCookie()
    while True:
        current_time = datetime.now().strftime('%H:%M')
        weekday = datetime.now().strftime('%w')
        if int(weekday) in start_day:
            for item in start_time:
                if str(item)[:-3] == current_time:
                    timestamp = times()
                    should_run = True
                if should_run and times() - timestamp > 60 * listen_time:
                    should_run = False
        if should_run and child_process is None:
            myprint('监听开始\n')
            child_process = multiprocessing.Process(target=listenThread)
            child_process.start()
        if not should_run and child_process is not None:
            myprint('监听结束\n')
            child_process.terminate()
            child_process.join()
            child_process = None
        sleep(10)
if __name__ == '__main__':
    try:
        listen()
    except KeyboardInterrupt:
        myprint('主动停止运行')





报错详情:

image.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Lucifer_BW + 1 + 1 热心回复!

查看全部评分

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

BellNet 发表于 2022-2-20 09:59
腾讯云和阿里云都别想了。我记得我之前搞的时候。。学习通把两个云函数的ip拉黑了。。
BestSum 发表于 2022-2-20 10:28
s1986q 发表于 2022-2-20 14:12
anandyuan 发表于 2022-2-20 16:32
看报错信息是requests模块没找到导致导入模块失败,我记得这个模块带的有,你在命令行导入试试看看有没有这个模块,没有的话再安装一下到项目目录
anandyuan 发表于 2022-2-20 16:40
而且项目的开始不能再用
[Python] 纯文本查看 复制代码
if __name__ == '__main__':
这个了,要用def main_handler(event, context):代替,因为执行项目代码时会先调用main_handler,没有这个函数,代码就无法运行
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 17:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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