Collect seeded Qinglong script repositories

This commit is contained in:
Hermes Agent
2026-05-24 04:36:41 +00:00
parent 28d62fef03
commit ca1a4275e4
282 changed files with 143071 additions and 5 deletions

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,158 @@
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/360.py
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/360.py
# Repo: smallfawn/QLScriptPublic
# Path: daily/360.py
# UploadedAt: 2026-04-07T07:05:19Z
# SHA256: 6ad9e6349174feff19123a743bc626bb84d6916c289d4ab3017d6b967b231a6e
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 作者: 青龙面板适配
# 说明: 360社区自动签到脚本青龙面板专用
# 依赖: requests
# new Env("360社区签到")
# 用法: 在青龙面板环境变量中设置 BBS360_COOKIE
# 请确保Cookie包含 __cfduid, uid 等必要字段
import os
import re
import time
import random
import requests
from dataclasses import dataclass
from typing import Optional, Tuple
SIGN_PAGE = "https://bbs.360.cn/dsu_paulsign-sign.html"
SIGN_API = "https://bbs.360.cn/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1"
@dataclass
class CheckinResult:
ok: bool
status: str
detail: str
class BBS360Checkin:
"""360社区签到客户端青龙面板适配"""
def __init__(self, cookie: str, timeout: int = 20):
self.cookie = cookie.strip()
self.timeout = timeout
self.session = requests.Session()
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Cookie": self.cookie,
"Referer": "https://bbs.360.cn/",
})
def fetch_formhash(self) -> Tuple[Optional[str], str]:
"""拉取签到页并提取 formhash"""
resp = self.session.get(SIGN_PAGE, timeout=self.timeout, allow_redirects=True)
text = resp.text or ""
# 青龙面板特殊处理如果返回403可能是需要验证
if resp.status_code == 403:
return None, "403 Forbidden可能需要绑定手机号"
# 未登录/未绑定手机号时提示
if "您需要先登录才能继续本操作" in text or "请使用手机微信扫码安全登录" in text:
return None, "未登录或账号未绑定手机号需在360社区绑定手机号"
# 提取 formhash
m = re.search(r'formhash=([0-9a-zA-Z]{6,})', text)
if not m:
m = re.search(r'name="formhash"\s+value="([0-9a-zA-Z]{6,})"', text)
if not m:
return None, "未解析到 formhash页面结构可能变更"
return m.group(1), "OK"
def submit_checkin(self, formhash: str) -> CheckinResult:
"""提交签到请求"""
moods = ["kx", "ym", "tp", "ng", "wl"]
payload = {
"formhash": formhash,
"qdxq": random.choice(moods),
"qdmode": "1",
"todaysay": random.choice([
"打卡签到,愿一切顺利!",
"新的一天,继续加油~",
"保持热爱,奔赴山海。",
"今日签到,万事胜意。",
"坚持自律,慢慢变强。",
]),
"fastreply": "0",
}
resp = self.session.post(SIGN_API, data=payload, timeout=self.timeout)
raw = resp.text or ""
# 青龙面板特殊处理返回403或500
if resp.status_code != 200:
return CheckinResult(False, f"http_{resp.status_code}", f"HTTP {resp.status_code}")
# 检查签到结果
if "签到成功" in raw or ("恭喜" in raw and "签到" in raw):
return CheckinResult(True, "success", self._extract_message(raw) or "签到成功")
if "已经签到" in raw or "已签到" in raw or "请勿重复签到" in raw:
return CheckinResult(True, "already", self._extract_message(raw) or "今日已签到")
if ("formhash" in raw and "错误" in raw) or "请求无效" in raw:
return CheckinResult(False, "bad_formhash", self._extract_message(raw) or "formhash无效/过期")
return CheckinResult(False, "unknown", self._extract_message(raw) or raw[:200])
@staticmethod
def _extract_message(text: str) -> str:
"""提取提示信息"""
m = re.search(r"showmessage\('([^']+)'\)", text)
if m:
return m.group(1)
m = re.search(r"([^\n\r]{0,20}(签到|已签到|重复签到)[^\n\r]{0,40})", text)
if m:
return m.group(1)
return ""
def run(self) -> CheckinResult:
formhash, info = self.fetch_formhash()
if not formhash:
return CheckinResult(False, "no_login_or_parse_failed", info)
time.sleep(random.uniform(1.0, 2.5))
return self.submit_checkin(formhash)
def main():
# 青龙面板专用从环境变量获取Cookie
cookie = os.getenv("BBS360_COOKIE", "").strip()
if not cookie:
print("❌ 未设置环境变量 BBS360_COOKIE")
print("💡 请在青龙面板 → 环境变量 → 添加以下内容:")
print(" KEY: BBS360_COOKIE")
print(" VALUE: 从浏览器复制的完整Cookie包含__cfduid, uid等")
return
# 青龙面板特殊处理检测Cookie是否包含必要字段
if "__cfduid" not in cookie or "uid" not in cookie:
print("❌ Cookie无效缺少必要字段需包含__cfduid和uid")
print("💡 请重新复制Cookie")
print(" 1. 登录 bbs.360.cn → F12 → Application → Cookies")
print(" 2. 复制 bbs.360.cn 下的所有Cookie字段")
return
client = BBS360Checkin(cookie=cookie, timeout=20)
result = client.run()
# 青龙面板专用输出格式
if result.ok:
print(f"✅ 360签到成功 | {result.status} | {result.detail}")
else:
print(f"❌ 360签到失败 | {result.status} | {result.detail}")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,257 @@
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/BREO.py
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/BREO.py
# Repo: smallfawn/QLScriptPublic
# Path: daily/BREO.py
# UploadedAt: 2026-04-07T11:05:15Z
# SHA256: 446c598f98f635052297065eb89ca1d0a7ae4a9e0c9caf49cdb7b41cd1e8f585
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#by:哆啦A梦
#入口:http://mx.qrurl.net/h5/wxa/link?sid=26407uif5Oq
#抓包breoplus.breo.cn的域名下的token多账号换行分割
#账号变量名:BREO
#new Env("BREO")
#cron 8 9,10,11 * * *
import requests
import json
import os
import time
def get_random_one_word():
try:
response = requests.get("https://uapis.cn/api/say")
if response.status_code == 200:
return response.text.strip()
else:
return "无法获取一言"
except Exception as e:
print(f"获取一言时出错: {e}")
return "无法获取一言"
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
def post_to_breo(token, content, title):
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/releasePost"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"anonymoused": 1,
"content": content,
"expressText": "",
"images": [],
"subTitle": "",
"title": title,
"topicText": ""
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 发帖成功!")
print(f"帖子 ID: {result['result']['id']}")
print(f"帖子标题: {result['result']['title']}")
return result["result"]["id"]
else:
print(f"❌ 发帖失败,错误信息:{result.get('message', '未知错误')}")
return None
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"❌ 请求错误: {e}")
return None
def collect_post(token, post_id):
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/collect"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"postId": post_id
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 收藏成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 收藏失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
def comment_post(token, post_id):
for _ in range(2): # 评论2次
comment_content = get_random_one_word() # 使用随机一言作为评论内容
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/comment"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"anonymoused": 0,
"commentText": comment_content,
"postId": post_id
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 评论成功!")
print(f"评论内容: {result['result']['rootOutVO']['commentText']}")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 评论失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
time.sleep(1) # 避免频繁请求
def browse_mall(token):
url = "https://breoplus.breo.cn/breo-app/user/po-task-info/mall"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1"
}
try:
response = requests.post(url, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 浏览商城成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 浏览商城失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
def punch_in(token):
url = "https://breoplus.breo.cn/breo-app/user/po-task-info/punch"
headers = {
"Host": "breoplus.breo.cn",
"Connection": "keep-alive",
"Content-Length": "0",
"content-type": "application/json",
"token": token,
"charset": "utf-8",
"Referer": "https://servicewechat.com/wx61457400e4212cec/304/page-frame.html",
"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/134.0.6998.136 Mobile Safari/537.36 XWEB/1340043 MMWEBSDK/20241202 MMWEBID/3628 MicroMessenger/8.0.56.2800(0x2800385E) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Accept-Encoding": "gzip, deflate, br"
}
try:
response = requests.post(url, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 签到成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 签到失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
if __name__ == "__main__":
# 获取公告
#get_proclamation()
# 从环境变量读取 token
tokens = os.getenv("BREO", "").splitlines()
if not tokens:
print("❌ 未检测到 账号信息,退出脚本。")
else:
print("=============== 开始执行任务 ===============")
for i, token in enumerate(tokens, 1):
if token.strip(): # 跳过空行
print(f"\n-------------- 账号 {i} 开始 --------------")
print("🚀 正在签到...")
punch_in(token)
print("\n📝 正在发布帖子...")
post_id = post_to_breo(token, "这是一个自动发布的帖子", "自动化测试")
if post_id:
print("\n⭐ 正在收藏帖子...")
collect_post(token, post_id)
print("\n💬 正在评论帖子...")
comment_post(token, post_id)
else:
print("❌ 发帖失败,跳过后续操作。")
print("\n🛒 正在浏览商城...")
browse_mall(token)
print(f"-------------- 账号 {i} 结束 --------------")
print("\n=============== 所有任务执行完毕 ===============")

View File

@@ -0,0 +1,255 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/breo.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/breo.py
# Repo: jdqlscript/toulu
# Path: breo.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 647b98a9b738f298f61a064abe47421a4511e74520de74cd4653c39e236dcd5a
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#by:哆啦A梦
#入口:http://api.0vsp.com/h5/wxa/link?sid=25424JXZCFp
#抓包breoplus.breo.cn的域名下的token多账号换行分割
#账号变量名:BREO
import requests
import json
import os
import time
def get_random_one_word():
try:
response = requests.get("https://uapis.cn/api/say")
if response.status_code == 200:
return response.text.strip()
else:
return "无法获取一言"
except Exception as e:
print(f"获取一言时出错: {e}")
return "无法获取一言"
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
def post_to_breo(token, content, title):
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/releasePost"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"anonymoused": 1,
"content": content,
"expressText": "",
"images": [],
"subTitle": "",
"title": title,
"topicText": ""
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 发帖成功!")
print(f"帖子 ID: {result['result']['id']}")
print(f"帖子标题: {result['result']['title']}")
return result["result"]["id"]
else:
print(f"❌ 发帖失败,错误信息:{result.get('message', '未知错误')}")
return None
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"❌ 请求错误: {e}")
return None
def collect_post(token, post_id):
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/collect"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"postId": post_id
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 收藏成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 收藏失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
def comment_post(token, post_id):
for _ in range(2): # 评论2次
comment_content = get_random_one_word() # 使用随机一言作为评论内容
url = "https://breoplus.breo.cn/breo-app/communityBaseInfo/comment"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1",
"Content-Type": "application/json; charset=UTF-8"
}
data = {
"anonymoused": 0,
"commentText": comment_content,
"postId": post_id
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 评论成功!")
print(f"评论内容: {result['result']['rootOutVO']['commentText']}")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 评论失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
time.sleep(1) # 避免频繁请求
def browse_mall(token):
url = "https://breoplus.breo.cn/breo-app/user/po-task-info/mall"
headers = {
"token": token,
"device-type": "Xiaomi",
"device-version": "10",
"channel": "Breo",
"version_code": "30201",
"version": "3.2.1",
"encrypt": "1"
}
try:
response = requests.post(url, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 浏览商城成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 浏览商城失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
def punch_in(token):
url = "https://breoplus.breo.cn/breo-app/user/po-task-info/punch"
headers = {
"Host": "breoplus.breo.cn",
"Connection": "keep-alive",
"Content-Length": "0",
"content-type": "application/json",
"token": token,
"charset": "utf-8",
"Referer": "https://servicewechat.com/wx61457400e4212cec/304/page-frame.html",
"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/134.0.6998.136 Mobile Safari/537.36 XWEB/1340043 MMWEBSDK/20241202 MMWEBID/3628 MicroMessenger/8.0.56.2800(0x2800385E) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"Accept-Encoding": "gzip, deflate, br"
}
try:
response = requests.post(url, headers=headers)
if response.status_code == 200:
result = response.json()
if result.get("success", False):
print("✅ 签到成功!")
print(f"获得点数: {result['result']['point']}")
print(f"成长值: {result['result']['grow']}")
else:
print(f"❌ 签到失败,错误信息:{result.get('message', '未知错误')}")
else:
print(f"❌ 请求失败,状态码:{response.status_code}")
except Exception as e:
print(f"❌ 请求错误: {e}")
if __name__ == "__main__":
# 获取公告
get_proclamation()
# 从环境变量读取 token
tokens = os.getenv("BREO", "").splitlines()
if not tokens:
print("❌ 未检测到 账号信息,退出脚本。")
else:
print("=============== 开始执行任务 ===============")
for i, token in enumerate(tokens, 1):
if token.strip(): # 跳过空行
print(f"\n-------------- 账号 {i} 开始 --------------")
print("🚀 正在签到...")
punch_in(token)
print("\n📝 正在发布帖子...")
post_id = post_to_breo(token, "这是一个自动发布的帖子", "自动化测试")
if post_id:
print("\n⭐ 正在收藏帖子...")
collect_post(token, post_id)
print("\n💬 正在评论帖子...")
comment_post(token, post_id)
else:
print("❌ 发帖失败,跳过后续操作。")
print("\n🛒 正在浏览商城...")
browse_mall(token)
print(f"-------------- 账号 {i} 结束 --------------")
print("\n=============== 所有任务执行完毕 ===============")

View File

@@ -0,0 +1,277 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/Ruishu.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/Ruishu.py
# Repo: jdqlscript/toulu
# Path: Ruishu.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 0132420d27d358f8cd91749b877206aee7e2a86cec5cd99c8c119392e4d604f3
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
/*
#TL库:https://github.com/3288588344/toulu.git
#tg频道:https://t.me/TLtoulu
#QQ频道:https://pd.qq.com/s/672fku8ge
#微信机器人kckl6688
#公众号:哆啦A梦的藏宝箱
*/
import os
import ssl
import time
import json
import execjs
import base64
import random
import certifi
import aiohttp
import asyncio
import requests
from http import cookiejar
from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
from aiohttp import ClientSession, TCPConnector
import httpx
httpx._config.DEFAULT_CIPHERS += ":ALL:@SECLEVEL=1"
diffValue = 2
filename='Cache.js'
if os.path.exists(filename):
with open(filename, 'r', encoding='utf-8') as file:
fileContent = file.read()
else:
fileContent=''
class BlockAll(cookiejar.CookiePolicy):
return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
netscape = True
rfc2965 = hide_cookie2 = False
def printn(m):
print(f'\n{m}')
context = ssl.create_default_context()
context.set_ciphers('DEFAULT@SECLEVEL=1') # 低安全级别0/1
context.check_hostname = False # 禁用主机
context.verify_mode = ssl.CERT_NONE # 禁用证书
class DESAdapter(requests.adapters.HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
kwargs['ssl_context'] = context
return super().init_poolmanager(*args, **kwargs)
requests.DEFAULT_RETRIES = 0
requests.packages.urllib3.disable_warnings()
ss = requests.session()
ss.headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36", "Referer": "https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
ss.mount('https://', DESAdapter())
ss.cookies.set_policy(BlockAll())
runTime = 0
sleepTime = 1
key = b'1234567`90koiuyhgtfrdews'
iv = 8 * b'\0'
def encrypt(text):
cipher = DES3.new(key, DES3.MODE_CBC, iv)
ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size))
return ciphertext.hex()
def decrypt(text):
ciphertext = bytes.fromhex(text)
cipher = DES3.new(key, DES3.MODE_CBC, iv)
plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size)
return plaintext.decode()
def initCookie(getUrl='https://wapact.189.cn:9001/gateway/standQuery/detailNew/exchange'):
global js_code_ym, fileContent
cookie = ''
response = httpx.post(getUrl)
content = response.text.split(' content="')[2].split('" r=')[0]
code1 = response.text.split('$_ts=window')[1].split('</script><script type="text/javascript"')[0]
code1Content = '$_ts=window' + code1
Url = response.text.split('$_ts.lcd();</script><script type="text/javascript" charset="utf-8" src="')[1].split('" r=')[0]
urls = getUrl.split('/')
rsurl = urls[0] + '//' + urls[2] + Url
filename = 'Cache.js'
if fileContent == '':
if not os.path.exists(filename):
fileRes = httpx.get(rsurl)
fileContent = fileRes.text
if fileRes.status_code == 200:
with open(filename, 'w', encoding='utf-8') as file:
file.write(fileRes.text)
else:
print(f"Failed to download {rsurl}. Status code: {fileRes.status_code}")
if response.headers['Set-Cookie']:
cookie = response.headers['Set-Cookie'].split(';')[0].split('=')[1]
runJs = js_code_ym.replace('content_code', content).replace("'ts_code'", code1Content + fileContent)
execjsRun = RefererCookie(runJs)
return {
'cookie': cookie,
'execjsRun': execjsRun
}
def RefererCookie(runJs):
try:
execjsRun = execjs.compile(runJs)
return execjsRun
except execjs._exceptions.CompileError as e:
print(f"JavaScript 编译错误: {e}")
except execjs._exceptions.RuntimeError as e:
print(f"JavaScript 运行时错误: {e}")
except Exception as e:
print(f"其他错误: {e}")
js_code_ym = '''delete __filename
delete __dirname
ActiveXObject = undefined
window = global;
content="content_code"
navigator = {"platform": "Linux aarch64"}
navigator = {"userAgent": "CtClient;11.0.0;Android;13;22081212C;NTIyMTcw!#!MTUzNzY"}
location={
"href": "https://",
"origin": "",
"protocol": "",
"host": "",
"hostname": "",
"port": "",
"pathname": "",
"search": "",
"hash": ""
}
i = {length: 0}
base = {length: 0}
div = {
getElementsByTagName: function (res) {
console.log('div中的getElementsByTagName', res)
if (res === 'i') {
return i
}
return '<div></div>'
}
}
script = {
}
meta = [
{charset:"UTF-8"},
{
content: content,
getAttribute: function (res) {
console.log('meta中的getAttribute', res)
if (res === 'r') {
return 'm'
}
},
parentNode: {
removeChild: function (res) {
console.log('meta中的removeChild', res)
return content
}
},
}
]
form = '<form></form>'
window.addEventListener= function (res) {
console.log('window中的addEventListener:', res)
}
document = {
createElement: function (res) {
console.log('document中的createElement', res)
if (res === 'div') {
return div
} else if (res === 'form') {
return form
}
else{return res}
},
addEventListener: function (res) {
console.log('document中的addEventListener:', res)
},
appendChild: function (res) {
console.log('document中的appendChild', res)
return res
},
removeChild: function (res) {
console.log('document中的removeChild', res)
},
getElementsByTagName: function (res) {
console.log('document中的getElementsByTagName', res)
if (res === 'script') {
return script
}
if (res === 'meta') {
return meta
}
if (res === 'base') {
return base
}
},
getElementById: function (res) {
console.log('document中的getElementById', res)
if (res === 'root-hammerhead-shadow-ui') {
return null
}
}
}
setInterval = function () {}
setTimeout = function () {}
window.top = window
'ts_code'
function main() {
cookie = document.cookie.split(';')[0]
return cookie
}'''
async def main(timeValue):
global runTime, js_codeRead
tasks = []
init_result = initCookie()
if init_result:
cookie = init_result['cookie']
execjsRun = init_result['execjsRun']
else:
print("初始化 cookies 失败")
return
runcookie = {
'cookie': cookie,
'execjsRun': execjsRun
}
# 添加输出 cookies 的代码
cookies = {
'yiUIIlbdQT3fO': runcookie['cookie'],
'yiUIIlbdQT3fP': runcookie['execjsRun'].call('main').split('=')[1]
}
print(json.dumps(cookies)) # 确保输出是 JSON 格式的
if __name__ == "__main__":
asyncio.run(main(0))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,473 @@
# Source: https://gitee.com/jdqlscript/zyqinglong/blob/main/sendNotify.py
# Raw: https://gitee.com/jdqlscript/zyqinglong/raw/main/sendNotify.py
# Repo: jdqlscript/zyqinglong
# Path: sendNotify.py
# UploadedAt: 2025-06-03T12:08:50+08:00
# SHA256: c3b909e625f5fce60874cd1324e5e9a62b581ca11ac7aeb7f6bec4dc45de2003
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#!/usr/bin/env python3
# _*_ coding:utf-8 _*_
#Modify: Kirin
from curses.ascii import FS
import sys
import os, re
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
from requests.adapters import HTTPAdapter
from urllib3.util import Retry
cur_path = os.path.abspath(os.path.dirname(__file__))
root_path = os.path.split(cur_path)[0]
sys.path.append(root_path)
# 通知服务
BARK = '' # bark服务,自行搜索; secrets可填;
BARK_PUSH='' # bark自建服务器要填完整链接结尾的/不要
PUSH_KEY = '' # Server酱的PUSH_KEY; secrets可填
TG_BOT_TOKEN = '' # tg机器人的TG_BOT_TOKEN; secrets可填1407203283:AAG9rt-6RDaaX0HBLZQq0laNOh898iFYaRQ
TG_USER_ID = '' # tg机器人的TG_USER_ID; secrets可填 1434078534
TG_API_HOST='' # tg 代理api
TG_PROXY_IP = '' # tg机器人的TG_PROXY_IP; secrets可填
TG_PROXY_PORT = '' # tg机器人的TG_PROXY_PORT; secrets可填
DD_BOT_TOKEN = '' # 钉钉机器人的DD_BOT_TOKEN; secrets可填
DD_BOT_SECRET = '' # 钉钉机器人的DD_BOT_SECRET; secrets可填
QQ_SKEY = '' # qq机器人的QQ_SKEY; secrets可填
QQ_MODE = '' # qq机器人的QQ_MODE; secrets可填
QYWX_AM = '' # 企业微信
QYWX_KEY = '' # 企业微信BOT
PUSH_PLUS_TOKEN = '' # 微信推送Plus+
FS_KEY = '' #飞书群BOT
notify_mode = []
message_info = ''''''
# GitHub action运行需要填写对应的secrets
if "BARK" in os.environ and os.environ["BARK"]:
BARK = os.environ["BARK"]
if "BARK_PUSH" in os.environ and os.environ["BARK_PUSH"]:
BARK_PUSH = os.environ["BARK_PUSH"]
if "PUSH_KEY" in os.environ and os.environ["PUSH_KEY"]:
PUSH_KEY = os.environ["PUSH_KEY"]
if "TG_BOT_TOKEN" in os.environ and os.environ["TG_BOT_TOKEN"] and "TG_USER_ID" in os.environ and os.environ["TG_USER_ID"]:
TG_BOT_TOKEN = os.environ["TG_BOT_TOKEN"]
TG_USER_ID = os.environ["TG_USER_ID"]
if "TG_API_HOST" in os.environ and os.environ["TG_API_HOST"]:
TG_API_HOST = os.environ["TG_API_HOST"]
if "DD_BOT_TOKEN" in os.environ and os.environ["DD_BOT_TOKEN"] and "DD_BOT_SECRET" in os.environ and os.environ["DD_BOT_SECRET"]:
DD_BOT_TOKEN = os.environ["DD_BOT_TOKEN"]
DD_BOT_SECRET = os.environ["DD_BOT_SECRET"]
if "QQ_SKEY" in os.environ and os.environ["QQ_SKEY"] and "QQ_MODE" in os.environ and os.environ["QQ_MODE"]:
QQ_SKEY = os.environ["QQ_SKEY"]
QQ_MODE = os.environ["QQ_MODE"]
# 获取pushplus+ PUSH_PLUS_TOKEN
if "PUSH_PLUS_TOKEN" in os.environ:
if len(os.environ["PUSH_PLUS_TOKEN"]) > 1:
PUSH_PLUS_TOKEN = os.environ["PUSH_PLUS_TOKEN"]
# print("已获取并使用Env环境 PUSH_PLUS_TOKEN")
# 获取企业微信应用推送 QYWX_AM
if "QYWX_AM" in os.environ:
if len(os.environ["QYWX_AM"]) > 1:
QYWX_AM = os.environ["QYWX_AM"]
if "QYWX_KEY" in os.environ:
if len(os.environ["QYWX_KEY"]) > 1:
QYWX_KEY = os.environ["QYWX_KEY"]
# print("已获取并使用Env环境 QYWX_AM")
#接入飞书webhook推送
if "FS_KEY" in os.environ:
if len(os.environ["FS_KEY"]) > 1:
FS_KEY = os.environ["FS_KEY"]
if BARK:
notify_mode.append('bark')
# print("BARK 推送打开")
if BARK_PUSH:
notify_mode.append('bark')
# print("BARK 推送打开")
if PUSH_KEY:
notify_mode.append('sc_key')
# print("Server酱 推送打开")
if TG_BOT_TOKEN and TG_USER_ID:
notify_mode.append('telegram_bot')
# print("Telegram 推送打开")
if DD_BOT_TOKEN and DD_BOT_SECRET:
notify_mode.append('dingding_bot')
# print("钉钉机器人 推送打开")
if QQ_SKEY and QQ_MODE:
notify_mode.append('coolpush_bot')
# print("QQ机器人 推送打开")
if PUSH_PLUS_TOKEN:
notify_mode.append('pushplus_bot')
# print("微信推送Plus机器人 推送打开")
if QYWX_AM:
notify_mode.append('wecom_app')
# print("企业微信机器人 推送打开")
if QYWX_KEY:
notify_mode.append('wecom_key')
# print("企业微信机器人 推送打开")
if FS_KEY:
notify_mode.append('fs_key')
# print("飞书机器人 推送打开")
def message(str_msg):
global message_info
print(str_msg)
message_info = "{}\n{}".format(message_info, str_msg)
sys.stdout.flush()
def bark(title, content):
print("\n")
if BARK:
try:
response = requests.get(
f"""https://api.day.app/{BARK}/{title}/{urllib.parse.quote_plus(content)}""").json()
if response['code'] == 200:
print('推送成功!')
else:
print('推送失败!')
except:
print('推送失败!')
if BARK_PUSH:
try:
response = requests.get(
f"""{BARK_PUSH}/{title}/{urllib.parse.quote_plus(content)}""").json()
if response['code'] == 200:
print('推送成功!')
else:
print('推送失败!')
except:
print('推送失败!')
print("bark服务启动")
if BARK=='' and BARK_PUSH=='':
print("bark服务的bark_token未设置!!\n取消推送")
return
def serverJ(title, content):
print("\n")
if not PUSH_KEY:
print("server酱服务的PUSH_KEY未设置!!\n取消推送")
return
print("serverJ服务启动")
data = {
"text": title,
"desp": content.replace("\n", "\n\n")
}
response = requests.post(f"https://sc.ftqq.com/{PUSH_KEY}.send", data=data).json()
if response['code'] == 0:
print('推送成功!')
else:
print('推送失败!')
# tg通知
def telegram_bot(title, content):
try:
print("\n")
bot_token = TG_BOT_TOKEN
user_id = TG_USER_ID
if not bot_token or not user_id:
print("tg服务的bot_token或者user_id未设置!!\n取消推送")
return
print("tg服务启动")
if TG_API_HOST:
if 'http' in TG_API_HOST:
url = f"{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
else:
url = f"https://{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
else:
url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
payload = {'chat_id': str(TG_USER_ID), 'text': f'{title}\n\n{content}', 'disable_web_page_preview': 'true'}
proxies = None
if TG_PROXY_IP and TG_PROXY_PORT:
proxyStr = "http://{}:{}".format(TG_PROXY_IP, TG_PROXY_PORT)
proxies = {"http": proxyStr, "https": proxyStr}
try:
response = requests.post(url=url, headers=headers, params=payload, proxies=proxies).json()
except:
print('推送失败!')
if response['ok']:
print('推送成功!')
else:
print('推送失败!')
except Exception as e:
print(e)
def dingding_bot(title, content):
timestamp = str(round(time.time() * 1000)) # 时间戳
secret_enc = DD_BOT_SECRET.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, DD_BOT_SECRET)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) # 签名
print('开始使用 钉钉机器人 推送消息...', end='')
url = f'https://oapi.dingtalk.com/robot/send?access_token={DD_BOT_TOKEN}&timestamp={timestamp}&sign={sign}'
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
'msgtype': 'text',
'text': {'content': f'{title}\n\n{content}'}
}
response = requests.post(url=url, data=json.dumps(data), headers=headers, timeout=15).json()
if not response['errcode']:
print('推送成功!')
else:
print('推送失败!')
def coolpush_bot(title, content):
print("\n")
if not QQ_SKEY or not QQ_MODE:
print("qq服务的QQ_SKEY或者QQ_MODE未设置!!\n取消推送")
return
print("qq服务启动")
url=f"https://qmsg.zendee.cn/{QQ_MODE}/{QQ_SKEY}"
payload = {'msg': f"{title}\n\n{content}".encode('utf-8')}
response = requests.post(url=url, params=payload).json()
if response['code'] == 0:
print('推送成功!')
else:
print('推送失败!')
# push推送
def pushplus_bot(title, content):
try:
print("\n")
if not PUSH_PLUS_TOKEN:
print("PUSHPLUS服务的token未设置!!\n取消推送")
return
print("PUSHPLUS服务启动")
url = 'http://www.pushplus.plus/send'
data = {
"token": PUSH_PLUS_TOKEN,
"title": title,
"content": content
}
body = json.dumps(data).encode(encoding='utf-8')
headers = {'Content-Type': 'application/json'}
response = requests.post(url=url, data=body, headers=headers).json()
if response['code'] == 200:
print('推送成功!')
else:
print('推送失败!')
except Exception as e:
print(e)
def wecom_key(title, content):
print("\n")
if not QYWX_KEY:
print("QYWX_KEY未设置!!\n取消推送")
return
print("QYWX_KEY服务启动")
print("content"+content)
headers = {'Content-Type': 'application/json'}
data = {
"msgtype":"text",
"text":{
"content":title+"\n"+content.replace("\n", "\n\n")
}
}
print(f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={QYWX_KEY}")
response = requests.post(f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={QYWX_KEY}", json=data,headers=headers).json()
print(response)
# 飞书机器人推送
def fs_key(title, content):
print("\n")
if not FS_KEY:
print("FS_KEY未设置!!\n取消推送")
return
print("FS_KEY服务启动")
print("content"+content)
headers = {'Content-Type': 'application/json'}
data = {
"msg_type":"text",
"content":{
"text":title+"\n"+content.replace("\n", "\n\n")
}
}
print(f"https://open.feishu.cn/open-apis/bot/v2/hook/{FS_KEY}")
response = requests.post(f"https://open.feishu.cn/open-apis/bot/v2/hook/{FS_KEY}", json=data,headers=headers).json()
print(response)
# 企业微信 APP 推送
def wecom_app(title, content):
try:
if not QYWX_AM:
print("QYWX_AM 并未设置!!\n取消推送")
return
QYWX_AM_AY = re.split(',', QYWX_AM)
if 4 < len(QYWX_AM_AY) > 5:
print("QYWX_AM 设置错误!!\n取消推送")
return
corpid = QYWX_AM_AY[0]
corpsecret = QYWX_AM_AY[1]
touser = QYWX_AM_AY[2]
agentid = QYWX_AM_AY[3]
try:
media_id = QYWX_AM_AY[4]
except:
media_id = ''
wx = WeCom(corpid, corpsecret, agentid)
# 如果没有配置 media_id 默认就以 text 方式发送
if not media_id:
message = title + '\n\n' + content
response = wx.send_text(message, touser)
else:
response = wx.send_mpnews(title, content, media_id, touser)
if response == 'ok':
print('推送成功!')
else:
print('推送失败!错误信息如下:\n', response)
except Exception as e:
print(e)
class WeCom:
def __init__(self, corpid, corpsecret, agentid):
self.CORPID = corpid
self.CORPSECRET = corpsecret
self.AGENTID = agentid
def get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {'corpid': self.CORPID,
'corpsecret': self.CORPSECRET,
}
req = requests.post(url, params=values)
data = json.loads(req.text)
return data["access_token"]
def send_text(self, message, touser="@all"):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": touser,
"msgtype": "text",
"agentid": self.AGENTID,
"text": {
"content": message
},
"safe": "0"
}
send_msges = (bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges)
respone = respone.json()
return respone["errmsg"]
def send_mpnews(self, title, message, media_id, touser="@all"):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": touser,
"msgtype": "mpnews",
"agentid": self.AGENTID,
"mpnews": {
"articles": [
{
"title": title,
"thumb_media_id": media_id,
"author": "Author",
"content_source_url": "",
"content": message.replace('\n', '<br/>'),
"digest": message
}
]
}
}
send_msges = (bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges)
respone = respone.json()
return respone["errmsg"]
def send(title, content):
"""
使用 bark, telegram bot, dingding bot, server, feishuJ 发送手机推送
:param title:
:param content:
:return:
"""
for i in notify_mode:
if i == 'bark':
if BARK or BARK_PUSH:
bark(title=title, content=content)
else:
print('未启用 bark')
continue
if i == 'sc_key':
if PUSH_KEY:
serverJ(title=title, content=content)
else:
print('未启用 Server酱')
continue
elif i == 'dingding_bot':
if DD_BOT_TOKEN and DD_BOT_SECRET:
dingding_bot(title=title, content=content)
else:
print('未启用 钉钉机器人')
continue
elif i == 'telegram_bot':
if TG_BOT_TOKEN and TG_USER_ID:
telegram_bot(title=title, content=content)
else:
print('未启用 telegram机器人')
continue
elif i == 'coolpush_bot':
if QQ_SKEY and QQ_MODE:
coolpush_bot(title=title, content=content)
else:
print('未启用 QQ机器人')
continue
elif i == 'pushplus_bot':
if PUSH_PLUS_TOKEN:
pushplus_bot(title=title, content=content)
else:
print('未启用 PUSHPLUS机器人')
continue
elif i == 'wecom_app':
if QYWX_AM:
wecom_app(title=title, content=content)
else:
print('未启用企业微信应用消息推送')
continue
elif i == 'wecom_key':
if QYWX_KEY:
for i in range(int(len(content)/2000)+1):
wecom_key(title=title, content=content[i*2000:(i+1)*2000])
else:
print('未启用企业微信应用消息推送')
continue
elif i == 'fs_key':
if FS_KEY:
fs_key(title=title, content=content)
else:
print('未启用飞书机器人消息推送')
continue
else:
print('此类推送方式不存在')
print("xxxxxxxxxxxx")
def main():
send('title', 'content')
if __name__ == '__main__':
main()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,486 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/wxapp/miaoyouHome.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/wxapp/miaoyouHome.js
// # Repo: smallfawn/QLScriptPublic
// # Path: wxapp/miaoyouHome.js
// # UploadedAt: 2026-05-14T17:47:57+08:00
// # SHA256: 1329d61db9ba3db8767461e0d23af495fe2f6cfea2c89049bf66451b2a63ef63
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/**
* cron 48 17 * * * miaoyouHome.js
* Show:微信公众号 庙友之家 每日签到 积分可换首饰
* 变量名:miaoyouHome
* 变量值:http://www.jumpingcarp.cn/scrm-rz-wechat-tzlm 公众号 左下角 每日签到 链接里面的headers 中的 COOKIE
* JSESSIONID= 的值 的值 的值 多账户@或换行
* scriptVersionNow = "0.0.1";
*/
const $ = new Env("wx_庙友之家");
const notify = $.isNode() ? require('../sendNotify') : '';
let ckName = "miaoyouHome";
let envSplitor = ["@", "\n"]; //多账号分隔符
let strSplitor = "&"; //多变量分隔符
let userIdx = 0;
let userList = [];
class UserInfo {
constructor(str) {
this.index = ++userIdx;
this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符
this.ckStatus = true;
//定义在这里的headers会被get请求删掉content-type 而不会重置
}
async main() {
await this.task();
await this.userInfo()
}
async task() {
try {
let options = {
fn: "签到",
method: "post",
url: `http://www.jumpingcarp.cn/scrm-rz-wechat-tzlm/lotteryController/extractMemberAwards`,
headers: {
"Connection": "keep-alive",
//"Content-Length": "2",
"Accept": "application/json, text/plain, */*",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 XWEB/1110017 MMWEBSDK/20231002 MMWEBID/2585 MicroMessenger/8.0.43.2480(0x28002B51) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64",
"Content-Type": "application/json;charset=UTF-8",
"Origin": "http://www.jumpingcarp.cn",
"Referer": "http://www.jumpingcarp.cn/scrm-rz-wechat-tzlm/index.html",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Cookie": "JSESSIONID=" + this.ck
},
body: JSON.stringify({})
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
console.log(result);
} catch (e) {
console.log(e);
}
}
async userInfo() {
try {
let options = {
fn: "我的积分",
method: "post",
url: `http://www.jumpingcarp.cn/scrm-rz-wechat-tzlm/memberController/showMemberInfo`,
headers: {
"Connection": "keep-alive",
//"Content-Length": "2",
"Accept": "application/json, text/plain, */*",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 XWEB/1110017 MMWEBSDK/20231002 MMWEBID/2585 MicroMessenger/8.0.43.2480(0x28002B51) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64",
"Content-Type": "application/json;charset=UTF-8",
"Origin": "http://www.jumpingcarp.cn",
"Referer": "http://www.jumpingcarp.cn/scrm-rz-wechat-tzlm/index.html",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Cookie": "JSESSIONID=" + this.ck
},
body: JSON.stringify({})
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if(result.code == 200){
$.log(`当前积分[${result.data.pointsBalance}]`)
}else {
console.log(result);
}
} catch (e) {
console.log(e);
}
}
}
async function start() {
let taskall = [];
for (let user of userList) {
if (user.ckStatus) {
taskall.push(await user.main());
}
}
await Promise.all(taskall);
}
!(async () => {
if (!(await checkEnv())) return;
if (userList.length > 0) {
await start();
}
await $.SendMsg($.logs.join("\n"))
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//********************************************************
/**
* 变量检查与处理
* @returns
*/
async function checkEnv() {
let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "";
if (userCookie) {
let e = envSplitor[0];
for (let o of envSplitor)
if (userCookie.indexOf(o) > -1) {
e = o;
break;
}
for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n));
} else {
console.log("未找到CK");
return;
}
return console.log(`共找到${userList.length}个账号`), true; //true == !0
}
/////////////////////////////////////////////////////////////////////////////////////
function Env(t, s) {
return new (class {
constructor(t, s) {
this.name = t;
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, s);
this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`);
}
isNode() {
return "undefined" != typeof module && !!module.exports;
}
isQuanX() {
return "undefined" != typeof $task;
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
isLoon() {
return "undefined" != typeof $loon;
}
getScript(t) {
return new Promise((s) => {
this.get({ url: t }, (t, e, i) => s(i));
});
}
runScript(t, s) {
return new Promise((e) => {
let i = this.getdata("@chavy_boxjs_userCfgs.httpapi");
i = i ? i.replace(/\n/g, "").trim() : i;
let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
(o = o ? 1 * o : 20), (o = s && s.timeout ? s.timeout : o);
const [h, a] = i.split("@"),
r = {
url: `http://${a}/v1/scripting/evaluate`,
body: { script_text: t, mock_type: "cron", timeout: o },
headers: { "X-Key": h, Accept: "*/*" },
};
this.post(r, (t, s, i) => e(i));
}).catch((t) => this.logErr(t));
}
loaddata() {
if (!this.isNode()) return {};
{
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s);
if (!e && !i) return {};
{
const i = e ? t : s;
try {
return JSON.parse(this.fs.readFileSync(i));
} catch (t) {
return {};
}
}
}
}
writedata() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s),
o = JSON.stringify(this.data);
e ? this.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o);
}
}
lodash_get(t, s, e) {
const i = s.replace(/\[(\d+)\]/g, ".$1").split(".");
let o = t;
for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e;
return o;
}
lodash_set(t, s, e) {
return Object(t) !== t
? t
: (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []),
(s
.slice(0, -1)
.reduce(
(t, e, i) =>
Object(t[e]) === t[e]
? t[e]
: (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}),
t
)[s[s.length - 1]] = e),
t);
}
getdata(t) {
let s = this.getval(t);
if (/^@/.test(t)) {
const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t),
o = e ? this.getval(e) : "";
if (o)
try {
const t = JSON.parse(o);
s = t ? this.lodash_get(t, i, "") : s;
} catch (t) {
s = "";
}
}
return s;
}
setdata(t, s) {
let e = !1;
if (/^@/.test(s)) {
const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s),
h = this.getval(i),
a = i ? ("null" === h ? null : h || "{}") : "{}";
try {
const s = JSON.parse(a);
this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i));
} catch (s) {
const h = {};
this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i));
}
} else e = this.setval(t, s);
return e;
}
getval(t) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.read(t);
} else if (this.isQuanX()) {
return $prefs.valueForKey(t);
} else if (this.isNode()) {
this.data = this.loaddata();
return this.data[t];
} else {
return this.data && this.data[t] || null;
}
}
setval(t, s) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.write(t, s);
} else if (this.isQuanX()) {
return $prefs.setValueForKey(t, s);
} else if (this.isNode()) {
this.data = this.loaddata();
this.data[s] = t;
this.writedata();
return true;
} else {
return this.data && this.data[s] || null;
}
}
initGotEnv(t) {
this.got = this.got ? this.got : require("got");
this.cktough = this.cktough ? this.cktough : require("tough-cookie");
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar();
if (t) {
t.headers = t.headers ? t.headers : {};
if (typeof t.headers.Cookie === "undefined" && typeof t.cookieJar === "undefined") {
t.cookieJar = this.ckjar;
}
}
}
/**
* @param {Object} options
* @returns {String} 将 Object 对象 转换成 queryStr: key=val&name=senku
*/
queryStr(options) {
return Object.entries(options)
.map(([key, value]) => `${key}=${typeof value === 'object' ? JSON.stringify(value) : value}`)
.join('&');
}
isJSONString(str) {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
isJson(obj) {
var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
return isjson;
}
async SendMsg(message) {
if (!message) return;
if ($.isNode()) {
await notify.sendNotify($.name, message)
} else {
$.msg($.name, '', message)
}
}
async httpRequest(options) {
const t = {
...options
};
if (!t.headers) {
t.headers = {}
}
if (t.params) {
t.url += '?' + this.queryStr(t.params);
}
t.method = t.method.toLowerCase()
if (t.method.toLowerCase() === 'get') {
delete t.headers['Content-Type'];
delete t.headers['Content-Length'];
delete t["body"]
}
if (t.method.toLowerCase() === 'post') {
let contentType
if (!t.body) {
t.body = ""
} else {
if (typeof t.body == "string") {
if (this.isJSONString(t.body)) {
contentType = 'application/json'
} else {
contentType = 'application/x-www-form-urlencoded'
}
} else if (this.isJson(t.body)) {
t.body = JSON.stringify(t.body)
contentType = 'application/json'
}
}
if (!t.headers['Content-Type']) {
t.headers['Content-Type'] = contentType;
}
delete t.headers['Content-Length'];
}
if (this.isNode()) {
this.initGotEnv(t);
let httpResult = await this.got(t)
if (this.isJSONString(httpResult.body)) {
httpResult.body = JSON.parse(httpResult.body)
}
return httpResult;
}
}
randomNumber(length) {
const characters = '0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
randomString(length) {
const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
timeStamp() {
return new Date().getTime()
}
uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
time(t) {
let s = {
"M+": new Date().getMonth() + 1,
"d+": new Date().getDate(),
"H+": new Date().getHours(),
"m+": new Date().getMinutes(),
"s+": new Date().getSeconds(),
"q+": Math.floor((new Date().getMonth() + 3) / 3),
S: new Date().getMilliseconds(),
};
/(y+)/.test(t) &&
(t = t.replace(
RegExp.$1,
(new Date().getFullYear() + "").substr(4 - RegExp.$1.length)
));
for (let e in s)
new RegExp("(" + e + ")").test(t) &&
(t = t.replace(
RegExp.$1,
1 == RegExp.$1.length
? s[e]
: ("00" + s[e]).substr(("" + s[e]).length)
));
return t;
}
msg(s = t, e = "", i = "", o) {
const h = (t) =>
!t || (!this.isLoon() && this.isSurge())
? t
: "string" == typeof t
? this.isLoon()
? t
: this.isQuanX()
? { "open-url": t }
: void 0
: "object" == typeof t && (t["open-url"] || t["media-url"])
? this.isLoon()
? t["open-url"]
: this.isQuanX()
? t
: void 0
: void 0;
this.isMute ||
(this.isSurge() || this.isLoon()
? $notification.post(s, e, i, h(o))
: this.isQuanX() && $notify(s, e, i, h(o)));
let logs = ['', '==============📣系统通知📣=============='];
logs.push(t);
e ? logs.push(e) : '';
i ? logs.push(i) : '';
console.log(logs.join('\n'));
this.logs = this.logs.concat(logs);
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator));
}
logErr(t, s) {
const e = !this.isSurge() && !this.isQuanX() && !this.isLoon();
e
? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack)
: this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t);
}
wait(t) {
return new Promise((s) => setTimeout(s, t));
}
done(t = {}) {
const s = new Date().getTime(),
e = (s - this.startTime) / 1e3;
this.log(
"",
`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`
),
this.log(),
(this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t);
}
})(t, s);
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,105 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E4%B8%9C%E6%96%B9%E6%A3%98%E5%B8%82.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E4%B8%9C%E6%96%B9%E6%A3%98%E5%B8%82.py
# Repo: jdqlscript/toulu
# Path: 东方棘市.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 892b06ab7625881cee4a8ea91869b68862dc3e51d0e8dcfe32d4bff4e31a4e63
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
import requests
import os
#抓包域名https://ys.shajixueyuan.com/api/user_sign/sign
#取url请求中的token变量名dfjsck
#变量格式 token#备注,多账号换行或者用@连接
#【tl库】https://pd.qq.com/s/btv4bw7av
#联系3288588344
def sign(token, remark):
url = "https://ys.shajixueyuan.com/api/user_sign/sign"
headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
'token': token
}
response = requests.post(url, headers=headers)
data = response.json()
if data['code'] == 1:
msg = data['data']['msg']
energy_release = data["data"]["rewards_info"]["energy_release"]
print(f"[{remark}] 签到结果: {msg}, 释放 {energy_release} 能量果子")
else:
msg = data["msg"]
print(f"[{remark}] 签到失败原因: {msg}")
def issueRewards(token, remark):
url = "https://ys.shajixueyuan.com/api/quest.quest/issueRewards"
headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
'token': token
}
data = {
"quest_id": 4
}
response = requests.post(url, json=data, headers=headers)
data = response.json()
msg = data['msg']
print(f"[{remark}] 分享结果: {msg}")
def info(token, remark):
url = "https://ys.shajixueyuan.com/api/user/info"
headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
'token': token
}
response = requests.get(url, headers=headers)
data = response.json()
if data['code'] == 1:
remaining_fruits = float(data["data"]["remaining_fruits"])
nickname = data["data"]["nickname"]
print(f"[{remark}]:当前余额: {remaining_fruits}")
if remaining_fruits >= 0.3:
apply(token, remark)
else:
print(f"[{remark}] 余额不足,无法进行提现")
else:
msg = data["msg"]
print(f"[{remark}] 查询失败: {msg}")
def apply(token, remark):
url = "https://ys.shajixueyuan.com/api/user.user_withdraw/apply"
headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 12; RMX3562 Build/SP1A.210812.016; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/122.0.6261.120 Mobile Safari/537.36 XWEB/1220099 MMWEBSDK/20240404 MMWEBID/2307 MicroMessenger/8.0.49.2600(0x28003133) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
'token': token
}
data = {
"fruit_withdraw_amount": "0.3",
"pay_gateway": "wechat"
}
response = requests.post(url, json=data, headers=headers)
data = response.json()
msg = data['msg']
print(f"[{remark}] 提现结果: {msg}")
if __name__ == "__main__":
tokens = os.environ.get('dfjsck')
if not tokens:
print("获取账号失败,请检查配置是否正确")
else:
# 将换行符替换为 @ 号,分割每个账号
tokens_list = [token.strip() for token in tokens.replace('@', '\n').split('\n') if token.strip()]
for index, item in enumerate(tokens_list, start=1):
parts = item.split('#')
token = parts[0].strip() # 提取 token
remark = parts[1].strip() if len(parts) > 1 else f"账号{index}" # 提取备注如果没有则用“账号X”代替
print(f"===== 开始执行第 {index} 个账号任务 =====")
print(f"账号: {remark}")
print(f"===== 开始执行签到任务 =====")
sign(token, remark)
print(f"===== 开始执行分享任务 =====")
issueRewards(token, remark)
print(f"===== 开始执行查询和提现任务 =====")
info(token, remark)
print("==============================")

