Проблемы с запуском Telegram бота на Python на сервере sweb (библиотека pyTelegramBotAPI)
Пытаюсь организовать маленького бота, который будет проверять электронную почту через некоторые отрезки времени и при получении писем от определенного адреса будет присылать об этом уведомление в телеграм. Ранее бот тестово запускался из PyCharm абсолютно успешно. pyTelegramBotAPI на сервер был установлен (проверено через pip list). Предполагаю что для его корректной работы что-то еще может требоваться установить на сервер, но уже не могу определить что. На сервере используемом для запуска (sweb) установлен python 3.4 При попытке запуска бота на сервере в логе появляется запись:
Traceback (most recent call last):
File "/%адрес%/public_html/cgi-bin/bot.py", line 2, in <module>
import telebot
File "/%адрес%/.thecode/lib/python3.4/site-packages/telebot/__init__.py", line 866
e.args = e.args + (f'Typed middleware handler "{typed_middleware_handler.__qualname__}"',)
^
SyntaxError: invalid syntax
В похожем вопросе советовали взять токен в коде в кавычки - но в моем случае он и так в них. Прилагаю и сам код тоже, возможно ошибка все-таки именно в нем.
import telebot
import schedule, time
import imaplib
import email
from email.header import decode_header
bot = telebot.TeleBot("%тут_токен%");
def mail_check():
def bot_message(message_type):
bot.send_message(%тут_id_конкретного юзера%, message_type)
mail_pass = "%пароль%"
username = "%логин%"
imap_server = "%сервер%"
imap = imaplib.IMAP4_SSL(imap_server)
imap.login(username, mail_pass)
imap.select("INBOX")
last_message = imap.uid('search', "UNSEEN", "ALL")[-1][-1]
if last_message!=b'':
last_message_number = last_message.decode()
last_message_number_list = last_message_number.split()
for message_number in last_message_number_list:
bytes_message_number = message_number.encode()
res, msg = imap.uid('fetch', bytes_message_number, '(RFC822)')
msg = email.message_from_bytes(msg[0][1])
letter_from = msg["Return-path"]
if '%адрес%' in letter_from:
letter_subject = decode_header(msg["Subject"])[0][0].decode()
if 'Заявка' in letter_subject:
bot_message('Новая заявка')
elif 'КОРРЕКЦИЯ' in letter_subject:
bot_message('Коррекция заявки')
elif 'Аннуляция' in letter_subject:
bot_message('Аннуляция заявки')
else: pass
else: pass
else: pass
schedule.every(30).minutes.do(mail_check)
while True:
schedule.run_pending()
time.sleep(1)
Ответы (1 шт):
На сервере одновременно установлено несколько версий python (самая новая из них - 3.8), для запуска скрипта команду следовало формулировать точнее:
nohup python3.8 /%путь до файла скрипта%
Плюс была допущена ошибка при установке виртуального окружения - без уточнений в командах по дефолту был использован python 3.4. Соответственно pyTelegramBotAPI устанавливался под него, и теперь уже принудительно запускаемый на 3.8 скрипт библиотеку не находил. Было заново настроено виртуальное окружение по образцу из этой инструкции: https://help.sweb.ru/ustanovka-django_147.html Таким образом была решена возникшая проблема с библиотеками (теперь все работает без ошибок). Основная проблема была в версии python и точной формулировке команд именно для нее.
Отдельное спасибо хотелось бы выразить поддержке хостинга, помогшей разобраться в проблеме.