如何在云端成功(免费)托管用Python编写的Telegram机器人?

时间:2018-11-05 19:57:01

标签: python cloud telegram telegram-bot serverless

我跟随this tutorial用Python创建了Telegram机器人。最后,我使用 ngrok 在计算机上本地运行了它。为了测试该机器人,我通过Telegram向它发送了消息,并且它起作用了,所以这是一个很好的教程。

但是,现在我想将Bot托管在云上,因为我当然不希望在运行终端的情况下始终打开PC。

我已经在网络上阅读了许多有关如何托管无服务器 Telegram机器人的教程。我曾尝试将其托管在AWS Lambda,Heroku,Google Cloud Platform和Glitch.com中。但是我仍然没有成功托管它。总是有一些原因使我无法托管它:我的代码未得到正确接受,本教程的描述性不足,或者我不了解重要的内容。

在遵循教程时,有时我不得不将我的代码调整为我试图托管该机器人的平台。我仍然无法使其正常工作。

我在做什么错? 我如何在云端成功(免费)成功托管用Python编写的Telegram机器人?

这是我的代码:

import requests
import os
from bottle import Bottle, response, request as bottle_request
from unidecode import unidecode

# get credentials
bot_url = os.environ['BOT_URL']


class BotChangei:


    def get_chat_id(self, data):
        chat_id = data['message']['chat']['id']
        return chat_id


    def get_message(self, data):
        message_text = data['message']['text']
        return message_text


    def send_message(self, prepared_data):
        """
        Prepared data should be json which includes at least `chat_id` and `text`
        """
        message_url = self.bot_url + 'sendMessage'
        requests.post(message_url, json=prepared_data)


class TelegramBot(BotChangei, Bottle):


    def __init__(self, *args, **kwargs):
        super(TelegramBot, self).__init__()
        self.route('/', callback=self.post_handler, method="POST")


    def is_vowel(self, letter):
        return unidecode(letter) in {'a', 'e', 'o', 'u'}


    def is_capital(self, letter):
        return unidecode(letter) in {'A', 'E', 'O', 'U'}


    def change_text_message(self, text):
        mutable_list = list(text)
        i = 0
        for letter in mutable_list:
            if self.is_vowel(letter):
                mutable_list[i] = 'i'
            elif self.is_capital(letter):
                mutable_list[i] = 'I'
            i += 1
        return "".join(mutable_list)


    def prepare_data_for_answer(self, data):
        message = self.get_message(data)
        answer = self.change_text_message(message)
        chat_id = self.get_chat_id(data)
        json_data = {
            "chat_id": chat_id,
            "text": answer,
        }

        return json_data


    def post_handler(self):
        data = bottle_request.json
        answer_data = self.prepare_data_for_answer(data)
        self.send_message(answer_data)
        return response


if __name__ == '__main__':
    app = TelegramBot()
    app.run(host='localhost', port=8080)

2 个答案:

答案 0 :(得分:0)

您可以让它在家里的计算机上运行,​​并使用ngrok(我最喜欢的服务)之类的服务。它有一个免费的层,可能适合您。

答案 1 :(得分:0)

Google Cloud免费为您提供$ 300的注册费用。我对ngrok不熟悉,但是我会尝试创建一个Google云帐户:

  1. 启动“计算引擎” VM实例
  2. SSH进入计算机,安装依赖项
  3. git clone(或任何您想做的)来获取 您在计算机上的项目并从命令行运行它

您可以对AWS EC2(而不是lambda)执行相同的操作-只需确保选择一个“免费套餐”机器映像-AWS每月就会为您提供750个小时的“免费套餐” EC2实例的免费时间。

不确定您对云计算有多熟悉,但您肯定希望了解AWS EC2或Google Cloud的“计算引擎”。这些使您可以在云中运行完全控制的文字计算机。如果您从未使用过SSH,则通常将其作为“陷阱”任务。 SSH登录后,您可以安装/运行所需的任何文件。

AWS的SSH指令:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

对于Google,启动虚拟机后,可以单击其旁边的“ SSH”,它允许您直接在网络浏览器中进行SSH(对于AWS,您必须下载用于启动EC2的私钥,然后从您的本地终端SSH进入。