View File

@@ -0,0 +1,592 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E4%B8%9C%E6%96%B9%E7%83%9F%E8%8D%89%E6%8A%A5App.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E4%B8%9C%E6%96%B9%E7%83%9F%E8%8D%89%E6%8A%A5App.js
// # Repo: jdqlscript/toulu
// # Path: 东方烟草报App.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: 1b5375a55de4fdf36651e7c45b9b2f0fbcceefb400e21472fe1f76baa51096bc
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/**
* cron 5 15 * * *
* Show:东方烟草报App 积分换实物
* 变量名:dfycToken
* 变量值:POST请求任意链接包含https://eapp.eastobacco.com/index.php body中的token 多账号&分割 不是@ 和换行
* scriptVersionNow = "0.0.1";
QQ频道:https://pd.qq.com/s/672fku8ge
tg频道:https://t.me/TLtoulu
*/
const cookies = []
const $ = new Env("东方烟草报");
const notify = $.isNode() ? require('./sendNotify') : '';
let ckName = "dfycToken";
let envSplitor = ["&"]; //多账号分隔符
let strSplitor = "#"; //多变量分隔符
let userIdx = 0;
let userList = [];
let msg = ""
class UserInfo {
constructor(str) {
this.index = ++userIdx;
this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符
this.ckStatus = true;
this.artList = []
}
async main() {
await this.user_info();
if (this.ckStatus) {
await this.task_daka()
await this.art_list()
if (this.artList.length !== 0) {
for (let i = 0; i < 3; i++) {
await this.task_read(this.artList[i].id, this.artList[i].catid)
await this.task_share(this.artList[i].id, this.artList[i].catid)
await this.task_like(this.artList[i].id, this.artList[i].catid)
}
}
}
}
async user_info() {
try {
let options = {
fn: "信息",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=userinfo`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 积分[${result.data.point}]🎉`)
this.ckStatus = true;
} else {
console.log(`❌账号[${this.index}] 用户查询: 失败`);
this.ckStatus = false;
console.log(result);
}
} catch (e) {
console.log(e);
}
}
async task_daka() {
try {
let options = {
fn: "打卡",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=daka`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
$.log(`✅账号[${this.index}] 打卡[${result.message}]🎉`)
} catch (e) {
console.log(e);
}
}
async art_list() {
try {
let options = {
fn: "文章列表",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=newsList_pub`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `catid=1&num=20&page=1&api_version=4&platform=android&token=${this.ck}&timestamp=${Date.now()}`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if (result.data.news) {
for (let news of result.data.news) {
this.artList.push(
{
id: news.id,
catid: news.catid,
title: news.title
}
)
}
console.log(`获取文章成功`);
} else {
console.log(`获取文章失败`);
}
} catch (e) {
console.log(e);
}
}
async task_read(id, catid) {
try {
let options = {
fn: "阅读",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=addvisite`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&newsid=${id}&catid=${catid}`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 阅读[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 阅读[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
async task_share(id, catid) {
try {
let options = {
fn: "分享",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=addScoreZf`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&id=${id}&catid=${catid}`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 分享[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 分享[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
async task_like(id, catid) {
try {
let options = {
fn: "点赞",
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=dingcai`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&newsid=${id}&catid=${catid}`
}
let { body: result } = await $.httpRequest(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 点赞[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 点赞[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
}
async function start() {
let taskall = [];
for (let user of userList) {
if (user.ckStatus) {
taskall.push(await user.main());
}
}
await Promise.all(taskall);
}
!(async () => {
if (!(await checkEnv())) return;
if (userList.length > 0) {
await start();
}
await $.sendMsg($.logs.join("\n"))
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//********************************************************
/**
* 变量检查与处理
* @returns
*/
async function checkEnv() {
let userCookie = ($.isNode() ? process.env[ckName] : cookies) || "";
if (userCookie) {
let e = envSplitor[0];
for (let o of envSplitor)
if (userCookie.indexOf(o) > -1) {
e = o;
break;
}
for (let n of userCookie.split(e)) n && userList.push(new UserInfo(n));
} else {
console.log("未找到CK");
return;
}
return console.log(`共找到${userList.length}个账号`), true; //true == !0
}
/////////////////////////////////////////////////////////////////////////////////////
// prettier-ignore
function Env(t, s) {
return new (class {
constructor(t, s) {
this.name = t;
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, s);
this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`);
}
isNode() {
return "undefined" != typeof module && !!module.exports;
}
isQuanX() {
return "undefined" != typeof $task;
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
isLoon() {
return "undefined" != typeof $loon;
}
loaddata() {
if (!this.isNode()) return {};
{
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s);
if (!e && !i) return {};
{
const i = e ? t : s;
try {
return JSON.parse(this.fs.readFileSync(i));
} catch (t) {
return {};
}
}
}
}
writedata() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s),
o = JSON.stringify(this.data);
e ? this.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o);
}
}
lodash_get(t, s, e) {
const i = s.replace(/\[(\d+)\]/g, ".$1").split(".");
let o = t;
for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e;
return o;
}
lodash_set(t, s, e) {
return Object(t) !== t
? t
: (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []),
(s
.slice(0, -1)
.reduce(
(t, e, i) =>
Object(t[e]) === t[e]
? t[e]
: (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}),
t
)[s[s.length - 1]] = e),
t);
}
getdata(t) {
let s = this.getval(t);
if (/^@/.test(t)) {
const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t),
o = e ? this.getval(e) : "";
if (o)
try {
const t = JSON.parse(o);
s = t ? this.lodash_get(t, i, "") : s;
} catch (t) {
s = "";
}
}
return s;
}
setdata(t, s) {
let e = !1;
if (/^@/.test(s)) {
const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s),
h = this.getval(i),
a = i ? ("null" === h ? null : h || "{}") : "{}";
try {
const s = JSON.parse(a);
this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i));
} catch (s) {
const h = {};
this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i));
}
} else e = this.setval(t, s);
return e;
}
getval(t) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.read(t);
} else if (this.isQuanX()) {
return $prefs.valueForKey(t);
} else if (this.isNode()) {
this.data = this.loaddata();
return this.data[t];
} else {
return this.data && this.data[t] || null;
}
}
setval(t, s) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.write(t, s);
} else if (this.isQuanX()) {
return $prefs.setValueForKey(t, s);
} else if (this.isNode()) {
this.data = this.loaddata();
this.data[s] = t;
this.writedata();
return true;
} else {
return this.data && this.data[s] || null;
}
}
initGotEnv(t) {
this.got = this.got ? this.got : require("got");
this.cktough = this.cktough ? this.cktough : require("tough-cookie");
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar();
if (t) {
t.headers = t.headers ? t.headers : {};
if (typeof t.headers.Cookie === "undefined" && typeof t.cookieJar === "undefined") {
t.cookieJar = this.ckjar;
}
}
}
/**
* @param {Object} options
* @returns {String} 将 Object 对象 转换成 queryStr: key=val&name=senku
*/
queryStr(options) {
return Object.entries(options)
.map(([key, value]) => `${key}=${typeof value === 'object' ? JSON.stringify(value) : value}`)
.join('&');
}
isJSONString(str) {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
isJson(obj) {
var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
return isjson;
}
async sendMsg(message) {
if (!message) return;
if ($.isNode()) {
await notify.sendNotify($.name, message)
} else {
$.msg($.name, '', message)
}
}
async httpRequest(options) {
let t = {
...options
};
if (!t.headers) {
t.headers = {}
}
if (t.params) {
t.url += '?' + this.queryStr(t.params);
}
t.method = t.method.toLowerCase();
if (t.method === 'get') {
delete t.headers['Content-Type'];
delete t.headers['Content-Length'];
delete t["body"]
}
if (t.method === 'post') {
let contentType;
if (!t.body) {
t.body = ""
} else {
if (typeof t.body == "string") {
if (this.isJSONString(t.body)) {
contentType = 'application/json'
} else {
contentType = 'application/x-www-form-urlencoded'
}
} else if (this.isJson(t.body)) {
t.body = JSON.stringify(t.body);
contentType = 'application/json';
}
}
if (!t.headers['Content-Type']) {
t.headers['Content-Type'] = contentType;
}
delete t.headers['Content-Length'];
}
if (this.isNode()) {
this.initGotEnv(t);
let httpResult = await this.got(t);
if (this.isJSONString(httpResult.body)) {
httpResult.body = JSON.parse(httpResult.body)
}
return httpResult;
}
if (this.isQuanX()) {
t.method = t.method.toUpperCase()
return new Promise((resolve, reject) => {
$task.fetch(t).then(response => {
if (this.isJSONString(response.body)) {
response.body = JSON.parse(response.body)
}
resolve(response)
})
})
}
}
randomNumber(length) {
const characters = '0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
randomString(length) {
const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
timeStamp() {
return new Date().getTime()
}
uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
time(t) {
let s = {
"M+": new Date().getMonth() + 1,
"d+": new Date().getDate(),
"H+": new Date().getHours(),
"m+": new Date().getMinutes(),
"s+": new Date().getSeconds(),
"q+": Math.floor((new Date().getMonth() + 3) / 3),
S: new Date().getMilliseconds(),
};
/(y+)/.test(t) &&
(t = t.replace(
RegExp.$1,
(new Date().getFullYear() + "").substr(4 - RegExp.$1.length)
));
for (let e in s)
new RegExp("(" + e + ")").test(t) &&
(t = t.replace(
RegExp.$1,
1 == RegExp.$1.length
? s[e]
: ("00" + s[e]).substr(("" + s[e]).length)
));
return t;
}
msg(s = t, e = "", i = "", o) {
const h = (t) =>
!t || (!this.isLoon() && this.isSurge())
? t
: "string" == typeof t
? this.isLoon()
? t
: this.isQuanX()
? { "open-url": t }
: void 0
: "object" == typeof t && (t["open-url"] || t["media-url"])
? this.isLoon()
? t["open-url"]
: this.isQuanX()
? t
: void 0
: void 0;
this.isMute ||
(this.isSurge() || this.isLoon()
? $notification.post(s, e, i, h(o))
: this.isQuanX() && $notify(s, e, i, h(o)));
let logs = ['', '==============📣系统通知📣=============='];
logs.push(t);
e ? logs.push(e) : '';
i ? logs.push(i) : '';
console.log(logs.join('\n'));
this.logs = this.logs.concat(logs);
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator));
}
logErr(t, s) {
const e = !this.isSurge() && !this.isQuanX() && !this.isLoon();
e
? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack)
: this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t);
}
wait(t) {
return new Promise((s) => setTimeout(s, t));
}
done(t = {}) {
const s = new Date().getTime(),
e = (s - this.startTime) / 1e3;
this.log(
"",
`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`
)
this.log()
if (this.isNode()) {
process.exit(1)
}
if (this.isQuanX()) {
$done(t)
}
}
})(t, s);
}

View File

@@ -0,0 +1,240 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/dfyc.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/dfyc.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/dfyc.js
// # UploadedAt: 2026-04-07T12:21:56Z
// # SHA256: b2cb2a98f820da0170af6c58668227bc14d9226ab3f7344b1a73d6f705ebe91b
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 东方烟草报App 积分换实物
cron: 10 8 * * *
------------------------------------------
#Notice:
变量名:dfycToken
POST请求任意链接包含https://eapp.eastobacco.com/index.php body中的token 多账号&分割或者换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("东方烟草报");
let ckName = `dfycToken`;
const strSplitor = "#";
const axios = require("axios");
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
class Task {
constructor(env) {
this.index = $.userIdx++;
this.ck = env.split(strSplitor)[0]; //单账号多变量分隔符
this.ckStatus = true;
this.artList = []
}
async run() {
await this.user_info();
if (this.ckStatus) {
await this.task_daka()
await this.art_list()
if (this.artList.length !== 0) {
for (let i = 0; i < 3; i++) {
await this.task_read(this.artList[i].id, this.artList[i].catid)
await this.task_share(this.artList[i].id, this.artList[i].catid)
await this.task_like(this.artList[i].id, this.artList[i].catid)
}
}
}
}
async user_info() {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=userinfo`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 积分[${result.data.point}]🎉`)
this.ckStatus = true;
} else {
console.log(`❌账号[${this.index}] 用户查询: 失败`);
this.ckStatus = false;
console.log(result);
}
} catch (e) {
console.log(e);
}
}
async task_daka() {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=daka`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
$.log(`✅账号[${this.index}] 打卡[${result.message}]🎉`)
} catch (e) {
console.log(e);
}
}
async art_list() {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=newsList_pub`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `catid=1&num=20&page=1&api_version=4&platform=android&token=${this.ck}&timestamp=${Date.now()}`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
if (result.data.news) {
for (let news of result.data.news) {
this.artList.push(
{
id: news.id,
catid: news.catid,
title: news.title
}
)
}
console.log(`获取文章成功`);
} else {
console.log(`获取文章失败`);
}
} catch (e) {
console.log(e);
}
}
async task_read(id, catid) {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=addvisite`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&newsid=${id}&catid=${catid}`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 阅读[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 阅读[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
async task_share(id, catid) {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=user&a=addScoreZf`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&id=${id}&catid=${catid}`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 分享[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 分享[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
async task_like(id, catid) {
try {
let options = {
method: "post",
url: `https://eapp.eastobacco.com/index.php?m=api&c=content&a=dingcai`,
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
data: `platform=android&token=${this.ck}&timestamp=${Date.now()}&api_version=4&newsid=${id}&catid=${catid}`
}
let { data: result } = await axios.request(options);
//console.log(options);
//console.log(result);
if (result.code == 200) {
$.log(`✅账号[${this.index}] 点赞[${id}]成功🎉`)
} else {
$.log(`❌账号[${this.index}] 点赞[${id}]失败`)
}
} catch (e) {
console.log(e);
}
}
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,68 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E4%B8%AD%E5%85%B4%E5%95%86%E5%9F%8E.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E4%B8%AD%E5%85%B4%E5%95%86%E5%9F%8E.py
# Repo: jdqlscript/toulu
# Path: 中兴商城.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 3fecf7b602ecddc6cf2ae9f9bc992c5b55dcbc333c15279dc6295ebe5f98cecc
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
'''
功能:中兴商城任务
一天5毛买东西可抵扣
抓手机端签到请求链接里面的accessToken=后面的字符串如dc487xxxx9d67填到环境变量'zxscck'里,多账号&连接网页版签到抓到的accessToken没有测试有可能能用
cron: 3 0 * * *
new Env('中兴商城');
'''
import requests
import os
try:
from notify import send
except:
pass
url = "https://www.ztemall.com/index.php/topapi"
headers = {
"Accept": "*/*",
"platform": "android",
"C-Version": "5.2.32.2308151406",
"User-Agent": "Mozilla/5.0 (Linux; Android 8.0.0; MI 5 Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36",
"model": "MI 5",
"Accept-Encoding": "gzip",
"Host": "www.ztemall.com",
"Connection": "Keep-Alive"
}
accounts = os.getenv('zxscck')
if accounts is None:
print('未检测到zxscck')
exit(1)
accounts_list = accounts.split('&')
print(f"获取到 {len(accounts_list)} 个账号\n")
result = []
for i, account in enumerate(accounts_list, start=1):
print(f"=======开始执行账号{i}=======\n")
params = {
"method": "member.checkIn.add",
"format": "json",
"v": "v1",
"accessToken": account
}
response = requests.get(url, headers=headers, params=params).json()
if response['errorcode'] == 0:
currentCheckInPoint = response['data']['currentCheckInPoint']
point = response['data']['point']
print(f"账号{i}签到成功,获得{currentCheckInPoint}积分,当前积分:{point}\n")
result.append(f"账号{i}签到成功,获得{currentCheckInPoint}积分,当前积分:{point}\n")
else:
msg = response['msg']
print(f"账号{i}签到失败,{msg}\n")
result.append(f"账号{i}签到失败,{msg}\n")
try:
send("中兴商城签到",f"{''.join(result)}")
except Exception as e:
print(f"消息推送失败:{e}\n{result}\n")

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,224 @@
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/backup/sysxc.py
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/backup/sysxc.py
# Repo: smallfawn/QLScriptPublic
# Path: backup/sysxc.py
# UploadedAt: 2026-05-14T17:47:57+08:00
# SHA256: b9f66359e357df42cb7ba689f5ae6ae61a49e64a850dba95a577e66b9226cff3
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
"""
new Env("书亦烧仙草python版")
1. 书亦烧仙草签到 抓包scrm-prod.shuyi.org.cn域名请求头里的auth
脚本仅供学习交流使用, 请在下载后24h内删除
2. cron 以防ocr识别出错每天运行两次左右
3. ddddocr搭建方法https://github.com/sml2h3/ocr_api_server #如果脚本里的失效请自行搭建
"""
import json,logging,os,sys,time,base64,requests
from os import environ, system, path
logger = logging.getLogger(name=None)
logging.Formatter("%(message)s")
logger.setLevel(logging.INFO)
logger.addHandler(logging.StreamHandler())
def load_send():
global send, mg
cur_path = path.abspath(path.dirname(__file__))
if path.exists(cur_path + "/notify.py"):
try:
from notify import send
print("加载通知服务成功!")
except:
send = False
print("加载通知服务失败~")
else:
send = False
print("加载通知服务失败~")
load_send()
try:
from Crypto.Cipher import AES
except:
logger.info(
"\n未检测到pycryptodome\n需要Python依赖里安装pycryptodome\n安装失败先linux依赖里安装gcc、python3-dev、libc-dev\n如果还是失败,重启容器,或者重启docker就能解决")
exit(0)
def setHeaders(i):
headers = {
"auth": cookies[i],
"hostname": "scrm-prod.shuyi.org.cn",
"content-type": "application/json",
"host": "scrm-prod.shuyi.org.cn",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; V2203A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.141 Mobile Safari/537.36 XWEB/5023 MMWEBSDK/20221012 MMWEBID/1571 MicroMessenger/8.0.30.2260(0x28001E55) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android"
}
return headers
cookies = []
try:
cookies = os.environ["sysxc_auth"].split("&")
if len(os.environ["sysxc_auth"]) > 0:
logger.info("已获取并使用Env环境Cookie\n声明本脚本为学习python请勿用于非法用途\n")
except:
logger.info(
"【提示】请先添加sysxc_auth")
exit(3)
def getVCode(headers):
"""获取滑块图片"""
data = {
"captchaType": "blockPuzzle",
"clientUid": "slider-6292e85b-e871-4abd-89df-4d97709c6e0c",
"ts": int(time.time() * 1000)
}
url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/getVCode'
response = requests.post(url, json=data, headers=headers)
return response.json()
def ocr(tg,bg):
"""使用自有ocr识别滑块坐标"""
url = 'http://103.45.185.224:9898/slide/match/b64/json'
jsonstr = json.dumps({'target_img': tg, 'bg_img': bg})
response = requests.post(url, data=base64.b64encode(jsonstr.encode()).decode())
return response.json()
'''
采用AES对称加密算法
'''
BLOCK_SIZE = 16 # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
def aesEncrypt(key, data):
'''
AES的ECB模式加密方法
:param key: 密钥
:param data:被加密字符串(明文)
:return:密文
'''
key = key.encode('utf8')
# 字符串补位
data = pad(data)
cipher = AES.new(key, AES.MODE_ECB)
# 加密后得到的是bytes类型的数据使用Base64进行编码,返回byte字符串
result = cipher.encrypt(data.encode())
encodestrs = base64.b64encode(result)
enctext = encodestrs.decode('utf8')
return enctext
def aesDecrypt(key, data):
'''
:param key: 密钥
:param data: 加密后的数据(密文)
:return:明文
'''
key = key.encode('utf8')
data = base64.b64decode(data)
cipher = AES.new(key, AES.MODE_ECB)
# 去补位
text_decrypted = unpad(cipher.decrypt(data))
text_decrypted = text_decrypted.decode('utf8')
return text_decrypted
def checkVCode(pointJson, token):
"""验证"""
try:
data = {
"captchaType": "blockPuzzle",
"pointJson": pointJson,
"token": token
}
url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/checkVCode'
response = requests.post(url, json=data, headers=headers)
result = response.json()
resultCode = result['resultCode']
resultMsg = result['resultMsg']
if resultCode == '0000':
logger.info(f"校验结果:成功")
else:
logger.info(f"校验结果: {resultMsg}")
time.sleep(3)
main()
except Exception as err:
print(err)
def check_sign(pointJson):
"""签到"""
try:
data = {
"captchaVerification": pointJson
}
url = 'https://scrm-prod.shuyi.org.cn/saas-gateway/api/agg-trade/v1/signIn/insertSignInV3'
response = requests.post(url, json=data, headers=headers)
result = response.json()
resultCode = result['resultCode']
resultMsg = result['resultMsg']
if resultCode == '0':
logger.info(f"签到结果:{result}")
send('书亦烧仙草签到通知', result)
else:
logger.info(f"签到结果: {resultMsg}")
send('书亦烧仙草签到通知', resultMsg)
except Exception as err:
print(err)
sys.exit(0)
def main():
logger.info("--------------------任务开始--------------------")
result = getVCode(headers)
bg = result['data']['originalImageBase64']
tg = result['data']['jigsawImageBase64']
key = result['data']['secretKey']
token = result['data']['token']
logger.info(f"本次口令为: {token}")
logger.info(f"本次密钥为: {key}")
time.sleep(1.5)
logger.info("--------------------识别滑块--------------------")
result = ocr(tg,bg)
res = result['result']['target']
d = (res[0])
logger.info(f"滑动距离为: {d}")
logger.info("--------------------执行算法--------------------")
aes_str = json.dumps({"x": d, "y": 5})
data = aes_str.replace(' ', '')
logger.info(f"加密前: {data}")
time.sleep(1.5)
ecdata = aesEncrypt(key, data)
aesDecrypt(key, ecdata)
pointJson = aesEncrypt(key, data)
logger.info(f"加密后: {pointJson}")
logger.info("--------------------校验滑块--------------------")
checkVCode(pointJson, token)
logger.info("--------------------开始签到--------------------")
str = (token + '---' + aes_str)
data = str.replace(' ', '')
ecdata = aesEncrypt(key, data)
aesDecrypt(key, ecdata)
pointJson = aesEncrypt(key, data)
time.sleep(0.5)
check_sign(pointJson)
if __name__ == '__main__':
for i in range(len(cookies)):
logger.info(f"\n开始第{i + 1}个账号")
headers = setHeaders(i)
main()
logger.info("所有账号执行完成\n")
sys.exit(0)

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,105 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%8F%AD%E5%8D%A6%E4%BC%98%E9%80%89.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%8F%AD%E5%8D%A6%E4%BC%98%E9%80%89.py
# Repo: jdqlscript/toulu
# Path: 叭卦优选.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 4c1f172936322381345aa0d5f5ccbb8c5d23b31c613a4444b6d39257690420e1
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#by:哆啦A梦
#TL库
#入口:http://api.0vsp.com/h5/wxa/link?sid=25423TwvStj
#抓包slb1.bg19.cn域名下的token填到环境变量BGYX就行
#多账号换行分割
import requests
import os
# 获取公告信息
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 35)
print(response.text)
print("=" * 35 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
# 获取随机 User-Agent
def get_random_ua():
ua_api_url = "http://ck.tfapi.cn/ua.php"
try:
response = requests.get(ua_api_url)
response.raise_for_status()
data = response.json()
return data.get('user_agent', '')
except requests.exceptions.RequestException as e:
print(f"获取 User-Agent 失败:{e}")
return ''
# 获取环境变量中的 token
def get_tokens_from_env():
tokens = os.environ.get('BGYX', '')
if not tokens:
print("未找到环境变量 BGYX 或其值为空")
return []
return [token.strip() for token in tokens.split('\n') if token.strip()]
# 签到函数
def sign_in(token):
url = "https://slb1.bg19.cn/api/wanlshop/Punch/click"
headers = {
"Host": "slb1.bg19.cn",
"Connection": "keep-alive",
"content-type": "application/json;charset=UTF-8",
"token": token,
"App-Client": "mp-wanlshop",
"Accept-Language": "zh-CN,zh;q=0.9",
"charset": "utf-8",
"User-Agent": get_random_ua(),
"Accept-Encoding": "gzip, deflate, br"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
result = response.json()
if result.get("code") == 1 and "您打过卡了" in result.get("data", {}).get("msg", ""):
print("今日已签到,无需重复签到。")
else:
print("签到成功!")
except requests.exceptions.RequestException as e:
print(f"签到失败:{e}")
# 主函数
def main():
get_proclamation() # 获取公告
tokens = get_tokens_from_env()
if not tokens:
return
for token in tokens:
sign_in(token)
if __name__ == "__main__":
main()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,129 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B0%8F%E7%B4%AB.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B0%8F%E7%B4%AB.py
# Repo: jdqlscript/toulu
# Path: 小紫.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 04f1966f2f6b22487095d315cd1a6838defe98bf62d12665d0dfb9fb20adc56d
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#入口:微信搜索小紫有约
#多个变量名用#分割
#变量名xzyy
#抓包sxkyziqidonglai.cn域名下的一整段cookie
import requests
import json
import os
# 获取环境变量中的多个 cookie多个 cookie 通过 # 分割
xzyy = os.environ.get('xzyy', '') # 例如: 'cookie1#cookie2#cookie3'
# 如果 xzyy 为空,则使用空列表,否则分割为多个 cookie
cookies = xzyy.split('#') if xzyy else []
# wxpusher 推送的配置信息
push_token = 'UID_Rj**********' # wxpusher的UID
push_title = '小紫有约' # 推送标题
push_content = '小紫有约签到通知\n\n' # 推送内容
wxapp_token = 'AT_aTsJ*********' # wxpusher的APPToken
def wxpusher_send():
"""
发送消息到wxpusher
"""
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
"appToken": wxapp_token,
"uids": [push_token],
"topicIds": [],
"summary": push_title,
"content": push_content,
"contentType": 1,
"verifyPay": False
}
try:
response = requests.post('https://wxpusher.zjiecode.com/api/send/message', headers=headers, data=json.dumps(data))
# 获取响应的 JSON 数据
response_json = response.json()
print(f"wxpusher 推送: {response_json.get('msg', '没有返回 msg 字段')}")
except requests.exceptions.RequestException as e:
print(f"wxpusher 推送失败: {e}")
def get_announcement():
"""
获取公告信息
"""
external_url = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt'
try:
response = requests.get(external_url)
if response.status_code == 200:
print( response.text)
print("公告获取成功,开始执行签到请求...")
else:
print(f"获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}")
def sign_in(cookie_xz):
"""
执行签到请求
"""
url = "https://sxkyziqidonglai.cn/api/mobile/activity-v2/activity/launchByValidater"
headers = {
"Host": "sxkyziqidonglai.cn",
"Content-Length": "75",
"Sec-CH-UA-Platform": '"Android"',
"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/130.0.6723.103 Mobile Safari/537.36 XWEB/1300333 MMWEBSDK/20241202 MMWEBID/3628 MicroMessenger/8.0.56.2800(0x2800383A) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64',
"Accept": "application/json, text/plain, */*",
"Sec-CH-UA": '"Chromium";v="130", "Android WebView";v="130", "Not?A_Brand";v="99"',
"Content-Type": "application/json",
"Sec-CH-UA-Mobile": "?1",
"Origin": "https://sxkyziqidonglai.cn",
"X-Requested-With": "com.tencent.mm",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://sxkyziqidonglai.cn/activity/signIn?siteId=SITE_33254242630091515087&channelCode=WXjxriol8e8293wezu&actCode=SIGNIN202501201006598253",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
"Cookie": cookie_xz
}
data = {
"actCode": "SIGNIN202501201006598253",
"siteId": "SITE_33254242630091515087"
}
try:
response = requests.post(url, headers=headers, data=json.dumps(data))
# 处理响应
if response.status_code == 200:
response_json = response.json()
if 'msg' in response_json:
print(f"{response_json['msg']}")
wxpusher_send() # 签到成功后发送推送
else:
print("请求成功,但未找到 'msg' 字段")
else:
response_json = response.json()
print(f"请求失败,状态码: {response.status_code}")
print(f"错误信息: {response_json.get('msg', '没有返回 msg 字段')}")
except requests.exceptions.RequestException as e:
print(f"签到请求失败: {e}")
if __name__ == "__main__":
# 获取公告
get_announcement()
if cookies:
# 循环遍历多个账号,进行签到
for index, cookie in enumerate(cookies, start=1):
print(f"正在为账号 {index} 执行签到...")
sign_in(cookie) # 执行签到
else:
print("没有找到任何可用的账号cookie程序退出。")

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,662 @@
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%BF%83%E5%96%9C%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%BF%83%E5%96%9C%E5%B0%8F%E7%A8%8B%E5%BA%8F.js
// # Repo: jdqlscript/toulu
// # Path: 心喜小程序.js
// # UploadedAt: 2025-06-28T11:18:42+08:00
// # SHA256: a195dc9ae52fc26b8357291a30f6778722f554879186e30c02249ebcf0411846
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/**
* cron 9 9 * * * xx.js
* 变量名: xinxi
* 每天运行一次就行
* 报错是正常情况
* 变量值:api.xinc818.com 请求头中sso的值 多账户&或者换行
* scriptVersionNow = "0.0.1";
*/
const $ = new Env("心喜");
const notify = $.isNode() ? require('./sendNotify') : '';
let ckName = "xinxi";
let envSplitor = ["&", "\n"]; //多账号分隔符
let strSplitor = "#"; //多变量分隔符
let userIdx = 0;
let userList = [];
class Task {
constructor(str) {
this.index = ++userIdx;
this.ck = str.split(strSplitor)[0]; //单账号多变量分隔符
this.ckStatus = true;
this.userId = null
this.artList = []
this.goodsList = []
}
async main() {
await this.user_info();
if (this.ckStatus == true) {
await this.task_signin();
await this.task_lottery()
await this.task_share()
await this.task_goods()
await this.art_list()
if (this.artList.length > 0) {
await this.task_follow(this.artList[0])
}
await this.goods_list()
if (this.goodsList.length > 0) {
await this.task_like(this.goodsList[0])
}
}
}
async task_signin() {
try {
let result = await this.taskRequest("get", `https://api.xinc818.com/mini/sign/in?dailyTaskId=`)
//console.log(result);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 签到状态【${result.data.flag}】获得积分【${result.data.integral}】🎉`)
} else {
console.log(`❌账号[${this.index}] 签到状态【false】`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
async user_info() {
try {
let result = await this.taskRequest("get", `https://api.xinc818.com/mini/user`)
//console.log(options);
console.log(result);
if (result.code == 0) {
$.log(`✅账号[${this.index}] 【${result.data.nickname}】积分【${result.data.integral}】🎉`)
this.userId = result.data.id
} else {
console.log(`❌账号[${this.index}] 用户查询【false】`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//浏览30sAPI
async task_goods() {
try {
let result = await this.taskRequest("get", `https://api.xinc818.com/mini/dailyTask/browseGoods/22`)
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data !== null) {
$.log(`✅账号[${this.index}] 完成浏览30s成功 获得【${result.data.singleReward}`)
} else {
console.log(`❌账号[${this.index}] 完成浏览30s任务失败`);
}
} else {
console.log(`❌账号[${this.index}] 完成浏览30s任务失败`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//想要任务API
async task_like(id) {
console.log(`https://api.xinc818.com/mini/integralGoods/${id}?type=`)
try {
let goodsResult = await this.taskRequest("get", `https://api.xinc818.com/mini/integralGoods/${id}?type=`)
if (goodsResult.data) {
let likeResult = await this.taskRequest("post", `https://api.xinc818.com/mini/live/likeLiveItem`, { "isLike": true, "dailyTaskId": 20, "productId": Number(goodsResult.data.outerId) })
//console.log(options);
console.log(likeResult);
if (likeResult.code == 0) {
if (likeResult.data !== null) {
$.log(`✅账号[${this.index}] 完成点击想要任务成功 获得【${likeResult.data.singleReward}`)
} else {
console.log(`❌账号[${this.index}] 完成点击想要任务失败`);
}
} else {
console.log(`❌账号[${this.index}] 完成点击想要任务失败`);
console.log(likeResult);
}
}
} catch (e) {
console.log(e);
}
}
//关注用户API
async task_follow(pusherId) {
console.log(pusherId)
try {
let result = await this.taskRequest("post", `https://api.xinc818.com/mini/user/follow`, { "decision": true, "followUserId": pusherId })
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data !== null) {
$.log(`✅账号[${this.index}] 完成关注用户任务成功 获得【${result.data.singleReward}`)
} else {
console.log(`❌账号[${this.index}] 完成关注用户任务失败`);
}
} else {
console.log(`❌账号[${this.index}] 完成关注用户任务失败`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//抽奖API
async task_lottery() {
try {
let result = await this.taskRequest("post", `https://api.xinc818.com/mini/lottery/draw`, { "activity": 61, "batch": false, "isIntegral": false, "userId": Number(this.userId), "dailyTaskId": 9 })
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data !== null) {
$.log(`✅账号[${this.index}] 完成抽奖成功 获得【${result.data.taskResult.singleReward}】积分 奖品【${result.data.lotteryResult.integral}`)
} else {
console.log(`❌账号[${this.index}] 完成抽奖失败`);
}
} else {
console.log(`❌账号[${this.index}] 完成抽奖失败`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//分享API
async task_share() {
try {
let result = await this.taskRequest("get", `https://api.xinc818.com/mini/dailyTask/share`)
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data !== null) {
$.log(`✅账号[${this.index}] 完成分享成功 获得【${result.data.singleReward}`)
} else {
console.log(`❌账号[${this.index}] 完成分享失败`);
}
} else {
console.log(`❌账号[${this.index}] 完成分享失败`);
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//获取帖子列表API(包含用户和帖子)
async art_list() {
try {
let result = await this.taskRequest("get", `https://cdn-api.xinc818.com/mini/posts/sorts?sortType=COMMENT&pageNum=1&pageSize=10&groupClassId=0`)
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data.list.length > 0) {
for (let i = 0; i < 2; i++)
this.artList.push(result.data.list[i].publisherId)
}
} else {
console.log(result);
}
} catch (e) {
console.log(e);
}
}
//获取商品API
async goods_list() {
try {
let result = await this.taskRequest("get", `https://cdn-api.xinc818.com/mini/integralGoods?orderField=sort&orderScheme=DESC&pageSize=10&pageNum=1`)
//console.log(options);
console.log(result);
if (result.code == 0) {
if (result.data.list.length > 0) {
for (let i = 0; i < 2; i++)
this.goodsList.push(result.data.list[i].id)
}
} else {
console.log(result);
}
} catch (e) {
console.log(e);
}
}
async taskRequest(method, url, body = "") {
//
let headers = {
//"Host": "api.xinc818.com",
"Connection": "keep-alive",
"charset": "utf-8",
"User-Agent": "Mozilla/5.0 (Linux; Android 10; MI 8 Lite Build/QKQ1.190910.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.0.0 Mobile Safari/537.36 XWEB/1160027 MMWEBSDK/20231002 MMWEBID/2585 MicroMessenger/8.0.43.2480(0x28002B51) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android",
"content-type": "application/json",
"Accept-Encoding": "gzip,compress,br,deflate",
"sso": this.ck,
"Referer": "https://servicewechat.com/wx673f827a4c2c94fa/253/page-frame.html"
}
const reqeuestOptions = {
url: url,
method: method,
headers: headers
}
if (method !== "get") {
if (headers["Content-Type"] == "application/json") {
reqeuestOptions["body"] = JSON.stringify(body);
} else {
reqeuestOptions["body"] = body
}
}
let { body: result } = await $.httpRequest(reqeuestOptions)
return result
}
}
!(async () => {
if (!(await checkEnv())) return;
if (userList.length > 0) {
let taskall = [];
for (let user of userList) {
if (user.ckStatus) {
taskall.push(user.main());
}
}
await Promise.all(taskall);
}
await $.sendMsg($.logs.join("\n"))
})()
.catch((e) => console.log(e))
.finally(() => $.done());
//********************************************************
/**
* 变量检查与处理
* @returns
*/
async function checkEnv() {
let userCookie = ($.isNode() ? process.env[ckName] : $.getdata(ckName)) || "";
if (userCookie) {
let e = envSplitor[0];
for (let o of envSplitor)
if (userCookie.indexOf(o) > -1) {
e = o;
break;
}
for (let n of userCookie.split(e)) n && userList.push(new Task(n));
} else {
console.log(`未找到CK【${ckName}`);
return;
}
return console.log(`共找到${userList.length}个账号`), true; //true == !0
}
function Env(t, s) {
return new (class {
constructor(t, s) {
this.name = t;
this.data = null;
this.dataFile = "box.dat";
this.logs = [];
this.logSeparator = "\n";
this.startTime = new Date().getTime();
Object.assign(this, s);
this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`);
}
isNode() {
return "undefined" != typeof module && !!module.exports;
}
isQuanX() {
return "undefined" != typeof $task;
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
}
isLoon() {
return "undefined" != typeof $loon;
}
loaddata() {
if (!this.isNode()) return {};
{
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s);
if (!e && !i) return {};
{
const i = e ? t : s;
try {
return JSON.parse(this.fs.readFileSync(i));
} catch (t) {
return {};
}
}
}
}
writedata() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs");
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
s = this.path.resolve(process.cwd(), this.dataFile),
e = this.fs.existsSync(t),
i = !e && this.fs.existsSync(s),
o = JSON.stringify(this.data);
e ? this.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o);
}
}
lodash_get(t, s, e) {
const i = s.replace(/\[(\d+)\]/g, ".$1").split(".");
let o = t;
for (const t of i) if (((o = Object(o)[t]), void 0 === o)) return e;
return o;
}
lodash_set(t, s, e) {
return Object(t) !== t
? t
: (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []),
(s
.slice(0, -1)
.reduce(
(t, e, i) =>
Object(t[e]) === t[e]
? t[e]
: (t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}),
t
)[s[s.length - 1]] = e),
t);
}
getdata(t) {
let s = this.getval(t);
if (/^@/.test(t)) {
const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t),
o = e ? this.getval(e) : "";
if (o)
try {
const t = JSON.parse(o);
s = t ? this.lodash_get(t, i, "") : s;
} catch (t) {
s = "";
}
}
return s;
}
setdata(t, s) {
let e = !1;
if (/^@/.test(s)) {
const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s),
h = this.getval(i),
a = i ? ("null" === h ? null : h || "{}") : "{}";
try {
const s = JSON.parse(a);
this.lodash_set(s, o, t), (e = this.setval(JSON.stringify(s), i));
} catch (s) {
const h = {};
this.lodash_set(h, o, t), (e = this.setval(JSON.stringify(h), i));
}
} else e = this.setval(t, s);
return e;
}
getval(t) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.read(t);
} else if (this.isQuanX()) {
return $prefs.valueForKey(t);
} else if (this.isNode()) {
this.data = this.loaddata();
return this.data[t];
} else {
return this.data && this.data[t] || null;
}
}
setval(t, s) {
if (this.isSurge() || this.isLoon()) {
return $persistentStore.write(t, s);
} else if (this.isQuanX()) {
return $prefs.setValueForKey(t, s);
} else if (this.isNode()) {
this.data = this.loaddata();
this.data[s] = t;
this.writedata();
return true;
} else {
return this.data && this.data[s] || null;
}
}
initGotEnv(t) {
this.got = this.got ? this.got : require("got");
this.cktough = this.cktough ? this.cktough : require("tough-cookie");
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar();
if (t) {
t.headers = t.headers ? t.headers : {};
if (typeof t.headers.Cookie === "undefined" && typeof t.cookieJar === "undefined") {
t.cookieJar = this.ckjar;
}
}
}
/**
* @param {Object} options
* @returns {String} 将 Object 对象 转换成 queryStr: key=val&name=senku
*/
queryStr(options) {
return Object.entries(options)
.map(([key, value]) => `${key}=${typeof value === 'object' ? JSON.stringify(value) : value}`)
.join('&');
}
//从url获取参数组成json
getURLParams(url) {
const params = {};
const queryString = url.split('?')[1];
if (queryString) {
const paramPairs = queryString.split('&');
paramPairs.forEach(pair => {
const [key, value] = pair.split('=');
params[key] = value;
});
}
return params;
}
isJSONString(str) {
try {
var obj = JSON.parse(str);
if (typeof obj == 'object' && obj) {
return true;
} else {
return false;
}
} catch (e) {
return false;
}
}
isJson(obj) {
var isjson = typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
return isjson;
}
async sendMsg(message) {
if (!message) return;
if ($.isNode()) {
await notify.sendNotify($.name, message)
} else {
$.msg($.name, '', message)
}
}
async httpRequest(options) {
let t = {
...options
};
if (!t.headers) {
t.headers = {}
}
if (t.params) {
t.url += '?' + this.queryStr(t.params);
}
t.method = t.method.toLowerCase();
if (t.method === 'get') {
delete t.headers['Content-Type'];
delete t.headers['Content-Length'];
delete t.headers['content-type'];
delete t.headers['content-length'];
delete t["body"]
}
if (t.method === 'post') {
let ContentType;
if (!t.body) {
t.body = ""
} else {
if (typeof t.body == "string") {
if (this.isJSONString(t.body)) {
ContentType = 'application/json'
} else {
ContentType = 'application/x-www-form-urlencoded'
}
} else if (this.isJson(t.body)) {
t.body = JSON.stringify(t.body);
ContentType = 'application/json';
}
}
if (!t.headers['Content-Type'] || !t.headers['content-type']) {
t.headers['Content-Type'] = ContentType;
}
delete t.headers['Content-Length'];
}
if (this.isNode()) {
this.initGotEnv(t);
let httpResult = await this.got(t);
if (this.isJSONString(httpResult.body)) {
httpResult.body = JSON.parse(httpResult.body)
}
return httpResult;
}
if (this.isQuanX()) {
t.method = t.method.toUpperCase()
return new Promise((resolve, reject) => {
$task.fetch(t).then(response => {
if (this.isJSONString(response.body)) {
response.body = JSON.parse(response.body)
}
resolve(response)
})
})
}
}
randomNumber(length) {
const characters = '0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
randomString(length) {
const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
return Array.from({ length }, () => characters[Math.floor(Math.random() * characters.length)]).join('');
}
timeStamp() {
return new Date().getTime()
}
uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
time(t) {
let s = {
"M+": new Date().getMonth() + 1,
"d+": new Date().getDate(),
"H+": new Date().getHours(),
"m+": new Date().getMinutes(),
"s+": new Date().getSeconds(),
"q+": Math.floor((new Date().getMonth() + 3) / 3),
S: new Date().getMilliseconds(),
};
/(y+)/.test(t) &&
(t = t.replace(
RegExp.$1,
(new Date().getFullYear() + "").substr(4 - RegExp.$1.length)
));
for (let e in s)
new RegExp("(" + e + ")").test(t) &&
(t = t.replace(
RegExp.$1,
1 == RegExp.$1.length
? s[e]
: ("00" + s[e]).substr(("" + s[e]).length)
));
return t;
}
msg(s = t, e = "", i = "", o) {
const h = (t) =>
!t || (!this.isLoon() && this.isSurge())
? t
: "string" == typeof t
? this.isLoon()
? t
: this.isQuanX()
? { "open-url": t }
: void 0
: "object" == typeof t && (t["open-url"] || t["media-url"])
? this.isLoon()
? t["open-url"]
: this.isQuanX()
? t
: void 0
: void 0;
this.isMute ||
(this.isSurge() || this.isLoon()
? $notification.post(s, e, i, h(o))
: this.isQuanX() && $notify(s, e, i, h(o)));
let logs = ['', '==============📣系统通知📣=============='];
logs.push(t);
e ? logs.push(e) : '';
i ? logs.push(i) : '';
console.log(logs.join('\n'));
this.logs = this.logs.concat(logs);
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator));
}
logErr(t, s) {
const e = !this.isSurge() && !this.isQuanX() && !this.isLoon();
e
? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack)
: this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t);
}
wait(t) {
return new Promise((s) => setTimeout(s, t));
}
done(t = {}) {
const s = new Date().getTime(),
e = (s - this.startTime) / 1e3;
this.log(
"",
`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`
)
this.log()
if (this.isNode()) {
process.exit(1)
}
if (this.isQuanX()) {
$done(t)
}
}
})(t, s);
}

View File

@@ -0,0 +1,112 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%8D%B7%E5%AE%89%E7%89%B9%E9%AA%91%E8%A1%8C.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%8D%B7%E5%AE%89%E7%89%B9%E9%AA%91%E8%A1%8C.py
# Repo: jdqlscript/toulu
# Path: 捷安特骑行.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: cde00a24e7d22ffcf989388d81544ad9d81ac4e28168158970b40a866195c1fb
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#抓包域名opo.giant.com.cn下的user_id就行
#多账号使用&分割
#by:哆啦A梦
import os
import requests
import json
# 定义请求的公共头部
COMMON_HEADERS = {
"Host": "opo.giant.com.cn",
"Content-Length": "23",
"Accept": "application/json, text/plain, */*",
"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/83.0.4103.101 Mobile Safari/537.36 AgentWeb/5.0.0 UCBrowser/11.6.4.950 _giantapp/4.1.9",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "https://found.giant.com.cn",
"X-Requested-With": "com.giantkunshan.giant",
"Sec-Fetch-Site": "same-site",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Dest": "empty",
"Referer": "https://found.giant.com.cn/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
}
# 定义请求的URL
API_URL = "https://opo.giant.com.cn/opo/index.php/day_pic/do_app_pic"
def get_announcement():
"""
获取公告信息
"""
external_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
try:
response = requests.get(external_url)
if response.status_code == 200:
print(response.text.strip()) # 打印公告内容
print("公告获取成功,开始执行签到请求...")
else:
print(f"获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}")
def check_in(user_id):
"""
模拟签到操作。
"""
data = {"type": "1", "user_id": user_id}
return send_request(data)
def share_task(user_id):
"""
模拟分享任务。
"""
data = {"type": "2", "user_id": user_id}
return send_request(data)
def claim_share_reward(user_id):
"""
模拟领取分享任务积分。
"""
data = {"type": "3", "user_id": user_id}
return send_request(data)
def send_request(data):
"""
发送请求的通用函数。
"""
try:
response = requests.post(API_URL, headers=COMMON_HEADERS, data=data)
if response.status_code == 200:
response_data = response.json()
if response_data.get("status") == 1 and response_data.get("msg") == "ok":
return f"操作成功!"
else:
return f"操作失败,返回信息:{response_data.get('msg', '未知错误')}"
else:
return f"请求失败,状态码:{response.status_code}"
except Exception as e:
return f"请求时发生错误:{e}"
def main():
# 先获取公告
get_announcement()
user_ids_str = os.getenv("JATQX")
if not user_ids_str:
print("错误:未设置环境变量 JATQX请确保已正确配置。")
return
user_ids = user_ids_str.split("&")
for user_id in user_ids:
user_id = user_id.strip()
if user_id:
print(f"用户 {user_id}:开始执行任务")
print(f"用户 {user_id}:签到结果:{check_in(user_id)}")
print(f"用户 {user_id}:分享结果:{share_task(user_id)}")
print(f"用户 {user_id}:领取积分结果:{claim_share_reward(user_id)}")
print(f"用户 {user_id}:任务完成\n")
if __name__ == "__main__":
main()

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,154 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/mtf.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/mtf.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/mtf.js
// # UploadedAt: 2026-04-07T12:21:56Z
// # SHA256: 43c9ffb5194ec2154559fffe845949b7f31cb07bdf8a884b094ec1135c6c729c
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/*
------------------------------------------
@Author: sm
@Date: 2024.06.07 19:15
@Description: 摩托范APP签到和抽奖
cron: 30 10 * * *
------------------------------------------
#Notice:
变量名 mtf
抓域名 api.58moto.com 下请求中 token和uid 的值填入变量 用#连接 多账户&或换行
⚠️【免责声明】
------------------------------------------
1、此脚本仅用于学习研究不保证其合法性、准确性、有效性请根据情况自行判断本人对此不承担任何保证责任。
2、由于此脚本仅用于学习研究您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
3、请勿将此脚本用于任何商业或非法目的若违反规定请自行对此负责。
4、此脚本涉及应用与本人无关本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
5、本人对任何脚本引发的问题概不负责包括但不限于由脚本错误引起的任何损失和损害。
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利应及时通知并提供身份证明所有权证明我们将在收到认证文件确认后删除此脚本。
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本即视为您已接受此免责声明。
*/
const { Env } = require("../tools/env")
const $ = new Env("摩托范");
let ckName = `mtf`;
const strSplitor = "#";
const axios = require("axios");
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
class Task {
constructor(env) {
this.index = $.userIdx++
this.user = env.split(strSplitor);
this.token = this.user[0];
this.uid = this.user[1];
}
async run() {
await this.userInfo()
await this.signIn()
await this.drwa()
}
async userInfo() {
let options = {
method: 'POST',
url: `https://api.58moto.com/user/center/info/principal`,
headers: {
"token": this.token,
"content-type": "application/x-www-form-urlencoded"
},
data: "uid=" + this.uid
}
let { data: result } = await axios.request(options);
if (result?.code == 0) {
$.log(`查询成功:当前手机号${result.data.mobile} \n 用户昵称为${result.data.username} 🎉`);
} else {
$.log(`查询: 失败 ❌ 了呢,原因未知!`);
console.log(result);
}
}
async signIn() {
let options = {
method: 'POST',
url: `https://api.58moto.com/coins/task/dailyCheckIn`,
headers: {
"token": this.token,
"content-type": "application/x-www-form-urlencoded"
},
data: "uid=" + this.uid + "&weekDate=" + $.time('yyyyMMdd')
}
let { data: result } = await axios.request(options);
if (result?.code == 0) {
$.log(`签到成功:${result.data.contentDesc} 🎉`);
} else if (result?.code == 300101) {
$.log(`签到失败:${result.msg},请勿重复签到`);
} else {
$.log(`签到: 失败 ❌ 了呢,原因未知!`);
console.log(result);
}
}
async drwa() {
let options = {
method: 'POST',
url: `https://jsapi.58moto.com/coins/turntable/activity/draw`,
headers: {
"content-type": "application/x-www-form-urlencoded"
},
data: `token=${this.token}&uid=${this.uid}&autherid=${this.uid}&platform=2&version=3.66.80&deviceId=53B5DA97-C72D-4C19-A219-70D8A9A31290&bundleId=com.jdd.motorfans&activityId=24`
}
let { data: result } = await axios.request(options);
if (result?.code == 0) {
$.log(`抽奖成功:${result.data.awardName} 🎉`);
} else {
$.log(`抽奖: 失败 ❌ 了呢,原因未知!`);
console.log(result);
}
}
//做任务需要wtoken逆向 不想写
}
!(async () => {
await getNotice()
$.checkEnv(ckName);
for (let user of $.userList) {
await new Task(user).run();
}
})()
.catch((e) => console.log(e))
.finally(() => $.done());
async function getNotice() {
try {
let options = {
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
headers: {
"User-Agent": defaultUserAgent,
},
timeout:3000
}
let {
data: res
} = await axios.request(options);
$.log(res)
return res
} catch (e) {}
}

View File

@@ -0,0 +1,110 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%B5%93%E4%BA%94%E7%9A%84%E9%85%92%E9%A6%86.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%B5%93%E4%BA%94%E7%9A%84%E9%85%92%E9%A6%86.py
# Repo: jdqlscript/toulu
# Path: 浓五的酒馆.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: ee3ecc859af5c73b12b168aba0154178676c21cf9f7134d0dc43dcb64c34cd65
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#入口:https://i.postimg.cc/7YjhgtCH/mmexport1742029346894.jpg
#抓包任意域名下的authorization注意不要开头的Bearer支持多账号
#环境变量名:NWDJG
#by:哆啦A梦
import requests
import os
tokens = os.getenv("NWDJG")
if not tokens:
raise ValueError("环境变量 NWDJG 未设置,请确保已正确配置环境变量。")
token_list = tokens.split("&")
headers_template = {
'xweb_xhr': '1',
'content-type': 'application/json',
'sec-fetch-site': 'cross-site',
'sec-fetch-mode': 'cors',
'sec-fetch-dest': 'empty',
'accept-language': 'zh-CN,zh;q=0.9',
}
sign_url = 'https://stdcrm.dtmiller.com/scrm-promotion-service/promotion/sign/today'
sign_params = {
'promotionId': 'PI67c25977540856000aac6ac0',
}
points_url = 'https://stdcrm.dtmiller.com/scrm-promotion-service/mini/wly/user/info'
def get_proclamation():
external_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
try:
response = requests.get(external_url)
if response.status_code == 200:
print(response.text)
print("公告获取成功,开始执行任务...")
else:
print(f"获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}")
get_proclamation()
total_accounts = len(token_list)
success_count = 0
fail_count = 0
# 遍历每个账号,依次执行签到和查询积分任务
for index, token in enumerate(token_list, start=1):
print(f"\n正在处理账号 {index}/{total_accounts}...")
headers = headers_template.copy()
headers['authorization'] = f"Bearer {token}"
points_response = requests.get(points_url, headers=headers)
if points_response.status_code == 200:
points_data = points_response.json()
if points_data['code'] == 0:
mobile = points_data['data']['member']['mobile']
account_name = f"{mobile[:3]}*****{mobile[-3:]}"
print(f"账号:{account_name}")
else:
print(f"查询积分失败,{points_data['msg']}")
account_name = "未知"
else:
print(f"查询积分网络请求异常,状态码:{points_response.status_code},响应内容:{points_response.text}")
account_name = "未知"
print("正在尝试签到...")
sign_response = requests.get(sign_url, params=sign_params, headers=headers)
if sign_response.status_code == 200:
sign_data = sign_response.json()
if sign_data['code'] == 0:
print("签到成功!")
print(f"签到天数:{sign_data['data']['signDays']}")
print(f"是否已领取奖励:{sign_data['data']['isReceive']}")
print(f"奖励信息:{sign_data['data']['prize']['goodsName']},积分:{sign_data['data']['prize']['prizePoints']}")
success_count += 1
else:
print(f"签到失败,{sign_data['msg']}")
fail_count += 1
else:
print(f"签到网络请求异常,状态码:{sign_response.status_code},响应内容:{sign_response.text}")
fail_count += 1
print(f"\n任务完成!")
print(f"总账号数量:{total_accounts}")
print(f"签到成功账号:{success_count}")
print(f"签到失败账号:{fail_count}")

View File

@@ -0,0 +1,132 @@
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/aima.js
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/aima.js
// # Repo: smallfawn/QLScriptPublic
// # Path: daily/aima.js
// # UploadedAt: 2026-04-13T11:40:47Z
// # SHA256: c4bf13f4d1a0d91d73bf3e99005689874fbc95559f9b4b60ed3a55f883c90c0c
// # Category: web版/抓包
// # Evidence: web/H5关键词 + cookie/token/header
//
/*
爱玛会员俱乐部 - 自动签到脚本2026年2月修复版
✅ 修复点使用域名替代失效IP更新活动ID为100001180
✅ 支持环境Node.js
✅ 变量名aima
✅ 变量值access-token支持多账号用 & 或换行分隔)
*/
const { Env } = require("../tools/env")
const $ = new Env("爱玛会员俱乐部");
const axios = require('axios')
// ================== 配置区 ==================
const ACTIVITY_ID = "100001192"; // 2026年2月活动ID
const BASE_URL = "https://scrm.aimatech.com"; // 使用官方域名不再硬编码IP
const APP_ID = "scrm";
const USER_AGENT = "Mozilla/5.0 (Linux; Android 15; 23013RK75C Build/AQ3A.250226.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/142.0.7444.173 Mobile Safari/537.36 XWEB/1420229 MMWEBSDK/20251101 MMWEBID/6369 MicroMessenger/8.0.67.3000(0x28004333) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64 MiniProgramEnv/android";
// ================== 工具函数 ==================
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function md5(str) {
const crypto = require('crypto');
return crypto.createHash('md5').update(str).digest('hex');
}
// ================== 核心逻辑 ==================
async function signIn(token, index) {
try {
const timestamp = Date.now();
const traceLogId = generateUUID();
// 构造通用请求头
const headers = {
"App-Id": APP_ID,
"Time-Stamp": timestamp.toString(),
"TraceLog-Id": traceLogId,
"Access-Token": token.trim(),
"content-type": "application/json",
"User-Agent": USER_AGENT,
"charset": "utf-8",
"Referer": "https://servicewechat.com/wx2dcfb409fd5ddfb4/215/page-frame.html"
};
// 生成签名(按规则拼接)
const signStr = `${APP_ID}${timestamp}${traceLogId}${token.trim()}AimaScrm321_^`;
headers["Sign"] = md5(signStr).toLowerCase();
// 1. 查询签到状态
$.log(`🚀 账号【${index}】查询签到状态...`);
const searchRes = await axios.post(
`${BASE_URL}/aima/wxclient/mkt/activities/sign:search`,
{ activityId: ACTIVITY_ID },
{ headers, timeout: 10000 }
);
const data = searchRes.data;
if (data.content && data.content.signStatus === 1) {
$.log(`✅ 账号【${index}】今日已签到!`);
return;
}
// 2. 执行签到
$.log(`⏳ 账号【${index}】正在签到...`);
const joinRes = await axios.post(
`${BASE_URL}/aima/wxclient/mkt/activities/sign:join`,
{ activityId: ACTIVITY_ID, activitySceneId: null },
{ headers, timeout: 10000 }
);
if (joinRes.data.code === 200 || joinRes.data.code === 0) {
const point = joinRes.data.content?.point || 10;
$.log(`🎉 账号【${index}】签到成功!获得 ${point} 积分`);
} else {
throw new Error(`签到失败: ${JSON.stringify(joinRes.data)}`);
}
} catch (e) {
throw new Error(e.message || e);
}
}
// ================== 主函数 ==================
!(async () => {
console.log(`\n🔔 爱玛会员俱乐部, 开始!`);
// 获取 access-token支持多账号
let tokens = [];
if ($.isNode()) {
const env = process.env.aima;
if (env) {
tokens = env.split(/&|\n/).filter(t => t.trim());
}
}
if (tokens.length === 0) {
$.msg("❌ 未找到 access-token请配置变量 'aima'");
return;
}
console.log(`共找到${tokens.length}个账号`);
for (let i = 0; i < tokens.length; i++) {
try {
console.log(`\n🚀 user:【${i + 1}】 start work`);
await signIn(tokens[i], i + 1);
} catch (e) {
console.log(`❌ 账号【${i + 1}】执行失败: ${e.message}`);
}
}
// 发送通知
//await $.sendMsg($.logs.join("\n"));
})()
.catch((e) => console.log(e))
.finally(() => $.done());

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,100 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%AC%AC%E4%B8%80%E7%94%B5%E5%8A%A8.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%AC%AC%E4%B8%80%E7%94%B5%E5%8A%A8.py
# Repo: jdqlscript/toulu
# Path: 第一电动.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 209af53a6ebb564eac88091192e8340740ae58df5af249d08a2205a670fff9b8
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#环境变量 dydd
#有问题联系3288588344
#频道https://pd.qq.com/s/672fku8ge
import os
import requests
import time
import hashlib
# 获取青龙面板环境变量 dydd
dydd = os.environ.get('dydd', '')
# 按换行符分割账号,并过滤空行
accounts = [line.strip() for line in dydd.strip().split('\n') if line.strip()]
url = "https://app2.d1ev.com/api/user/add-integral"
# 公共参数
params_base = {
'app_id': "d1ev_app",
'appName': "第一电动",
'os': "android",
'osVer': "9",
'vName': "2.5.6",
'vCode': "20506"
}
headers = {
'User-Agent': "Dalvik/2.1.0 (Linux; U; Android 9; PCRT00 Build/PQ3A.190605.06201646)",
'Connection': "Keep-Alive",
'Accept-Encoding': "gzip",
'TE': "gzip, deflate; q=0.5"
}
# 定义任务列表,每个任务包括任务类型和执行次数
tasks = [
{'type': 11, 'name': '签到', 'count': 1},
{'type': 3, 'name': '分享', 'count': 3},
{'type': 5, 'name': '点赞', 'count': 5},
{'type': 2, 'name': '阅读', 'count': 1}
]
for account in accounts:
# 分割账号为 uid 和 token
parts = account.split('#')
if len(parts) != 2:
print(f"跳过无效格式账号: {account}")
continue
uid, token = parts
# 生成当前时间戳
current_timestamp = str(int(time.time()))
for task in tasks:
task_type = task['type']
task_name = task['name']
task_count = task['count']
for _ in range(task_count):
# 构造签名字符串
sign_str = f"OMKCy2UxZwn8e4Ak{params_base['appName']}{params_base['app_id']}{params_base['os']}{params_base['osVer']}{current_timestamp}{token}{task_type}{uid}{params_base['vCode']}{params_base['vName']}"
# 计算 MD5 签名
sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
# 定义带有动态值的参数
params = {
'timestamp': current_timestamp,
'token': token,
'uid': uid,
'type': task_type,
'sign': sign.upper(),
**params_base
}
try:
# 发送 GET 请求
response = requests.get(url, params=params, headers=headers)
response.raise_for_status() # 如果请求失败,则抛出异常
# 打印任务执行结果
print(f"账号: {uid}, 任务: {task_name}, 响应: {response.text}")
except requests.exceptions.RequestException as e:
print(f"账号: {uid}, 任务: {task_name}, 请求失败: {e}")
# 任务间隔5秒
time.sleep(5)
# 任务类型间隔10秒
time.sleep(10)

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,83 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%9C%9C%E9%9B%AA%E5%86%B0%E5%9F%8E.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%9C%9C%E9%9B%AA%E5%86%B0%E5%9F%8E.py
# Repo: jdqlscript/toulu
# Path: 蜜雪冰城.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 3365d3b2294be333c9e59e0f382c7a7e84e3fe65d0e027b478939841e0730a84
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#有问题联系3288588344
#频道https://pd.qq.com/s/672fku8ge
import requests
import threading
from hashlib import md5 as md5Encode
# ----固定变量区----
marketingId = '1816854086004391938'
# 任务数和线程数
tasks_num = 100 # 运行 100 次
threads_num = 30 # 最大线程数 30 个
# ----自定义变量区----
token = '抓包token'#token填里面
round = '13:00'
secretword = '年度重磅 新品免单'#口令
headers = {
'Access-Token': token,
'Referer': 'https://mxsa-h5.mxbc.net/',
'Host': 'mxsa.mxbc.net',
'Origin': 'https://mxsa-h5.mxbc.net',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.50(0x18003233) NetType/4G Language/zh_CN miniProgram/wx7696c66d2245d107',
'Content-type': 'application/json;charset=UTF-8',
}
def exchange():
try:
url = 'https://mxsa.mxbc.net/api/v1/h5/marketing/secretword/confirm'
param = f'marketingId={marketingId}&round={round}&s=2&secretword={secretword}c274bac6493544b89d9c4f9d8d542b84'
m = md5Encode(param.encode("utf8"))
sign = m.hexdigest()
body = {
"secretword": secretword,
"sign": sign,
"marketingId": marketingId,
"round": round,
"s": 2
}
res = requests.post(url, headers=headers, json=body)
print(f'任务开始: {res.text}')
except Exception as e:
print(f'任务失败: {e}')
def threading_run(tasks,threads):
for i in range(tasks):
if threading.active_count() < threads + 1 and tasks != 0:
t = threading.Thread(target=exchange)
t.start()
tasks -= 1
if threading.active_count() == threads + 1:
# 等待前面的进程结束后再执行后面的代码这里为1因为程序本身即为一个线程
while threading.active_count() == threads + 1:
pass
while threading.active_count() != 1:
pass
def start_task():
threading_run(tasks_num, threads_num)
if __name__ == '__main__':
# 手动执行任务
start_task()

View File

@@ -0,0 +1,101 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%9C%9C%E9%9B%AA%E7%A7%92%E6%9D%80.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%9C%9C%E9%9B%AA%E7%A7%92%E6%9D%80.py
# Repo: jdqlscript/toulu
# Path: 蜜雪秒杀.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: abf071122636d805eb08d25c42ad6dad1fe571426756167e12ca9d902644f3c4
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#需要填的值在最下面
#蜜雪冰城抢券 填场次时间即可 比如11:00 拉到最下面自己填token进去 卡着58 59秒跑 跑之前开飞行或者挂爱加速 避免405黑ip 有叼毛已经用这个抢到了
import hashlib
import time
import requests
import datetime
response = requests.get("https://raw.githubusercontent.com/3288588344/toulu/main/tl.txt")
response.encoding = 'utf-8'
txt = response.text
print(txt)
def ts():
return str(int(time.time()*1000))
def wait(sleepTime):
nowTine = time.strftime('%H', time.localtime())
nextTime = str(int(nowTine) + 1).zfill(2)
print('脚本提前', sleepTime, f'活动开始时间{nextTime}:00:00')
timeArray = time.strptime(time.strftime('%Y%m%d') + f'{nextTime}0000', "%Y%m%d%H%M%S")
timeStamp = int(time.mktime(timeArray))
while True:
reduce_time = time.time() + sleepTime - timeStamp # 差值秒
if time.time() + sleepTime - timeStamp > 0:
print(
f"当前时间{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))},,提前结束{sleepTime}s")
break
else:
if abs(reduce_time) > 2: # 如果剩余时间大于2s则睡眠剩余的一半时间
print(
f"当前时间{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))},睡眠{abs(reduce_time) / 2}s")
time.sleep(abs(reduce_time) / 2)
class MXMS:
def __init__(self,atoken):
self.headers={
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b19)XWEB/9193',
'Origin': 'https://mxsa-h5.mxbc.net',
'Referer': 'https://mxsa-h5.mxbc.net/',
'Content-Type': 'application/json;charset=UTF-8',
'Access-Token': atoken
}
def mkpayload(self,params):
params.update({'stamp':ts()})
sorted_items = sorted(params.items())
formatted_string = '&'.join([f'{k}={v}' for k, v in sorted_items])+'c274bac6493544b89d9c4f9d8d542b84'
params.update({'sign':hashlib.md5(formatted_string.encode()).hexdigest()})
return params
def info(self):
u='https://mxsa.mxbc.net/api/v1/h5/marketing/secretword/info'
p={
'marketingId': marketingId,
's': '2',
}
p=self.mkpayload(p)
r=requests.get(u,headers=self.headers,params=p)
if 'marketingId' in r.text:
rj=r.json()
print('请确定一下参数是否你填写的一致')
print('marketingId',rj['data']['marketingId'])
print(rj['data']['hintWord'])
print('-'*50)
else:
print(r.text)
print('信息获取异常')
def confirm(self):
try:
u='https://mxsa.mxbc.net/api/v1/h5/marketing/secretword/confirm'
p={"marketingId":marketingId,"round":round,'s':'2',"secretword":secretword}
p = self.mkpayload(p)
r=requests.post(u,headers=self.headers,json=p,timeout=0.75)
print(r.text)
if '已达领取上限' in r.text:
return True
except Exception as e:
print(e)
def run(self):
self.info()
wait(0.005)
print(datetime.datetime.now())
for i in range(fb_cont):
if self.confirm()==True:
return True
time.sleep(0.75)
print(datetime.datetime.now())
if __name__ == '__main__':
atoken='eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUx'#填token
marketingId='1816854086004391938'
secretword = "好一朵美丽的茉莉花"#口令
fb_cont = 300
nowTine0 = time.strftime('%H', time.localtime())
nextTime0 = str(int(nowTine0) + 1).zfill(2)
round=nextTime0+":00"
api=MXMS(atoken)
api.run()

View File

@@ -0,0 +1,346 @@
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E9%87%91%E5%BE%BD%E9%85%92%E4%BC%9A%E5%91%98.py
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E9%87%91%E5%BE%BD%E9%85%92%E4%BC%9A%E5%91%98.py
# Repo: jdqlscript/toulu
# Path: 金徽酒会员.py
# UploadedAt: 2025-06-28T11:18:42+08:00
# SHA256: 9fd75c1dd091a8a08d0f248e161e5ce52b2e81540a29e3361d4b5549bf9a263c
# Category: web版/抓包
# Evidence: web/H5关键词 + cookie/token/header
#by:哆啦A梦
#入口:http://api.0vsp.com/h5/wxa/link?sid=25430gykJTW
#抓包ucodeprod-openapi.jinhuijiu.com.cn域名下的Authorization和serialId格式Authorization#serialId
#多账号换行分割
import os
import requests
import json
import random
import time
def get_proclamation():
primary_url = "https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt"
backup_url = "https://tfapi.cn/TL/tl.json"
try:
response = requests.get(primary_url, timeout=10)
if response.status_code == 200:
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
return
except requests.exceptions.RequestException as e:
print(f"获取公告时发生错误: {e}, 尝试备用链接...")
try:
response = requests.get(backup_url, timeout=10)
if response.status_code == 200:
print("\n" + "=" * 50)
print("📢 公告信息")
print("=" * 45)
print(response.text)
print("=" * 45 + "\n")
print("公告获取成功,开始执行任务...\n")
else:
print(f"⚠️ 获取公告失败,状态码: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"⚠️ 获取公告时发生错误: {e}, 可能是网络问题或链接无效。")
def get_desensitized_phone(response_data):
"""
从响应数据中提取并脱敏账号。
"""
phone_number = response_data.get("phoneNumber", "")
if phone_number and len(phone_number) >= 11:
return phone_number[:3] + "****" + phone_number[7:]
return "未知账号"
def fetch_user_metadata():
"""
从环境变量获取多账号信息,发送请求获取用户数据元,并对账号进行脱敏处理。
"""
env_variable = "JHHY"
url = "https://ucodeprod-openapi.jinhuijiu.com.cn/user/metadata"
account_info_list = os.getenv(env_variable, "").splitlines()
if not account_info_list:
print("环境变量JHHY未设置或格式不正确")
print("=" * 45)
return
for account_info in account_info_list:
if not account_info.strip():
continue
try:
token_part, serial_part = account_info.split("#", 1)
token = token_part.strip()
serial_id = serial_part.strip()
except ValueError:
print(f"警告: 账号信息格式错误")
print("=" * 45)
continue
headers = {
'Authorization': f"Bearer {token}",
'serialId': serial_id
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
data = response.json()
desensitized_phone = get_desensitized_phone(data)
print(f"账号 {desensitized_phone} 获取账户信息成功")
print("=" * 45)
except requests.exceptions.RequestException as e:
print(f"账号 {account_info} 获取账号信息失败: {e}")
print("=" * 45)
except ValueError as e:
print(f"账号 {account_info} 账号数据解析失败: {e}")
print("=" * 45)
def perform_check_in():
"""
发送签到请求。
"""
env_variable = "JHHY"
checkin_url = "https://ucodeprod-openapi.jinhuijiu.com.cn/lottery/checkIn"
metadata_url = "https://ucodeprod-openapi.jinhuijiu.com.cn/user/metadata"
account_info_list = os.getenv(env_variable, "").splitlines()
if not account_info_list:
print("环境变量JHHY未设置或格式不正确")
print("=" * 45)
return
# 使用字典存储每个账号的脱敏手机号
account_desensitized_info = {}
# 首先获取每个账号的脱敏手机号
for account_info in account_info_list:
if not account_info.strip():
continue
try:
token_part, serial_part = account_info.split("#", 1)
auth_token = f"Bearer {token_part.strip()}"
serial_id = serial_part.strip()
except ValueError:
print(f"警告: 账号信息格式错误")
print("=" * 45)
continue
headers = {
'Authorization': auth_token,
'serialId': serial_id,
}
try:
# 获取账号信息并脱敏
metadata_response = requests.get(metadata_url, headers=headers)
metadata_response.raise_for_status()
metadata_data = metadata_response.json()
account_desensitized_info[account_info] = get_desensitized_phone(metadata_data)
except Exception as e:
# 这里只记录获取脱敏信息的错误,不输出
account_desensitized_info[account_info] = "未知账号"
# 进行签到
for account_info in account_info_list:
if not account_info.strip():
continue
desensitized_phone = account_desensitized_info.get(account_info, "未知账号")
try:
token_part, serial_part = account_info.split("#", 1)
auth_token = f"Bearer {token_part.strip()}"
serial_id = serial_part.strip()
except ValueError:
print(f"警告: 账号信息格式错误")
print("=" * 45)
continue
params = {
'longitude': "119.24095916748047",
'latitude': "34.2840690612793"
}
payload = {
"promotionCode": "signIn",
"promotionId": 1001867,
"longitude": 119.24095916748047,
"latitude": 34.2840690612793
}
headers = {
'Content-Type': "application/json",
'Authorization': auth_token,
'serialId': serial_id,
}
try:
response = requests.post(checkin_url, params=params, data=json.dumps(payload), headers=headers)
response.raise_for_status()
response_data = response.json()
if response_data.get("success", False):
if "今日已签到" in response_data.get("message", ""):
print(f"账号 {desensitized_phone} 今日已签到")
print("=" * 45)
else:
print(f"账号 {desensitized_phone} 签到成功")
print("=" * 45)
else:
error_message = response_data.get('message', '未知错误')
if "今日已签到" in error_message:
print(f"账号 {desensitized_phone} 今日已签到")
print("=" * 45)
else:
print(f"账号 {desensitized_phone} 签到失败: {error_message}")
print("=" * 45)
except requests.exceptions.RequestException as e:
# 检查是否有返回的响应内容
if hasattr(e, 'response') and e.response is not None:
try:
error_response = e.response.json()
error_message = error_response.get('emsg', error_response.get('message', '未知错误'))
# 检查是否是已签到的错误
if "今日已签到" in error_message:
print(f"账号 {desensitized_phone} 今日已签到")
print("=" * 45)
else:
print(f"账号 {desensitized_phone} 签到失败: {error_message}")
print("=" * 45)
except ValueError:
# 如果响应内容不是JSON格式直接输出原始内容
print(f"账号 {desensitized_phone} 签到失败: {e.response.text}")
print("=" * 45)
else:
# 如果没有响应内容,输出通用错误提示
print(f"账号 {desensitized_phone} 签到失败: 网络请求失败,请检查网络连接后重试")
print("=" * 45)
def complete_tasks(task_ids):
"""
完成指定任务,并加入随机延迟
"""
url = "https://ucodeprod-openapi.jinhuijiu.com.cn/task/complete"
env_variable = "JHHY"
account_info_list = os.getenv(env_variable, "").splitlines()
if not account_info_list:
print("环境变量JHHY未设置或格式不正确")
print("=" * 45)
return
# 首先获取每个账号的脱敏手机号和认证信息
account_info_map = {}
for account_info in account_info_list:
if not account_info.strip():
continue
try:
token_part, serial_part = account_info.split("#", 1)
token = token_part.strip()
serial_id = serial_part.strip()
except ValueError:
print(f"警告: 账号信息格式错误")
print("=" * 45)
continue
# 获取账号脱敏信息
headers = {
'Authorization': f"Bearer {token}",
'serialId': serial_id,
}
try:
metadata_response = requests.get("https://ucodeprod-openapi.jinhuijiu.com.cn/user/metadata", headers=headers)
metadata_response.raise_for_status()
metadata_data = metadata_response.json()
desensitized_phone = get_desensitized_phone(metadata_data)
account_info_map[account_info] = {
'token': token,
'serial_id': serial_id,
'desensitized_phone': desensitized_phone
}
except Exception as e:
account_info_map[account_info] = {
'token': token,
'serial_id': serial_id,
'desensitized_phone': "未知账号"
}
# 对每个账号完成任务
for account_info, info in account_info_map.items():
desensitized_phone = info['desensitized_phone']
token = info['token']
serial_id = info['serial_id']
headers = {
'Content-Type': "application/json",
'Authorization': f"Bearer {token}",
'serialId': serial_id
}
for task_id in task_ids:
payload = {
"taskId": task_id,
"auto": True
}
try:
response = requests.post(url, data=json.dumps(payload), headers=headers)
# 不再调用raise_for_status因为我们需要捕获400状态码
if response.status_code == 200:
data = response.json()
# 如果任务完成成功
if data.get('success', False):
task_name = data.get('lotteryResultVo', {}).get('prizes', [{}])[0].get('remark', '未知任务')
print("=" * 45)
print(f"账号 {desensitized_phone} 任务 '{task_name}'ID: {task_id})成功完成!")
print("=" * 45)
else:
error_message = data.get('message', '未知错误')
print(f"账号 {desensitized_phone} 任务 ID {task_id} 完成失败: {error_message}")
elif response.status_code == 400:
error_data = response.json()
if error_data.get('ecode') == 41041 and "用户已完成任务" in error_data.get('emsg', ''):
print(f"账号 {desensitized_phone} 任务 ID {task_id} 已完成")
print("=" * 45)
else:
print(f"账号 {desensitized_phone} 任务 ID {task_id} 完成失败: 状态码400错误信息: {response.text}")
print("=" * 45)
else:
print(f"账号 {desensitized_phone} 任务 ID {task_id} 完成失败: 状态码 {response.status_code},响应内容: {response.text}")
print("=" * 45)
# 随机延迟0-20秒
delay_time = random.uniform(0, 20)
print(f"账号 {desensitized_phone} 在完成任务后延迟 {delay_time:.2f}")
print("=" * 45)
time.sleep(delay_time)
except requests.exceptions.RequestException as e:
print(f"账号 {desensitized_phone} 请求任务 ID {task_id} 时发生网络错误:{e}")
print("=" * 45)
except ValueError as e:
print(f"账号 {desensitized_phone} 解析任务 ID {task_id} 响应内容失败:{e}")
print("=" * 45)
# 主函数
def main():
#获取公告
get_proclamation()
# 签到任务
perform_check_in()
# 完成任务
task_ids = [100016, 100017, 10018]
complete_tasks(task_ids)
if __name__ == "__main__":
main()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long