# Source: https://github.com/lksky8/sign-ql/blob/main/yxw_appsign.py # Raw: https://raw.githubusercontent.com/lksky8/sign-ql/main/yxw_appsign.py # Repo: lksky8/sign-ql # Path: yxw_appsign.py # UploadedAt: 2025-09-28T06:42:50Z # SHA256: c6d91db16e3a84bf5dfc1e2c7d6cb38fb3f6d38f5829d7f496ba308fa7a77a10 # Category: web版/账密 # Evidence: web/H5关键词 + username/password/login ''' 作者:https://github.com/lksky8/sign-ql/ 日期:2025-9-28 网站:游侠网APP签到 功能:签到、抽奖,金币可换现金买游戏,配合金币脚本使用可获得更多金币 变量:yxwlogin='账号&密码' 多个账号用@或者#分割 定时:一天一次 cron:45 8 * * * ''' from json import JSONDecodeError import requests import hashlib import time import json import os import re import datetime if 'yxwlogin' in os.environ: yxwlogin = re.split("@|#",os.environ.get("yxwlogin")) print(f'查找到{len(yxwlogin)}个账号') else: yxwlogin = [] send_msg = '' one_msg = '' def log(cont=''): global send_msg, one_msg if cont: one_msg += f'\n{cont}' send_msg += f'\n{cont}' def send_notification_message(title): try: from notify import send print("加载通知服务成功!") send(title, send_msg) except Exception as e: if e: print('发送通知消息失败!') api_headers = { 'Host': 'api3.ali213.net', 'accept': '*/*', 'user-agent': 'ali213app', 'accept-language': 'zh-Hans-CN;q=1', } def get_user_ids_and_tokens(file_path='youxia_data.json'): try: # 1. 读取JSON文件 with open(file_path, 'r', encoding='utf-8') as f: phone_data = json.load(f) # 2. 遍历每个手机号 results = [] for phone_key, data in phone_data.items(): user_name = data.get('nickname') user_token = data.get('token') if user_name and user_token: # 确保userId和token存在 results.append({ 'phone_key': phone_key, 'user_name': user_name, 'token': user_token }) # print(f"手机号: {phone_key}, userId: {user_id}, token: {token}") return results except FileNotFoundError: print(f"文件 {file_path} 不存在!") return [] except json.JSONDecodeError: print(f"文件 {file_path} 格式错误!") return [] def save_or_update_phone_data(phone_key, new_data, file_path='youxia_data.json'): if os.path.exists(file_path): with open(file_path, 'r', encoding='utf-8') as f: existing_data = json.load(f) else: existing_data = {} if phone_key in existing_data: existing_data[phone_key].update(new_data) # 合并新旧数据 print(f"账号 [{phone_key}] 数据已更新!") else: existing_data[phone_key] = new_data # 新增数据 print(f"账号 [{phone_key}] 新增数据!") with open(file_path, 'w', encoding='utf-8') as f: json.dump(existing_data, f, ensure_ascii=False, indent=4) def get_userdata(u): phone_user = u.split('&')[0] phone_password = u.split('&')[1] try: with open('youxia_data.json', 'r', encoding='utf-8') as f: cache_data = json.load(f) except (FileNotFoundError, json.JSONDecodeError): cache_data = {} if phone_user not in cache_data: print(f'账号 {phone_user} 不存在于缓存中,尝试初始化数据') login(phone_user, phone_password) else: print(f'账号 {phone_user} 已存在于缓存中,直接读取数据') def md5_encode(string): md5 = hashlib.md5() md5.update(string.encode('utf-8')) return md5.hexdigest() def check_token(phone,token): # 检查token是否有效,并返回新的token try: response = requests.get(f'https://api3.ali213.net/feedearn/checktoken?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{phone}] token 有效') save_or_update_phone_data(phone, {'token': response_json['token']}) return response_json['token'] else: print(f'账号 [{phone}] token 无效') log(f'账号 [{phone}] token 无效\n') return None except JSONDecodeError as e: print(f'账号 [{phone}] 检查token失败: {e}') except Exception as e: print(f'账号 [{phone}] 检查token失败: {e}') def token_exchanger(token): headers = { 'Host': 'api3.ali213.net', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 ali213app', 'accept-language': 'zh-CN,zh-Hans;q=0.9', 'sec-fetch-dest': 'document', } response = requests.get('https://api3.ali213.net/feedearn/tokenexchanger?token='+token+'&redirectUrl=https://api3.ali213.net/feedearn/luckybox',headers=headers) print(response.text) def userinfo(phone,token): try: response = requests.get(f'https://api3.ali213.net/feedearn/userbaseinfo?token={token}', headers=api_headers) response_json = response.json() if '"status":0' in response.text: print(f'账号 [{phone}] 登录过期,需要重新登录') log(f'账号 [{phone}] 登录过期,需要重新登录\n') else: experience = response_json['experience'] nextgrade_experience = response_json['nextgrade']['experience'] nextgrade_experience_coin = response_json['nextgrade']['coin'] money = response_json['money'] / 100 # 计算百分比 percent = (experience / nextgrade_experience) * 100 print(f'账号 [{response_json["nickname"]}] Lv.{response_json["grade"]} 目前金币:{response_json["coins"]} 现金:{money} 剩余{percent:.2f}% 即可升级获得{nextgrade_experience_coin}金币') log(f'账号 [{response_json["nickname"]}] Lv.{response_json["grade"]} 目前金币:{response_json["coins"]} 现金:{money} 剩余{percent:.2f}% 即可升级获得{nextgrade_experience_coin}金币\n') except requests.exceptions.RequestException as e: print(f'账号 [{phone}] 获取用户信息失败: {e}') except json.JSONDecodeError as e: print(f'账号 [{phone}] 获取用户信息失败: {e}') except Exception as e: print(f'账号 [{phone}] 获取用户信息失败: {e}') def check_sign(name,token): try: response = requests.get(f'https://api3.ali213.net/feedearn/signing?action=set&token={token}', headers=api_headers) if r'\u7528\u6237\u672a\u767b\u5f55\u6216\u767b\u5f55\u5df2\u8d85\u65f6' in response.text: print(f'账号 [{name}] 登录过期,需要重新登录') else: response_json = response.json() if response_json['data']['status'] == 1: print(f'账号 [{name}] {response_json["data"]["msg"]},获得金币:{response_json["data"]["coins"]}') log(f'账号 [{name}] {response_json["data"]["msg"]},获得金币:{response_json["data"]["coins"]}\n') elif response_json['data']['status'] == 0: print(f'账号 [{name}] {response_json["data"]["msg"]}') log(f'账号 [{name}] {response_json["data"]["msg"]}\n') else: print(f'账号 [{name}] 签到失败:{response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 签到失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 签到失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 签到失败[其他]: {e}') def login(phone, password): headers = { 'Host': 'i.ali213.net', 'accept': '*/*', 'user-agent': 'ali213app', 'accept-language': 'zh-Hans-CN;q=1', } time10 = str(int(time.time())) params = { 'action': 'login', 'from': 'feedearn', 'passwd': password, 'signature': md5_encode(f'username-{phone}-time-{time10}-passwd-{password}-from-feedearn-action-loginBGg)K6ng4?&x9sCIuO%C2%' + '{@TJ?fnFJ,bZKy/[/EWnw9UsC$@1'), 'time': time10, 'username': phone, } try: response = requests.get('https://i.ali213.net/api.html', params=params, headers=headers) response.raise_for_status() response_json = response.json() if response_json['status'] == 1 and response_json['msg'] == '登录成功': print('登录成功: ' + response_json['data']['userinfo']['nickname']) log(f'账号 [{response_json["data"]["userinfo"]["nickname"]}] 登录成功\n') new_data = { 'uid': response_json['data']['userinfo']['uid'], 'nickname': response_json['data']['userinfo']['nickname'], 'token': response_json['data']['token'], } save_or_update_phone_data(phone, new_data) elif response_json['status'] == 0: print('登录失败: ' + response_json['msg']) log(f'登录失败: {response_json["msg"]}\n') else: print('登录失败: ' + response_json) except requests.exceptions.RequestException as e: print(e) def newusercheck(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/newusercheck?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1 and response_json['msg'] == '您是老用户,所以还是跳老活动页面吧' or response_json['msg'] == '您参与完新用户活动了,现在去老活动页面吧': # print(f'账号 [{name}] 老用户了,去周签') olduser_sign(name, token) elif response_json['status'] == 3 and response_json['msg'] == '您是最新用户,可以跳最新活动页面了': # print(f'账号 [{name}] 新用户,去首月福利签到') newuser_sign(name, token) else: print(f'账号 [{name}] 未知状态: {response_json}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 检查新用户失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 检查新用户失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 检查新用户失败[其他]: {e}') def newuser_sign(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/newuseractivitysign?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{name}] 新用户福利: {response_json["msg"]}') log(f'账号 [{name}] 新用户福利: {response_json["msg"]}\n') newuser_monthsigncheck(name, token) elif response_json['status'] == 0: print(f'账号 [{name}] 新用户福利: {response_json["msg"]}') log(f'账号 [{name}] 新用户福利: {response_json["msg"]}\n') newuser_monthsigncheck(name, token) else: print(f'账号 [{name}] 新用户福利:签到失败 {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 新用户福利签到失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 新用户福利签到失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 新用户福利签到失败[其他]: {e}') def newuser_monthsigncheck(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/newusermonthactivity?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: prize = response_json['data']['prize'] today = datetime.datetime.now().strftime('%Y-%m-%d') for item in prize: if item['date'] == today: print(f"账号 [{name}] 【新用户首月福利】 今天({today})的签到信息:") log(f'账号 [{name}] 【新用户首月福利】 今天({today})的签到信息:\n') newuser_kjl(name, token, item['con'], item['tit'], item['typeid']) break else: print('没有获取到当天签到数据') log('没有获取到当天签到数据\n') month_day = response_json["data"]["qztime"].split(',') print(f'账号 [{name}] 【新用户首月福利】已签到: {response_json["data"]["wcday"]}天,已领取{response_json["data"]["totalcoin"]}金币') log(f'账号 [{name}] 【新用户首月福利】已签到: {response_json["data"]["wcday"]}天,已领取{response_json["data"]["totalcoin"]}金币\n') print(f'账号 [{name}] 【新用户首月福利】从{month_day[0]}开始,到{month_day[1]}结束。记得绑定Steam账号才能领取奖励') elif response_json['status'] == 0: print(f'账号 [{name}] 新用户月签查询失败: {response_json["msg"]}') log(f'账号 [{name}] 新用户月签查询失败: {response_json["msg"]}\n') else: print(f'账号 [{name}] 新用户月签查询失败: {response.text}') log(f'账号 [{name}] 新用户月签查询失败: {response.text}\n') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 新用户月签查询失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 新用户月签查询失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 新用户月签查询失败[其他]: {e}') def olduser_sign(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/olduseractivitysign?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{name}] 老用户福利: {response_json["msg"]}') log(f'账号 [{name}] 老用户福利: {response_json["msg"]}\n') olduser_weeksigncheck(name, user_token) elif response_json['status'] == 0: print(f'账号 [{name}] 老用户福利: {response_json["msg"]}') log(f'账号 [{name}] 老用户福利: {response_json["msg"]}\n') olduser_weeksigncheck(name, user_token) else: print(f'账号 [{name}] 老用户福利:签到失败 {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 老用户福利签到失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 老用户福利签到失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 老用户福利签到失败[其他]: {e}') def olduser_weeksigncheck(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/oldusermonthactivity?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{name}] 【第{response_json["data"]["prizingno"]}阶段】已达成连续签到: {response_json["data"]["signday"]}天') log(f'账号 [{name}] 【第{response_json["data"]["prizingno"]}阶段】已达成连续签到: {response_json["data"]["signday"]}天\n') if response_json["data"]["signday"] == 7: print(f'账号 [{name}] 第七天了,可领取奖励') time.sleep(5) kjl(name, token) elif response_json['status'] == 0: print(f'账号 [{name}] 周签查询失败: {response_json["msg"]}') log(f'账号 [{name}] 周签查询失败: {response_json["msg"]}\n') else: print(f'账号 [{name}] 周签查询失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 周签查询失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 周签查询失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 周签查询失败[其他]: {e}') def kjl(name, token): try: response = requests.get(f'https://api3.ali213.net/feedearn/olduseractivityprizing?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1 and response_json['msg'] == '恭喜中奖': print(f'账号 [{name}] 已领取奖励: 《{response_json["data"]["name"]}》') log(f'账号 [{name}] 已领取奖励: 《{response_json["data"]["name"]}》\n') elif response_json['status'] == 0: print(f'账号 [{name}] 领取奖励失败: {response_json["msg"]}') log(f'账号 [{name}] 领取奖励失败: {response_json["msg"]}\n') else: print(f'账号 [{name}] 领取奖励失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 领取奖励失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 领取奖励失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 领取奖励失败[其他]: {e}') def newuser_kjl(name,token,coin,mem,typeid): try: params = { "coin": coin, "mem": mem, "token": token, "typeid": str(typeid) } response = requests.post("https://api3.ali213.net/feedearn/newuserprizing", params=params, headers=api_headers) response_json = response.json() if response_json['status'] == 1 and response_json['msg'] == '成功': print(f'账号 [{name}] 【新用户首月福利】已领取奖励: {coin}') log(f'账号 [{name}] 【新用户首月福利】已领取奖励: {coin}\n') elif response_json['status'] == 0: print(f'账号 [{name}] 【新用户首月福利】领取奖励失败: {response_json["msg"]}') log(f'账号 [{name}] 【新用户首月福利】领取奖励失败: {response_json["msg"]}\n') else: print(f'账号 [{name}] 【新用户首月福利】领取奖励失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 【新用户首月福利】领取奖励失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 【新用户首月福利】领取奖励失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 【新用户首月福利】领取奖励失败[其他]: {e}') def luckbox_cookies(phone, token): headers = { 'Host': 'api3.ali213.net', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'sec-fetch-site': 'none', 'sec-fetch-mode': 'navigate', 'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 ali213app', 'accept-language': 'zh-CN,zh-Hans;q=0.9', 'sec-fetch-dest': 'document', } try: response = requests.get(f'https://api3.ali213.net/feedearn/tokenexchanger?token={token}&redirectUrl=https://api3.ali213.net/feedearn/luckybox', headers=headers) api3AliSSO = response.cookies.get_dict() if api3AliSSO: print(f'账号 [{phone}] 获取神秘宝箱cookies成功') save_or_update_phone_data(phone, api3AliSSO) else: print(f'账号 [{phone}] 获取神秘宝箱cookies失败') log(f'账号 [{phone}] 获取神秘宝箱cookies失败\n') except requests.exceptions.RequestException as e: print(f'账号 [{phone}] 获取神秘宝箱cookies失败[请求]: {e}') except Exception as e: print(f'账号 [{phone}] 获取神秘宝箱cookies失败[其他]: {e}') def usermission(name,token): try: response = requests.get(f'https://api3.ali213.net/feedearn/usermission?token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{name}] 任务查询成功') common_mission = response_json['data']['common'] if common_mission: for mission in common_mission: mission_name = mission['title'] mission_experience = mission['experience'] mission_total = mission['total'] mission_prize = mission['prize'] print(f'任务名称: {mission_name}, 每日次数: {mission_total}, 奖励经验: {mission_experience}, {mission_prize}') elif response_json['status'] == 0: print(f'账号 [{name}] 任务查询失败: {response_json["msg"]}') else: print(f'账号 [{name}] 任务查询失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 任务查询失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 任务查询失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 任务查询失败[其他]: {e}') def share(name,token,entity_id): try: response = requests.get(f'https://api3.ali213.net/feedearn/sharearticle?channelID=1&entityID={entity_id}&token={token}', headers=api_headers) response_json = response.json() if response_json['status'] == 1: print(f'账号 [{name}] 分享成功,奖励: {response_json["msg"]}金币') elif response_json['status'] == 0: print(f'账号 [{name}] 分享失败: {response_json["msg"]}') else: print(f'账号 [{name}] 分享失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 分享失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 分享失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 分享失败[其他]: {e}') def get_recommendList(): try: response = requests.get('https://newapi.ali213.net/app/v1/recommendList?confirmNo=0&keyword=&lastId=&navId=2&pageNo=1&pageNum=10', headers=api_headers) response_json = response.json() if response_json['code'] == 200: print('推荐列表数据获取成功') data = response_json['data']['list'] integer_jump_urls = [] for item in data: if isinstance(item.get('jumpUrl'), int): integer_jump_urls.append(item['jumpUrl']) return integer_jump_urls else: print('推荐列表数据获取失败') log(f'推荐列表数据获取失败\n') return [] except requests.exceptions.RequestException as e: print(f'推荐列表数据获取失败[请求]: {e}') except json.JSONDecodeError as e: print(f'推荐列表数据获取失败[JSON]: {e}') except Exception as e: print(f'推荐列表数据获取失败[其他]: {e}') def get_square(): try: response = requests.get('https://club.ali213.net/application/forum/square?id=0', headers=api_headers) response_json = response.json() if response_json['code'] == 111 and response_json['msg'] == 'success': print('BBS社区数据获取成功') threadList = response.json()['data']['threadList'] thread_id = [] for item in threadList: thread_id.append(item['id']) return thread_id else: print('BBS社区数据获取失败') log(f'BBS社区数据获取失败\n') return [] except requests.exceptions.RequestException as e: print(f'BBS社区数据获取失败[请求]: {e}') except json.JSONDecodeError as e: print(f'BBS社区数据获取失败[JSON]: {e}') except Exception as e: print(f'BBS社区数据获取失败[其他]: {e}') def readingreward(name,token,threadid): try: response = requests.get(f'https://club.ali213.net/application/thread/readingreward?threadid={threadid}&token={token}', headers=api_headers) response_json = response.json() if response_json['code'] == 111 and response_json['msg'] == 'success': print(f'账号 [{name}] 阅读奖励成功,奖励: {response_json["data"]}金币') elif response_json['code'] == -1 and response_json['msg'] == 'failed': print(f'账号 [{name}] 阅读奖励失败: 已领取过奖励') else: print(f'账号 [{name}] 阅读奖励失败: {response.text}') except requests.exceptions.RequestException as e: print(f'账号 [{name}] 阅读奖励失败[请求]: {e}') except json.JSONDecodeError as e: print(f'账号 [{name}] 阅读奖励失败[JSON]: {e}') except Exception as e: print(f'账号 [{name}] 阅读奖励失败[其他]: {e}') if __name__ == '__main__': print('*'*50) all_user = len(yxwlogin) print(f"检测到环境变量中存在{all_user}个账号") for yxwlogin_item in yxwlogin: get_userdata(yxwlogin_item) user_data = get_user_ids_and_tokens() if not user_data: print("未读取到用户数据,程序退出") exit(0) else: print(f"读取到{len(user_data)}个账号") recommendList = get_recommendList() square = get_square() print('*'*50) for item in user_data: print('-' * 50) log('-' * 35) user_phone = item['phone_key'] user_name = item['user_name'] user_token = item['token'] new_user_token = check_token(user_phone,user_token) if new_user_token: check_sign(user_name, new_user_token) newusercheck(user_name, new_user_token) luckbox_cookies(user_phone, user_token) # usermission(user_name, new_user_token) if recommendList: for entity_id in recommendList: share(user_name, new_user_token, entity_id) time.sleep(1) else: print(f'账号 [{user_phone}] 推荐列表为空') if square: for thread_id in square: readingreward(user_name, new_user_token, thread_id) time.sleep(1) else: print(f'账号 [{user_phone}] BBS社区列表为空') userinfo(user_phone, new_user_token) else: print(f'账号 [{user_phone}] 获取数据失败') continue try: send_notification_message(title='游侠网开宝箱') # 发送通知 except Exception as e: print('推送失败:' + str(e))