Бот для загрузки файлов в Телеграмм питон

В статье пойдет речь о запуске платформы на базе Telegram бота, предназначенной для взаимодействия с самыми разными сервисами, например с GitHub и Яндекс.Метрикой.

Платформа позволяет создавать плагины для работы с каждым из них. Вы сможете в один клик настроить оповещения о коммитах, pull-реквестах, закрытии issues из каждого репозитория в нужный чат и установить внешний вид этих оповещений. Вы даже можете попросить бота присылать вам свежую статистику из Яндекс.Метрики в удобное для вас время. Мы в команде CodeX используем данное решение уже несколько месяцев и не представляем себе, как можно было работать без этого.

Для взаимодействия с ботом вы можете воспользоваться нашим облачным решением или установить бота самостоятельно на своем сервере.

Облачное решение

Запуск бота на своем сервере

Для запуска CodeX.bot вам потребуется выполнить следующие действия:

  • установить дополнительные библиотеки для языка Python
  • клонировать наш репозиторий с кодом бота
  • зарегистрировать нового бота в Telegram
  • отредактировать файл конфигурации

Установка дополнительных библиотек

CodeX.bot написан на языке Python с использованием некоторых дополнительных библиотек. Вам нужно установить их, прежде чем начать работу:

Как скачивать файлы с помощью Python

Клонирование репозитория с кодом

Клонировать репозиторий CodeX.bot можно выполнив команду:

git clone [email protected]:codex-team/codex.bot.git

Для работы системы вам понадобится создать Telegram бота. Просто следуйте инструкции из статьи или официального руководства.

Конфигурация

Теперь вам необходимо настроить конфигурацию системы. Для этого переименуйте директорию local.sample в local и отредактируйте содержимое файла config.py в соответствии с вашими предпочтениями:

SERVER_HOST — адрес вашего сервера. Если вы пользуетесь прокси ngrok, он будет выглядеть приблизительно так: ‘http://9b812f5d.ngrok.io’. LOCAL_SERVER_PORT — порт, на котором будет запущен ваш локальный сервер. LOGS_FILENAME — адрес файла для логов. По умолчанию равен ‘logs/logs.log’. SSL_CERTIFICATE — содержимое SSL сертификата сервера. По уполчанию равен None. API_TOKEN — токен вашего Telegram бота через которого будет работать система. TELEGRAM_CALLBACK_URL — адрес, по которому CodeX.bot будет обрабатывать все сообщения от Telegram. Например: ‘https://9b812f5d.ngrok.io/telegramcallback’.

Установка Telegram Webhook

Telegram позволяет установить webhook для ботов. Это нужно для того, чтобы при каждом сообщении, отправленном в чат с ботом, Telegram устанавливал соединение с вашим сервером и передавал ему JSON с текстом и сервисной информацией. Поскольку Telegram работает только по протоколу HTTPS, вам понадобится SSL сертификат. Если у вас есть доверенный сертификат, то ничего дополнительно настраивать не придется, в случае использования самоподписанного сертификата, его нужно будет отправить при установке вебхука.

Сгенерировать сертификат можно следующей командой:

openssl req -new -x509 -nodes -newkey rsa:1024 -keyout server.key -out server.crt

Далее, openssl предложит вам заполнить несколько полей информации, важно указать поле FQDN равное адресу хоста-callback’а.

Для установки вебхука можно воспользоваться пакетом python-telegram-bot для Python.

import telegram TOKEN = » HOST = » # Параметр FQDN сертификата должен совпадать с данным адресом PORT = 8443 CERT = ‘path/to/ssl/server.crt’ bot = telegram.Bot(TOKEN) bot.setWebhook(webhook_url=’https://%s:%s/%s’ % (HOST, PORT, TOKEN), certificate=open(CERT, ‘rb’))

К счастью, CodeX.bot сделает установку вебхука за вас, если в настройках ему передать соответствующий параметр. Например:

SSL_CERTIFICATE = open(«/path/to/ssl/server.crt», ‘rb’)

