📜  使用Python创建一个 Telegram Bot

📅  最后修改于: 2022-05-13 01:55:23.177000             🧑  作者: Mango

使用Python创建一个 Telegram Bot

在本文中,我们将了解如何使用Python创建电报机器人。

最近,Telegram 已成为最常用的消息传递和内容共享平台之一,它没有像 Whatsapp 那样的文件共享限制,并且带有一些预装的机器人,可以在任何渠道(whatsapp 的情况下是群组)中使用来控制行为或过滤用户发送的垃圾邮件。

要求

  • Telegram 帐户:如果您没有安装 Telegram 应用程序,只需从 Play 商店下载即可。下载后使用您的手机号码创建一个帐户,就像 WhatsApp 一样。
  • . python-telegram-bot 模块:这里我们需要一个名为python-telegram-bot的模块,这个库为 Telegram Bot API 提供了一个纯Python接口。它与Python版本 3.6.8+ 兼容。除了纯 API 实现之外,该库还具有许多高级类,使机器人的开发变得简单明了。这些类包含在“telegram.ext”子模块中。有关更多信息,您可以查看他们的官方 GitHub 存储库。

模块的安装

我们可以使用以下命令通过 pip 和 conda 安装此模块。

# installing via pip
pip install python-telegram-bot

# installing via conda
conda install -c conda-forge python-telegram-bot

创建第一个机器人的步骤

第一步:在 Telegram 上开户后,在顶部的搜索栏中搜索“BotFather”

第 2 步:单击“BotFather”(第一个结果)并输入/newbot

第 3 步:为您的机器人指定一个唯一名称。命名后,Botfather 会询问它的用户名。然后也给一个唯一的名字,但记住你的机器人的用户名必须以机器人结尾,比如my_bot、hellobot 等。

第 4 步:在给出唯一名称后,如果它被接受,您将收到类似这样的消息 –

这里的令牌值对你来说会有所不同,我们将在我们的Python代码中使用这个令牌在我们的机器人中进行更改并使其像我们想要的那样,并在其中添加一些命令。

分步实施

步骤 1:导入所需的库

Python3
from telegram.ext.updater import Updater
from telegram.update import Update
from telegram.ext.callbackcontext import CallbackContext
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.filters import Filters


Python3
updater = Updater("your_own_API_Token got from BotFather",
                  use_context=True)
  
  
def start(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Enter the text you want to show to the user whenever they start the bot")


Python3
def help(update: Update, context: CallbackContext):
    update.message.reply_text("Your Message")


Python3
def gmail_url(update: Update, context: CallbackContext):
    update.message.reply_text("gmail link here")
  
  
def youtube_url(update: Update, context: CallbackContext):
    update.message.reply_text("youtube link")
  
  
def linkedIn_url(update: Update, context: CallbackContext):
    update.message.reply_text("Your linkedin profile url")
  
  
def geeks_url(update: Update, context: CallbackContext):
    update.message.reply_text("GeeksforGeeks url here")
  
  
def unknown_text(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry I can't recognize you , you said '%s'" % update.message.text)
  
  
def unknown(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry '%s' is not a valid command" % update.message.text)


Python3
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('youtube', youtube_url))
updater.dispatcher.add_handler(CommandHandler('help', help))
updater.dispatcher.add_handler(CommandHandler('linkedin', linkedIn_url))
updater.dispatcher.add_handler(CommandHandler('gmail', gmail_url))
updater.dispatcher.add_handler(CommandHandler('geeks', geeks_url))
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown))
updater.dispatcher.add_handler(MessageHandler(
    # Filters out unknown commands
    Filters.command, unknown))
  
# Filters out unknown messages.
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown_text))


Python3
updater.start_polling()


Python3
from telegram.ext.updater import Updater
from telegram.update import Update
from telegram.ext.callbackcontext import CallbackContext
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.filters import Filters
  
updater = Updater("your_own_API_Token got from BotFather",
                  use_context=True)
  
  
def start(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Hello sir, Welcome to the Bot.Please write\
        /help to see the commands available.")
  
def help(update: Update, context: CallbackContext):
    update.message.reply_text("""Available Commands :-
    /youtube - To get the youtube URL
    /linkedin - To get the LinkedIn profile URL
    /gmail - To get gmail URL
    /geeks - To get the GeeksforGeeks URL""")
  
  
def gmail_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Your gmail link here (I am not\
        giving mine one for security reasons)")
  
  
def youtube_url(update: Update, context: CallbackContext):
    update.message.reply_text("Youtube Link =>\
    https://www.youtube.com/")
  
  
def linkedIn_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "LinkedIn URL => \
        https://www.linkedin.com/in/dwaipayan-bandyopadhyay-007a/")
  
  
def geeks_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "GeeksforGeeks URL => https://www.geeksforgeeks.org/")
  
  
def unknown(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry '%s' is not a valid command" % update.message.text)
  
  
def unknown_text(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry I can't recognize you , you said '%s'" % update.message.text)
  
  
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('youtube', youtube_url))
updater.dispatcher.add_handler(CommandHandler('help', help))
updater.dispatcher.add_handler(CommandHandler('linkedin', linkedIn_url))
updater.dispatcher.add_handler(CommandHandler('gmail', gmail_url))
updater.dispatcher.add_handler(CommandHandler('geeks', geeks_url))
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown))
updater.dispatcher.add_handler(MessageHandler(
    Filters.command, unknown))  # Filters out unknown commands
  
# Filters out unknown messages.
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown_text))
  
updater.start_polling()


