如何在 google 云功能上使用 telegram webhook?

How to use telegram webhook on google cloud functions?

我已经在 google 云功能的 python 中使用 webhook 设置了一个电报机器人。基于来自互联网的一些示例代码,我让它作为一个简单的 echo-bot 工作,但是它的结构与我在使用长轮询之前编写的机器人有很大不同:

# main.py
import os
import telegram

def webhook(request):
    bot = telegram.Bot(token=os.environ["TELEGRAM_TOKEN"])
    if request.method == "POST":
        update = telegram.Update.de_json(request.get_json(force=True), bot)
        chat_id = update.message.chat.id
        # Reply with the same message
        bot.sendMessage(chat_id=chat_id, text=update.message.text)
    return "ok"

我不明白如何向其中添加更多的处理程序或不同的函数,特别是因为云函数需要我仅将 一个 函数命名为 运行脚本(在本例中为 webhook 函数)。

如何将上面的逻辑转换成下面我比较熟悉的逻辑:

import os

TOKEN = "TOKEN"
PORT = int(os.environ.get('PORT', '8443'))
updater = Updater(TOKEN)

# add example handler

def start(update, context):
        context.bot.send_message(chat_id=update.message.chat_id, text="Hello, I am dice bot and I will roll some tasty dice for you.")

    start_handler = CommandHandler('start', start)
    dispatcher.add_handler(start_handler)

# start webhook polling

updater.start_webhook(listen="0.0.0.0",
                      port=PORT,
                      url_path=TOKEN)
updater.bot.set_webhook("https://<appname>.herokuapp.com/" + TOKEN)
updater.idle()

此代码与长轮询具有相同的结构,因此我知道如何添加额外的处理程序。但是它有两个问题:

  1. 这是 heroku 文档中的代码片段,所以我不知道这是否适用于 google 云函数

  2. 这个 没有生成一个我可以在云函数中调用的函数,我尝试将上面的所有代码包装在一个大函数中 webhook 并且只是 运行 宁,但它不起作用(并且不会在我的 google 仪表板上产生错误)。

感谢任何帮助!

我通过在 App Engine 上设置电报机器人和使用 python 实现 webhook 发现了这个 github telebot repo from yukuku。如前所述,您可能希望使用 App Engine 以在同一个 main.py 文件中实现具有许多功能的机器人。

我刚刚试过了,它对我有用。

我做到了这是我的片段

from telegram import Bot,Update
from telegram.ext import CommandHandler,Dispatcher
import os

TOKEN = os.getenv('TOKEN')
bot = Bot(token=TOKEN)

dispatcher = Dispatcher(bot,None,workers=0)

def start(update,context):
  context.bot.send_message(chat_id=update.effective_chat.id,text="I am a bot, you can talk to me")


dispatcher.add_handler(CommandHandler('start',start))


def main(request):
  update = Update.de_json(request.get_json(force=True), bot)

  dispatcher.process_update(update)
  return "OK"

# below function to be used only once to set webhook url on telegram 
def set_webhook(request):
  global bot
  global TOKEN
  s = bot.setWebhook(f"{URL}/{TOKEN}") # replace your functions URL,TOKEN
  if s:
    return "Webhook Setup OK"
  else:
    return "Webhook Setup Failed"