Структура файловой системы

В файле local/db.py содержатся настройки базы данных, где CodeX.bot хранит всю необходимую информацию. По умолчанию у вас будет использоваться SQLite.

В файле components/core.py вы можете найти несколько глобальных функций, которые используются всеми компонентами системы:

  • send_to_chat — отправка сообщений в Telegram чат.
  • generate_hash — генерация уникальных идентификаторов для пользователей и чатов.
  • bgcolors — для вывода отладочной информации в консоль.

В файле main.py содержится код запуска системы. Запуск выполняется в следующем порядке:

  • Подключение файла вывода логов.
  • Установка вашего сервера в качестве webhook для Telegram бота.
  • Загрузка плагинов, описанных в глобальной конфигурации.
  • Запуск веб-сервера, получающего оповещения от Telegram бота.

В файле modules/core/server.py находится код веб-сервера, который обрабатывает сообщения от Telegram и передает их нужным плагинам, вызывая у них метод telegram_command:

Разработчик плагина сам устанавливает какие команды обрабатывать. Например, модуль ответственный за Github оповещения принимает команду /github_start примерно так:

def telegram_command(self, message): if ‘/github_start’ in message.text: .

Плагин может самостоятельно принимать оповещения от сторонних сервисов в специальном методе set_rules:

def __init__(self): self.module_name = ‘github’ self.uri_prefix = ‘/github’ def set_rules(self, app): app.add_url_rule(‘%s/test’ % self.uri_prefix, ‘%s_test’ % self.module_name, test) app.add_url_rule(‘%s/’ % self.uri_prefix, ‘%s_callback’ % self.module_name, callback, methods=[«POST»])

Подробнее работу основных плагинов рассмотрим в следующей статье.

Еще по теме:  Как настроить велком бот в Телеграм

If you like this article, share a link with your friends

Read more

We talk about interesting technologies and share our experience of using them.

Источник: codex.so

Пишем Telegram Bot на Python

Python – язык программирования высокого уровня, который появился сравнительно недавно. Однако его простота и легкий синтаксис уже сделали язык лидером в программировании. Многие предпочитают Python для создания Telegram Bot.

Что требуется для создания бота

  1. Среда программирования Python.
  2. Если у вас установлена версия до 3.4, то следует скачать Gid и Pip. Первое – система управления версиями, второе – система управления пакетами Python. Pip позволяет устанавливать пакеты из командной строки.
  3. Регистрация на GitHub.com
  4. Регистрация на сервере Heroku.com.

Последние два позволят развернуть бот в сети.

Создаем бота

В результате вы получите токен – символьно-числовую последовательность, уникальную для каждого бота Telegram. Именно с помощью этого идентификатора отправляются запросы на сайт https://api.telegram.org.

Каждый запрос имеет вид:

Методы описаны в документации к Telegram Bot API и являются стандартными. Задача программиста при написании бота заключается в создании кода, который получает сообщения от пользователя и отправляет команду боту на выполнение действий. Запрос может выглядеть следующим образом:

Это пример отправки сообщения для клиента Telegram. Обязательно необходимо знать параметр id_chat – это идентификатор чата. Узнать его можно из ответа, который присылает сервер, который имеет вид JSON-строки:

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

Пишем бота для Telegram на Python

Сначала создадим программный код. Необходимо установить Python и среду разработки.

  1. Скачайте Python с официального сайта https://www.python.org/downloads/
  2. Установите, обязательно указав «Add Python to Path».
  3. Проверьте установку, открыв командную строку и набрав pip. Должен появится справочный материал по pip.

Откройте среду программирования IDLE. Это делается через пуск, в главном меню ищите раздел с установленным Python и выбирайте нужную команду. Отроется окно. Создайте в нем новый файл и вставьте программный код бота Telegram на Python.

