Continue seeded Qinglong script collection

This commit is contained in:
Hermes Agent
2026-05-24 05:33:05 +00:00
parent ca1a4275e4
commit b082da3fe1
392 changed files with 131619 additions and 7 deletions

View File

@@ -0,0 +1,683 @@
# Source: https://github.com/3ixi/CodeScripts/blob/main/jieshibang.py
# Raw: https://raw.githubusercontent.com/3ixi/CodeScripts/main/jieshibang.py
# Repo: 3ixi/CodeScripts
# Path: jieshibang.py
# UploadedAt: 2025-09-23T14:07:43+08:00
# SHA256: 06534c171f947641f0d11096c44fd2028820defdd07e5168b2dcf295862fe5b2
# Category: 微信小程序/抓包版
# Evidence: appid/openid/session_key/encryptedData等小程序字段
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
杰士邦会员中心小程序签到脚本
脚本作者3iXi
创建时间2025/07/07
此脚本需要配合iPad协议服务使用
小程序:杰士邦会员中心
---------------
更新时间2025/07/08新增阅读签到活动但是活动获取有点问题9号修复
"""
import json
import time
import re
from datetime import datetime
from typing import Dict, Optional
try:
import httpx
except ImportError:
print("错误: 需要安装 httpx[http2] 依赖")
exit(1)
import getCode
class JieshibangSignin:
"""杰士邦小程序签到"""
def __init__(self):
self.base_url = "https://api.vshop.hchiv.cn"
self.app_id = "wx5966681b4a895dee"
self.base_headers = {
"host": "api.vshop.hchiv.cn",
"xweb_xhr": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF",
"appenv": "test",
"content-type": "application/json",
"accept": "*/*",
"referer": "https://servicewechat.com/wx5966681b4a895dee/47/page-frame.html",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9"
}
self.headers = self.base_headers.copy()
self.client = httpx.Client(http2=True, verify=False)
def get_timestamp(self) -> int:
"""获取13位时间戳"""
return int(time.time() * 1000)
def clear_session(self):
"""清理会话数据防止cookie污染"""
self.headers = self.base_headers.copy()
self.client.cookies.clear()
print("会话数据已清理")
def login(self, wx_info: str) -> Optional[str]:
"""登录获取token"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/member/wechatlogin/authLoginApplet"
params = {
"sideType": "3",
"mob": "",
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"wxInfo": wx_info,
"extend": "{\"sourcePage\":\"/packageA/pages/integral-index/integral-index\",\"activityId\":\"\",\"sourceShopId\":\"\",\"guideNo\":\"\",\"way\":\"member\",\"linkType\":\"2001\"}",
"sessionIdForWxShop": ""
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success") and data.get("data", {}).get("success"):
client_token = data["data"]["data"].get("clientToken")
if client_token:
self.headers["authorization"] = f"Bearer {client_token}"
return client_token
else:
if data.get("data", {}).get("code") == 1012:
return "CODE_EXPIRED"
except Exception as e:
print(f"登录请求失败: {e}")
return None
def get_client_info(self) -> Optional[Dict]:
"""获取客户信息"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/member/tblogin/getClientInfo"
params = {
"sideType": "3",
"mob": "",
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success") and data.get("data", {}).get("success"):
return data["data"]["data"]
except Exception as e:
print(f"获取客户信息失败: {e}")
return None
def get_signin_activity_id(self, mob: str) -> Optional[str]:
"""获取签到活动ID"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/common/common/get-customer-page"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"pageId": 102999,
"pageType": 2
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
page_json_str = data.get("data", {}).get("result", {}).get("pageJson", "")
if page_json_str:
try:
page_json = json.loads(page_json_str)
for module in page_json.get('moduleList', []):
if module.get('type') == 'iconNav':
if 'detail' in module and 'linkList' in module['detail']:
for link in module['detail']['linkList']:
if link.get('text') == '签到':
return link.get('id')
except json.JSONDecodeError:
print("解析pageJson失败")
except Exception as e:
print(f"获取签到活动ID失败: {e}")
return None
def signin(self, mob: str, activity_id: str) -> bool:
"""提交签到"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/api/play-default/sign/add-sign-new.do"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
integral = data.get("data", {}).get("integral", 0)
integral_alias = data.get("data", {}).get("integralAlias", "积分")
print(f"签到成功,获得{integral}{integral_alias}")
return True
else:
print(f"签到失败: {data.get('errorMessage', '未知错误')}")
except Exception as e:
print(f"签到请求失败: {e}")
return False
def get_lottery_activity_id(self, mob: str):
"""获取抽奖活动ID和名称"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/common/common/get-customer-page"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"pageId": 111079,
"pageType": 2
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
page_json_str = data.get("data", {}).get("result", {}).get("pageJson", "")
if page_json_str:
try:
page_json_str = re.sub(r'[\x00-\x1f\x7f-\x9f]', '', page_json_str)
page_json = json.loads(page_json_str)
for module in page_json.get('moduleList', []):
if module.get('type') == 'imgAd':
detail = module.get('detail', {})
link_list = detail.get('linkList', [])
for link in link_list:
zones = link.get('zones', [])
for zone in zones:
link_url = zone.get('linkUrl', '')
if '抽奖' in link_url:
return zone.get('id'), link_url
except json.JSONDecodeError as e:
print(f"解析抽奖pageJson失败: {e}")
except Exception as e:
print(f"获取抽奖活动ID失败: {e}")
return None, None
def get_lottery_times(self, mob: str, activity_id: str) -> int:
"""获取抽奖次数"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/activity/draw/child/receiveFreeTimes"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success") and data.get("data", {}).get("success"):
total_times = data["data"]["data"].get("totalTimes", 0)
return total_times
except Exception as e:
print(f"获取抽奖次数失败: {e}")
return 0
def lottery(self, mob: str, activity_id: str) -> bool:
"""提交抽奖"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/activity/draw/startTurntable"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success") and data.get("data", {}).get("success"):
prize_result = data["data"]["data"].get("prizeResult", {})
prize_name = prize_result.get("prizeName", "未知奖品")
print(f"抽奖成功,获得{prize_name}")
return True
else:
print(f"抽奖失败: {data.get('errorMessage', '未知错误')}")
except Exception as e:
print(f"抽奖请求失败: {e}")
return False
def get_activity_list(self, mob: str) -> Optional[str]:
"""获取活动列表,查找包含"签到"的活动"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/activity/activity/activityList"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"pageNumber": 1,
"pageSize": 20,
"decoActStatus": ["1"]
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success") and data.get("data", {}).get("success"):
data_list = data["data"]["data"].get("dataList", [])
for activity in data_list:
name = activity.get("name", "")
if "签到" in name:
activity_id = str(activity.get("id", ""))
print(f"获取到{name}")
return activity_id
except Exception as e:
print(f"获取活动列表失败: {e}")
return None
def get_sign_prize(self, mob: str, activity_id: str) -> Optional[str]:
"""获取签到活动奖励详情"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/cloud/activity/sign/getSignPrize"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
response_list = data.get("data", {}).get("responseList", [])
if response_list:
prize_name = response_list[0].get("prizeName", "未知奖品")
return prize_name
except Exception as e:
print(f"获取签到奖励详情失败: {e}")
return None
def add_sign_new(self, mob: str, activity_id: str) -> Optional[Dict]:
"""提交签到活动"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/api/play-default/sign/add-sign-new.do"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
result_data = data.get("data", {})
integral = result_data.get("integral", 0)
integral_alias = result_data.get("integralAlias", "积分")
return {"integral": integral, "integralAlias": integral_alias}
except Exception as e:
print(f"提交签到活动失败: {e}")
return None
def get_continuous_sign_days(self, mob: str, activity_id: str) -> Optional[int]:
"""获取连续签到天数"""
timestamp = self.get_timestamp()
url = f"{self.base_url}/jfmb/api/play-default/sign/current-month-signdays-new.do"
params = {
"sideType": "3",
"mob": mob,
"appId": self.app_id,
"shopNick": self.app_id,
"timestamp": timestamp
}
# 获取当前年月,格式为 YYYY-MM
current_time = datetime.now().strftime("%Y-%m")
payload = {
"appId": self.app_id,
"openId": True,
"shopNick": "",
"timestamp": timestamp,
"interfaceSource": 0,
"activityId": activity_id,
"time": current_time
}
payload_str = json.dumps(payload, separators=(',', ':'))
self.headers["content-length"] = str(len(payload_str.encode('utf-8')))
try:
response = self.client.post(url, params=params, json=payload, headers=self.headers)
response.raise_for_status()
data = response.json()
if data.get("success"):
result_data = data.get("data", {})
continuous_sign_day = result_data.get("continuousSignDay", 0)
return continuous_sign_day
except Exception as e:
print(f"获取连续签到天数失败: {e}")
return None
def process_account(self, nick_name: str, wx_info: str, license: Optional[str] = None) -> bool:
"""处理单个账号的签到和抽奖"""
print(f"\n开始处理账号: {nick_name}")
token = self.login(wx_info)
if token == "CODE_EXPIRED":
print(f"Code已过期重新获取...")
if license:
try:
new_code = getCode.get_single_code(self.app_id, license)
print(f"重新获取到Code: {new_code}")
token = self.login(new_code)
except Exception as e:
print(f"重新获取Code失败: {e}")
return False
else:
print("无法重新获取Code跳过此账号")
return False
if not token:
print(f"账号 {nick_name} 登录失败")
self.clear_session()
return False
client_info = self.get_client_info()
if not client_info:
print(f"获取账号 {nick_name} 信息失败")
return False
client_name = client_info.get("client_name", nick_name)
residual_integral = client_info.get("residualIntegral", 0)
user_mob = client_info.get("user_mob", "")
print(f"{client_name}登录成功,当前积分{residual_integral}")
# 第一个签到活动
print("\n--- 每日签到 ---")
signin_id = self.get_signin_activity_id(user_mob)
if signin_id:
self.signin(user_mob, signin_id)
else:
print("获取签到活动ID失败")
# 第二个签到活动流程
print("\n--- 签到活动 ---")
try:
activity_id = self.get_activity_list(user_mob)
if activity_id:
# 获取签到奖励详情
prize_name = self.get_sign_prize(user_mob, activity_id)
if prize_name:
print(f"签到奖励:{prize_name}")
# 提交签到
sign_result = self.add_sign_new(user_mob, activity_id)
if sign_result:
integral = sign_result.get("integral", 0)
integral_alias = sign_result.get("integralAlias", "积分")
print(f"签到成功,获得{integral}{integral_alias}")
# 获取连续签到天数
continuous_days = self.get_continuous_sign_days(user_mob, activity_id)
if continuous_days is not None:
print(f"已连续签到{continuous_days}")
else:
print("签到活动提交失败")
except Exception as e:
print(f"签到活动处理失败,跳过: {e}")
# 抽奖活动
print("\n--- 抽奖活动 ---")
lottery_id, lottery_name = self.get_lottery_activity_id(user_mob)
if lottery_id:
lottery_times = self.get_lottery_times(user_mob, lottery_id)
print(f"抽奖活动\"{lottery_name}\"可免费抽奖{lottery_times}")
if lottery_times > 0:
self.lottery(user_mob, lottery_id)
else:
print("没有免费抽奖次数")
else:
print("获取抽奖活动ID失败")
self.clear_session()
return True
def close(self):
"""关闭HTTP客户端"""
self.client.close()
def reset_client(self):
"""重置HTTP客户端创建新的连接"""
self.client.close()
self.client = httpx.Client(http2=True, verify=False)
def main():
"""主函数"""
try:
print("正在获取登录Code...")
app_id = "wx5966681b4a895dee"
codes = getCode.get_wechat_codes(app_id)
if not codes:
print("未获取到任何在线账号的Code")
return
print(f"获取到 {len(codes)} 个账号的Code")
signin = JieshibangSignin()
try:
for i, (nick_name, code) in enumerate(codes.items(), 1):
print(f"\n{'='*50}")
print(f"处理第 {i}/{len(codes)} 个账号")
print(f"{'='*50}")
try:
signin.process_account(nick_name, code)
except Exception as e:
print(f"处理账号 {nick_name} 时发生错误: {e}")
signin.clear_session()
if i < len(codes):
print(f"等待2秒后处理下一个账号...")
time.sleep(2)
finally:
signin.close()
print("\n所有账号处理完成")
except Exception as e:
print(f"脚本执行失败: {e}")
if __name__ == "__main__":
main()