Collect seeded Qinglong script repositories
This commit is contained in:
282
脚本库/web版/抓包/100bt百田游戏/2025-06-28_百田网_8da05cf4.js
Normal file
282
脚本库/web版/抓包/100bt百田游戏/2025-06-28_百田网_8da05cf4.js
Normal file
File diff suppressed because one or more lines are too long
158
脚本库/web版/抓包/360社区签到/2026-04-07_360_6ad9e634.py
Normal file
158
脚本库/web版/抓包/360社区签到/2026-04-07_360_6ad9e634.py
Normal 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()
|
||||
257
脚本库/web版/抓包/BREO/2026-04-07_BREO_446c598f.py
Normal file
257
脚本库/web版/抓包/BREO/2026-04-07_BREO_446c598f.py
Normal 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=============== 所有任务执行完毕 ===============")
|
||||
255
脚本库/web版/抓包/breo/2025-06-28_breo_647b98a9.py
Normal file
255
脚本库/web版/抓包/breo/2025-06-28_breo_647b98a9.py
Normal 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=============== 所有任务执行完毕 ===============")
|
||||
277
脚本库/web版/抓包/function_res_{/2025-06-28_Ruishu_0132420d.py
Normal file
277
脚本库/web版/抓包/function_res_{/2025-06-28_Ruishu_0132420d.py
Normal 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))
|
||||
565
脚本库/web版/抓包/item.taskTitle,/2025-06-28_爱奇艺会员_d89c064a.js
Normal file
565
脚本库/web版/抓包/item.taskTitle,/2025-06-28_爱奇艺会员_d89c064a.js
Normal file
File diff suppressed because one or more lines are too long
32
脚本库/web版/抓包/only_mi/2025-08-25_ql_only_mi_dc606d90.py
Normal file
32
脚本库/web版/抓包/only_mi/2025-08-25_ql_only_mi_dc606d90.py
Normal file
File diff suppressed because one or more lines are too long
473
脚本库/web版/抓包/sendNotify/2025-06-03_sendNotify_c3b909e6.py
Normal file
473
脚本库/web版/抓包/sendNotify/2025-06-03_sendNotify_c3b909e6.py
Normal 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}×tamp={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()
|
||||
265
脚本库/web版/抓包/vx体彩服务号/2025-06-28_体彩通杀_b2c5ac79.js
Normal file
265
脚本库/web版/抓包/vx体彩服务号/2025-06-28_体彩通杀_b2c5ac79.js
Normal file
File diff suppressed because one or more lines are too long
336
脚本库/web版/抓包/vx日清体验馆/2025-06-28_日清体验馆_12996359.js
Normal file
336
脚本库/web版/抓包/vx日清体验馆/2025-06-28_日清体验馆_12996359.js
Normal file
File diff suppressed because one or more lines are too long
436
脚本库/web版/抓包/vx毛铺草本荟/2025-06-28_毛铺草本荟_391b94a7.js
Normal file
436
脚本库/web版/抓包/vx毛铺草本荟/2025-06-28_毛铺草本荟_391b94a7.js
Normal file
File diff suppressed because one or more lines are too long
486
脚本库/web版/抓包/wx_庙友之家/2026-05-14_miaoyouHome_1329d61d.js
Normal file
486
脚本库/web版/抓包/wx_庙友之家/2026-05-14_miaoyouHome_1329d61d.js
Normal 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);
|
||||
}
|
||||
384
脚本库/web版/抓包/xbox俱乐部V2/2025-06-28_xbox俱乐部_d32e8317.js
Normal file
384
脚本库/web版/抓包/xbox俱乐部V2/2025-06-28_xbox俱乐部_d32e8317.js
Normal file
File diff suppressed because one or more lines are too long
105
脚本库/web版/抓包/东方棘市/2025-06-28_东方棘市_892b06ab.py
Normal file
105
脚本库/web版/抓包/东方棘市/2025-06-28_东方棘市_892b06ab.py
Normal 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("==============================")
|
||||
592
脚本库/web版/抓包/东方烟草报/2025-06-28_东方烟草报App_1b5375a5.js
Normal file
592
脚本库/web版/抓包/东方烟草报/2025-06-28_东方烟草报App_1b5375a5.js
Normal 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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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);
|
||||
}
|
||||
240
脚本库/web版/抓包/东方烟草报/2026-04-07_dfyc_b2cb2a98.js
Normal file
240
脚本库/web版/抓包/东方烟草报/2026-04-07_dfyc_b2cb2a98.js
Normal 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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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}×tamp=${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) {}
|
||||
|
||||
}
|
||||
68
脚本库/web版/抓包/中兴商城/2025-06-28_中兴商城_3fecf7b6.py
Normal file
68
脚本库/web版/抓包/中兴商城/2025-06-28_中兴商城_3fecf7b6.py
Normal 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")
|
||||
1328
脚本库/web版/抓包/丰信客户端/2025-06-28_丰信_5b9a593b.js
Normal file
1328
脚本库/web版/抓包/丰信客户端/2025-06-28_丰信_5b9a593b.js
Normal file
File diff suppressed because it is too large
Load Diff
442
脚本库/web版/抓包/书亦烧仙草/2026-05-14_sysxc_9847bcfd.js
Normal file
442
脚本库/web版/抓包/书亦烧仙草/2026-05-14_sysxc_9847bcfd.js
Normal file
File diff suppressed because one or more lines are too long
224
脚本库/web版/抓包/书亦烧仙草python版/2026-05-14_sysxc_b9f66359.py
Normal file
224
脚本库/web版/抓包/书亦烧仙草python版/2026-05-14_sysxc_b9f66359.py
Normal 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)
|
||||
|
||||
392
脚本库/web版/抓包/兴攀农场/2025-06-28_兴攀农场_125624b7.js
Normal file
392
脚本库/web版/抓包/兴攀农场/2025-06-28_兴攀农场_125624b7.js
Normal file
File diff suppressed because one or more lines are too long
105
脚本库/web版/抓包/叭卦优选/2025-06-28_叭卦优选_4c1f1729.py
Normal file
105
脚本库/web版/抓包/叭卦优选/2025-06-28_叭卦优选_4c1f1729.py
Normal 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()
|
||||
194
脚本库/web版/抓包/叮当快药APP/2025-06-28_叮当快药_eab3ff48.js
Normal file
194
脚本库/web版/抓包/叮当快药APP/2025-06-28_叮当快药_eab3ff48.js
Normal file
File diff suppressed because one or more lines are too long
272
脚本库/web版/抓包/国乐酱酒/2025-06-28_国乐酱酒_568436f8.js
Normal file
272
脚本库/web版/抓包/国乐酱酒/2025-06-28_国乐酱酒_568436f8.js
Normal file
File diff suppressed because one or more lines are too long
311
脚本库/web版/抓包/奇瑞汽车/2025-06-28_奇瑞汽车_d970e667.js
Normal file
311
脚本库/web版/抓包/奇瑞汽车/2025-06-28_奇瑞汽车_d970e667.js
Normal file
File diff suppressed because one or more lines are too long
181
脚本库/web版/抓包/安徽电信/2025-06-28_安徽电信_907729f3.js
Normal file
181
脚本库/web版/抓包/安徽电信/2025-06-28_安徽电信_907729f3.js
Normal file
File diff suppressed because one or more lines are too long
129
脚本库/web版/抓包/小紫/2025-06-28_小紫_04f1966f.py
Normal file
129
脚本库/web版/抓包/小紫/2025-06-28_小紫_04f1966f.py
Normal 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,程序退出。")
|
||||
1030
脚本库/web版/抓包/得物森林/2025-06-03_得物森林_124d8271.py
Normal file
1030
脚本库/web版/抓包/得物森林/2025-06-03_得物森林_124d8271.py
Normal file
File diff suppressed because it is too large
Load Diff
662
脚本库/web版/抓包/心喜/2025-06-28_心喜小程序_a195dc9a.js
Normal file
662
脚本库/web版/抓包/心喜/2025-06-28_心喜小程序_a195dc9a.js
Normal 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);
|
||||
}
|
||||
112
脚本库/web版/抓包/捷安特骑行/2025-06-28_捷安特骑行_cde00a24.py
Normal file
112
脚本库/web版/抓包/捷安特骑行/2025-06-28_捷安特骑行_cde00a24.py
Normal 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()
|
||||
388
脚本库/web版/抓包/掌心临海/2025-06-28_掌心临海_f795ee0f.js
Normal file
388
脚本库/web版/抓包/掌心临海/2025-06-28_掌心临海_f795ee0f.js
Normal file
File diff suppressed because one or more lines are too long
154
脚本库/web版/抓包/摩托范/2026-04-07_mtf_43c9ffb5.js
Normal file
154
脚本库/web版/抓包/摩托范/2026-04-07_mtf_43c9ffb5.js
Normal 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) {}
|
||||
|
||||
}
|
||||
110
脚本库/web版/抓包/浓五的酒馆/2025-06-28_浓五的酒馆_ee3ecc85.py
Normal file
110
脚本库/web版/抓包/浓五的酒馆/2025-06-28_浓五的酒馆_ee3ecc85.py
Normal 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}")
|
||||
132
脚本库/web版/抓包/爱玛会员俱乐部/2026-04-13_aima_c4bf13f4.js
Normal file
132
脚本库/web版/抓包/爱玛会员俱乐部/2026-04-13_aima_c4bf13f4.js
Normal 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());
|
||||
|
||||
617
脚本库/web版/抓包/福袋生活/2025-06-28_福袋生活_a0e7b152.js
Normal file
617
脚本库/web版/抓包/福袋生活/2025-06-28_福袋生活_a0e7b152.js
Normal file
File diff suppressed because one or more lines are too long
100
脚本库/web版/抓包/第一电动/2025-06-28_第一电动_209af53a.py
Normal file
100
脚本库/web版/抓包/第一电动/2025-06-28_第一电动_209af53a.py
Normal 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)
|
||||
|
||||
235
脚本库/web版/抓包/粉象生活App/2026-04-02_fenxiang_c0377499.js
Normal file
235
脚本库/web版/抓包/粉象生活App/2026-04-02_fenxiang_c0377499.js
Normal file
File diff suppressed because one or more lines are too long
83
脚本库/web版/抓包/蜜雪冰城/2025-06-28_蜜雪冰城_3365d3b2.py
Normal file
83
脚本库/web版/抓包/蜜雪冰城/2025-06-28_蜜雪冰城_3365d3b2.py
Normal 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()
|
||||
|
||||
|
||||
101
脚本库/web版/抓包/蜜雪秒杀/2025-06-28_蜜雪秒杀_abf07112.py
Normal file
101
脚本库/web版/抓包/蜜雪秒杀/2025-06-28_蜜雪秒杀_abf07112.py
Normal 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()
|
||||
346
脚本库/web版/抓包/金徽酒会员/2025-06-28_金徽酒会员_9fd75c1d.py
Normal file
346
脚本库/web版/抓包/金徽酒会员/2025-06-28_金徽酒会员_9fd75c1d.py
Normal 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()
|
||||
274
脚本库/web版/抓包/雀巢会员俱乐部/2025-06-28_雀巢会员俱乐部_36e37724.js
Normal file
274
脚本库/web版/抓包/雀巢会员俱乐部/2025-06-28_雀巢会员俱乐部_36e37724.js
Normal file
File diff suppressed because one or more lines are too long
395
脚本库/web版/抓包/青碳行/2026-04-01_qtx_c3063c65.js
Normal file
395
脚本库/web版/抓包/青碳行/2026-04-01_qtx_c3063c65.js
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user