import requests
import datetime
#Установка адреса бота
url = https://api.telegram.org/bot507226896:AAGT_fsEO1milOkqbNp-VolQDJ0tGjaPvD7/
#Поиск последнего сообщения из массива чата с пользователем Telegram.
def lastUpdate(dataEnd):
res = dataEnd[‘result’]
totalUpdates = len(res) — 1
return res[totalUpdates]
#Получение идентификатора чата Telegram
def getChatID(update):
chatID = update[‘message’][‘chat’][‘id’]
return chatID
#отправка запроса sendMessage боту
def sendResp(chat, value):
settings =
resp = requests.post(url + ‘sendMessage’, data=settings)
return resp
#Get-запрос на обновление информации к боту. Результат – строка json. Метод .json позволяет развернуть ее в массив
def getUpdatesJson(request):
settings =
response = requests.get(request + ‘getUpdates’, data=settings)
return response.json()
#Главная функция
def main():
chatID = getChatID(lastUpdate(getUpdatesJson(url)))
sendResp(chatID, ‘Ваше сообщение’)
updateID = lastUpdate(getUpdatesJson(url))[‘update_id’]
#Бесконечный цикл, который отправляет запросы боту на получение обновлений
while True:
#Если обновление есть, отправляем сообщение
if updateID == lastUpdate(getUpdatesJson(url))[‘update_id’]:
sendResp(getChatID(lastUpdate(getUpdatesJson(url))), ‘проба’)
updateID += 1
sleep(1)
#Запуск главной функции
if __name__ == ‘__main__’:
main()

Python чувствителен к пробелам и табуляции, поэтому выполните Format-Untabify Region.

Запустите здесь же в среде разработки. В созданном боте Telegram должно появиться сообщение «Ваше сообщение Проба».

Разворачиваем проект на сервере

Самое сложное – заставить наш проект для Telegram работать на сервере. Мы воспользуемся бесплатным сервисом Heroku.

  1. Устанавливаем окружение, набирая pip install pipenv – ее надо набрать в командной строке.
  2. Регистрируемся на Heroku.com
  3. Устанавливаем интерфейс командной строки Heroku (CLI)
    https://devcenter.heroku.com/articles/getting-started-with-python#set-up
  4. В командной строке набираем Heroku и Enter
  5. Вводим адрес электронной почты, с которым регистрировались на сервере, и пароль, придуманный при регистрации
  6. Создаем папку. Ее лучше создать в папке с Python. Для примера создадим папку run
  7. Набираем virtualenv run , чтобы инициализировать в ней virtualenv.
  8. Регистрируемся на github.com и создаем свой репозиторий
  9. Переходим в папку run с помощью cd run
  10. Клонируем репозиторий git командой git clone https:/github.com/ВАШЕ_ИМЯ/ВАШ РЕПОЗИТОРИЙ . ВАШЕ_ИМЯ – имя пользователя на github
  11. Скопируйте скрипт в папку созданного репозитория (она появится в run)
  12. Зайдите в папку run/scripts , чтобы запустить файл activate.bat. Если он сработал успешно, то перед адресом в командной строке будет стоять название вашей папки. Например,
  13. Перейдем в папку run , затем в папку репозитория с помощью команды cd
  14. Установим модуль requests. Наберем pip install requests
  15. Чтобы создать зависимость введите pip freeze > requirements.txt
  16. В папке run создайте файл Procfile или Procfile.windows (для Windows) и сохраните в нем строку web: python bot.py, где bot.py – имя вашего файла с программой для бота
  17. В папке репозитория создайте файл __init__.py. Он будет пустым

Далее последовательно набирайте в командной строке

Вы увидите сообщение об инициализации пустого репозитория.

Внимание, после add пробел и точка! Добавляет файлы в локальный депозиторий.

Выполнение команды занимает некоторое время, необходимо подождать.

Еще по теме:  Как сделать файл без сжатия в Телеграмме

git commit -m ‘short message that describe changes to commit’
Фиксирует изменения в репозитории.
git push -u https://github.com/ИМЯ_ПОЛЬЗОВАТЕЛЯ/ИМЯ_РЕПОЗИТОРИЯ
Позволит развернуть проект на github.

Затем выполните команды:

heroku create имя проекта

В результате вы получите адрес вашего проекта, например, runbot.herokuapp.com.

git push heroku master

Ждем окончания процесса компиляции проекта.

heroku ps:scale web=1
heroku open

Последняя команда откроет ваше приложение на сервере. Бот на Питоне для Телеграмма начнет свою работу.

На сайте с документацией можно посмотреть другие Telegram Bot примеры на Python.

Источник: telegramzy.ru

Как написать Telegram бота: практическое руководство

6 Апрель 2016 , Python, 454196 просмотров, How To Create a Telegram Bot Using Python

В последнее время Telegram у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной из основных «фишек» Telegram является его якобы защищённость — по словам Павла Дурова вся переписка между пользователями шифруется. Более того, ни одна спец.служба мира не будет иметь доступ к вашим сообщениям. Но в данной статье речь не об этом. Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода Telegram ботах (github бот, например), мессенджер открыл своё API для разработчиков, и теперь каждый может создать своего собственного бота с блэкджеком и плюшками.

В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы «запилим» полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.

Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую Python библиотеку, реализующую все основные функции ботов — telepot. Как я уже упоминал ранее, для того, чтобы обслуживать пользователей нашего бота мы будет разрабатывать веб-приложение, используя Django фреймворк.

Как создать Telegram бота?

Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:

  • Необходимо установить приложение Telegram на телефон или компьютер. Скачать приложение можно тут
  • Добавляем к себе в контакт-лист бота с именем BotFather
  • Запускаем процедуру «общения» с ботом нажатием кнопки Start. Далее перед нами предстанет список команд точно как на скриншоте.
  • Для того, чтобы создать нового бота необходимо выполнить команду /newbot и следовать инструкциям. Обратите внимание, что username для бота должен всегда содержать в конце слово bot. Например, DjangoBot или Django_bot.

Telegram bot

  • Для нашего бота я выбрал имя PythonPlanetBot, так как его основная функция заключается в парсинге RSS feed сайта Python Planet и выдача информации о последних постах пользователю 🙂

Python Planet бот

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

Use this token to access the HTTP API:

За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:

  • Присвоить боту описание
  • Установить аватар
  • Поменять token

и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.

Приступаем к кодированию

Как я ранее уже упоминал, мы будем писать веб-приложение на Django. Но стоит отметить, что это делать необязательно. Можно обойтись и обычным Python скриптом, правда в этом случае необходимо будет периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates) и увеличивая offset для получения самых последних данных без повторений. В Telegram существует два взаимоисключающих метода получения команд/сообщений для вашего бота.

  • Использование вызова API метода getUpdates
  • Установка Webhook

Установка Webhook заключается в передаче боту специального URL адреса на который будет поступать POST запрос каждый раз, когда кто-то начнёт посылать сообщения боту. Именно этот вариант мы и будем использовать для взаимодействия между ботом и его пользователем. Для того, чтобы задать URL, необходимо использовать API метод setWebhook. Отмечу, что URL должен начинаться с https, то есть иметь защищённое SSL соединение с валидным сертификатом. Telegram разрешает использовать самоподписанный сертификат, правда для этого необходимо в методе setWebhook передавать также публичный ключ в PEM формате (ASCII base64). Либо же можно получить валидный бесплатный SSL сертификат от Let’s Encrypt.

Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.

Итак, вернёмся к python библиотеке для работы с Telegram — telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:

pip install telepot

Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:

import telepot token = ‘123456’ TelegramBot = telepot.Bot(token) print TelegramBot.getMe()

Еще по теме:  Как разлогинитьсч в телеграии приложентт

Переменной token присваиваем значение токена, полученного при создании бота через BotFather. В итоге после выполнения этих команд мы получим:

Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.

Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

Telegram Bot

TelegramBot.getUpdates() [, u’message_id’: 1, u’chat’: >, u’update_id’: 649179764>]

