Проблема с запросом на ввод данных пользователем от бота Telegram на Heroku

#python #heroku #telegram

Вопрос:

Я пытаюсь развернуть этого бота Telegram* на Heroku: https://github.com/radinshayanfar/TGCopyBot. Сначала боту необходимо войти в мою учетную запись, для чего требуется код входа, который отправляется на мои устройства, на которых я уже вошел в систему. При локальном запуске бота с терминала он запрашивает ввод у пользователя Enter code: , после чего я ввожу код входа в терминал и нажимаю Enter, и бот продолжает выполнять свою работу. Но после развертывания бота на Heroku и запуска dyno он выходит из строя, и это видно в журналах:

 2021-06-26T12:55:33.312544 00:00 app[worker.1]: Enter code:Traceback (most recent call last):
2021-06-26T12:55:33.312546 00:00 app[worker.1]:   File "/app/app/main.py", line 77, in <module>
2021-06-26T12:55:33.312729 00:00 app[worker.1]:     tg.login()
2021-06-26T12:55:33.312730 00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/telegram/client.py", line 493, in login
2021-06-26T12:55:33.312946 00:00 app[worker.1]:     result = actions[authorization_state]()
2021-06-26T12:55:33.312948 00:00 app[worker.1]:   File "/app/.heroku/python/lib/python3.9/site-packages/telegram/client.py", line 585, in _send_telegram_code
2021-06-26T12:55:33.313163 00:00 app[worker.1]:     code = input('Enter code:')
2021-06-26T12:55:33.313168 00:00 app[worker.1]: EOFError: EOF when reading a line
2021-06-26T12:55:33.373308 00:00 heroku[worker.1]: Process exited with status 1
2021-06-26T12:55:33.427790 00:00 heroku[worker.1]: State changed from up to crashed
 

Затем он может автоматически запустить бота снова, а затем аварийно завершить работу и вывести те же ошибки, что и выше. В чем здесь проблема и как ее можно исправить?

Если проблема заключается в запросе кода входа, то я получаю код входа на других своих устройствах, но как мне передать код входа боту? В более общем плане, как вы реагируете на запрос на ввод данных пользователем от любого бота, развернутого на Heroku?

*на самом деле это не Telegram-бот, созданный с помощью @BotFather; он просто использует инструменты разработки Telegram API

Ответ №1:

В вашей локальной среде встроенный input модуль работает нормально, потому что у вас есть доступ к терминалу и вы можете предоставить входные данные.

На Heroku такой опции нет, поэтому команда возвращает исключение ошибки EOF, так как функция попадает в условие конца файла (EOF), ничего не считывая.

Возможным решением может быть запрос пользователя на ввод login code через бота Telegram, например, в качестве первого шага после того, как пользователь начнет общаться в чате.

Ответ №2:

Похоже, проблема связана с запросом на ввод данных пользователем, и у пользователя нет прямого способа ввести что-либо на Heroku, как это было бы на терминале. Код может быть изменен, чтобы принять то, что в этом случае будет введено в качестве переменной среды, например, с помощью строки сеанса: https://docs.pyrogram.org/topics/storage-engines#session-strings, https://docs.telethon.dev/en/latest/concepts/sessions.html#string-sessions