Telegram bot URL识别功能开发:Filters.entity(URL)实现问题求助
可直接运行的修复后代码
你现有代码存在4个核心错误:未定义URL实体类型、重复初始化updater、URL提取逻辑错误、语法缩进错误,修复后完整代码如下:
import logging from telegram import MessageEntity from telegram.ext import Updater, CommandHandler, MessageHandler, Filters import os import random TOKEN = "XXXXX" # 替换为你的bot实际token PORT = int(os.environ.get('PORT', '8443')) # 启用日志 logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) def start(update, context): update.message.reply_text('Hi!') def coin(update, context): cid=update.message.chat_id msg="⚫️ 正面" if random.randint(1,2)==1 else "⚪️ 反面" update.message.reply_text(msg) def help(update, context): update.message.reply_text('帮助信息') def links(update, context): # 提取消息中所有URL urls = [] for entity in update.message.entities: if entity.type == MessageEntity.URL: url = update.message.text[entity.offset:entity.offset + entity.length] urls.append(url) # 这里替换为你要执行的自定义操作,示例为返回识别到的所有URL if urls: replay_text = f"识别到URL:\n{chr(10).join(urls)}" update.message.reply_text(replay_text) def error(update, context): logger.warning('Update "%s" 触发错误 "%s"', update, context.error) def main(): updater = Updater(TOKEN, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(CommandHandler("help", help)) dp.add_handler(CommandHandler("coin", coin)) # 绑定URL实体过滤器到处理函数 dp.add_handler(MessageHandler(Filters.entity(MessageEntity.URL), links)) dp.add_error_handler(error) # 启动webhook,替换XXXXX为你的服务实际域名 updater.start_webhook(listen="0.0.0.0", port=PORT, url_path=TOKEN, webhook_url="XXXXX/" + TOKEN) updater.idle() if __name__ == '__main__': main()
功能说明
- 只要用户发送的消息中包含任意URL(包括带http/https前缀、不带前缀的www域名等),都会自动触发
links函数 - 你可以修改
links函数内的逻辑,替换为你需要执行的自定义操作,比如URL校验、内容爬取、自动回复等
内容的提问来源于stack exchange,提问作者Sabrani Wodoo
相关产品推荐
相关产品推荐

