长江雨课堂刷网课

#!/usr/bin/python
# -*- coding: gbk -*-
# 此源码适用于长江雨课堂
import time
import requests
import re
import base64
import json
CSR = input("请输入你的csrftoken:")
SES = input("请输入你的sessionid:")
token = "5q2k5Li65byA5rqQ5bel5YW355SxaGV3ZWkyNzIz5LqM5qyh5byA5Y+R77yM5LuF5L6b5a2m5Lmg5Lqk5rWB5L2/55So"
csrftoken = (CSR)
sessionid = (SES)
select = True
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
    # UA设置
    'Content-Type': 'application/json',
    'Cookie': 'csrftoken=' + csrftoken + '; sessionid=' + sessionid + '; university_id=3714; platform_id=3',
    'x-csrftoken': csrftoken,
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'university-id': '3714',
    'xtbz': 'cloud'
}

leaf_type = {
    "video": 0,
    "homework": 6,
    "exam": 5,
    "recommend": 3,
    "discussion": 4
}

Classid = []
Unitmap = {}


def decode_token():
    token = "5q2k5Li65byA5rqQ5bel5YW355SxaGV3ZWkyNzIz5LqM5qyh5byA5Y+R77yM5LuF5L6b5a2m5Lmg5Lqk5rWB5L2/55So"
    print(base64.b64decode(token).decode())


def get_user_id():
    response = requests.get('https://changjiang.yuketang.cn/v2/api/web/userinfo', headers=headers).text


def get_course_list():
    params = {'identity': '2'}
    response = requests.get('https://changjiang.yuketang.cn/v2/api/web/courses/list', params=params,
                            headers=headers).json()
    if response['errmsg'] != 'Success':
        print("你的csrftoken或者sessionid填错了!")
        exit(1)

    index = 0
    for i in response['data']['list']:
        Classid.append(i['classroom_id'])
        print("编号:" + str(index + 1) + " 课名:" + str(i["course"]['name']))
        index += 1

    number = int(input("编号是跟老师上传课程顺序有关,举个例子,如果你的课程是 编号:4 课名:就业创业 如果你输入4没反应,就输入3或者5,也就是编号附近的数字,范围一般不会超过+-2\n你学习哪节课?输入编号:\n "))
    return str(Classid[number])


def get_video_watch_progress(cid, user_id, classroomid, video_id):
    url = f"https://changjiang.yuketang.cn/video-log/get_video_watch_progress/?cid={cid}&user_id={user_id}&classroom_id={classroomid}&video_type=video&vtype=rate&video_id={video_id}&snapshot=1&term=latest&uv_id=3714"
    progress = requests.get(url=url, headers=headers)
    return progress


def lookok(video_id, video_name, cid, user_id, classroomid, skuid):
    video_id = str(video_id)
    classroomid = str(classroomid)
    url = "https://changjiang.yuketang.cn/video-log/heartbeat/"
    get_url = f"https://changjiang.yuketang.cn/video-log/get_video_watch_progress/?cid={cid}&user_id={user_id}&classroom_id={classroomid}&video_type=video&vtype=rate&video_id={video_id}&snapshot=1&term=latest&uv_id=3714"
    progress = get_video_watch_progress(cid, user_id, classroomid, video_id)

    if_completed = '0'
    try:
        if_completed = re.search(r'"completed":(.+?),', progress.text).group(1)
    except:
        pass

    if if_completed == '1':
        print(video_name + " 这个已经学过了啊 !你怎么能偷偷学习?")
        return 1
    else:
        print(video_name + ",正在迷惑服务器")

    video_frame = 0
    val = 0
    learning_rate = 40
    t = time.time()
    timestap = int(round(t * 1000))

    while val not in ["1.0", '1']:
        heart_data = []
        for i in range(65):
            heart_data.append({
                "i": 5,
                "et": "loadeddata",
                "p": "web",
                "n": "ali-cdn.xuetangx.com",
                "lob": "ykt",
                "cp": video_frame,
                "fp": 0,
                "tp": 0,
                "sp": 1,
                "ts": str(timestap),
                "u": int(user_id),
                "uip": "",
                "c": cid,
                "v": int(video_id),
                "skuid": skuid,
                "classroomid": classroomid,
                "cc": video_id,
                "d": 4981.0,
                "pg": "4512543_skdv",
                "sq": 2,
                "t": "video",
                "cards_id": 0,
                "slide": 0,
                "v_url": ""
            })
            video_frame += learning_rate
            max_time = int((time.time() + 3600) * 1000)
            timestap = min(max_time, timestap + 1000 * 15)

        data = {"heart_data": heart_data}
        r = requests.post(url=url, headers=headers, json=data)
        try:
            error_msg = json.loads(r.text)["message"]
            if "anomaly" in error_msg:
                video_frame = 0
        except:
            pass

        progress = get_video_watch_progress(cid, user_id, classroomid, video_id)
        tmp_rate = re.search(r'"rate":(.+?)[,}]', progress.text)
        if tmp_rate is None:
            return 0

        val = tmp_rate.group(1)
        print("当前学习进度为:" + str(float(val) * 100) + "%/100%" + " last_point: " + str(video_frame))
        time.sleep(0.7)

    print("视频" + video_id + " " + video_name + "学习完成!")
    return 1