我们正在导入的函数的简要使用:

  • 更新程序:这将包含我们从 BotFather 获得的 API 密钥,用于指定我们要在哪个机器人中使用我们的Python代码添加功能。
  • 更新:这将调用每个 机器人收到更新的时间,即消息或命令,并将向用户发送消息。
  • CallbackContext:我们不会直接在我们的代码中使用它的功能,但是当我们添加调度程序时它是必需的(它将在内部工作)
  • CommandHandler:这个Handler类用于处理用户发送给机器人的任何命令,命令总是以“/”开头,即“/start”、“/help”等。
  • MessageHandler:这个Handler类用于处理用户发送给bot的任何普通消息,
  • 过滤器这将从发送的消息中过滤普通文本、命令、图像等。

步骤 2:定义操作函数

开始函数:它将显示第一个对话,您可以将其命名为其他名称,但只要用户在最开始按“开始”,就会将其中的消息发送给用户。

蟒蛇3

updater = Updater("your_own_API_Token got from BotFather",
                  use_context=True)
  
  
def start(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Enter the text you want to show to the user whenever they start the bot")

基本上,在开始消息中,您应该添加诸如“Hello Welcome to the Bot”之类的内容。

帮助函数:基本上在这个函数中你应该添加用户可能需要的任何类型的帮助,即你的机器人理解的所有命令,与机器人相关的信息等)

蟒蛇3

def help(update: Update, context: CallbackContext):
    update.message.reply_text("Your Message")

向 Bot 添加更多功能。

蟒蛇3

def gmail_url(update: Update, context: CallbackContext):
    update.message.reply_text("gmail link here")
  
  
def youtube_url(update: Update, context: CallbackContext):
    update.message.reply_text("youtube link")
  
  
def linkedIn_url(update: Update, context: CallbackContext):
    update.message.reply_text("Your linkedin profile url")
  
  
def geeks_url(update: Update, context: CallbackContext):
    update.message.reply_text("GeeksforGeeks url here")
  
  
def unknown_text(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry I can't recognize you , you said '%s'" % update.message.text)
  
  
def unknown(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry '%s' is not a valid command" % update.message.text)

这里我们添加了4个功能,一个是打开Gmail,一个是youtube,一个是LinkedIn,最后一个是GeeksforGeeks。这些不是强制性函数,您可以根据需要添加任何类型的函数及其回复文本,这些仅用于演示。在这里, unknown_text函数会在收到一些未知消息时发送写入其中的消息,并且未知函数将过滤掉用户发送的所有未知命令并回复写入其中的消息。

第 3 步:添加处理程序来处理我们的消息和命令

蟒蛇3

updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('youtube', youtube_url))
updater.dispatcher.add_handler(CommandHandler('help', help))
updater.dispatcher.add_handler(CommandHandler('linkedin', linkedIn_url))
updater.dispatcher.add_handler(CommandHandler('gmail', gmail_url))
updater.dispatcher.add_handler(CommandHandler('geeks', geeks_url))
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown))
updater.dispatcher.add_handler(MessageHandler(
    # Filters out unknown commands
    Filters.command, unknown))
  
# Filters out unknown messages.
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown_text))

这里的每一行都表明,每当用户写一个命令时,即作为回复的 CommandHandler 的第一个参数,用户会得到写在下一个参数中提到的函数内的消息。

第 4 步:运行机器人

蟒蛇3

updater.start_polling()

每当我们开始轮询时,bot 将处于活动状态,它将查找任何用户发送的任何新消息,如果它与那里指定的命令匹配,它将相应地回复。

下面是完整的实现:

蟒蛇3

from telegram.ext.updater import Updater
from telegram.update import Update
from telegram.ext.callbackcontext import CallbackContext
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.filters import Filters
  
updater = Updater("your_own_API_Token got from BotFather",
                  use_context=True)
  
  
def start(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Hello sir, Welcome to the Bot.Please write\
        /help to see the commands available.")
  
def help(update: Update, context: CallbackContext):
    update.message.reply_text("""Available Commands :-
    /youtube - To get the youtube URL
    /linkedin - To get the LinkedIn profile URL
    /gmail - To get gmail URL
    /geeks - To get the GeeksforGeeks URL""")
  
  
def gmail_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Your gmail link here (I am not\
        giving mine one for security reasons)")
  
  
def youtube_url(update: Update, context: CallbackContext):
    update.message.reply_text("Youtube Link =>\
    https://www.youtube.com/")
  
  
def linkedIn_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "LinkedIn URL => \
        https://www.linkedin.com/in/dwaipayan-bandyopadhyay-007a/")
  
  
def geeks_url(update: Update, context: CallbackContext):
    update.message.reply_text(
        "GeeksforGeeks URL => https://www.geeksforgeeks.org/")
  
  
def unknown(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry '%s' is not a valid command" % update.message.text)
  
  
def unknown_text(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Sorry I can't recognize you , you said '%s'" % update.message.text)
  
  
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('youtube', youtube_url))
updater.dispatcher.add_handler(CommandHandler('help', help))
updater.dispatcher.add_handler(CommandHandler('linkedin', linkedIn_url))
updater.dispatcher.add_handler(CommandHandler('gmail', gmail_url))
updater.dispatcher.add_handler(CommandHandler('geeks', geeks_url))
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown))
updater.dispatcher.add_handler(MessageHandler(
    Filters.command, unknown))  # Filters out unknown commands
  
# Filters out unknown messages.
updater.dispatcher.add_handler(MessageHandler(Filters.text, unknown_text))
  
updater.start_polling()

输出: