そこで、次のコマンドを受信できるTelegramボットを作成しました。
/list
_/info 123
__/info
_をキャッチし、追加の引数をintとして渡すことができるので、これはうまく機能します。しかし、悲しいことに、Telegramクライアントは_/info 123
_を完全なコマンドとしてではなく、_/info
_の部分だけと見なします。コマンド全体をコマンドとして認識させる方法はありますか?
Markdownを試してみました:[/info 123](/info 123)
ですが、喜びはありません。これは可能ですか?
私は同じ質問で@BotSupportに連絡しました、そして彼/彼ら/それは次の答えで迅速に答えました:
こんにちは。現時点では、コマンドのパラメータを強調表示することはできません。いずれにせよ、正しいカスタムキーボードを使用すれば、回避策を見つけることができるかもしれません;)— @BotSupport
カスタムキーボードは誰かにとってはオプションかもしれませんが、私にとってはそうではありません。私が行った解決策は、コマンドを/info123
として指定することです。ボットがすべての/
コマンドを受信したら、受信したコマンドがinfo
で始まるかどうかを確認し、開始する場合はinfo
の部分を削除します。残りのstring/intを引数に変換し、それを関連するコマンドに渡します。
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)
コマンドinfo
の引数として123
を渡すつもりで、たまたま python-telegram-bot を使用する場合は、次のようにします。
dispatcher.add_handler(CommandHandler('hello', SayHello, pass_args=True))
ドキュメントによると:pass_args
args
と呼ばれるキーワード引数としてコマンドに渡された引数をハンドラーに渡すかどうかを決定します。文字列のリストが含まれます。これは、単一または連続する空白で分割されたコマンドに続くテキスト文字です。デフォルトはFalseです。
これは、ユーザー入力から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