1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/Bg6shY若失效,可用地址
阿里云:
服务器购买地址
https://t.aliyun.com/U/Bg6shY若失效,可用地址
https://www.aliyun.com/daily-act/ecs/activity_selection?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.代码如下
#!/usr/bin/env python3# -*- coding: utf-8 -*-import osimport sysimport requestsimport jsonimport timeimport refrom datetime import datetimedef get_env_variable(var_name):"""从环境变量获取配置"""value = os.environ.get(var_name)if not value:print(f"❌ 错误: 环境变量 {var_name} 未设置")sys.exit(1)return valuedef validate_token(token):"""验证token格式和有效性"""# 检查token是否存在if not token or token.strip() == "":return {"valid": False,"message": "❌ Token为空或未设置","error_type": "empty"}# 检查token长度(基本格式验证)if len(token) < 10:return {"valid": False,"message": "❌ Token格式异常,长度过短","error_type": "format"}def test_token_validity(token):"""测试token是否有效(通过检查API响应内容)"""# 使用一个简单的API端点来测试token有效性test_url = "https://mfuns.net/v1/history/get" #仅用来测试是否为正确凭证,不会对数据做处理headers = {"Authorization": token,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0","Origin": "https://www.mfuns.net","Referer": "https://www.mfuns.net"}try:response = requests.get(test_url, headers=headers, timeout=10)# 检查响应内容,而不是仅仅检查状态码if response.status_code == 200:try:data = response.json()# 检查响应中的code字段if "code" in data:if data["code"] == 401:return {"valid": False,"message": "❌ Token已过期或无效","status": "expired"}elif data["code"] == 1:return {"valid": True,"message": "✅ Token有效性测试通过","status": "active"}# 如果没有code字段,但响应成功,也认为是有效的return {"valid": True,"message": "✅ Token有效性测试通过","status": "active"}except json.JSONDecodeError:# 如果无法解析JSON,但状态码是200,认为是有效的return {"valid": True,"message": "✅ Token有效性测试通过","status": "active"}else:return {"valid": False,"message": f"❌ Token测试失败,HTTP状态码: {response.status_code}","status": "unknown"}except requests.exceptions.RequestException as e:return {"valid": False,"message": f"❌ Token测试网络错误: {str(e)}","status": "network_error"}def sign_in(cookie, retry_count=1):"""执行签到操作,支持重试"""# API配置url = "https://mfuns.net/v1/sign/sign" # 签到api端口# 请求头headers = {"Authorization": cookie,"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0","Origin": "https://www.mfuns.net","Referer": "https://www.mfuns.net","sec-fetch-mode": "cors"}for attempt in range(retry_count + 1):try:# 发送签到请求response = requests.get(url, headers=headers, timeout=30)# 检查响应状态if response.status_code != 200:if attempt < retry_count:print(f"⚠️ 第{attempt + 1}次签到失败,HTTP错误: {response.status_code},{3}秒后重试...")time.sleep(3)continuereturn {"success": False,"message": f"HTTP错误: {response.status_code}","data": None,"attempts": attempt + 1}# 解析响应数据result = response.json()# 根据API文档,code为1表示成功,0表示已签到if result.get("code") == 1:return {"success": True,"message": result.get("msg", "签到成功"),"data": result,"attempts": attempt + 1}elif result.get("code") == 0:return {"success": True,"message": result.get("msg", "今日已签到"),"data": result,"attempts": attempt + 1}else:if attempt < retry_count:print(f"⚠️ 第{attempt + 1}次签到失败: {result.get('msg', '未知错误')},{3}秒后重试...")time.sleep(3)continuereturn {"success": False,"message": f"签到失败: {result.get('msg', '未知错误')}","data": result,"attempts": attempt + 1}except requests.exceptions.RequestException as e:if attempt < retry_count:print(f"⚠️ 第{attempt + 1}次网络请求失败: {str(e)},{3}秒后重试...")time.sleep(3)continuereturn {"success": False,"message": f"网络请求失败: {str(e)}","data": None,"attempts": attempt + 1}except json.JSONDecodeError as e:if attempt < retry_count:print(f"⚠️ 第{attempt + 1}次响应数据解析失败: {str(e)},{3}秒后重试...")time.sleep(3)continuereturn {"success": False,"message": f"响应数据解析失败: {str(e)}","data": None,"attempts": attempt + 1}# 理论上不会执行到这里,但为了完整性return {"success": False,"message": "签到失败: 重试次数已用完","data": None,"attempts": retry_count + 1}def main():"""主函数"""# 配置重试次数MAX_RETRY_COUNT = 1 # 最大重试次数# 获取当前时间current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"🕐 开始执行签到任务 - {current_time}")print(f"📋 配置: 最大重试次数 {MAX_RETRY_COUNT}")print("=" * 50)# 获取Cookiecookie = get_env_variable("NEKO_MFUNS_COOKIE")print("✅ 成功获取Cookie")# Token有效性测试print("🔍 正在测试Token有效性...")validity_test = test_token_validity(cookie)print(validity_test["message"])if not validity_test["valid"]:print("❌ Token有效性测试失败,停止执行")sys.exit(1)# 执行签到(带重试)print(f"🔄 正在执行签到(最多重试{MAX_RETRY_COUNT}次)...")result = sign_in(cookie, retry_count=MAX_RETRY_COUNT)# 输出结果print("=" * 50)if result["success"]:print(f"✅ {result['message']}")if result["attempts"] > 1:print(f"📊 重试次数: {result['attempts'] - 1}")if result["data"]:print(f"📊 响应数据: {json.dumps(result['data'], ensure_ascii=False, indent=2)}")else:print(f"❌ {result['message']}")print(f"📊 尝试次数: {result['attempts']}")if result["data"]:print(f"📊 响应数据: {json.dumps(result['data'], ensure_ascii=False, indent=2)}")print("=" * 50)print("🎯 签到任务执行完成")# 根据结果返回适当的退出码sys.exit(0 if result["success"] else 1)if __name__ == "__main__":main()
这是一个喵御宅(MFUNS)自动签到脚本,主要用于青龙面板/定时任务运行。整体流程是:
从环境变量读取 NEKO_MFUNS_COOKIE(实际上是 Authorization Token)
先调用一个"不会改数据"的接口 /v1/history/get 来 验证 Token 是否有效
Token 有效则调用 /v1/sign/sign 执行签到(失败会按配置重试)
打印签到结果、重试次数、并以退出码表示成功/失败(成功 0,失败 1)
主要方法
1) get_env_variable(var_name)
读取环境变量
取不到就打印错误并
sys.exit(1)直接退出用于强制保证脚本必须配置存在(这里是
NEKO_MFUNS_COOKIE)
2) validate_token(token)
Token 格式基础校验(但当前实现不完整)
已写了两种失败情况的返回:
Token 为空
Token 长度过短
但函数后面没有
return(也没在主流程里调用),所以目前 对脚本运行没有实际影响,属于"预留/未完成函数"。
3) test_token_validity(token)
Token 有效性测试(核心前置检查)
请求:
GET https://mfuns.net/v1/history/getHeader 用
Authorization: token模拟登录态逻辑判断:
HTTP 200 且 JSON 中
code == 1→ 认为 token 有效JSON 中
code == 401→ 认为 token 过期/无效能 200 但 JSON 解析失败 → 也视为有效(偏宽松)
其他状态码/网络异常 → 视为无效,并返回原因
4) sign_in(cookie, retry_count=1)
执行签到(支持重试)
请求:
GET https://mfuns.net/v1/sign/sign按
retry_count控制最多重试次数(默认 1 次重试,也就是最多请求 2 次)结果判断(按返回 JSON 的
code):code == 1→ 签到成功code == 0→ 今日已签到(仍算成功)其他 code → 失败,可重试
同时捕获:
网络异常(RequestException)
JSON 解析异常(JSONDecodeError)
返回一个结构化结果:
success/message/data/attempts
5) main()
主流程编排
打印开始时间、重试配置
读取
NEKO_MFUNS_COOKIE调用
test_token_validity():无效就退出码 1调用
sign_in():打印结果与响应 JSON(格式化输出)最终根据签到是否成功
sys.exit(0 or 1)
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论