import asyncio import datetime import json import os import re import urllib.parse from cacheout import FIFOCache from pyrogram import Client, filters cache = FIFOCache(maxsize=512) platform = "v4" if os.path.exists("/jd/config/magic.json"): with open("/jd/config/magic.json", 'r', encoding='utf-8') as f: BOT = json.load(f) if os.path.exists("/ql/config/magic.json"): platform = "ql" with open("/ql/config/magic.json", 'r', encoding='utf-8') as f: BOT = json.load(f) if os.path.exists("/ql/data/config/magic.json"): platform = "ql2" with open("/ql/data/config/magic.json", 'r', encoding='utf-8') as f: BOT = json.load(f) api_id = int(BOT['api_id']) api_hash = BOT['api_hash'] my_id = int(BOT['user_id']) my_bot_id = int(BOT['bot_token'].split(":")[0]) base_path = BOT['base_path'] if platform == "v4": _ConfigSH = '/jd/config/config.sh' elif platform == 'ql': _ConfigSH = '/ql/config/config.sh' else: _ConfigSH = '/ql/data/config/config.sh' if BOT['proxy']: proxy = { 'hostname': BOT['proxy_add'], # 改成自己的 'port': int(BOT['proxy_port']), 'username': BOT['proxy_username'], 'password': BOT['proxy_password'] } app = Client('magic', api_id, api_hash, proxy=proxy) else: app = Client('magic', api_id, api_hash) # 监控的自动车 car_group_id = int(BOT['car_group_id']) monitor_flag = 'https://i.walle.com/api?data=' # 你的脚本配置 car_config = [ {'name': 'M加购有礼', 'env': 'M_WX_ADD_CART_URL', 'js': 'm_jd_wx_addCart.js', 'cmd': 'now'}, {'name': 'M幸运抽奖', 'env': 'M_WX_LUCK_DRAW_URL', 'js': 'm_jd_wx_luckDraw.js', 'cmd': 'now'}, {'name': 'M集卡抽奖', 'env': 'M_WX_COLLECT_CARD_URL', 'js': 'm_jd_wx_collectCard.js', 'cmd': 'now'}, {'name': 'M关注有礼', 'env': 'M_FOLLOW_SHOP_ARGV', 'js': 'm_jd_follow_shop.js', 'cmd': 'now'} ] @app.on_message(filters.chat(my_bot_id) & filters.regex("在吗")) async def handler(client, message): await message.reply("老板啥事!") @app.on_message(filters.chat(car_group_id) & filters.text) async def handler(client, message): try: if message.entities is None: return text = message.entities[0]['url'] if text is None: return if 'i.walle.com' not in text: return text = urllib.parse.unquote(text.replace(monitor_flag, '')) zd = 1 if 'jd_zdjr_activityId' in text: zd = re.search(f'jd_zdjr_activityId="(.*)"', text)[1] if zd != 1: if cache.get(zd) is not None: await client.send_message(my_bot_id, f'跑过 {text}') return cache.set(zd, zd) else: if cache.get(text) is not None: await client.send_message(my_bot_id, f'跑过 {text}') return cache.set(text, text) name = '' js = '' command = '' for v in car_config: if v['env'] in text: name = v['name'] js = v['js'] command = v['cmd'] break if len(name) == 0: await client.send_message(my_bot_id, f'未知变量`{text}`') return messages = text.split("\n") change = "" for message in messages: if "export " not in message: continue kv = message.replace("export ", "") key = kv.split("=")[0] value = re.findall(r'"([^"]*)"', kv)[0] configs = rwcon("str") if kv in configs: continue if key in configs: configs = re.sub(f'{key}=("|\').*("|\')', kv, configs) change += f"【替换】 `{name}` 环境变量成功\n`{kv}\n`" else: if platform == 'v4': end_line = 0 configs = rwcon("list") for config in configs: if "第五区域" in config and "↑" in config: end_line = configs.index(config) - 1 break configs.insert(end_line, f'export {key}="{value}"\n') else: configs = rwcon("str") configs += f'export {key}="{value}"\n' change += f"【新增】 `{name}` 环境变量成功\n`{kv}\n`" await client.send_message(my_bot_id, change) rwcon(configs) if len(change) == 0: await client.send_message(my_bot_id, f'【取消】{name}环境变量无需改动') return if len(js) > 0: await client.send_message(my_bot_id, f'开始运行 {js}') if platform == 'v4': await cmd(client, f'jtask {base_path}/{js} {command}') else: await cmd(client, f'task {base_path}/{js} {command}') else: await client.send_message(my_bot_id, f'无需执行') except Exception as e: await client.send_message(my_bot_id, f'{str(e)}') async def cmd(client, cmd_text): '''定义执行cmd命令''' try: p = await asyncio.create_subprocess_shell( cmd_text, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) res_bytes, res_err = await p.communicate() res = res_bytes.decode('utf-8') if len(res) > 0: if platform == "v4": base = "/jd" elif platform == "ql": base = "/ql" else: base = "/ql/data" tmp_log = f'{base}/log/bot/{cmd_text.split("/")[-1].split(".js")[0]}-{datetime.datetime.now().strftime("%H-%M-%S.%f")}.log' with open(tmp_log, 'w+', encoding='utf-8') as f: f.write(res) except Exception as e: await client.send_message(my_bot_id, f'日志目录有误,{str(e)}') # 读写config.sh def rwcon(arg): if arg == "str": with open(_ConfigSH, 'r', encoding='utf-8') as f1: configs = f1.read() return configs elif arg == "list": with open(_ConfigSH, 'r', encoding='utf-8') as f1: configs = f1.readlines() return configs elif isinstance(arg, str): with open(_ConfigSH, 'w', encoding='utf-8') as f1: f1.write(arg) elif isinstance(arg, list): with open(_ConfigSH, 'w', encoding='utf-8') as f1: f1.write("".join(arg)) app.run()