Compare commits
No commits in common. "58f289d5d9f090bd38eee2d51feb7fd82ecafee3" and "f57f49e3720fe66416f6ab79bdc9ed82213ce05f" have entirely different histories.
58f289d5d9
...
f57f49e372
4 changed files with 24 additions and 75 deletions
|
@ -22,7 +22,7 @@ from core.promote import handle_promote_command
|
||||||
from core.repeater import MessageRepeater
|
from core.repeater import MessageRepeater
|
||||||
from core.report_links import report_broken_links
|
from core.report_links import report_broken_links
|
||||||
from core.simple import handle_start_command, handle_baka, dummy_handler, handle_info_command, handle_ping_command, \
|
from core.simple import handle_start_command, handle_baka, dummy_handler, handle_info_command, handle_ping_command, \
|
||||||
handle_tips_command, handle_about_command, handle_nexusmods_id
|
handle_tips_command, handle_about_command
|
||||||
from core.actions import handle_actions, handle_reverse_actions
|
from core.actions import handle_actions, handle_reverse_actions
|
||||||
from core.stats import handle_stats_command
|
from core.stats import handle_stats_command
|
||||||
from core.middleware.stats import MessageStatsMiddleware
|
from core.middleware.stats import MessageStatsMiddleware
|
||||||
|
@ -77,7 +77,6 @@ class TelegramAdapter:
|
||||||
handle_unpin_channel_message)
|
handle_unpin_channel_message)
|
||||||
# repeater 模块
|
# repeater 模块
|
||||||
repeater_router.message(F.chat.type.in_({'group', 'supergroup'}))(MessageRepeater().handle_message)
|
repeater_router.message(F.chat.type.in_({'group', 'supergroup'}))(MessageRepeater().handle_message)
|
||||||
router.message(F.text.regexp(r'(n|N) ?网尾号 ?[0-9]*'))(handle_nexusmods_id)
|
|
||||||
router.message(F.text == '我是笨蛋')(handle_baka)
|
router.message(F.text == '我是笨蛋')(handle_baka)
|
||||||
router.inline_query()(handle_inline_query)
|
router.inline_query()(handle_inline_query)
|
||||||
# 捕获所有其他消息
|
# 捕获所有其他消息
|
||||||
|
|
|
@ -2,8 +2,6 @@ from aiogram.enums import ParseMode
|
||||||
from aiogram.types import InlineQuery, InlineQueryResultArticle, InputTextMessageContent
|
from aiogram.types import InlineQuery, InlineQueryResultArticle, InputTextMessageContent
|
||||||
from aiogram.utils.formatting import Text, ExpandableBlockQuote
|
from aiogram.utils.formatting import Text, ExpandableBlockQuote
|
||||||
|
|
||||||
from core.link import clean_link_in_text
|
|
||||||
|
|
||||||
|
|
||||||
async def handle_inline_query(query: InlineQuery):
|
async def handle_inline_query(query: InlineQuery):
|
||||||
"""
|
"""
|
||||||
|
@ -13,7 +11,7 @@ async def handle_inline_query(query: InlineQuery):
|
||||||
"""
|
"""
|
||||||
print(f"Received inline query")
|
print(f"Received inline query")
|
||||||
query_text = query.query
|
query_text = query.query
|
||||||
if not query_text:
|
if query_text == "":
|
||||||
await query.answer(results=[
|
await query.answer(results=[
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
id="1",
|
id="1",
|
||||||
|
@ -28,7 +26,7 @@ async def handle_inline_query(query: InlineQuery):
|
||||||
return
|
return
|
||||||
|
|
||||||
if query_text.startswith("search"):
|
if query_text.startswith("search"):
|
||||||
search_query = query_text.replace("search", "",1).strip()
|
search_query = query_text.replace("search", "").strip()
|
||||||
if search_query:
|
if search_query:
|
||||||
await query.answer(results=[
|
await query.answer(results=[
|
||||||
InlineQueryResultArticle(
|
InlineQueryResultArticle(
|
||||||
|
@ -65,7 +63,7 @@ async def handle_inline_query(query: InlineQuery):
|
||||||
return
|
return
|
||||||
|
|
||||||
if query_text.startswith("pg"):
|
if query_text.startswith("pg"):
|
||||||
text = query_text.replace("pg", "",1).strip()
|
text = query_text.replace("pg", "").strip()
|
||||||
import pangu
|
import pangu
|
||||||
text = pangu.spacing_text(text)
|
text = pangu.spacing_text(text)
|
||||||
await query.answer(results=[
|
await query.answer(results=[
|
||||||
|
@ -185,34 +183,6 @@ async def handle_inline_query(query: InlineQuery):
|
||||||
)
|
)
|
||||||
], cache_time=0)
|
], cache_time=0)
|
||||||
return
|
return
|
||||||
if "http" in query_text:
|
|
||||||
# 实现清理 URL 的功能
|
|
||||||
cleaned_links = await clean_link_in_text(query_text)
|
|
||||||
if cleaned_links:
|
|
||||||
result = '\n\n'.join(cleaned_links)
|
|
||||||
await query.answer(results=[
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
id="1",
|
|
||||||
title="清理后的链接",
|
|
||||||
input_message_content=InputTextMessageContent(
|
|
||||||
message_text=Text(ExpandableBlockQuote(result)).as_markdown(),
|
|
||||||
parse_mode=ParseMode.MARKDOWN
|
|
||||||
),
|
|
||||||
description=f"发送清理后的链接:{result}"
|
|
||||||
)
|
|
||||||
], cache_time=0)
|
|
||||||
else:
|
|
||||||
await query.answer(results=[
|
|
||||||
InlineQueryResultArticle(
|
|
||||||
id="1",
|
|
||||||
title="似乎没有链接需要被清理",
|
|
||||||
input_message_content=InputTextMessageContent(
|
|
||||||
message_text=query_text,
|
|
||||||
parse_mode=None
|
|
||||||
),
|
|
||||||
description="发送原始文本")
|
|
||||||
], cache_time=0)
|
|
||||||
return
|
|
||||||
if query_text.startswith("将军"):
|
if query_text.startswith("将军"):
|
||||||
# fallback support for users who forget the colon
|
# fallback support for users who forget the colon
|
||||||
if not query_text.startswith('将军:'):
|
if not query_text.startswith('将军:'):
|
||||||
|
@ -253,9 +223,7 @@ async def handle_inline_query(query: InlineQuery):
|
||||||
else:
|
else:
|
||||||
from helpers.songs import fetch_from_b23_api
|
from helpers.songs import fetch_from_b23_api
|
||||||
# 如果没有在本地找到歌曲,则尝试从 Bilibili API 获取
|
# 如果没有在本地找到歌曲,则尝试从 Bilibili API 获取
|
||||||
#result = await fetch_from_b23_api(keywords)
|
result = await fetch_from_b23_api(keywords)
|
||||||
result = None
|
|
||||||
# 因为 B 站的搜索 API 经常失效,所以这里暂时注释掉
|
|
||||||
if result:
|
if result:
|
||||||
song_name, song_link = result
|
song_name, song_link = result
|
||||||
await query.answer(results=[
|
await query.answer(results=[
|
||||||
|
|
51
core/link.py
51
core/link.py
|
@ -14,13 +14,11 @@ from config import config
|
||||||
whitelist_param_links = ['www.iesdouyin.com','item.taobao.com', 'detail.tmall.com', 'h5.m.goofish.com', 'music.163.com',
|
whitelist_param_links = ['www.iesdouyin.com','item.taobao.com', 'detail.tmall.com', 'h5.m.goofish.com', 'music.163.com',
|
||||||
'www.bilibili.com', 'm.bilibili.com', 'bilibili.com', 'mall.bilibili.com',
|
'www.bilibili.com', 'm.bilibili.com', 'bilibili.com', 'mall.bilibili.com',
|
||||||
'space.bilibili.com', 'live.bilibili.com','item.m.jd.com','item.jd.com',
|
'space.bilibili.com', 'live.bilibili.com','item.m.jd.com','item.jd.com',
|
||||||
'www.xiaohongshu.com','zhuanlan.zhihu.com','www.baidu.com','m.youtube.com','www.youtube.com',
|
'www.xiaohongshu.com','zhuanlan.zhihu.com','www.baidu.com','www.youtube.com',
|
||||||
'music.youtube.com','youtu.be']
|
'music.youtube.com','youtu.be']
|
||||||
|
|
||||||
has_self_redirection_links = ['www.cnbeta.com.tw','m.cnbeta.com.tw','www.landiannews.com', 'www.bilibili.com']
|
has_self_redirection_links = ['www.cnbeta.com.tw','m.cnbeta.com.tw','www.landiannews.com', 'www.bilibili.com']
|
||||||
|
|
||||||
has_better_alternative_links = ['www.iesdouyin.com','bilibili.com', 'm.bilibili.com', 'youtu.be','m.youtube.com','x.com', 'twitter.com']
|
|
||||||
|
|
||||||
def matches_adb_selector(url, selector):
|
def matches_adb_selector(url, selector):
|
||||||
"""Check if URL matches the given selector"""
|
"""Check if URL matches the given selector"""
|
||||||
if selector['type'] == 'url-pattern':
|
if selector['type'] == 'url-pattern':
|
||||||
|
@ -184,7 +182,7 @@ def reserve_whitelisted_params(url):
|
||||||
# 重新构建URL
|
# 重新构建URL
|
||||||
cleaned_query = urlencode(new_query_params, doseq=True)
|
cleaned_query = urlencode(new_query_params, doseq=True)
|
||||||
return urlunparse(parsed_url._replace(query=cleaned_query))
|
return urlunparse(parsed_url._replace(query=cleaned_query))
|
||||||
elif parsed_url.hostname in ['www.baidu.com','m.youtube.com','www.youtube.com','music.youtube.com','youtu.be']:
|
elif parsed_url.hostname in ['www.baidu.com','www.youtube.com','music.youtube.com','youtu.be']:
|
||||||
new_query_params = {}
|
new_query_params = {}
|
||||||
if parsed_url.hostname == 'www.baidu.com' and 'wd' in query_params:
|
if parsed_url.hostname == 'www.baidu.com' and 'wd' in query_params:
|
||||||
# 百度搜索链接保留 wd 参数
|
# 百度搜索链接保留 wd 参数
|
||||||
|
@ -208,7 +206,7 @@ def reserve_whitelisted_params(url):
|
||||||
return url
|
return url
|
||||||
|
|
||||||
def transform_into_fixed_url(url):
|
def transform_into_fixed_url(url):
|
||||||
""" 转换为修复的链接 """
|
""" 转换为修复了链接预览的链接 """
|
||||||
parsed_url = urlparse(url)
|
parsed_url = urlparse(url)
|
||||||
|
|
||||||
if parsed_url.hostname in ['x.com', 'twitter.com']:
|
if parsed_url.hostname in ['x.com', 'twitter.com']:
|
||||||
|
@ -220,9 +218,6 @@ def transform_into_fixed_url(url):
|
||||||
if parsed_url.hostname in ['www.iesdouyin.com']:
|
if parsed_url.hostname in ['www.iesdouyin.com']:
|
||||||
# 把抖音分享链接转换为正常的 www.douyin.com
|
# 把抖音分享链接转换为正常的 www.douyin.com
|
||||||
return urlunparse(parsed_url._replace(netloc='www.douyin.com'))
|
return urlunparse(parsed_url._replace(netloc='www.douyin.com'))
|
||||||
if parsed_url.hostname in ['youtu.be','m.youtube.com']:
|
|
||||||
# 把 youtu.be 和 m.youtube.com 的链接转换为 www.youtube.com
|
|
||||||
return urlunparse(parsed_url._replace(netloc='www.youtube.com'))
|
|
||||||
return url
|
return url
|
||||||
|
|
||||||
async def process_url(url):
|
async def process_url(url):
|
||||||
|
@ -233,7 +228,7 @@ async def process_url(url):
|
||||||
# 对于适配的网站,直接保留白名单参数并返回
|
# 对于适配的网站,直接保留白名单参数并返回
|
||||||
if urlparse(url).hostname in whitelist_param_links:
|
if urlparse(url).hostname in whitelist_param_links:
|
||||||
final_url = reserve_whitelisted_params(url)
|
final_url = reserve_whitelisted_params(url)
|
||||||
if urlparse(final_url).hostname in has_better_alternative_links:
|
if urlparse(final_url).hostname in ['www.iesdouyin.com','bilibili.com', 'm.bilibili.com']:
|
||||||
final_url = transform_into_fixed_url(final_url)
|
final_url = transform_into_fixed_url(final_url)
|
||||||
if url != final_url:
|
if url != final_url:
|
||||||
return final_url
|
return final_url
|
||||||
|
@ -251,14 +246,12 @@ async def process_url(url):
|
||||||
# 对于扩展短链接之后的适配的网站,直接保留白名单参数并返回
|
# 对于扩展短链接之后的适配的网站,直接保留白名单参数并返回
|
||||||
if urlparse(extended_url).hostname in whitelist_param_links:
|
if urlparse(extended_url).hostname in whitelist_param_links:
|
||||||
final_url = reserve_whitelisted_params(extended_url)
|
final_url = reserve_whitelisted_params(extended_url)
|
||||||
if urlparse(final_url).hostname in has_better_alternative_links:
|
if urlparse(final_url).hostname in ['www.iesdouyin.com','bilibili.com', 'm.bilibili.com']:
|
||||||
final_url = transform_into_fixed_url(final_url)
|
final_url = transform_into_fixed_url(final_url)
|
||||||
if url != final_url:
|
if url != final_url:
|
||||||
return final_url
|
return final_url
|
||||||
else:
|
if urlparse(extended_url).hostname in ['x.com', 'twitter.com']:
|
||||||
# 链接没有变化,直接返回 None,避免重复处理
|
# 对于 Twitter 链接,转换为 fixupx.com
|
||||||
return None
|
|
||||||
if urlparse(extended_url).hostname in has_better_alternative_links:
|
|
||||||
removed_tracking_url = remove_tracking_params(extended_url)
|
removed_tracking_url = remove_tracking_params(extended_url)
|
||||||
final_url = transform_into_fixed_url(removed_tracking_url)
|
final_url = transform_into_fixed_url(removed_tracking_url)
|
||||||
else:
|
else:
|
||||||
|
@ -268,29 +261,23 @@ async def process_url(url):
|
||||||
return final_url
|
return final_url
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def clean_link_in_text(text):
|
|
||||||
# URL regex pattern
|
|
||||||
url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
|
|
||||||
urls = re.findall(url_pattern, text)
|
|
||||||
if not urls:
|
|
||||||
return None
|
|
||||||
final_urls = await asyncio.gather(*[process_url(url) for url in urls])
|
|
||||||
# Filter out None values
|
|
||||||
final_urls = [url for url in final_urls if url is not None]
|
|
||||||
return final_urls
|
|
||||||
|
|
||||||
async def handle_links(message: Message):
|
async def handle_links(message: Message):
|
||||||
if not config.is_feature_enabled('link', message.chat.id):
|
if not config.is_feature_enabled('link', message.chat.id):
|
||||||
return
|
return
|
||||||
|
# URL regex pattern
|
||||||
|
url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+'
|
||||||
text = message.text or message.caption
|
text = message.text or message.caption
|
||||||
# Extract URLs from message text
|
# Extract URLs from message text
|
||||||
if text:
|
if text:
|
||||||
final_urls = await clean_link_in_text(text)
|
urls = re.findall(url_pattern, text)
|
||||||
|
if not urls:
|
||||||
|
return
|
||||||
|
final_urls = await asyncio.gather(*[process_url(url) for url in urls])
|
||||||
|
# Filter out None values
|
||||||
|
final_urls = [url for url in final_urls if url is not None]
|
||||||
# 回复处理后的链接
|
# 回复处理后的链接
|
||||||
if final_urls:
|
if final_urls:
|
||||||
await message.reply(
|
await message.reply(f"<blockquote expandable>{"\n\n".join(final_urls)}\n</blockquote>\n消息里有包含跟踪参数的链接,已经帮你转换了哦~\n\n"
|
||||||
f"<blockquote expandable>{"\n\n".join(final_urls)}\n</blockquote>\n消息里有包含跟踪参数的链接,已经帮你转换了哦~\n\n"
|
f"注意:这个功能是试验性的,可能会出现问题。"
|
||||||
f"注意:这个功能是试验性的,可能会出现问题。"
|
f"\n如果你找到了问题,欢迎"
|
||||||
f"\n如果你找到了问题,欢迎"
|
f"把它通过 <code>/report_broken_links 链接 需要去除的参数等等</code> 报告给开发者!")
|
||||||
f"把它通过 <code>/report_broken_links 链接 需要去除的参数等等</code> 报告给开发者!")
|
|
|
@ -88,11 +88,6 @@ async def handle_about_command(message: Message) -> None:
|
||||||
response += f"也就大概花了 {minutes} 分 {seconds} 秒..."
|
response += f"也就大概花了 {minutes} 分 {seconds} 秒..."
|
||||||
await about_message.edit_text(response)
|
await about_message.edit_text(response)
|
||||||
|
|
||||||
async def handle_nexusmods_id(message: Message) -> None:
|
|
||||||
"""输入n网尾号xxxx之后主动返回星露谷物语的对应mod"""
|
|
||||||
nexusmods_id = message.text.replace(" ","").replace("N网尾号","").replace("n网尾号","")
|
|
||||||
await message.reply(f"https://www.nexusmods.com/stardewvalley/mods/{nexusmods_id}")
|
|
||||||
|
|
||||||
async def dummy_handler(message: Message) -> None:
|
async def dummy_handler(message: Message) -> None:
|
||||||
"""A handler to catch all other messages"""
|
"""A handler to catch all other messages"""
|
||||||
pass
|
pass
|
Loading…
Add table
Add a link
Reference in a new issue