# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/quark.py # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/quark.py # Repo: smallfawn/QLScriptPublic # Path: daily/quark.py # UploadedAt: 2026-05-14T17:47:57+08:00 # SHA256: 6ffca99dbbda1318e011f003244908a1c83db172b3549699b254b309b0fe5a00 # Category: APP版/抓包 # Evidence: cookie/token/authorization/header ''' new Env('夸克自动签到') cron: 0 9 * * * V2版-目前有效 使用移动端接口修复每日自动签到,移除原有的“登录验证”,参数有效期未知 V1版-已失效 受大佬 @Cp0204 的仓库项目启发改编 源码来自 GitHub 仓库:https://github.com/Cp0204/quark-auto-save 提取“登录验证”“签到”“领取”方法封装到下文中的“Quark”类中 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'] = '' try: # 异常捕捉 from notify import send # 导入消息通知模块 except Exception as err: # 异常捕捉 print('%s\n❌加载通知服务失败~' % 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变量') send('夸克自动签到', '❌未添加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[i]}" def get_growth_info(self): ''' 获取用户当前的签到信息 :return: 返回一个字典,包含用户当前的签到信息 ''' url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/info" 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" 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" 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[key] = value # 返回所需的参数 return { 'kps': params.get('kps', ''), 'sign': params.get('sign', ''), 'vcode': params.get('vcode', '') } def main(): ''' 主函数 :return: 返回一个字符串,包含签到结果 ''' msg = "" global cookie_quark 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[i].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 # 登录 log = Quark(user_data).do_sign() msg += log + "\n" i += 1 print(msg) try: send('夸克自动签到', msg) except Exception as err: print('%s\n❌ 错误,请查看运行日志!' % err) return msg[:-1] if __name__ == "__main__": print("----------夸克网盘开始签到----------") main() print("----------夸克网盘签到完毕----------")