feat: 默认节点池重置订阅链接+显示当前链接

This commit is contained in:
mango
2026-02-25 17:36:50 +08:00
parent ba8ffb9a76
commit 1f918cd408

36
bot.py
View File

@@ -15,6 +15,11 @@ SUB_SECRET = os.environ.get('SUB_SECRET', 'changeme')
SUB_HOST = os.environ.get('SUB_HOST', 'substore.mjjtop.com')
WAITING_ADD = set() # user_ids waiting to add sub
def get_default_secret():
"""获取默认节点池的 secret优先用 data.json 里的,没有就用环境变量"""
data = load_data()
return data.get('default_secret', SUB_SECRET)
def load_data():
if os.path.exists(DATA_FILE):
with open(DATA_FILE) as f:
@@ -135,20 +140,37 @@ async def cb_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
if action == 'menu_default':
cnt = len(data['subs'])
alive_cnt = len([s for s in data['subs'] if s.get('alive', True)])
host = SUB_HOST
url = f"https://{host}/{get_default_secret()}/download?target=ClashMeta"
buttons = [
[InlineKeyboardButton("📋 节点列表", callback_data='menu_list'),
InlineKeyboardButton("📥 获取订阅", callback_data='menu_get')],
[InlineKeyboardButton(" 添加节点", callback_data='menu_add'),
InlineKeyboardButton("🗑 删除节点", callback_data='menu_del')],
[InlineKeyboardButton("🔄 重置订阅链接", callback_data='menu_reset_secret')],
[InlineKeyboardButton("◀️ 返回主菜单", callback_data='menu_home')],
]
try:
await q.edit_message_text(
f'📦 *默认节点池*\n\n总计 {cnt} 个节点,{alive_cnt} 个可用',
f'📦 *默认节点池*\n\n总计 {cnt} 个节点,{alive_cnt} 个可用\n🔗 订阅链接:\n`{url}`',
parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(buttons))
except:
await send_del(q.message,
f'📦 *默认节点池*\n\n总计 {cnt} 个节点,{alive_cnt} 个可用',
f'📦 *默认节点池*\n\n总计 {cnt} 个节点,{alive_cnt} 个可用\n🔗 订阅链接:\n`{url}`',
parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(buttons))
elif action == 'menu_reset_secret':
new_secret = secrets.token_hex(16)
data['default_secret'] = new_secret
save_data(data)
host = SUB_HOST
url = f"https://{host}/{new_secret}/download?target=ClashMeta"
buttons = [[InlineKeyboardButton("◀️ 返回", callback_data='menu_default')]]
try:
await q.edit_message_text(f"✅ 默认订阅链接已重置\n\n旧链接已失效\n新链接:\n`{url}`",
parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(buttons))
except:
await send_del(q.message, f"✅ 默认订阅链接已重置\n\n旧链接已失效\n新链接:\n`{url}`",
parse_mode='Markdown', reply_markup=InlineKeyboardMarkup(buttons))
elif action == 'menu_home':
@@ -280,7 +302,7 @@ async def cb_getsub(update: Update, context: ContextTypes.DEFAULT_TYPE):
cm = gen_clash_meta([s])
await send_del(q.message, f'```yaml\n{cm}\n```', parse_mode='Markdown')
elif fmt == 'url':
url = f'https://substore.mjjtop.com/{SUB_SECRET}/download?target=ClashMeta'
url = f'https://substore.mjjtop.com/{get_default_secret()}/download?target=ClashMeta'
await send_del(q.message, f'📎 订阅URL:\n{url}')
return
@@ -303,7 +325,7 @@ async def cb_getsub(update: Update, context: ContextTypes.DEFAULT_TYPE):
proto, fmt = parts[1], parts[2]
subs = alive if proto == 'all' else [s for s in alive if s['type'] == proto]
if fmt == 'clash':
url = f'https://substore.mjjtop.com/{SUB_SECRET}/download?target=ClashMeta'
url = f'https://substore.mjjtop.com/{get_default_secret()}/download?target=ClashMeta'
if proto != 'all': url += f'&type={proto}'
return await send_del(q.message, f'📎 Clash Meta 订阅链接:\n{url}')
links = '\n'.join(s['link'] for s in subs)
@@ -317,7 +339,7 @@ async def cb_getsub(update: Update, context: ContextTypes.DEFAULT_TYPE):
return
if action == 'get_all_clash':
url = f'https://substore.mjjtop.com/{SUB_SECRET}/download?target=ClashMeta'
url = f'https://substore.mjjtop.com/{get_default_secret()}/download?target=ClashMeta'
await send_del(q.message, f'📎 Clash Meta 订阅链接:\n{url}')
return
@@ -408,7 +430,7 @@ async def cb_multiout(update: Update, context: ContextTypes.DEFAULT_TYPE):
await send_del(q.message, f'```yaml\n{cm}\n```', parse_mode='Markdown')
elif fmt == 'url':
names = ','.join(urllib.request.quote(s['name']) for s in chosen)
url = f'https://substore.mjjtop.com/{SUB_SECRET}/download?target=ClashMeta&name={names}'
url = f'https://substore.mjjtop.com/{get_default_secret()}/download?target=ClashMeta&name={names}'
await send_del(q.message, f'📎 订阅URL:\n{url}')
elif fmt == 'b64':
links = '\n'.join(s['link'] for s in chosen)
@@ -599,7 +621,7 @@ class SubHandler(BaseHTTPRequestHandler):
# 匹配默认分组或自定义分组
alive = []
if path == f'/{SUB_SECRET}/download':
if path == f'/{get_default_secret()}/download':
data = load_data()
alive = [s for s in data['subs'] if s.get('alive', True)]
else: