1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/DT4XYh若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/DT4XYh若失效,可用地址
https://www.aliyun.com/activity/wuying/dj?source=5176.29345612&userCode=49hts92d腾讯云:
https://curl.qcloud.com/wJpWmSfU若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=2019052.部署教程
3.代码如下
"""方舟健客签到cron: 0 5 * * *const $ = new Env("方舟健客签到");"""import requestsimport reimport osimport datetimeimport hashlibimport jsonif 'jktoken' in os.environ:jktoken = re.split("@|&",os.environ.get("jktoken"))print(f'查找到{len(jktoken)}个账号')else:jktoken =['']print('无jktoken变量')def md5_encrypt(text):md5_hash = hashlib.md5()md5_hash.update(text.encode('utf-8'))md5_result = md5_hash.hexdigest()return md5_resultdef time13():now = datetime.datetime.now()timestamp_ms = int(now.timestamp() * 1000) + (now.microsecond // 1000)return timestamp_msdef b():a = time13() - 1500000000000j = a % 999983j2 = a % 9973h = "6260"return str(j) + "#" + md5_encrypt(md5_encrypt("19874ee7-ea2c-4043-a24a-16a14816399c" + str(j) + "6260") + str(j2) + "6260") + "#" + str(j2) + "#" + "6260"send_msg = ''one_msg = ''def Log(cont=''):global send_msg, one_msgif cont:one_msg += f'{cont}\n'send_msg += f'{cont}\n'def send_notification_message(title):try:from notify import sendprint("加载通知服务成功!")send(title, send_msg)except Exception as e:if e:print('发送通知消息失败!')def refresh_token(token):headers = {'Content-Type': 'application/json; charset=utf-8','User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.135 Mobile Safari/537.36 jiankeMall/6.26.0(w1080*h2029)','Host': 'acgi.jianke.com','organizationCode': 'app.jianke'}data = {'refreshToken': token }response = requests.post('https://acgi.jianke.com/passport/account/refreshToken', json=data, headers=headers)if '授权失败' in response.text:print('账号刷新token已失效,请重新获取')Log('账号刷新token已失效,请重新获取')return Falseelse:response_json = response.json()if response_json['token_type'] == 'bearer':print("账号token刷新成功,新的access_token已填入:\n" + response_json['access_token'])return response_json['access_token']else:print("Failed to send POST request. Status Code:", response.status_code)print("出错了:", response.text)def JK_sign(new_token):headers = {'Authorization':'bearer ' + new_token,'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.135 Mobile Safari/537.36 jiankeMall/6.26.0(w1080*h2029)','X-JK-X': b(),'versionName': '6.26.0','X-JK-UDID': '19874ee7-ea2c-4043-a24a-16a14816399c'}dl = requests.put(url='https://acgi.jianke.com/v2/member/signConfig/sign',headers=headers)dl_json = dl.json()if dl.status_code == 200:print(f"本次签到获得:{dl_json['coinNum']}金币,今天是本周第{dl_json['cumulativeNum']}天签到")Log(f"\n本次签到获得:{dl_json['coinNum']}金币,今天是本周第{dl_json['cumulativeNum']}天签到")elif dl_json['message'] == '今日已签到':print('今天已经签到了')Log('\n今天已经签到了')else:print("出错了:", dl.text)def main():z = 1for ck in jktoken:try:print(f'登录第{z}个账号')print('----------------------\n')access_token = refresh_token(ck)if access_token:print('刷新token成功')print('\n开始签到操作>>>>>>>>>>\n')JK_sign(access_token)print('\n----------------------')z = z + 1except Exception as e:print('未知错误:' + str(e))if __name__ == '__main__':try:main()except Exception as e:print('未知错误:' + str(e))try:send_notification_message(title='方舟健客') # 发送通知except Exception as e:print('推送失败:' + str(e))
解析
该脚本为方舟健客自动签到脚本,主要作用包括:
读取环境变量
jktoken(抓包得到的 refresh_token),支持多账号(用&或@分隔)。逐账号执行两步:
刷新 token:
POST /passport/account/refreshToken,得到access_token(bearer)。签到:
PUT /v2/member/signConfig/sign携带Authorization: bearer ...和自算头X-JK-X(由b()生成),打印"获得金币、本周第几天"。结束后用青龙的
notify.py发一条汇总通知(标题"方舟健客")。
怎么用
在青龙或你的环境里设置变量(多账号用
&或@):export jktoken="refresh_token_A&refresh_token_B"cron(脚本注释里给的):
0 5 * * *运行日志里能看到每个账号是否刷新成功、签到结果(金币数、连续天数),或"今日已签到"。
抓包提示
刷新接口用的是 refresh_token,不是 access_token。App 登录包里找
refreshToken。若接口返回"授权失败",说明 refresh token 失效,需要重新抓一次。
建议增强:
超时与重试:给
requests.post/put增timeout=(5,10),失败指数退避重试 2–3 次,降低偶发网络抖动影响。更安全的日志:刷新成功时当前会原样打印
access_token,建议只打印前后 4 位做脱敏,避免日志泄露:def mask(tok): return tok[:6] + '...' + tok[-6:]
print("刷新成功,新 access_token=", mask(response_json['access_token']))异常分支更细:
JK_sign里除了status_code==200和 "今日已签到",其他返回最好打印dl_json的code/message,并在 401/403 时提示"token 过期,需重新抓包"。User-Agent/版本可配置:把
versionName、jiankeMall/6.26.0、X-JK-UDID、organizationCode这类常量抽到顶部或环境变量,便于服务端升级时快速调整。并发与限速:多账号很多时可在循环里
time.sleep(1~3s),降低相同指纹高频请求特征。通知内容:把每个账号的"金币+累计天数"汇总成表格/清单,更直观;失败账号单独列出原因。
常见故障速查
刷新失败/授权失败:
refresh_token过期 → 重新抓。签到返回非 200:多半是
access_token无效(刷新失败或签名头不符);也可能是接口改版,优先对齐 App 的 UA/版本。今日已签到:脚本幂等性正常,无需处理。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论