web-dev-qa-db-ja.com

ボットに引数で応答させるにはどうすればよいですか?

そこで、次のコマンドを受信できるTelegramボットを作成しました。

  • _/list_
  • _/info 123_

_/info_をキャッチし、追加の引数をintとして渡すことができるので、これはうまく機能します。しかし、悲しいことに、Telegramクライアントは_/info 123_を完全なコマンドとしてではなく、_/info_の部分だけと見なします。コマンド全体をコマンドとして認識させる方法はありますか?

Markdownを試してみました:[/info 123](/info 123)ですが、喜びはありません。これは可能ですか?

11
Mave

私は同じ質問で@BotSupportに連絡しました、そして彼/彼ら/それは次の答えで迅速に答えました:

こんにちは。現時点では、コマンドのパラメータを強調表示することはできません。いずれにせよ、正しいカスタムキーボードを使用すれば、回避策を見つけることができるかもしれません;)— @BotSupport

カスタムキーボードは誰かにとってはオプションかもしれませんが、私にとってはそうではありません。私が行った解決策は、コマンドを/info123として指定することです。ボットがすべての/コマンドを受信したら、受信したコマンドがinfoで始まるかどうかを確認し、開始する場合はinfoの部分を削除します。残りのstring/intを引数に変換し、それを関連するコマンドに渡します。

10
Mave

RegexHandler() を使用してこれを行うことができます。

これがの例です

def info(bot, update):
  id = update.message.text.replace('/info_', '')
  update.message.reply_text(id, parse_mode='Markdown')


def main():
  updater = Updater(TOKEN)
  updater.dispatcher.add_handler(RegexHandler('^(/info_[\d]+)$', info))
  updater.start_polling()

使用法

コマンド /info_120 戻ります 120
および/info_007 戻ります 007

[〜#〜]更新[〜#〜]
新しいバージョンの場合は、代わりにこの方法を使用できます。

MessageHandler(Filters.regex(r'pattern'), callback)
4
Sumithran

コマンドinfoの引数として123を渡すつもりで、たまたま python-telegram-bot を使用する場合は、次のようにします。

dispatcher.add_handler(CommandHandler('hello', SayHello, pass_args=True))

ドキュメントによると:pass_argsargsと呼ばれるキーワード引数としてコマンドに渡された引数をハンドラーに渡すかどうかを決定します。文字列のリストが含まれます。これは、単一または連続する空白で分割されたコマンドに続くテキスト文字です。デフォルトはFalseです。

2
Moeen MH

これは、ユーザー入力からkwargを作成するためのかなり基本的な方法です。

残念ながら、ユーザーはパラメーターとして使用できるフィールドを知っている必要がありますが、ユーザーが検出可能なkwargスタイルのメッセージを提供しないときに有益な応答を提供できれば、おそらくより良いエクスペリエンスを実現できます。

私が言うように、非常に初歩的なアイデアであり、利用可能な正規表現フィルターを使用すると、おそらくより速く達成されるでしょう。そして、これは「厄介な」種類のユーザーからの入力をチェックするときにはるかに信頼性が高くなります。

スクリプトは、コマンドの前にある||区切り文字に依存しており、示されているように、新しい行やスペースなどの余分な文字をトリミングします。

commitの余分なチェックを削除できます。これは、入力をデータベースに明示的に保存することをボットに通知するために提供されているためです。

def parse_kwargs(update):
    commit = False
    kwargs = {}
    if update.message:
        for args in update.message.text.split('||')[1:]:
            for kw_pair in args.split(','):
                key, value = kw_pair.split('=')
                if key.strip() != 'commit':
                    kwargs[key.strip()] = value.strip()
                Elif key.strip() == 'commit' and value.strip().lower() == 'true':
                    commit = True
    return kwargs, commit
0
Swift