Я следовал этому руководству , чтобы создать бота Telegram на Python. В конце концов, я запустил его локально на своей машине с ngrok . Чтобы протестировать бота, я отправлял ему сообщения в Telegram, и он работал , так что это было хорошее руководство.
Однако теперь я хочу разместить бота в облаке, потому что я определенно не хочу, чтобы мой компьютер всегда включался с работающим терминалом.
Я читал в Интернете много учебных пособий о том, как разместить безсерверного бота Telegram. Я пытался разместить его в AWS Lambda, Heroku, Google Cloud Platform и Glitch.com. Но мне все еще не удалось успешно провести его. Всегда было что-то, что мешало мне его разместить: либо мой код не был принят должным образом, учебник не был достаточно описательным, либо я не понимал что-то важное.
Когда я следовал инструкциям, мне иногда приходилось адаптировать свой код к платформе, на которой я пытался разместить бота. Я все еще не мог заставить его работать.
Что я делаю не так? Как я могу успешно разместить своего бота Telegram, написанного на Python, в облаке (бесплатно)?
Это мой код:
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)