• dewndi

    '''
    new Env('夸克自动签到')
    cron: 0 9   *
    目前有效
    使用移动端接口修复每日自动签到,移除原有的“登录验证”,参数有效期未知
    Author: BNDou
    Date: 2024-03-15 21:43:06
    LastEditTime: 2025-11-18 03:49:26
    FilePath: \Auto_Check_In\checkIn_Quark.py
    Description: 
    抓包流程:
        【手机端】
        ①打开抓包,手机端访问抽奖页
        ②找到url为 https://drive-m.quark.cn/1/clouddrive/act/growth/reward 的请求信息
        ③复制整段url,该链接后面必须要有参数: kps sign vcode,粘贴到环境变量
        环境变量名为 COOKIE_QUARK 多账户用 回车 或 && 分开
        user字段是用户名 (可是随意填写,多账户方便区分)
        例如: user=张三; url=https://drive-m.quark.cn/1/clouddrive/act/growth/reward?xxxxxx=xxxxxx&kps=abcdefg&sign=hijklmn&vcode=111111111;
        旧版环境变量格式也兼容,例如: user=张三; kps=abcdefg; sign=hijklmn; vcode=111111111;
    '''
    import os
    import re
    import sys
    import requests

    测试用环境变量

    os.environ['COOKIE_QUARK'] = ''

    初始化通知模块

    notify = None
    try:
        # 优先导入第三方notify模块
        from notify import send as notify_send
        notify = notify_send
        print("✅ 成功加载notify通知模块")
    except ImportError:
        try:
            # 兼容旧版utils.notify路径
            from utils.notify import send as utils_notify_send
            notify = utils_notify_send
            print("✅ 成功加载utils.notify通知模块")
        except Exception as err:
            print(f"⚠️ 通知模块加载失败: {err},将仅输出日志不发送通知")

    获取环境变量

    def get_env():
        # 判断 COOKIE_QUARK是否存在于环境变量
        if "COOKIE_QUARK" in os.environ:
            # 读取系统变量以 \n 或 && 分割变量
            cookie_list = re.split('\n|&&', os.environ.get('COOKIE_QUARK'))
        else:
            # 标准日志输出
            print('❌未添加COOKIE_QUARK变量')
            if notify:
                notify('夸克自动签到', '❌未添加COOKIE_QUARK变量')
            # 脚本退出
            sys.exit(0)
        return cookie_list
    class Quark:
        '''
        Quark类封装了签到、领取签到奖励的方法
        '''
        def __init__(self, user_data):
            '''
            初始化方法
            :param user_data: 用户信息,用于后续的请求
            '''
            self.param = user_data
        def convert_bytes(self, b):
            '''
            将字节转换为 MB GB TB
            :param b: 字节数
            :return: 返回 MB GB TB
            '''
            units = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
            i = 0
            while b >= 1024 and i < len(units) - 1:
                b /= 1024
                i += 1
            return f"{b:.2f} {units}"
        def get_growth_info(self):
            '''
            获取用户当前的签到信息
            :return: 返回一个字典,包含用户当前的签到信息
            '''
            url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/info&quot;
            querystring = {
                "pr": "ucpro",
                "fr": "android",
                "kps": self.param.get('kps'),
                "sign": self.param.get('sign'),
                "vcode": self.param.get('vcode')
            }
            response = requests.get(url=url, params=querystring).json()
            #print(response)
            if response.get("data"):
                return response["data"]
            else:
                return False
        def get_growth_sign(self):
            '''
            获取用户当前的签到信息
            :return: 返回一个字典,包含用户当前的签到信息
            '''
            url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/sign&quot;
            querystring = {
                "pr": "ucpro",
                "fr": "android",
                "kps": self.param.get('kps'),
                "sign": self.param.get('sign'),
                "vcode": self.param.get('vcode')
            }
            data = {"sign_cyclic": True}
            response = requests.post(url=url, json=data, params=querystring).json()
            #print(response)
            if response.get("data"):
                return True, response["data"]["sign_daily_reward"]
            else:
                return False, response["message"]
        def queryBalance(self):
            '''
            查询抽奖余额
            '''
            url = "https://coral2.quark.cn/currency/v1/queryBalance&quot;
            querystring = {
                "moduleCode": "1f3563d38896438db994f118d4ff53cb",
                "kps": self.param.get('kps'),
            }
            response = requests.get(url=url, params=querystring).json()
            # print(response)
            if response.get("data"):
                return response["data"]["balance"]
            else:
                return response["msg"]
        def do_sign(self):
            '''
            执行签到任务
            :return: 返回一个字符串,包含签到结果
            '''
            log = ""
            # 每日领空间
            growth_info = self.get_growth_info()
            if growth_info:
                log += (
                    f" {'88VIP' if growth_info['88VIP'] else '普通用户'} {self.param.get('user')}\n"
                    f"???? 网盘总容量:{self.convert_bytes(growth_info['total_capacity'])},"
                    f"签到累计容量:")
                if "sign_reward" in growth_info['cap_composition']:
                    log += f"{self.convert_bytes(growth_info['cap_composition']['sign_reward'])}\n"
                else:
                    log += "0 MB\n"
                if growth_info["cap_sign"]["sign_daily"]:
                    log += (
                        f"✅ 签到日志: 今日已签到+{self.convert_bytes(growth_info['cap_sign']['sign_daily_reward'])},"
                        f"连签进度({growth_info['cap_sign']['sign_progress']}/{growth_info['cap_sign']['sign_target']})\n"
                    )
                else:
                    sign, sign_return = self.get_growth_sign()
                    if sign:
                        log += (
                            f"✅ 执行签到: 今日签到+{self.convert_bytes(sign_return)},"
                            f"连签进度({growth_info['cap_sign']['sign_progress'] + 1}/{growth_info['cap_sign']['sign_target']})\n"
                        )
                    else:
                        log += f"❌ 签到异常: {sign_return}\n"
            else:
                log += f"❌ 签到异常: 获取成长信息失败\n"
            return log
    def extract_params(url):
        '''
        从URL中提取所需的参数
        :param url: 包含参数的URL
        :return: 返回一个字典,包含所需的参数
        '''
        # 提取URL中的查询参数部分(?后面的内容)
        query_start = url.find('?')
        query_string = url[query_start + 1:] if query_start != -1 else ''
        # 解析查询参数
        params = {}
        for param in query_string.split('&'):
            if '=' in param:
                key, value = param.split('=', 1)
                params = value
        # 返回所需的参数
        return {
            'kps': params.get('kps', ''),
            'sign': params.get('sign', ''),
            'vcode': params.get('vcode', '')
        }
    def main():
        '''
        主函数
        :return: 返回一个字符串,包含签到结果
        '''
        msg = ""
        cookie_quark = get_env()
        print("✅ 检测到共", len(cookie_quark), "个夸克账号\n")
        i = 0
        while i < len(cookie_quark):
            # 获取user_data参数
            user_data = {}  # 用户信息
            for a in cookie_quark.replace(" ", "").split(';'):
                if not a == '':
                    user_data.update({a[0:a.index('=')]: a[a.index('=') + 1:]})
            
            # 从url参数中提取额外信息
            if 'url' in user_data:
                url_params = extract_params(user_data['url'])
                user_data.update(url_params)
            # print(user_data)
            
            # 开始任务
            log = f"????????‍♂️ 第{i + 1}个账号"
            msg += log
            print(log)  # 实时输出日志
            # 执行签到
            sign_log = Quark(user_data).do_sign()
            msg += sign_log + "\n"
            print(sign_log)  # 实时输出签到日志
            i += 1
        # 输出完整日志
        print("\n" + "="*50)
        print("???? 签到结果汇总:")
        print(msg)
        print("="*50)
        # 发送通知(如果通知模块加载成功)
        if notify:
            try:
                notify('夸克自动签到', msg)
                print("✅ 通知发送成功")
            except Exception as err:
                print(f"❌ 通知发送失败: {err}")
        else:
            print("⚠️ 未加载到通知模块,跳过发送通知")
        return msg[:-1]
    if __name__ == "__main__":
        print("----------夸克网盘开始签到----------")
        main()
        print("----------夸克网盘签到完毕----------")
    青龙面板脚本夸克签到领取永久空间

    主楼
  • shanci

    青龙面板夸克签到领永久空间,实用教程。

    #1
  • 不二

    好东西就收藏

    #2
  • 秦始皇

    收藏了

    #3
  • C

    我怎么没找到手机端抽奖页,有大佬给个路径吗

    #4
  • beyfish

    收藏

    #5

发表回复

登录后回复