代码之家  ›  专栏  ›  技术社区  ›  com

具有参数的电报BOT可点击命令

  •  1
  • com  · 技术社区  · 6 年前

    我正在使用 python-telegram-bot 创建电报机器人。

    我试图将参数中的参数插入到BOT消息中,这样用户就可以按下它了吗?

    这里,在 telegram core page 我找到了一个用命令+参数(/dLi)进行聊天的图片。 enter image description here

    但是我不知道怎么做

    3 回复  |  直到 6 年前
        1
  •  2
  •   dzNET    6 年前

    快速解决方案:

    #!/usr/bin/python3
    from telegram.ext import Updater, MessageHandler, Filters
    from telegram.ext import RegexHandler
    from string import ascii_lowercase
    from string import digits
    from random import choice
    from sys import exc_info as error
    
    token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
    
    def start(bot, update):
      username = update.message.from_user.first_name
      update.message.reply_text(greeting(username), parse_mode='Markdown')
      message = genre_head()
    
      for genre in genres:
        message += genre_list(genre['name'], genre['id'])
    
      update.message.reply_text(message, parse_mode='Markdown')
    
    def artist(bot, update):
      genre_id = update.message.text.replace('/dl_', '')
    
      for genre in genres:
        if genre['id'] == genre_id:
           message = artist_head(genre['name'])
    
      for artist in artists:
        message += artist_list(artist['id'], artist['name'], genre_id)
    
      message += artist_list_end()
      update.message.reply_text(message, parse_mode='Markdown')
    
    def download(bot, update):
      file = update.message.text.replace('/dl_', '')
      update.message.reply_text(u'\U0001F3BC\nhttp://music.com/{}.mp3'.format(file),
                                parse_mode='Markdown')
    
    try:
      updater = Updater(token)
      dp = updater.dispatcher
    
      dp.add_handler(RegexHandler('/start', start))
      dp.add_handler(RegexHandler('^(/dl_[\d]+)$', artist))
      dp.add_handler(RegexHandler('^(/dl_[\d]+[\w]+)$', download))
      dp.add_handler(MessageHandler(Filters.text, start))
    
      updater.start_polling()
    except:
      print(error())
      updater.stop()
    
    ################################################################################
    # Messeges
    def greeting(first_name):
      return '*Hello and welcome, {}!*\n'.format(first_name)
    
    def genre_head():
      return '*What your favorite genre?*\n'
    
    def genre_list(genre_name, genre_id):
      return '\n{}*{}*\n[ Choose {} /dl_{} ]\n'.format(u'\U0001F3B6', genre_name,
                                                       u'\U0001F449', genre_id)
    
    def artist_head(genre_name):
      return 'What artist in {}*{}* you are looking for?\n'.format(u'\U0001F3B6',
                                                                   genre_name)
    
    def artist_list(artist_id, artist_name, genre_id):
      return '\n{} *{}*\n[Press for download {} /dl_{}{}]\n'.format(u'\U0001F468',
                                                                    artist_name,
                                                                    u'\U0001F449',
                                                                    genre_id,
                                                                    artist_id)
    
    def artist_list_end():
      return '\n\nIf you choose a wrong genre press {} /start'.format(u'\U0001F449')
    
    ################################################################################
    # Fake data
    def digit():
      return ''.join(choice(digits) for iter in range(4))
    
    def char():
      return ''.join(choice(ascii_lowercase) for iter in range(4))
    
    genres = [{'id':digit(), 'name':'Rock'},
              {'id':digit(), 'name':'Classic'},
              {'id':digit(), 'name':'Pop'},
              {'id':digit(), 'name':'Dance'}]
    
    artists = [{'id':char(), 'name':'Led Zeppeling'},
               {'id':char(), 'name':'Johann Sebastian Bach'},
               {'id':char(), 'name':'Madonna'},
               {'id':char(), 'name':'Tiesto'}]
    
        2
  •  1
  •   Jack'lul    6 年前

    查看此已关闭的问题: https://github.com/python-telegram-bot/python-telegram-bot/issues/696

    这个概念很简单:

    • 匹配以开头的邮件 /dl_
    • 把那部分去掉,剩下的部分验证
    • 处理任何需要处理的
        3
  •  0
  •   Sumithran    6 年前

    你可以使用 RegexHandler() 这样做。

    这里是一个 例子

    def download(bot, update):
      id = update.message.text.replace('/dl_', '')
      update.message.reply_text(id, parse_mode='Markdown')
    
    
    def main():
      updater = Updater(TOKEN)
      updater.dispatcher.add_handler(RegexHandler('^(/dl_[\d]+)$', download))
      updater.start_polling()
    

    用法

    命令 /info_120 将返回 120
    /info_007 将返回 007