ReplyKeyboardMarkup 不起作用 python?

ReplyKeyboardMarkup doesn't work python?

我写了一个电报机器人。一切顺利,运作良好。但是当我想使用document中提到的ReplyKeyboardMarkup时,它不起作用!我的意思是键盘没有出现。

这个 JSON 对象有一个键 keyboard,根据它的文档,它的值是:

type: Array of Array of String.

description: Array of button rows, each represented by an Array of Strings

这是我发送请求的代码:

reply_markup = {'keyboard': [['1'],['2']], 'resize_keyboard': True, 'one_time_keyboard': True}
params = urllib.urlencode({
      'chat_id': str(chat_id),
      'text': msg.encode('utf-8'),
      'reply_markup': reply_markup,
      'disable_web_page_preview': 'true',
      # 'reply_to_message_id': str(message_id),
})
resp = urllib2.urlopen(BASE_URL + 'sendMessage', params).read()

您必须分别将 reply_markup 序列化为 JSON 字符串,就像这个答案

因为即使在阅读了 Kostya 链接到的 PHP 答案后,我仍然需要反复试验才能正确进入 Python,这里是经过改编的 Python 有效的代码(您只需要添加机器人的令牌和聊天 ID 即可将消息发送到)。

请注意,我还必须将我的 Telegram 客户端更新到最新版本(当前为 3.1)才能看到结果。

import urllib
import urllib2
import json


TOKEN = "<your bot token>"
chat_id = <your chat id>


msg = "some string"
BASE_URL = "https://api.telegram.org/bot{}/".format(TOKEN)

reply_markup = {'keyboard': [['1'],['2']], 'resize_keyboard': True, 'one_time_keyboard': True}
reply_markup = json.dumps(reply_markup)
params = urllib.urlencode({
      'chat_id': str(chat_id),
      'text': msg.encode('utf-8'),
      'reply_markup': reply_markup,
      'disable_web_page_preview': 'true',
      # 'reply_to_message_id': str(message_id),
})
resp = urllib2.urlopen(BASE_URL + 'sendMessage', params).read()

喜欢的可以试试这个方法

import telegram
from telegram.ext import Updater

updater = Updater(token='BOT_TOKEN')
dispatcher = updater.dispatcher
updater.start_polling()
def test(bot, update):
    results = bot.sendMessage(chat_id=update.message.chat_id, text="Test", reply_markup={"keyboard":[["Test1"], ["Test2"], ["Test3"], ["Test4"]})
    print results
dispatcher.addTelegramCommandHandler('test', test)

这个导入让事情变得更短,我今天才开始使用它python-telegram-bot 3.4

以下代码段将起作用:

reply_markup = {
    "keyboard": [[{"text":"1"}], [{"text":"2"}]], 
    "resize_keyboard": True, 
    "one_time_keyboard": True
}