if __name__ == "__main__":
    decode_token()
    user_id = get_user_id()
    cid = get_course_list()
    headers['classroom-id'] = cid
    headers['xtbz'] = 'ykt'
    headers['Referer'] = 'https://changjiang.yuketang.cn/v2/web/studentLog/%s' % cid

    if select:
        skuid = requests.get(url='https://changjiang.yuketang.cn/v2/api/web/classrooms/%s?role=5' % cid,
                             headers=headers).json()['data']['free_sku_id']
        get_url = 'https://changjiang.yuketang.cn/c27/online_courseware/schedule/score_detail/single/%s/0/' % skuid
        ret = requests.get(url=get_url, headers=headers).json()
        for i in ret['data']['leaf_level_infos']:
            if i['leaf_type'] != '':
                get_url = 'https://changjiang.yuketang.cn/mooc-api/v1/lms/learn/leaf_info/%s/%s/' % (cid, i['id'])
                getccid = requests.get(url=get_url, headers=headers).json()
                skuid = getccid['data']['sku_id']
                user_id = getccid['data']['user_id']
                ccid = getccid['data']['content_info']['media']
                course_id = getccid['data']['course_id']
                lookok(i['id'], i['leaf_level_title'], course_id, str(user_id), cid, skuid)
        print("--偷懒吧你!--")
    else:
        response = requests.post('https://changjiang.yuketang.cn/mooc-api/v1/lms/learn/course/pub_new_pro',
                                 headers=headers, data=json.dumps(data)).json()
        for i in response['data']:
            if response['data'][i]['total_done'] == 1:
                print("%s你偷偷看了网课?,跳过...." % Unitmap[i])
                continue
            url = 'https://changjiang.yuketang.cn/c27/online_courseware/xty/kls/pub_news/%s/' % i
            ret = requests.get(url, headers=headers).json()
            for j in ret['data']['content_info'][0]['section_list']:
                VideoId = j['leaf_list'][0]['id']
                get_url = 'https://changjiang.yuketang.cn/mooc-api/v1/lms/learn/leaf_info/%s/%s/' % (cid, VideoId)
                getccid = requests.get(url=get_url, headers=headers).json()
                skuid = getccid['data']['sku_id']
                user_id = getccid['data']['user_id']
                course_id = getccid['data']['course_id']
                lookok(VideoId, j['name'], course_id, str(user_id), cid, skuid)
            print("%sOK!...." % Unitmap[i])

### C语言中定义布尔变量的方法 在C语言中,可以通过多种方式定义布尔类型的变量。以下是几种常见的方法: #### 方法一:使用标准库 `stdbool.h` 自C99起,为了提高与C++的兼容性,引入了头文件 `<stdbool.h>`,其中定义了布尔类型 `bool` 和常量 `true`、`false`[^1]。 通过包含该头文件即可直接使用布尔类型: ```c #include <stdio.h> #include <stdbool.h> int main() { bool isTrue = true; bool isFalse = false; printf("isTrue: %d\n", isTrue); printf("isFalse: %d\n", isFalse); return 0; } ``` 此方法简单直观,适用于支持C99及以上版本的标准编译器。 --- #### 方法二:手动定义布尔类型 如果目标环境不支持 `<stdbool.h>` 或者需要更高的灵活性,可以自行定义布尔类型及其值。通常的做法如下: ```c #define TRUE 1 #define FALSE 0 typedef int bool; ``` 或者更简洁的形式: ```c #define true 1 #define false 0 #define bool _Bool ``` 这种方式允许开发者完全控制布尔类型的定义和行为,适合特定场景下的定制化需求。 --- #### 方法三:利用联合体(Union)实现高效的空间利用率 另一种高级技巧是借助联合体(Union),通过位域技术实现高效的布尔变量存储[^2]。这种方法特别适用于嵌入式开发或其他资源受限的环境中。 以下是一个完整的例子: ```c #include <stdio.h> typedef union { struct { unsigned b0 : 1; // 占用1位 unsigned b1 : 1; unsigned b2 : 1; unsigned b3 : 1; unsigned b4 : 1; unsigned b5 : 1; unsigned b6 : 1; unsigned b7 : 1; } bit_type; unsigned char byte; // 整个字节共享同一内存区域 } FLAG; FLAG FLAG0; // 使用宏简化访问 #define flag_0 FLAG0.bit_type.b0 #define flag_1 FLAG0.bit_type.b1 int main() { flag_0 = 1; // 设置flag_0为真 flag_1 = 0; // 设置flag_1为假 printf("flag_0: %u\n", flag_0); // 输出1 printf("flag_1: %u\n", flag_1); // 输出0 return 0; } ``` 上述代码展示了如何通过联合体中的位域字段创建多个独立的布尔标志,同时仅占用单个字节的内存空间。 --- ### 总结 - 如果项目遵循现代C标准并希望保持可读性和一致性,则推荐使用 `<stdbool.h>` 提供的功能。 - 对于特殊用途或历史遗留系统,可以选择手动定义布尔类型。 - 需要优化内存使用的场合下,考虑采用联合体配合位域的技术方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值