Sabrani Wodoo
Sabrani Wodoo

Reputation: 11

Telegram bot to recognize URLs

I'm creating my first Telegram bot. I want the bot to filter text looking only for URLs, and trigger when is found.

For example, if someone types in the chat "www.google.com", I want the bot to recognize it as a URL and later do X action. I tried filtering for words to get an exact URL, but I'm doing it wrong.

I'm trying with Filters.entity(URL) but I've not been able to make the full necessary code.

This is the actual bot code:

import logging
from telegram.ext import Updater, CommandHandler, ConversationHandler, MessageHandler, Filters
import os
import random
import requests

TOKEN = "XXXXX"
PORT = int(os.environ.get('PORT', '8443'))
updater = Updater(TOKEN)

# Enable logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                   level=logging.INFO)

logger = logging.getLogger(__name__)

# Define a few command handlers. These usually take the two arguments update and
# context. Error handlers also receive the raised TelegramError object in error.
def start(update, context):
   """Send a message when the command /start is issued."""
   update.message.reply_text('Hi!')

def coin(update, context):
   ''' ⚪️/⚫️ Moneda 
   Genera un número elatorio entre 1 y 2.
   '''
   cid=update.message.chat_id
   msg="⚫️ Cara" if random.randint(1,2)==1 else "⚪️ Cruz"
   # Responde directametne en el canal donde se le ha hablado.
   update.message.reply_text(msg)

def help(update, context):
   """Send a message when the command /help is issued."""
   update.message.reply_text('Help!')

def links(update, context):
   """Echo the user message."""
   url = str(update.message.text)
   if url.lower() == '*morning*':
   update.message.reply_text(update.message.text)
   
def error(update, context):
   """Log Errors caused by Updates."""
   logger.warning('Update "%s" caused error "%s"', update, context.error)

def main():
   """Start the bot."""
   # Create the Updater and pass it your bot's token.
   # Make sure to set use_context=True to use the new context based callbacks
   # Post version 12 this will no longer be necessary
   updater = Updater(TOKEN, use_context=True)

   # Get the dispatcher to register handlers
   dp = updater.dispatcher

   # on different commands - answer in Telegram
   dp.add_handler(CommandHandler("start", start))
   dp.add_handler(CommandHandler("help", help))
   dp.add_handler(CommandHandler("coin", coin))          

   # on noncommand i.e message - echo the message on Telegram    
   dp.add_handler(MessageHandler(Filters.entity(URL), links))

   # log all errors
   dp.add_error_handler(error)

   # Start the Bot
   updater.start_webhook(listen="0.0.0.0",
                         port=PORT,
                         url_path=TOKEN,
webhook_url="XXXXX/" + TOKEN)

   # Run the bot until you press Ctrl-C or the process receives SIGINT,
   # SIGTERM or SIGABRT. This should be used most of the time, since
   # start_polling() is non-blocking and will stop the bot gracefully.
   updater.idle()

if __name__ == '__main__':
   main()

Upvotes: 1

Views: 2201

Answers (1)

py coder
py coder

Reputation: 61

dp.add_handler(MessageHandler(Filters.entity(URL), links))

change this to this ->

dp.add_handler(MessageHandler(Filters.entity('url'), links))

disable your other replyto normal text handler .. because that function concider your links as a normal text

Upvotes: 3

Related Questions