Python

Python + Telegram = bot

Решил немного погрузиться в изучение Python, в процессе поставил задачу отойти от стандартного Hello World и попытаться написать сразу простого бота для Telegram. В итоге, бот может отвечать на заданные фразы, присылать внешний ip адрес и делать снимок с камеры. Скажу сразу, код не идеальный, но в процессе отладки ни один котик не пострадал.

Для начала сразу оговорюсь писать будем на Python версии 3 и будем использовать модули для облегчения жизни нашего проекта.

Пишем мы на Ubunru 19.10, поэтому надо учитывать, что есть две версии установленного Python.

Установим PIP и необходимые пакеты:

PIP – система управления пакетами, которая используется для установки и управления программными пакетами.

pytelegrambotapi – нужен для работы с API Telegram

PySocks – прокси сервер, иначе бот не будет работать.

Как было указано выше, пишем мы на Ubuntu, поэтому в директории пользователя /home/users-name/ создаем файлы bot-file.py и config.py

Файл bot-file содержит код бота, а файл config необходим для конфигурации бота. В конфигурации необходимо будет указать список пользователей, которым разрешено взаимодействие с ботом.

Начнем с файла конфигурации, там все просто, необходимо просто указать id пользователя Telegram.

Переходим к файлу бота.

Разберем некоторые интересные моменты, на которые следует обратить внимание.

Прокси

В данном примере используется Socks 5 прокси:

Достаточно указать свои данные и запустить бот.

Token ID

В начале пытался брать Token из файла конфигурации, но бот так и не запустился. Пришлось оставить в коде, поэтому Token бота вписывать придется в сам код.

Авторизация

Для проверки пользователя используется функция проверки id пользователя из файла конфигурации. В случае успеха бот присылает сообщение и стикер, тоже самое в случае отказа.

Клавиатура

Красивые кнопочки любят все. 🙂

Второй горизонтальный ряд добавляется легко, просто пишем снова – keyboard1.row.

Прием документов и фотографий

Бот умеет сохранять документы и фотографии, которые скачиваются в папку received. Папку предварительно необходимо будет создать в профиле пользователя, где создавали файлы бота и файла конфигурации.

Wget

С вопросом получения картинки с камеры и внешнего ip адреса пришлось повозить подольше. Но в итоге через папку temp и вызов через bash wget все получилось.

Планировщик crontab

Бот запускается через планировщик задач, каждые пять минут происходит проверка запущенного процесса. Так как бот использует прокси и может произойти обрыв канала интернет, то повторный запуск бота не сможет произойти.

Для начала необходимо точно определить где и какая версия Python установлена.

В моем случае Python версии 3.7, поэтому в файле я буду указывать именно его.

Создаем bash скрипт для crontab

Не забываем проверить пути до бота и Python.

Делаем файл исполняемым:

Открываем планировщик и вносим задачу:

Делал под пользователем, не под root.

Проверить запустился ли бот, можно командой:

Должен будет выдать номер запущенного процесса, если строка пустая, то бот не запущен.

Заключение

В итоге получили бота, который в случае чего может и документ принять и фоточку с камеры наблюдения прислать. В интернете полно статей на данную тематику, есть и powershell боты и другие. Но мне было интересно решить именно такую задачу. В процессе эксплуатации буду наращивать потенциал бота.

Файлы примера бота можно скачать тут: python-bot

Если есть замечания по коду и его оптимизации, то буду рад вашим комментариям. Так как тема для меня слишком новая и код скорее всего далек от идеала!

8 комментариев

  • Виктор

    Фрагмент кода бота
    owm = pyowm.OWM(config.tokenOWM,language = “RU”) # Передаём токен из файла config.py
    bot = telebot.TeleBot(config.token) # Передаём токен из файла config.py
    apihelper.proxy = {‘https’:config.proxy} # Передаём Proxy из файла config.py

    фрагмент файла config.py:
    token = ’72xxxxx14:AAEX_qCfxsmZxxxxxxxxxxxxxNM64ScjLPw’
    tokenOWM = ‘c86xxxxxxxxxxxxxxxxxxxxxxa9be9’
    proxy = ‘socks5h://gggggg:sssssssss@212.xx.xx.xxx:7xxx7’

    Расположение (порядок) не играет роли

  • Виктор

    Здравствуйте!

    При использовании вашего bash скрипта обнаружил множественный запуск процессов с ботом. Задал этот вопрос на qna.habr.com (ссылка: https://qna.habr.com/q/709483) и мне подсказали что скрипт в данном случае должен быть таким:
    #!/bin/bash
    if pgrep -f “/usr/bin/python3.6 /home/usertest/bot.py” >&/dev/null
    then {
    echo “Exit! Python bot is already running!”
    exit 1
    }
    else
    {
    sleep 1 #delay
    /usr/bin/python3.6 /home/usertest/bot.py
    exit 0
    }
    fi;
    Но я немного по другому его использую, а именно без указания “/usr/bin/python3.6” :
    #!/bin/bash
    if pgrep -f “/home/usertest/bot.py” >&/dev/null
    then {
    echo “Exit! Python bot is already running!”
    exit 1
    }
    else
    {
    sleep 1 #delay
    /usr/bin/python3.6 /home/usertest/bot.py
    exit 0
    }
    fi;

  • Давид

    Здравствуйте, не могли бы вы подсказать, как настроить callback_data с apihelper?
    Запускаю программу подобную вашей, но с кнопками дающими обратную связь и появляется ошибка:
    (__init__.py:420 MainThread) ERROR – TeleBot: “A request to the Telegram API was unsuccessful. The server returned HTTP 400 Bad Request. Response body:
    [b'{“ok”:false,”error_code”:400,”description”:”Bad Request: can\’t parse reply keyboard markup JSON object”}’]”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку Отправить комментарий Я даю согласие на обработку персональных данных.