Процесс общения с telegram ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список/массив из объектов типа Update. Внутри Update находится объект Message. Для стандартного взаимодействия с ботом нас фактически интересует именно объект Message, у которого мы считываем атрибут text, хранящий в себе текст, переданный боту и объект chat, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве offset параметра при вызове метода getUpdates. То есть update_id+1 вернёт все сообщения, поступившие после последнего update_id, при этом все предыдущие сообщения будут удалены.

TelegramBot.getUpdates(649179764+1) [, u’message_id’: 13, u’chat’: >, u’update_id’: 649179765>]

На этапе написания простейшего Telegram бота нам этих вызовов достаточно. Приступим к написанию Django приложения для обслуживания наших пользователей.

Простая функция парсинга RSS фида Planet Python выглядит вот так:

# -*- coding: utf8 -*- from xml.etree import cElementTree import requests def parse_planetpy_rss(): «»»Parses first 10 items from http://planetpython.org/rss20.xml «»» response = requests.get(‘http://planetpython.org/rss20.xml’) parsed_xml = cElementTree.fromstring(response.content) items = [] for node in parsed_xml.iter(): if node.tag == ‘item’: item = <> for item_node in list(node): if item_node.tag == ‘title’: item[‘title’] = item_node.text if item_node.tag == ‘link’: item[‘link’] = item_node.text items.append(item) return items[:10]

Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django «вьюшка» выглядит следующим образом:

CommandReceiveView ждёт POST запрос на себя, парсит его и отвечает исходя из заданной команды. Полноценное Django приложение можно найти по этой ссылке. Стоит отметить в коде использование ещё одного API вызова — sendMessage. Этот метод отправляет сообщение заданному пользователю, используя при этом chat_id и сам текст сообщения. Chat_id — это уникальный идентификатор чата между пользователем и ботом (его идентификатор есть в ответе на запрос getUpdates). У Telegram ботов есть одно ограничение, они не могут посылать сообщения пользователям, которые предварительно не инициировали общение с ним. По-видимому это сделано дабы избежать массового создания спам-ботов.

Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь 🙂

Итак, веб-приложение на Django запущено. Как же начать тестировать бота? А всё очень просто — необходимо симулировать действия Telegram сервиса. Для этого нам понадобится HTTP клиент и тело запроса. В качестве HTTP клиента я часто использую Chrome плагин под названием Postman, а тело запроса мы возьмём напрямую из данных, полученных с помощью API вызова getUpdates.

После запуска runserver, URL на который необходимо посылать запрос выглядит следующим образом:

http://127.0.0.1:8000/planet/b. BOT_TOKEN/

где BOT_TOKEN — это токен нашего бота. Смотрим скриншот:

Postman REST Client

telegram-bot-postman

А давайте-ка отправим команду feed для получения списка новостей из Planet Python:

Postman и TelegramPostman и Telegram

На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.

Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.

Присоединяйтесь к рассылке

Понравился контент? Пожалуйста, подпишись на рассылку.

Интересные записи:

  • Введение в logging на Python
  • FastAPI, asyncio и multiprocessing
  • Что нового появилось в Django Channels?
  • Pyenv: удобный менеджер версий python
  • Работа с MySQL в Python
  • Celery: начинаем правильно
  • Обзор Python 3.9
  • Django Channels: работа с WebSocket и не только
  • Почему Python?
  • Руководство по работе с HTTP в Python. Библиотека requests
  • Разворачиваем Django приложение в production на примере Telegram бота
  • Python-RQ: очередь задач на базе Redis
  • Авторизация через Telegram в Django и Python
  • Работа с PostgreSQL в Python
  • Введение в pandas: анализ данных на Python
  • Django, RQ и FakeRedis
  • Итоги первой встречи Python программистов в Алматы
  • Обзор Python 3.8
  • Участие в подкасте TalkPython
  • Строим Data Pipeline на Python и Luigi
  • Видео презентации ETL на Python

Источник: khashtamov.com

Рейтинг
( Пока оценок нет )
Загрузка ...