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=201905
2.部署教程
3.代码如下
"""
方舟健客签到
cron: 0 5 * * *
const $ = new Env("方舟健客签到");
"""
import requests
import re
import os
import datetime
import hashlib
import json
if '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_result
def time13():
now = datetime.datetime.now()
timestamp_ms = int(now.timestamp() * 1000) + (now.microsecond // 1000)
return timestamp_ms
def b():
a = time13() - 1500000000000
j = a % 999983
j2 = a % 9973
h = "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_msg
if cont:
one_msg += f'{cont}\n'
send_msg += f'{cont}\n'
def send_notification_message(title):
try:
from notify import send
print("加载通知服务成功!")
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 False
else:
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 = 1
for 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 + 1
except 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/版本。今日已签到:脚本幂等性正常,无需处理。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论