This commit is contained in:
Faker 2024-03-02 17:36:15 +08:00
parent a28ce66fc9
commit d986684f35
4 changed files with 0 additions and 935 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,449 +0,0 @@
{
"api_id": 3741859,
"api_hash": "f81a30b542215b3d578",
"bot_id": 1657667,
"bot_token": "1657544667:AAGO7sit_k_0u_C1w7U",
"user_id": 9513088,
"proxy": true,
"proxy_type": "socks5",
"proxy_addr": "127.0.0.1",
"proxy_port": 7890,
"proxy_username": "",
"proxy_password": "",
"proxy_secret": "如果proxy_type是MTProxy,则该值必填",
"log_path": "/ql/log",
"log_send": true,
"log_send_id 你日志要发给谁就填谁id": 1,
"log_send_id": -1657544,
"monitor_cache_size": 100,
"monitor_cars 是你要监控的对象需要填上自己bot的id和线报频道或群组id": 1,
"monitor_cars": [
-1001718319262,
-1001718319261
],
"monitor_auto_stops": [
"jd_AutoOpenCard"
],
"monitor_black_keywords 黑名单关键词基于正则表达式实现": 1,
"monitor_black_keywords": [
"(ShopToken)"
],
"monitor_converters_whitelist_keywords 不转换关键词基于正则表达式实现": 1,
"monitor_converters_whitelist_keywords": [
"(M_WX_)"
],
"monitor_converters 转换关键词基于正则表达式实现": 1,
"monitor_converters": {
"((?=.*jd_task_lzzd_custom)(?=.*https)^.*$)": {
"env": "export M_WX_TEAM_URL=\"%s\""
},
"(jd_lzkj_activityId|jd_task_lzzd_custom)": {
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
},
"((?=.*jd_task_cjzd_custom)(?=.*https)^.*$)": {
"env": "export M_WX_TEAM_URL=\"%s\""
},
"(jd_task_cjzd_custom|jd_cjhy_activityId)": {
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
},
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*cjhy)(.|\\n)(?=(.|\\n)*积分)(.|\\n)*$": {
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
},
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*lzkj)(.|\\n)(?=(.|\\n)*积分)(.|\\n)*$": {
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
},
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*cjhy)(.|\\n)*$": {
"env": "export M_WX_TEAM_URL=\"https://cjhydz-isv.isvjcloud.com/wxTeam/activity?activityId=%s\""
},
"^(?=(.|\\n)*jd_zdjr_activityId)(?=(.|\\n)*lzkj)(.|\\n)*$": {
"env": "export M_WX_TEAM_URL=\"https://lzkjdz-isv.isvjcloud.com/wxTeam/activity2/875406?activityId=%s\""
},
"(jd_zpcj|(?=.*jd_task_zp_custom)(?=.*https)^.*$)": {
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
},
"((?=.*jd_task_jg_custom)(?=.*https)^.*$)": {
"env": "export M_WX_ADD_CART_URL=\"%s\""
},
"((?=.*jd_task_gz_custom)(?=.*https)^.*$)": {
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
}
},
"monitor_scripts": {
"M_WX_TEAM_URL": {
"name": "M组队瓜分京豆",
"task 就是你面板上的那个任务,想怎么写就怎么写 或者 你手动怎么执行就怎么写": 1,
"task": "task /ql/scripts/m_jd_wx_team.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_TEAM_URL",
"enable": true
},
"M_WX_TEAM_JF_URL": {
"name": "M组队瓜分积分",
"task": "task /ql/scripts/m_jd_wx_team.js now",
"wait": 0,
"queue": true,
"queue_name": "M_WX_TEAM_JF_URL",
"enable": true
},
"M_WX_LEVEL_BIRTH_URL": {
"name": "M等级生日礼包",
"task": "task /ql/scripts/m_jd_wx_levelBirth.js now",
"wait": 5,
"queue": true,
"queue_name": "M_WX_LEVEL_BIRTH_URL",
"enable": true
},
"M_JOY_INVITE_URL": {
"name": "M邀请有礼JOY",
"task": "task /ql/scripts/m_jd_joy_invite.js now",
"wait": 0,
"queue": false,
"queue_name": "M_JOY_INVITE_URL",
"enable": true
},
"M_WX_KNOWLEDGE_URL": {
"name": "知识超人",
"task": "task /ql/scripts/m_jd_wx_knowledge.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_KNOWLEDGE_URL",
"enable": true
},
"M_LOREAL_INVITE_URL": {
"name": "M邀请有礼LOREAL",
"task": "task /ql/scripts/m_jd_loreal_invite.js now",
"wait": 0,
"queue": false,
"queue_name": "M_LOREAL_INVITE_URL",
"enable": true
},
"M_WX_ADD_CART_URL": {
"name": "M加购有礼",
"task": "task /ql/scripts/m_jd_wx_addCart.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_ADD_CART_URL",
"enable": true
},
"M_GYG_SHOP_ARGV": {
"name": "M店铺刮奖",
"task": "task /ql/scripts/m_jd_shop_gyg.js now",
"wait": 0,
"queue": false,
"queue_name": "M_GYG_SHOP_ARGV",
"enable": true
},
"M_SHOP_POINT_EXCHANGE_ARGV": {
"name": "M店铺积分兑换",
"task": "task /ql/scripts/m_jd_shop_pointExchange.js now",
"wait": 0,
"queue": true,
"queue_name": "M_SHOP_POINT_EXCHANGE_ARGV",
"enable": true
},
"M_WX_LUCK_DRAW_URL": {
"name": "M幸运抽奖",
"task": "task /ql/scripts/m_jd_wx_luckDraw.js now",
"wait": 10,
"queue": true,
"queue_name": "M_WX_LUCK_DRAW_URL",
"enable": true
},
"M_WX_COMPLETE_DRAW_URL": {
"name": "M完善有礼",
"task": "task /ql/scripts/m_jd_wx_completeDraw.js now",
"wait": 30,
"queue": true,
"queue_name": "M_WX_COMPLETE_DRAW_URL",
"enable": true
},
"M_WX_CENTER_DRAW_URL": {
"name": "M老虎机抽奖",
"task": "task /ql/scripts/m_jd_wx_centerDraw.js now",
"wait": 30,
"queue": true,
"queue_name": "M_WX_CENTER_DRAW_URL",
"enable": true
},
"M_WX_GAME_URL": {
"name": "M无线游戏",
"task": "task /ql/scripts/m_jd_wx_game.js now",
"wait": 0,
"queue": true,
"queue_name": "M_WX_GAME_URL",
"enable": true
},
"M_WX_SHOP_GIFT_URL": {
"name": "M关注有礼无线",
"task": "task /ql/scripts/m_jd_wx_shopGift.js now",
"wait": 30,
"queue": true,
"queue_name": "M_WX_SHOP_GIFT_URL",
"enable": true
},
"M_WX_UNPACK_DRAW_URL": {
"name": "M分享福袋",
"task": "task /ql/scripts/m_jd_wx_unPackDraw.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_UNPACK_DRAW_URL",
"enable": true
},
"M_WX_DAILY_GIFT_URL": {
"name": "M每日领奖",
"task": "task /ql/scripts/m_jd_wx_dailyGift.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_DAILY_GIFT_URL",
"enable": true
},
"M_WX_SHOP_SIGN_URL": {
"name": "M签到有礼",
"task": "task /ql/scripts/m_jd_wx_shopSign.js now",
"wait": 10,
"queue": true,
"queue_name": "M_WX_SHOP_SIGN_URL",
"enable": true
},
"M_WX_POINT_DRAW_URL": {
"name": "M积分兑换",
"task": "task /ql/scripts/m_jd_wx_pointDraw.js now",
"wait": 0,
"queue": true,
"queue_name": "M_WX_POINT_DRAW_URL",
"enable": true
},
"M_WX_BUILD_DRAW_URL": {
"name": "M盖楼领奖",
"task": "task /ql/scripts/m_jd_wx_buildDraw.js now",
"wait": 30,
"queue": true,
"queue_name": "DEFAULT_WX_QUEUE",
"enable": true
},
"M_WX_CARTKOI_URL": {
"name": "M购物车锦鲤",
"task": "task /ql/scripts/m_jd_wx_cartKoi.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_CARTKOI_URL",
"enable": true
},
"M_WX_SECOND_DRAW_URL": {
"name": "M读秒手速",
"task": "task /ql/scripts/m_jd_wx_secondDraw.js now",
"wait": 10,
"queue": true,
"queue_name": "DEFAULT_WX_QUEUE",
"enable": true
},
"M_WX_FANS_DRAW_URL": {
"name": "M粉丝互动",
"task": "task /ql/scripts/m_jd_wx_fansDraw.js now",
"wait": 30,
"queue": true,
"queue_name": "DEFAULT_WX_QUEUE",
"enable": true
},
"M_FAV_SHOP_ARGV": {
"name": "M收藏有礼",
"task": "task /ql/scripts/m_jd_fav_shop_gift.js now",
"wait": 0,
"queue": false,
"queue_name": "M_FAV_SHOP_ARGV",
"enable": true
},
"M_WX_FOLLOW_DRAW_URL": {
"name": "M关注抽奖",
"task": "task /ql/scripts/m_jd_wx_followDraw.js now",
"wait": 10,
"queue": true,
"queue_name": "M_WX_FOLLOW_DRAW_URL",
"enable": true
},
"M_FOLLOW_SHOP_ARGV": {
"name": "M关注有礼",
"task": "task /ql/scripts/m_jd_follow_shop.js now",
"wait": 0,
"queue": false,
"queue_name": "M_FOLLOW_SHOP_ARGV",
"enable": true
},
"M_OPEN_CARD_ARGV": {
"name": "M入会有礼",
"task": "task /ql/scripts/m_jd_open_card.js now",
"wait": 0,
"queue": true,
"queue_name": "M_OPEN_CARD_ARGV",
"enable": true
},
"M_OPEN_CARD_FORCE_ARGV": {
"name": "M强制入会",
"task": "task /ql/scripts/m_jd_open_card_force.js now",
"wait": 0,
"queue": true,
"queue_name": "M_OPEN_CARD_FORCE_ARGV",
"enable": true
},
"M_WX_SHARE_URL": {
"name": "M分享有礼",
"task": "task /ql/scripts/m_jd_wx_share.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_SHARE_URL",
"enable": true
},
"M_WX_DADOUDOU_URL": {
"name": "M打豆豆",
"task": "task /ql/scripts/m_jd_wx_dadoudou.js now",
"wait": 0,
"queue": false,
"queue_name": "M_WX_DADOUDOU_URL",
"enable": true
}
},
"rules": {
"/wxTeam/": {
"name": "M组队瓜分",
"env": "export jd_zdjr_activityId=\"%s\"\nexport jd_zdjr_activityUrl=\"%s\"\nexport jd_zdjr_type=\"%s\""
},
"/wxFansInterActionActivity/": {
"name": "M粉丝互动",
"env": "export M_WX_FANS_DRAW_URL=\"%s\""
},
"/wxMcLevelAndBirthGifts/": {
"name": "M等级生日礼包",
"env": "export M_WX_LEVEL_BIRTH_URL=\"%s\""
},
"(/wxCollectionActivity/|^(?=.*lorealjdcampaign)(?=.*activityType=10024).*$)": {
"name": "M加购有礼",
"env": "export M_WX_ADD_CART_URL=\"%s\""
},
"(^(?=.*lorealjdcampaign)(?=.*activityType=10024).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10024).*$)": {
"name": "M加购有礼",
"env": "export M_WX_ADD_CART_URL=\"%s\""
},
"(^(?=.*dVF7gQUVKyUcuSsVhuya5d2XD4F)(?=.*code).*$)": {
"name": "M邀请有礼JOY",
"env": "export invite_code=\"%s\""
},
"(wxCollectCard)": {
"name": "M集卡有礼",
"env": "export M_WX_COLLECT_CARD_URL=\"%s\""
},
"(/wxKnowledgeActivity/)": {
"name": "知识超人",
"env": "export M_WX_KNOWLEDGE_URL=\"%s\""
},
"/microDz/": {
"name": "微定制开卡",
"env": "#微定制\nexport WDZactivityId=\"%s\""
},
"^(?=.*lorealjdcampaign)(?=.*activityType=10006).*$": {
"name": "M邀请有礼LOREAL",
"env": "export M_LOREAL_INVITE_URL=\"%s\""
},
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10006).*$": {
"name": "M邀请有礼INTERACT",
"env": "export M_INTERACT_INVITE_URL=\"%s\""
},
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10070).*$": {
"name": "M邀请有礼INTERACT",
"env": "export M_INTERACT_INVITE_URL=\"%s\""
},
"(/lzclient/|/wxDrawActivity/|^(?=.*gzsl-isv)(?=.*game).*$)": {
"name": "M幸运抽奖",
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
},
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10020).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10021).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10026).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10031).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10063).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10080).*$)": {
"name": "M幸运抽奖",
"env": "export M_WX_LUCK_DRAW_URL=\"%s\""
},
"/completeInfoActivity/": {
"name": "M完善有礼",
"env": "export M_WX_COMPLETE_DRAW_URL=\"%s\""
},
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10049).*$": {
"name": "M完善有礼",
"env": "export M_WX_COMPLETE_DRAW_URL=\"%s\""
},
"/drawCenter/": {
"name": "M老虎机抽奖",
"env": "export M_WX_CENTER_DRAW_URL=\"%s\""
},
"/wxGameActivity/": {
"name": "M无线游戏",
"env": "export M_WX_GAME_URL=\"%s\""
},
"(/wxShopGift/|shopGiftBag.html|newShopGiftBag.html)": {
"name": "M关注特效",
"env": "export M_WX_SHOP_GIFT_URL=\"%s\""
},
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10058).*$": {
"name": "M无线关注",
"env": "export M_WX_SHOP_GIFT_URL=\"%s\""
},
"(/wxUnPackingActivity/)": {
"name": "M分享福袋",
"env": "export M_WX_UNPACK_DRAW_URL=\"%s\""
},
"/daily/": {
"name": "M每日领奖",
"env": "export M_WX_DAILY_GIFT_URL=\"%s\""
},
"/signActivity?": {
"name": "M签到有礼",
"env": "export M_WX_SHOP_SIGN_URL=\"%s\""
},
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10023).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10040).*$)": {
"name": "M签到有礼",
"env": "export M_WX_SHOP_SIGN_URL=\"%s\""
},
"(/wxPointShopView/point)": {
"name": "M积分兑换",
"env": "export M_WX_POINT_DRAW_URL=\"%s\""
},
"/wxBuildActivity/": {
"name": "M盖楼领奖",
"env": "export M_WX_BUILD_DRAW_URL=\"%s\""
},
"/wxCartKoi/": {
"name": "M购物车锦鲤",
"env": "export M_WX_CARTKOI_URL=\"%s\""
},
"^(?=.*prod/cc/interactsaas)(?=.*activityType=10036).*$": {
"name": "M购物车锦鲤",
"env": "export M_WX_CARTKOI_URL=\"%s\""
},
"(/fansactiveall/|/videofangrowth/|/fansactivecopy/)": {
"name": "M粉丝红包",
"env": "export M_FANS_RED_PACKET_URL=\"%s\""
},
"(/wxSecond/)": {
"name": "M读秒手速",
"env": "export M_WX_SECOND_DRAW_URL=\"%s\""
},
"(/wxShopFollowActivity/)": {
"name": "M关注抽奖",
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
},
"(^(?=.*prod/cc/interactsaas)(?=.*activityType=10053).*$|^(?=.*prod/cc/interactsaas)(?=.*activityType=10069).*$)": {
"name": "M无线关注",
"env": "export M_WX_FOLLOW_DRAW_URL=\"%s\""
},
"/wxCollectCard/": {
"name": "M集卡有礼",
"env": "export M_WX_COLLECT_CARD_URL=\"%s\""
},
"/wxShareActivity/": {
"name": "M分享有礼",
"env": "export M_WX_SHARE_URL=\"%s\""
},
"/wxgame/activity/": {
"name": "M打豆豆",
"env": "export M_WX_DADOUDOU_URL=\"%s\""
}
}
}

