192 lines
6.4 KiB
Python
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()
|