Python Telegram API ReplyKeyboardMarkup

时间:2018-06-04 11:48:36

标签: python-3.x telegram

我是python的新手。我试图在Telegram应用程序中向用户发送一个显示带有两个按钮的自定义键盘的响应,但它给出了关于编码的错误。

我想知道我的错误在哪里。

import json
from urllib.request import urlopen
from urllib.parse import quote, unquote
import time

def Decode(telegram_response):
    decoded=''
    for line in telegram_response:
        decoded=decoded+line.decode('utf-8')
    return decoded

TOKEN = 'mytoken'
URL = 'https://api.telegram.org/bot{}/'.format(TOKEN)
cmd = 'getme'

telegram_response = urlopen(URL + cmd)
decoded = Decode(telegram_response)
gtm = json.loads(decoded)

status = True
while status:
    cmd = 'getUpdates'

    telegram_response = urlopen(URL + cmd)
    decoded = Decode(telegram_response)
    upds = json.loads(decoded)

    new_message = len(upds['result'])

if new_message !=0:

    msg = upds['result'][0]['message']
    chat_id = str(msg['chat']['id'])


    reply_markup = {'keyboard': [[{'text':'first button'}],[{'text':'second button'}]], 'resize_keyboard': True, 'one_time_keyboard': True}
    reply_markup = json.dumps(reply_markup)

    params = ({'chat_id': chat_id, 'reply_markup': reply_markup, 'disable_web_page_preview': 'true'})
    myresponse =urlopen(URL + 'sendMessage' + quote((params).encode('utf-8')))

2 个答案:

答案 0 :(得分:0)

你可以这个代码:我希望对你有用。 我改变了:

params = ({'chat_id': chat_id, 'reply_markup': reply_markup, 'disable_web_page_preview': 'true'})
myresponse =urlopen(URL + 'sendMessage' + quote((params).encode('utf-8')))

使用:

params = ({'text': 'ss', 'chat_id': chat_id, 'reply_markup': reply_markup, 'disable_web_page_preview': 'true'})
data = urllib.parse.urlencode(params).encode("utf-8")
myresponse = urlopen(URL + 'sendMessage', data)

编译代码:

import json
import urllib
from urllib.parse import quote
from urllib.request import urlopen


def Decode(telegram_response):
    decoded = ''
    for line in telegram_response:
        decoded = decoded + line.decode('utf-8')
    return decoded


TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'
URL = 'https://api.telegram.org/bot{}/'.format(TOKEN)
cmd = 'getme'

telegram_response = urlopen(URL + cmd)
decoded = Decode(telegram_response)
gtm = json.loads(decoded)

status = True
while status:
    cmd = 'getUpdates'

    telegram_response = urlopen(URL + cmd)
    decoded = Decode(telegram_response)
    upds = json.loads(decoded)

    new_message = len(upds['result'])

    if new_message != 0:
        msg = upds['result'][0]['message']
        chat_id = str(msg['chat']['id'])
        reply_markup = {'keyboard': [[{'text': 'first button'}], [{'text': 'second button'}]], 'resize_keyboard': True,
                    'one_time_keyboard': True}
        reply_markup = json.dumps(reply_markup)

        params = ({'text': 'ss', 'chat_id': chat_id, 'reply_markup': reply_markup, 'disable_web_page_preview': 'true'})
        data = urllib.parse.urlencode(params).encode("utf-8")
        myresponse = urlopen(URL + 'sendMessage', data)

答案 1 :(得分:0)

构建强大的机器人的简便方法是使用python-telegram-bot库。

我用一些主要的修补程序和功能重新编写了您的代码。希望它可以帮助您更深入地学习机器人。

我的机器人版本:

###############################################################################
!#/usr/bin/python3

from sys import exc_info as error
from urllib.request import urlopen
from urllib.parse import urlencode
import json

TOKEN = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX'
URL = 'https://api.telegram.org/bot{}'.format(TOKEN)
STATUS = True
OFFSET = 0

def call_api_method(method='getMe', data=None):
  # Call API method with data.
  data = urlencode(data).encode("utf-8") if data else data
  response = urlopen('{}/{}'.format(URL, method), data)
  return json.loads(response.read())

def get_me():
  # Get bot info.
  bot = call_api_method()
  return type('Bot', (), dict(bot['result']))

def get_updates():
  # Get new updates from Telegram.
  data = {'offset': OFFSET, 'limit': 0, 'timeout': 0}
  return type('Updates', (), call_api_method('getUpdates', data))

def handle(update):
  # Make usefull objects.
  message = type('Message', (object,), dict(update['message']))
  user = type('User', (), dict(update['message']['from']))
  chat = type('Chat', (), dict(update['message']['chat']))
  return message, user, chat

def send_message(chat_id, message):
  # Send message to specific chat.
  data = {'text': message,
          'chat_id': chat_id,
          'parse_mode': 'Markdown',
          'disable_web_page_preview': True}
  call_api_method('sendMessage', data)

def send_keyboard(chat_id, message, keyboard):
  # Send message and keyboard to specific chat.
  data = {'text': message,
          'chat_id': chat_id,
          'parse_mode': 'Markdown',
          'reply_markup': reply_markup(keyboard),
          'disable_web_page_preview': 'true'}
  call_api_method('sendMessage', data)

def reply_markup(keyboard):
  # Serialize keyboard data to JSON.
  return json.dumps({'keyboard': keyboard,
                     'resize_keyboard': True,
                     'one_time_keyboard': True,
                     'selective': True})

def main_keyboard():
  # Main menu.
  return [first_button(), second_button()]

def one_line_keyboard():
  # Menu with buttons in one line.
  return [two_buttons()]

def first_button():
  # Single keyboard button.
  return ['first button']

def second_button():
  # Single keyboard button.
  return ['second button']

def two_buttons():
  # Two buttons on one line.
  return ['left button', 'right button']


while STATUS:
  # Get updates forever. Except if get Error.
  try:
    if not OFFSET:
      OFFSET = 1
      # Print bot info on the start.
      bot = get_me()
      print('Bot @{} is running...'.format(bot.username))

    updates = get_updates()

    for update in updates.result:
      # Handle last update.
      OFFSET = update['update_id'] + 1
      message, user, chat = handle(update)

      # Greeting user by full name.
      greeting = 'Hello, {} {}!'.format(user.first_name, user.last_name)

      #send_message(chat.id, greeting)
      send_keyboard(chat.id, greeting, one_line_keyboard())
  except:
    STATUS = False
    print('\nERROR:\t', error()[1])

###############################################################################