426
magic.py
View File

@ -1,426 +0,0 @@
import asyncio
import datetime
import json
import logging
import os
import re
import time
from urllib import parse
from cacheout import FIFOCache
from telethon import TelegramClient, events
# 0. 进入容器
# 1. pip3 install -U cacheout
# 2. 复制magic.py,magic.json到/ql/config/目录 并配置
# 3. python3 /ql/config/magic.py 用手机号登录
# 4. 给bot发送在吗 有反应即可
# 5. pm2 start /ql/config/magic.py -x --interpreter python3
# 6. 挂起bot到后台 查看状态 pm2 l
# 7. 如果修改了magic.json,执行pm2 restart magic 即可重启
# pm2 start /jd/config/magic.py -x --interpreter python3
logging.basicConfig(format='[%(levelname) 5s/%(asctime)s] %(name)s: %(message)s', level=logging.INFO)
# 创建
logger = logging.getLogger("magic")
logger.setLevel(logging.INFO)
_ConfigCar = ""
_ConfigSh = ""
if os.path.exists("/jd/config/magic.json"):
_ConfigCar = "/jd/config/magic.json"
_ConfigSh = "/jd/config/config.sh"
elif os.path.exists("/ql/config/magic.json"):
_ConfigCar = "/ql/config/magic.json"
_ConfigSh = "/ql/config/config.sh"
elif os.path.exists("/ql/data/config/magic.json"):
_ConfigCar = "/ql/data/config/magic.json"
_ConfigSh = "/ql/data/config/config.sh"
else:
logger.info("未找到magic.json config.sh")
with open(_ConfigCar, 'r', encoding='utf-8') as f:
magic_json = f.read()
properties = json.loads(magic_json)
# 缓存
cache = FIFOCache(maxsize=properties.get("monitor_cache_size"), ttl=0, timer=time.time)
# Telegram相关
api_id = properties.get("api_id")
api_hash = properties.get("api_hash")
bot_id = properties.get("bot_id")
bot_token = properties.get("bot_token")
user_id = properties.get("user_id")
# 监控相关
log_path = properties.get("log_path")
log_send = properties.get("log_send", True)
log_send_id = properties.get("log_send_id")
monitor_cars = properties.get("monitor_cars")
logger.info(f"监控的频道或群组-->{monitor_cars}")
monitor_converters = properties.get("monitor_converters")
logger.info(f"监控转换器-->{monitor_converters}")
monitor_converters_whitelist_keywords = properties.get("monitor_converters_whitelist_keywords")
logger.info(f"不转换白名单关键字-->{monitor_converters_whitelist_keywords}")
monitor_black_keywords = properties.get("monitor_black_keywords")
logger.info(f"黑名单关键字-->{monitor_black_keywords}")
monitor_scripts = properties.get("monitor_scripts")
monitor_auto_stops = properties.get("monitor_auto_stops")
logger.info(f"监控的自动停车-->{monitor_auto_stops}")
rules = properties.get("rules")
logger.info(f"监控的自动解析-->{monitor_auto_stops}")
if properties.get("proxy"):
if properties.get("proxy_type") == "MTProxy":
proxy = {
'addr': properties.get("proxy_addr"),
'port': properties.get("proxy_port"),
'proxy_secret': properties.get('proxy_secret', "")
}
else:
proxy = {
'proxy_type': properties.get("proxy_type"),
'addr': properties.get("proxy_addr"),
'port': properties.get("proxy_port"),
'username': properties.get('proxy_username', ""),
'password': properties.get('proxy_password', "")
}
client = TelegramClient("magic", api_id, api_hash, proxy=proxy, auto_reconnect=True, retry_delay=1, connection_retries=99999).start()
else:
client = TelegramClient("magic", api_id, api_hash, auto_reconnect=True, retry_delay=1, connection_retries=99999).start()
def rest_of_day():
"""
:return: 截止到目前当日剩余时间
"""
today = datetime.datetime.strptime(str(datetime.date.today()), "%Y-%m-%d")
tomorrow = today + datetime.timedelta(days=1)
nowTime = datetime.datetime.now()
return (tomorrow - nowTime).seconds - 90 # 获取秒
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))
async def export(text):
messages = text.split("\n")
change = ""
key = ""
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"【替换】环境变量成功\nexport {kv}"
await client.send_message(bot_id, change)
else:
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')
change += f"【新增】环境变量成功\nexport {kv}"
await client.send_message(bot_id, change)
rwcon(configs)
if len(change) == 0:
await client.send_message(bot_id, f'【取消】{key}环境变量无需改动')
# 设置变量
@client.on(events.NewMessage(chats=monitor_cars, pattern='^没水了$'))
async def handler(event):
for auto_stop_file in monitor_auto_stops:
os.popen(f"ps -ef | grep {auto_stop_file}" + " | grep -v grep | awk '{print $1}' | xargs kill -9")
await client.send_message(bot_id, f'没水停车')
# 设置变量
@client.on(events.NewMessage(chats=[bot_id], pattern='^在吗$'))
async def handler(event):
await client.send_message(bot_id, f'老板啥事?')
# 提取多行转换
async def converter_lines(text):
before_eps = text.split("\n")
after_eps = [elem for elem in before_eps if elem.startswith("export")]
return await converter_handler("\n".join(after_eps))
# 设置变量
@client.on(events.NewMessage(from_users=[user_id], pattern='^(run|Run)$'))
async def handler(event):
try:
reply = await event.get_reply_message()
if event.is_reply is False:
return
if "export" in reply.text:
# 提取变量
text = await converter_lines(reply.text)
text = re.findall(r'(export.*)', text)[0]
await export(text)
kv = text.replace("export ", "")
logger.info(kv)
key = kv.split("=")[0]
action = monitor_scripts.get(key)
command = action.get("task", "")
await cmd(command)
else:
# 提取变量
activity_id, url = await get_activity_info(reply.text)
if activity_id is None:
logger.info(f"未找到id [%s],退出", url)
return
is_break = False
for rule_key in rules:
if is_break:
break
result = re.search(rule_key, url)
if result is None:
logger.info(f"不匹配%s,下一个", rule_key)
continue
value = rules.get(rule_key)
env = value.get("env")
argv_len = len(re.findall("%s", env))
env_key = re.findall("export (.*)=", env)[0]
if argv_len == 1:
env = env % url
elif argv_len == 2:
env = env % (activity_id, url)
elif argv_len == 3:
domain = re.search('(https?://[^/]+)', url)[0]
env = env % (activity_id, domain, "None")
else:
logger.info("还不支持")
break
await export(env)
action = monitor_scripts.get(env_key)
command = action.get("task", "")
await cmd(command)
break
except Exception as e:
logger.error(e)
# 设置变量
@client.on(events.NewMessage(chats=[bot_id], pattern='^清理缓存$'))
async def handler(event):
b_size = cache.size()
logger.info(f"清理前缓存数量,{b_size}")
cache.clear()
a_size = cache.size()
logger.info(f"清理后缓存数量,{a_size}")
await client.send_message(bot_id, f'清理缓存结束 {b_size}-->{a_size}')
async def get_activity_info(text):
result = re.findall(r'((http|https)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])', text)
if len(result) <= 0:
return None, None
url = re.search('((http|https)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])', text)[0]
params = parse.parse_qs(parse.urlparse(url).query)
ban_rule_list = [
'activityId',
'giftId',
'actId',
'tplId',
'token',
'code',
'a',
'id']
activity_id = ''
for key in ban_rule_list:
activity_id = params.get(key)
logger.info(activity_id)
if activity_id is not None:
activity_id = params.get(key)
activity_id = activity_id[0]
break
return activity_id, url
@client.on(events.NewMessage(chats=monitor_cars, pattern=r'(export\s?\w*=(".*"|\'.*\')|[/ikun])'))
async def handler(event):
origin = event.message.text
text = re.findall(r'https://i.walle.com/api\?data=(.+)?\)', origin)
if len(text) > 0:
text = parse.unquote_plus(text[0])
elif "export" in origin:
text = origin
else:
return
groupname = "mybot"
try:
groupname = f'[{event.chat.title}](https://t.me/c/{event.chat.id}/{event.message.id})'
except Exception:
pass
try:
origin_text = text
logger.info(f"原始数据 {origin_text}")
# 黑名单
for b_key in monitor_black_keywords:
result = re.search(b_key, origin_text)
if result is not None:
await client.send_message(bot_id, f'黑名单 {b_key} {text}')
return
text = await converter_handler(text)
activity_id, url = await get_activity_info(text)
if "mybot" not in groupname:
if activity_id is not None:
if cache.get(activity_id) is not None:
await client.send_message(bot_id, f'{groupname}】跑过 `{activity_id}`')
return
cache.set(activity_id, activity_id, rest_of_day())
else:
if cache.get(text) is not None:
await client.send_message(bot_id, f'{groupname}】跑过 {text}')
return
cache.set(text, text, rest_of_day())
logger.info(f"最终变量 {text}")
kv = text.replace("export ", "")
key = kv.split("=")[0]
action = monitor_scripts.get(key)
logger.info(f'ACTION {action}')
if action is None: # 没有自动车
await client.send_message(bot_id, f'{groupname}】没有自动车 {text}')
return
# 没有匹配的动作 或没开启
if not action.get("enable"):
await client.send_message(bot_id, f'{groupname}】没启用任务 {key}')
return
command = action.get("task", "")
if command == '':
await client.send_message(bot_id, f'{groupname}】没有配置任务 {key}')
return
name = action.get("name")
if action.get("queue"):
await queues[action.get("queue_name")].put({"text": text, "groupname": groupname, "action": action})
await client.send_message(bot_id, f'{groupname}】入队执行 #{name}')
return
await export(text)
await client.send_message(bot_id, f'{groupname}】开始执行 #{name}')
await cmd(command)
except Exception as e:
logger.error(e)
await client.send_message(bot_id, f'{str(e)}')
async def converter_handler(text):
text = "\n".join(list(filter(lambda x: "export " in x, text.replace("`", "").split("\n"))))
for c_w_key in monitor_converters_whitelist_keywords:
result = re.search(c_w_key, text)
if result is not None:
logger.info(f"无需转换 {text}")
return text
logger.info(f"转换前数据 {text}")
try:
tmp_text = text
# 转换
for c_key in monitor_converters:
result = re.search(c_key, text)
if result is None:
logger.info(f"规则不匹配 {c_key},下一个")
continue
rule = monitor_converters.get(c_key)
target = rule.get("env")
argv_len = len(re.findall("%s", target))
values = re.findall(r'"([^"]*)"', text)
if argv_len == 1:
target = target % (values[0])
elif argv_len == 2:
target = target % (values[0], values[1])
elif argv_len == 3:
target = target % (values[0], values[1], values[2])
else:
print("不支持更多参数")
text = target
break
except Exception as e:
logger.info(str(e))
logger.info(f"转换后数据 {text}")
return text
queues = {}
async def task(task_name, task_key):
logger.info(f"队列监听--> {task_name} {task_key} 已启动,等待任务")
curr_queue = queues[task_key]
while True:
try:
param = await curr_queue.get()
logger.info(f"出队执行 {param}")
exec_action = param.get("action")
# 默认立马执行
await client.send_message(bot_id, f'{param.get("groupname")}】出队执行 #{exec_action.get("name")}')
await export(param.get("text"))
await cmd(exec_action.get("task", ""))
if curr_queue.qsize() > 1:
exec_action = param.get("action")
await client.send_message(bot_id, f'{exec_action["name"]},队列长度{curr_queue.qsize()},将等待{exec_action["wait"]}秒...')
await asyncio.sleep(exec_action['wait'])
except Exception as e:
logger.error(e)
async def cmd(exec_cmd):
try:
logger.info(f'执行命令 {exec_cmd}')
name = re.findall(r'(?:.*/)*([^. ]+)\.(?:js|py|sh)', exec_cmd)[0]
tmp_log = f'{log_path}/{name}.{datetime.datetime.now().strftime("%H%M%S%f")}.log'
logger.info(f'日志文件 {tmp_log}')
proc = await asyncio.create_subprocess_shell(
f"{exec_cmd} >> {tmp_log} 2>&1",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE
)
await proc.communicate()
if log_send:
await client.send_file(log_send_id, tmp_log)
os.remove(tmp_log)
except Exception as e:
logger.error(e)
await client.send_message(bot_id, f'something wrong,I\'m sorry\n{str(e)}')
if __name__ == "__main__":
try:
logger.info("开始运行")
for key in monitor_scripts:
action = monitor_scripts[key]
name = action.get('name')
queue = action.get("queue")
queue_name = action.get("queue_name")
if queues.get(queue_name) is not None:
logger.info(f"队列监听--> {name} {queue_name} 已启动,等待任务")
continue
queues[queue_name] = asyncio.Queue()
client.loop.create_task(task(name, queue_name))
client.run_until_disconnected()
except Exception as e:
logger.error(e)
client.disconnect()