yydspure/magic.py

192 lines
6.4 KiB
Python

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()