diff --git a/傻狗阅读_api_1.2通知版本.py b/傻狗阅读_api.py similarity index 97% rename from 傻狗阅读_api_1.2通知版本.py rename to 傻狗阅读_api.py index e1001e1..ec0b022 100644 --- a/傻狗阅读_api_1.2通知版本.py +++ b/傻狗阅读_api.py @@ -1,507 +1,507 @@ -# --------------------------------注释区-------------------------------- -# 入口:https://api.yd.dgtech.top/twyd/agent/user/login?aid=dabd8febf0c64c31b79c4785034e0de9&refererUserUuid=dbcc7c9327e64e9f94ac412a03c4debb -# -# 需抓取数据: -# * 填写自动过检的api接口 本地 内网ip:5000 非本地自行进行穿透 -# * 登录多少个账号就跑多少个账号 -# -# -# 变量名:yuanshen_api -withdraw_auto = True #是否自动提现 -# --------------------------------祈求区-------------------------------- -# _ooOoo_ -# o8888888o -# 88" . "88 -# (| -_- |) -# O\ = /O -# ____/`---'\____ -# . ' \\| |// `. -# / \\||| : |||// \ -# / _||||| -:- |||||- \ -# | | \\\ - /// | | -# | \_| ''\---/'' | | -# \ .-\__ `-` ___/-. / -# ___`. .' /--.--\ `. . __ -# ."" '< `.___\_<|>_/___.' >'"". -# | | : `- \`.;`\ _ /`;.`/ - ` : | | -# \ \ `-. \_ __\ /__ _/ .-` / / -# ======`-.____`-.___\_____/___.-`____.-'====== -# `=---=' -# -# ............................................. -# 佛祖保佑 永无BUG -# 佛祖镇楼 BUG辟邪 -# --------------------------------代码区-------------------------------- -from functools import wraps -import requests -import time -import os -import json -import hashlib -import random -import logging -import sys -import string -import re -from base64 import b64encode -import uuid -import base64 -from datetime import datetime,timedelta -from urllib.parse import urlparse, parse_qs,quote -from notify import send - -logging.basicConfig(level=logging.INFO, format='[%(levelname)s] ===> %(message)s') -code = "傻狗阅读_api版" -ver = "1.2" -envname = "yuanshen_api" - -debug = False #debug模式 开启即从脚本内部获取环境变量 -debugcookie = "127.0.0.1:5000" #debug模式cookie - -is_bulletin = False #公告开关 -is_toulu = False #偷撸公告开关 -is_with_sleep = False #是否开启随机延时 -def retry(exceptions =Exception, tries=5, delay=2, backoff=2): - """ - 简单的重试 module,如果重试失败则抛出错误。 - """ - def decorator(func): - @wraps(func) - def wrapper(*args, **kwargs): - # 每次调用时初始化独立的重试计数和延迟时间 - _tries, _delay = tries, delay - while _tries > 1: - try: - return func(*args, **kwargs) - except exceptions as e: - print(f"发生错误:[{e}], Retrying in {_delay} seconds ...") - time.sleep(_delay) - _tries -= 1 - _delay *= backoff - # 最后一次尝试 - return func(*args, **kwargs) - return wrapper - return decorator - - -class env(): - """ - env模块,获取cookie并转成列表,统计时间,提示脚本开始结束,检测一些配置,try except异常处理 - :param args: 传递给env的参数 - :param kwargs: 传递给env的关键字参数 - :return: Null - - Powered by huaji - """ - def __init__(self, *args, **kwargs): - self.cookie = None - self.env_ver = '1.5' #版本号 - self.split_chars = ['@', '&', '\n'] #分隔符 - self.identifiers = ['Powered By Huaji', 'QQ Group:901898186', 'yuanshen'] #标识符 - def check_file(self): - file_path = __file__ - try: - - with open(file_path, 'r', encoding='utf-8') as file: - content = file.read() - - results = {} - - # 批量检查每个标识符 - for identifier in self.identifiers: - if identifier in content: - results[identifier] = True - else: - results[identifier] = False - logging.error(f"文件可能被恶意篡改,请勿修改文件内容") - - all_identifiers_present = all(results.values()) - if not all_identifiers_present: - logging.error(f"文件可能被恶意篡改,请勿修改文件内容") - self.force_exit() - - except Exception as e: - print(f"读取文件时发生错误: {e}") - self.force_exit() - - def split_cookies(self): - """根据多个分隔符分割cookie""" - for sep in self.split_chars: - if sep in self.cookie: - return self.cookie.split(sep) - return [self.cookie] - - def scmain(self): - if 'https://' not in self.cookie and 'http://' not in self.cookie: - apiurl = 'http://' + self.cookies[0] - r = requests.get(apiurl + '/getallwx').json() - for i, cookie in enumerate(r, 1): - print(f"--------开始第{i}个账号--------") - main = yuanshen(cookie,apiurl) - main.main() - print(f"--------第{i}个账号执行完毕--------") - - - - def force_exit(self,code=0): - exit() - print("Warning: 篡改你妈") - os._exit(code) # 强制退出程序 - sys.exit(code) # 正常退出 - import ctypes - while True: - ctypes.string_at(114514) - ctypes.string_at(1919810) - ctypes.string_at(666666) - print("Warning: 篡改你妈") - - - def run(self): - if not os.getenv(envname) and not debug: - logging.warning(f"请先设置环境变量[{envname}]") - self.force_exit() - - self.cookie = os.getenv(envname, "") - - if debug: - self.cookie = debugcookie - if is_bulletin: - try: - print(requests.get("https://gitee.com/HuaJiB/yuanshen34/raw/master/pubilc.txt").text, "\n\n\n") - except: - logging.error("网络异常,链接公告服务器失败(gitee),请检查网络") - self.force_exit() - if is_toulu: - try: - txt = ''' -此为滑稽的偷撸本本 如你不在滑稽的小群却意外通过某种渠道获得了该脚本 -请联系QQ3487934983 提供证据后 你将代替泄露人员获得该群位置 -======================================================= - ''' - print(txt*5) - except: - self.force_exit() - if is_with_sleep: - random_time = random.randint(10,60) - logging.info(f"随机延时[{random_time}]秒") - time.sleep(random_time) - - self.cookies = self.split_cookies() - account_count = len(self.cookies) - logging.info(f"一共获取到{account_count}个账号") - print(f"=========🔔开始执行[{code}][{ver}]=========\n") - - - start_time = time.time() - if debug: - self.scmain() - else: - try: - self.scmain() - except Exception as e: - logging.error(f"脚本执行出错: {e}") - end_time = time.time() - - execution_time = end_time - start_time - - print(f"\n============🔔脚本[{code}]执行结束============") - print(f"本次脚本总运行时间: [{execution_time:.2f}] 秒") - self.force_exit() - - def main(self): - self.check_file() - self.run() - - def random_str(self,charset="all", length=8, to_upper=False,to_lower=False): - if charset == "all": #包含大小写字母和数字 - chars = string.ascii_letters + string.digits - elif charset == "letters": #大小写字母 - chars = string.ascii_letters - elif charset == "digits": - chars = string.digits - elif charset == "lowercase": #小写字母 - chars = string.ascii_lowercase - elif charset == "uuid": - return str(uuid.uuid4()) - elif charset == "uuid_str": - return str(uuid.uuid4()).replace("-", "") - elif charset != '' and charset is not None: - chars = charset - - - random_string = ''.join(random.choice(chars) for _ in range(length)) - - if to_upper: - return random_string.upper() - elif to_lower: - return random_string.lower() - else: - return random_string - - def aes_encrypt(self,data): - from Crypto.Cipher import AES - from Crypto.Util.Padding import pad, unpad - from binascii import hexlify, unhexlify - key = self.key.encode('utf-8') - iv = self.iv.encode('utf-8') - cipher = AES.new(key, AES.MODE_CBC, iv) - padded_plaintext = pad(data.encode('utf-8'), AES.block_size) - ciphertext = cipher.encrypt(padded_plaintext) - encrypted_base64 = b64encode(ciphertext).decode('utf-8') - - return encrypted_base64 - -class yuanshen: - def __init__(self,cookie,apiurl) -> None: - self.apiurl = apiurl - self.Wxid = cookie['Wxid'] - self.bz = cookie['wxname'] - logging.info(f'[{self.bz}]开始运行') - - def get_readtime(self,url): - h = { - 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', - 'accept-language': 'zh-CN,zh;q=0.9', - 'cache-control': 'no-cache', - # 'cookie': 'RK=x93V1EQnnk; ptcz=70105284a73b47db6aa5f48a05337a8cd84e98de7bd26d75975059126646db21; pac_uid=0_ZkHRNfy6PMhrH; ua_id=SyF8Nc7qjhUZ6RH8AAAAAHO013VXlTF21GY7ajzLLgs=; _clck=19reoir|1|fpg|0; wxuin=27186344812218; eas_sid=x1Y7v2y759E6j1a811G6q158d0; qq_domain_video_guid_verify=08d525e64ffa56c3; _qimei_uuid42=18a1b130e12100363fb639c628b466967c0e1ac0aa; pgv_pvid=6915337851; _qimei_fingerprint=3c42962857167cc55475bb65b2331f0b; _qimei_h38=fded42463fb639c628b4669602000006018a1b; o_cookie=3487934983; _qimei_q32=ec50b72a0f5a646accacf4393f1271f2; _qimei_q36=9e46147a2ab8bee5904ab74e30001741890c; rewardsn=; wxtokenkey=777', - 'pragma': 'no-cache', - 'priority': 'u=0, i', - 'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'document', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-site': 'none', - 'sec-fetch-user': '?1', - 'upgrade-insecure-requests': '1', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', -} - r = requests.get(url,headers=h).text - match = re.search(r"var createTime = '(.+?)';", r) - if match: - date_string = (match.group(1)) - - date = datetime.strptime(date_string, "%Y-%m-%d %H:%M") - half_year_ago = datetime.now() - timedelta(days=30) - if date > half_year_ago: - return False,date_string - else: - return True,date_string - @retry() - def login(self): - h = { - "Host": "api.yd.dgtech.top", - "sec-ch-ua": "Not/A)Brand;v=8, Chromium;v=126, Android", - "sec-ch-ua-mobile": "?1", - "sec-ch-ua-platform": "Android", - "upgrade-insecure-requests": "1", - "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260117 MMWEBSDK/20240301 MMWEBID/5295 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", - "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", - "sec-fetch-site": "none", - "sec-fetch-mode": "navigate", - "sec-fetch-user": "?1", - "sec-fetch-dest": "document", - "accept-encoding": "gzip, deflate, br, zstd", - "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", - "priority": "u=0, i"} - r = requests.get('https://api.yd.dgtech.top/twyd/agent/user/login?aid=dabd8febf0c64c31b79c4785034e0de9&refererUserUuid=dbcc7c9327e64e9f94ac412a03c4debb',allow_redirects=False,headers=h) - loginurl = r.headers['Location'] - data = {'Wxid':self.Wxid,'url':loginurl} - url = requests.post(self.apiurl+'/loginbyweb',json=data).json()['url'] - r = requests.get(url,headers=h,allow_redirects=False) - j = parse_qs(urlparse(r.headers['Location']).query) - domain = urlparse(r.headers['Location']).netloc - self.ck = j['sessionId'][0] - logging.info(f'登录成功[{self.ck}]') - self.h = { - "content-length": "2", - "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Android WebView\";v=\"126\"", - "sec-ch-ua-mobile": "?1", - "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", - "aid": "dabd8febf0c64c31b79c4785034e0de9", - "content-type": "application/json", - "accept": "application/json, text/javascript, */*; q=0.01", - "sessionid": self.ck, - "sec-ch-ua-platform": "\"Android\"", - "origin": f"https://{domain}", - "x-requested-with": "com.tencent.mm", - "sec-fetch-site": "cross-site", - "sec-fetch-mode": "cors", - "sec-fetch-dest": "empty", - "referer": f"https://{domain}/", - "accept-encoding": "gzip, deflate, br, zstd", - "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", - "priority": "u=1, i" -} - @retry() - def ruko(self): - url = 'https://api.yd.dgtech.top/mpreader/gotoRead' - r = requests.post(url,json={},headers=self.h).json() - if r['msg'] == 'OK': - h = { - "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Android WebView\";v=\"126\"", - "sec-ch-ua-mobile": "?1", - "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", - "sec-ch-ua-platform": "\"Android\"", - "accept": "image/wxpic,image/tpg,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", - "x-requested-with": "com.tencent.mm", - "sec-fetch-site": "cross-site", - "sec-fetch-mode": "no-cors", - "sec-fetch-dest": "image", - "referer": "https://b1b08f658d.zncyxt.cn/", - "accept-encoding": "gzip, deflate, br, zstd", - "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", - "priority": "u=1, i" -} - imgurl = r['data']['url'] - r = requests.get(imgurl,headers=h,timeout=10) - image_base64 = base64.b64encode(r.content).decode('utf-8') - data = {"image":image_base64} - r = requests.post("https://python.huaji.asia/decode_qr", json=data).json() - result = r['data'] - logging.info(f'请求解码成功[{result}]') - h = { - 'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64', - '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', - # 'Accept-Encoding': 'gzip, deflate, br, zstd', - 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Android WebView";v="126"', - 'sec-ch-ua-mobile': '?1', - 'sec-ch-ua-platform': '"Android"', - 'upgrade-insecure-requests': '1', - 'x-requested-with': 'com.tencent.mm', - 'sec-fetch-site': 'none', - 'sec-fetch-mode': 'navigate', - 'sec-fetch-user': '?1', - 'sec-fetch-dest': 'document', - 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', - 'priority': 'u=0, i', - # 'Cookie': 'token=nf9amey318ukp0bdij5gwoct7sz4v6l2', -} - r = requests.get(result,headers=h,timeout=10) - if r.status_code == 200: - matches = re.findall(r'.*?', r.text, re.DOTALL) - code = (matches[2].replace('','').replace('\n','').replace('\t','')) - # with open('code.js','w') as f: - # f.write(code) - decodeurl = 'https://decode.huaji.asia/decode' - data = {"code": code,"plugins": ["obfuscator"]} - r = requests.post(decodeurl,json=data).json() - if r['success']: - logging.info('参数被加密 进行解密操作') - code = r["decodedCode"] - regex = r"a\((['\"])(.*?)\1,\s*(['\"])(.*?)\3,\s*(['\"])(.*?)\5\)" - matches = re.findall(regex, code) - if matches: - for match in matches: - param1, param2, param3 = match[1], match[3], match[5] - print("参数1:", param1) - print("参数2:", param2) - print("参数3:", param3) - self.read_session = param2 - - else: - print("没有匹配到调用") - domain = urlparse(result).netloc - self.domainnum = domain.split('.')[0].replace('https://','') - - self.readh = { - "Host": "api.yd.dgtech.top", - "content-length": "2", - "sec-ch-ua": "Not/A)Brand;v=8, Chromium;v=126, Android", - "sec-ch-ua-mobile": "?1", - "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260117 MMWEBSDK/20240301 MMWEBID/5295 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", - "aid": "dabd8febf0c64c31b79c4785034e0de9", - "content-type": "application/json", - "accept": "application/json, text/javascript, */*; q=0.01", - "sessionid": self.read_session, - "sec-ch-ua-platform": "Android", - "origin": f"https://{domain}", - "x-requested-with": "com.tencent.mm", - "sec-fetch-site": "same-site", - "sec-fetch-mode": "cors", - "sec-fetch-dest": "empty", - "referer": f"https://{domain}/", - "accept-encoding": "gzip, deflate, br, zstd", - "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", - "priority": "u=1, i" -} - - return True - - else: - logging.error(f"获取入口失败[{r}]") - return False - def tuisong(self): - # 发送消息到wxpusher - url = f"{self.apiurl}/zdgjc" - data = {"url":self.readurl} - r = requests.post(url,json=data).json() - logging.info(f"遇到检测文章:推送结果[{r}]") - @retry() - def read(self): - - while True: - timestamp = int(time.time()*1000) - #print(timestamp,self.readh['aid'],self.domainnum,self.readh['sessionid']) - #exit() - signstr = str(timestamp) + self.readh['aid'] + self.domainnum + self.readh['sessionid'] - sign = hashlib.md5(signstr.encode()).hexdigest() - data = { - "sign": sign, - "time": timestamp - } - url = f'https://api.yd.dgtech.top/ydrw/article?_t={timestamp}' - r = requests.post(url,json=data,headers=self.readh).json() - if r['success']: - self.readurl = r['data']['url'] - va,acttime = self.get_readtime(self.readurl) - logging.info(f'获取文章链接成功[{self.readurl}]文章发布时间[{acttime}]') - - if 'biz' not in self.readurl or 'chksm' in self.readurl or va: - self.tuisong() - time.sleep(random.uniform(20,25)) - else: - time.sleep(random.uniform(10,15)) - - logging.info(f'阅读成功[{r["msg"]}]') - - else: - logging.error(f'取文章链接失败:{r}') - break - @retry() - def withdraw(self): - url = 'https://api.yd.dgtech.top/twyd/agent/user/getCoinDrawList' - r = requests.post(url,json={},headers=self.h).json() - allmoney = r["data"]["user"]["totalCoin"] / 10000 - lessmoney = r['data']['coinList'][0]['amount'] - uuid = r["data"]["coinList"][0]["uuid"] - logging.info(f'余额:{allmoney}') - if withdraw_auto: - if allmoney >= lessmoney: - url = 'https://api.yd.dgtech.top/twyd/agent/user/userCoinDraw' - data = {"withdrawUuid":uuid} - r = requests.post(url,json=data,headers=self.h).json() - logging.info(f"提现结果[{r}]") - send(code+"提现通知📢📢📢",f"微信账户[{self.bz}]\n余额:{allmoney} 元\n提现结果:{r}") - else: - logging.info('余额不足不提现') - - - def main(self): - try: - self.login() - if self.ruko(): - self.read() - self.withdraw() - except Exception as e: - logging.error(f'程序异常退出:{e}') - - - - - - -if __name__ == '__main__': - - env().main() +# --------------------------------注释区-------------------------------- +# 入口:https://api.yd.dgtech.top/twyd/agent/user/login?aid=dabd8febf0c64c31b79c4785034e0de9&refererUserUuid=dbcc7c9327e64e9f94ac412a03c4debb +# +# 需抓取数据: +# * 填写自动过检的api接口 本地 内网ip:5000 非本地自行进行穿透 +# * 登录多少个账号就跑多少个账号 +# +# +# 变量名:yuanshen_api +withdraw_auto = True #是否自动提现 +# --------------------------------祈求区-------------------------------- +# _ooOoo_ +# o8888888o +# 88" . "88 +# (| -_- |) +# O\ = /O +# ____/`---'\____ +# . ' \\| |// `. +# / \\||| : |||// \ +# / _||||| -:- |||||- \ +# | | \\\ - /// | | +# | \_| ''\---/'' | | +# \ .-\__ `-` ___/-. / +# ___`. .' /--.--\ `. . __ +# ."" '< `.___\_<|>_/___.' >'"". +# | | : `- \`.;`\ _ /`;.`/ - ` : | | +# \ \ `-. \_ __\ /__ _/ .-` / / +# ======`-.____`-.___\_____/___.-`____.-'====== +# `=---=' +# +# ............................................. +# 佛祖保佑 永无BUG +# 佛祖镇楼 BUG辟邪 +# --------------------------------代码区-------------------------------- +from functools import wraps +import requests +import time +import os +import json +import hashlib +import random +import logging +import sys +import string +import re +from base64 import b64encode +import uuid +import base64 +from datetime import datetime,timedelta +from urllib.parse import urlparse, parse_qs,quote +from notify import send + +logging.basicConfig(level=logging.INFO, format='[%(levelname)s] ===> %(message)s') +code = "傻狗阅读_api版" +ver = "1.2" +envname = "yuanshen_api" + +debug = False #debug模式 开启即从脚本内部获取环境变量 +debugcookie = "127.0.0.1:5000" #debug模式cookie + +is_bulletin = False #公告开关 +is_toulu = False #偷撸公告开关 +is_with_sleep = False #是否开启随机延时 +def retry(exceptions =Exception, tries=5, delay=2, backoff=2): + """ + 简单的重试 module,如果重试失败则抛出错误。 + """ + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + # 每次调用时初始化独立的重试计数和延迟时间 + _tries, _delay = tries, delay + while _tries > 1: + try: + return func(*args, **kwargs) + except exceptions as e: + print(f"发生错误:[{e}], Retrying in {_delay} seconds ...") + time.sleep(_delay) + _tries -= 1 + _delay *= backoff + # 最后一次尝试 + return func(*args, **kwargs) + return wrapper + return decorator + + +class env(): + """ + env模块,获取cookie并转成列表,统计时间,提示脚本开始结束,检测一些配置,try except异常处理 + :param args: 传递给env的参数 + :param kwargs: 传递给env的关键字参数 + :return: Null + + Powered by huaji + """ + def __init__(self, *args, **kwargs): + self.cookie = None + self.env_ver = '1.5' #版本号 + self.split_chars = ['@', '&', '\n'] #分隔符 + self.identifiers = ['Powered By Huaji', 'QQ Group:901898186', 'yuanshen'] #标识符 + def check_file(self): + file_path = __file__ + try: + + with open(file_path, 'r', encoding='utf-8') as file: + content = file.read() + + results = {} + + # 批量检查每个标识符 + for identifier in self.identifiers: + if identifier in content: + results[identifier] = True + else: + results[identifier] = False + logging.error(f"文件可能被恶意篡改,请勿修改文件内容") + + all_identifiers_present = all(results.values()) + if not all_identifiers_present: + logging.error(f"文件可能被恶意篡改,请勿修改文件内容") + self.force_exit() + + except Exception as e: + print(f"读取文件时发生错误: {e}") + self.force_exit() + + def split_cookies(self): + """根据多个分隔符分割cookie""" + for sep in self.split_chars: + if sep in self.cookie: + return self.cookie.split(sep) + return [self.cookie] + + def scmain(self): + if 'https://' not in self.cookie and 'http://' not in self.cookie: + apiurl = 'http://' + self.cookies[0] + r = requests.get(apiurl + '/getallwx').json() + for i, cookie in enumerate(r, 1): + print(f"--------开始第{i}个账号--------") + main = yuanshen(cookie,apiurl) + main.main() + print(f"--------第{i}个账号执行完毕--------") + + + + def force_exit(self,code=0): + exit() + print("Warning: 篡改你妈") + os._exit(code) # 强制退出程序 + sys.exit(code) # 正常退出 + import ctypes + while True: + ctypes.string_at(114514) + ctypes.string_at(1919810) + ctypes.string_at(666666) + print("Warning: 篡改你妈") + + + def run(self): + if not os.getenv(envname) and not debug: + logging.warning(f"请先设置环境变量[{envname}]") + self.force_exit() + + self.cookie = os.getenv(envname, "") + + if debug: + self.cookie = debugcookie + if is_bulletin: + try: + print(requests.get("https://gitee.com/HuaJiB/yuanshen34/raw/master/pubilc.txt").text, "\n\n\n") + except: + logging.error("网络异常,链接公告服务器失败(gitee),请检查网络") + self.force_exit() + if is_toulu: + try: + txt = ''' +此为滑稽的偷撸本本 如你不在滑稽的小群却意外通过某种渠道获得了该脚本 +请联系QQ3487934983 提供证据后 你将代替泄露人员获得该群位置 +======================================================= + ''' + print(txt*5) + except: + self.force_exit() + if is_with_sleep: + random_time = random.randint(10,60) + logging.info(f"随机延时[{random_time}]秒") + time.sleep(random_time) + + self.cookies = self.split_cookies() + account_count = len(self.cookies) + logging.info(f"一共获取到{account_count}个账号") + print(f"=========🔔开始执行[{code}][{ver}]=========\n") + + + start_time = time.time() + if debug: + self.scmain() + else: + try: + self.scmain() + except Exception as e: + logging.error(f"脚本执行出错: {e}") + end_time = time.time() + + execution_time = end_time - start_time + + print(f"\n============🔔脚本[{code}]执行结束============") + print(f"本次脚本总运行时间: [{execution_time:.2f}] 秒") + self.force_exit() + + def main(self): + self.check_file() + self.run() + + def random_str(self,charset="all", length=8, to_upper=False,to_lower=False): + if charset == "all": #包含大小写字母和数字 + chars = string.ascii_letters + string.digits + elif charset == "letters": #大小写字母 + chars = string.ascii_letters + elif charset == "digits": + chars = string.digits + elif charset == "lowercase": #小写字母 + chars = string.ascii_lowercase + elif charset == "uuid": + return str(uuid.uuid4()) + elif charset == "uuid_str": + return str(uuid.uuid4()).replace("-", "") + elif charset != '' and charset is not None: + chars = charset + + + random_string = ''.join(random.choice(chars) for _ in range(length)) + + if to_upper: + return random_string.upper() + elif to_lower: + return random_string.lower() + else: + return random_string + + def aes_encrypt(self,data): + from Crypto.Cipher import AES + from Crypto.Util.Padding import pad, unpad + from binascii import hexlify, unhexlify + key = self.key.encode('utf-8') + iv = self.iv.encode('utf-8') + cipher = AES.new(key, AES.MODE_CBC, iv) + padded_plaintext = pad(data.encode('utf-8'), AES.block_size) + ciphertext = cipher.encrypt(padded_plaintext) + encrypted_base64 = b64encode(ciphertext).decode('utf-8') + + return encrypted_base64 + +class yuanshen: + def __init__(self,cookie,apiurl) -> None: + self.apiurl = apiurl + self.Wxid = cookie['Wxid'] + self.bz = cookie['wxname'] + logging.info(f'[{self.bz}]开始运行') + + def get_readtime(self,url): + h = { + 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'accept-language': 'zh-CN,zh;q=0.9', + 'cache-control': 'no-cache', + # 'cookie': 'RK=x93V1EQnnk; ptcz=70105284a73b47db6aa5f48a05337a8cd84e98de7bd26d75975059126646db21; pac_uid=0_ZkHRNfy6PMhrH; ua_id=SyF8Nc7qjhUZ6RH8AAAAAHO013VXlTF21GY7ajzLLgs=; _clck=19reoir|1|fpg|0; wxuin=27186344812218; eas_sid=x1Y7v2y759E6j1a811G6q158d0; qq_domain_video_guid_verify=08d525e64ffa56c3; _qimei_uuid42=18a1b130e12100363fb639c628b466967c0e1ac0aa; pgv_pvid=6915337851; _qimei_fingerprint=3c42962857167cc55475bb65b2331f0b; _qimei_h38=fded42463fb639c628b4669602000006018a1b; o_cookie=3487934983; _qimei_q32=ec50b72a0f5a646accacf4393f1271f2; _qimei_q36=9e46147a2ab8bee5904ab74e30001741890c; rewardsn=; wxtokenkey=777', + 'pragma': 'no-cache', + 'priority': 'u=0, i', + 'sec-ch-ua': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"', + 'sec-fetch-dest': 'document', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-site': 'none', + 'sec-fetch-user': '?1', + 'upgrade-insecure-requests': '1', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36', +} + r = requests.get(url,headers=h).text + match = re.search(r"var createTime = '(.+?)';", r) + if match: + date_string = (match.group(1)) + + date = datetime.strptime(date_string, "%Y-%m-%d %H:%M") + half_year_ago = datetime.now() - timedelta(days=30) + if date > half_year_ago: + return False,date_string + else: + return True,date_string + @retry() + def login(self): + h = { + "Host": "api.yd.dgtech.top", + "sec-ch-ua": "Not/A)Brand;v=8, Chromium;v=126, Android", + "sec-ch-ua-mobile": "?1", + "sec-ch-ua-platform": "Android", + "upgrade-insecure-requests": "1", + "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260117 MMWEBSDK/20240301 MMWEBID/5295 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", + "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", + "sec-fetch-site": "none", + "sec-fetch-mode": "navigate", + "sec-fetch-user": "?1", + "sec-fetch-dest": "document", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + "priority": "u=0, i"} + r = requests.get('https://api.yd.dgtech.top/twyd/agent/user/login?aid=dabd8febf0c64c31b79c4785034e0de9&refererUserUuid=dbcc7c9327e64e9f94ac412a03c4debb',allow_redirects=False,headers=h) + loginurl = r.headers['Location'] + data = {'Wxid':self.Wxid,'url':loginurl} + url = requests.post(self.apiurl+'/loginbyweb',json=data).json()['url'] + r = requests.get(url,headers=h,allow_redirects=False) + j = parse_qs(urlparse(r.headers['Location']).query) + domain = urlparse(r.headers['Location']).netloc + self.ck = j['sessionId'][0] + logging.info(f'登录成功[{self.ck}]') + self.h = { + "content-length": "2", + "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Android WebView\";v=\"126\"", + "sec-ch-ua-mobile": "?1", + "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", + "aid": "dabd8febf0c64c31b79c4785034e0de9", + "content-type": "application/json", + "accept": "application/json, text/javascript, */*; q=0.01", + "sessionid": self.ck, + "sec-ch-ua-platform": "\"Android\"", + "origin": f"https://{domain}", + "x-requested-with": "com.tencent.mm", + "sec-fetch-site": "cross-site", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": f"https://{domain}/", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + "priority": "u=1, i" +} + @retry() + def ruko(self): + url = 'https://api.yd.dgtech.top/mpreader/gotoRead' + r = requests.post(url,json={},headers=self.h).json() + if r['msg'] == 'OK': + h = { + "sec-ch-ua": "\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Android WebView\";v=\"126\"", + "sec-ch-ua-mobile": "?1", + "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", + "sec-ch-ua-platform": "\"Android\"", + "accept": "image/wxpic,image/tpg,image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", + "x-requested-with": "com.tencent.mm", + "sec-fetch-site": "cross-site", + "sec-fetch-mode": "no-cors", + "sec-fetch-dest": "image", + "referer": "https://b1b08f658d.zncyxt.cn/", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + "priority": "u=1, i" +} + imgurl = r['data']['url'] + r = requests.get(imgurl,headers=h,timeout=10) + image_base64 = base64.b64encode(r.content).decode('utf-8') + data = {"image":image_base64} + r = requests.post("https://python.huaji.asia/decode_qr", json=data).json() + result = r['data'] + logging.info(f'请求解码成功[{result}]') + h = { + 'User-Agent': 'Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260183 MMWEBSDK/20240301 MMWEBID/98 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64', + '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', + # 'Accept-Encoding': 'gzip, deflate, br, zstd', + 'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Android WebView";v="126"', + 'sec-ch-ua-mobile': '?1', + 'sec-ch-ua-platform': '"Android"', + 'upgrade-insecure-requests': '1', + 'x-requested-with': 'com.tencent.mm', + 'sec-fetch-site': 'none', + 'sec-fetch-mode': 'navigate', + 'sec-fetch-user': '?1', + 'sec-fetch-dest': 'document', + 'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', + 'priority': 'u=0, i', + # 'Cookie': 'token=nf9amey318ukp0bdij5gwoct7sz4v6l2', +} + r = requests.get(result,headers=h,timeout=10) + if r.status_code == 200: + matches = re.findall(r'.*?', r.text, re.DOTALL) + code = (matches[2].replace('','').replace('\n','').replace('\t','')) + # with open('code.js','w') as f: + # f.write(code) + decodeurl = 'https://decode.huaji.asia/decode' + data = {"code": code,"plugins": ["obfuscator"]} + r = requests.post(decodeurl,json=data).json() + if r['success']: + logging.info('参数被加密 进行解密操作') + code = r["decodedCode"] + regex = r"a\((['\"])(.*?)\1,\s*(['\"])(.*?)\3,\s*(['\"])(.*?)\5\)" + matches = re.findall(regex, code) + if matches: + for match in matches: + param1, param2, param3 = match[1], match[3], match[5] + print("参数1:", param1) + print("参数2:", param2) + print("参数3:", param3) + self.read_session = param2 + + else: + print("没有匹配到调用") + domain = urlparse(result).netloc + self.domainnum = domain.split('.')[0].replace('https://','') + + self.readh = { + "Host": "api.yd.dgtech.top", + "content-length": "2", + "sec-ch-ua": "Not/A)Brand;v=8, Chromium;v=126, Android", + "sec-ch-ua-mobile": "?1", + "user-agent": "Mozilla/5.0 (Linux; Android 14; 23113RKC6C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/126.0.6478.188 Mobile Safari/537.36 XWEB/1260117 MMWEBSDK/20240301 MMWEBID/5295 MicroMessenger/8.0.48.2580(0x28003035) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64", + "aid": "dabd8febf0c64c31b79c4785034e0de9", + "content-type": "application/json", + "accept": "application/json, text/javascript, */*; q=0.01", + "sessionid": self.read_session, + "sec-ch-ua-platform": "Android", + "origin": f"https://{domain}", + "x-requested-with": "com.tencent.mm", + "sec-fetch-site": "same-site", + "sec-fetch-mode": "cors", + "sec-fetch-dest": "empty", + "referer": f"https://{domain}/", + "accept-encoding": "gzip, deflate, br, zstd", + "accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", + "priority": "u=1, i" +} + + return True + + else: + logging.error(f"获取入口失败[{r}]") + return False + def tuisong(self): + # 发送消息到wxpusher + url = f"{self.apiurl}/zdgjc" + data = {"url":self.readurl} + r = requests.post(url,json=data).json() + logging.info(f"遇到检测文章:推送结果[{r}]") + @retry() + def read(self): + + while True: + timestamp = int(time.time()*1000) + #print(timestamp,self.readh['aid'],self.domainnum,self.readh['sessionid']) + #exit() + signstr = str(timestamp) + self.readh['aid'] + self.domainnum + self.readh['sessionid'] + sign = hashlib.md5(signstr.encode()).hexdigest() + data = { + "sign": sign, + "time": timestamp + } + url = f'https://api.yd.dgtech.top/ydrw/article?_t={timestamp}' + r = requests.post(url,json=data,headers=self.readh).json() + if r['success']: + self.readurl = r['data']['url'] + va,acttime = self.get_readtime(self.readurl) + logging.info(f'获取文章链接成功[{self.readurl}]文章发布时间[{acttime}]') + + if 'biz' not in self.readurl or 'chksm' in self.readurl or va: + self.tuisong() + time.sleep(random.uniform(20,25)) + else: + time.sleep(random.uniform(10,15)) + + logging.info(f'阅读成功[{r["msg"]}]') + + else: + logging.error(f'取文章链接失败:{r}') + break + @retry() + def withdraw(self): + url = 'https://api.yd.dgtech.top/twyd/agent/user/getCoinDrawList' + r = requests.post(url,json={},headers=self.h).json() + allmoney = r["data"]["user"]["totalCoin"] / 10000 + lessmoney = r['data']['coinList'][0]['amount'] + uuid = r["data"]["coinList"][0]["uuid"] + logging.info(f'余额:{allmoney}') + if withdraw_auto: + if allmoney >= lessmoney: + url = 'https://api.yd.dgtech.top/twyd/agent/user/userCoinDraw' + data = {"withdrawUuid":uuid} + r = requests.post(url,json=data,headers=self.h).json() + logging.info(f"提现结果[{r}]") + send(code+"提现通知📢📢📢",f"微信账户[{self.bz}]\n余额:{allmoney} 元\n提现结果:{r}") + else: + logging.info('余额不足不提现') + + + def main(self): + try: + self.login() + if self.ruko(): + self.read() + self.withdraw() + except Exception as e: + logging.error(f'程序异常退出:{e}') + + + + + + +if __name__ == '__main__': + + env().main()