Как сделать чтобы бот отправлял картинку python telegram
Есть несколько разных платформ, которые позволяют создать свой собственный четко. Одним из них, что, возможно, самое простые в использовании и также становится неуклонно популярностью, является Телеграмма Отказ
Мы будем использовать Python, чтобы включить наш бот и SQLite для постоянного хранения информации на сессиях. Таким образом, это учебная серия, которая будет:
- Покажите, как написать простой эхо-бот с нуля с помощью Python и Telegram Bot API (часть 1)
- Продлить эхо-бот в бот менеджера списка TodDo, поддерживаемый SQLite База данных (часть 2)
- Покажите, как запустить наш бот из VPS и позвольте ему масштабировать для большего количества пользователей (часть 3).
Что вам нужно
Вам нужно будет иметь:
- Некоторые Основные знания Python Чтобы следовать этому руководству
- Вам должно быть комфортно с запущенными командами в оболочке Linux, клемма MacOS или командной строки Windows
- Вы должны быть в состоянии установить пакеты Python, используя диспетчер пакетов PIP (или CONDA, если вам удобнее с этим)
- В идеале вы должны были написать хотя бы базовое заявление SQL ранее, но это не является строго необходимым (и будет иметь отношение только в части 2).
Весь код предназначен для Python 3.5, но его следует легко адаптировать к другим версиям Python.
Почему python?
Установка
Если вы обычно используете виртуальную среду для новых проектов Python, затем сначала установите один из них и установите запросы внутри этого.
Создание бота телеграммы
Бот отец теперь попросит вас выбрать имя пользователя для своего бота. Это имя пользователя должно закончиться бот и быть во всем мире уникальным. Когда телеграмма стала более популярной, она стала сложнее найти краткое и соответствующее имя пользователя для вашего бота. В этом руководстве мы будем использовать ExampletoDo_bot , но для остальной части этого учебника мы укажем имя пользователя BOT с <Ваш-бот-имя пользователя> Итак, вам придется заменить выбранное имя пользователя там, где нет необходимости. Отправьте выбранное имя пользователя на Бот Отец:
Для остальной части этого учебника мы укажем, где вам нужно поставить свой токен, используя <Ваш-боттон> Отказ
Обратите внимание на токен, так как нам понадобится в код, который мы собираемся написать.
Взаимодействуя с нашим ботом через ваш веб-браузер
Написание кода Python для нашего бота
Теперь мы можем добраться до написания Python. Создать файл эхобот.пи и добавьте следующий код:
Давайте потянемся, что делает этот код:
Следующие две строки являются глобальными переменными, где мы определяем токен нашего бота, который нам нужно аутентифицироваться с API Telegram, и мы создаем основной URL-адрес, который мы будем использовать во всех наших запросах на API.
get_url Функция Просто загружает контент с URL и дает нам строку. Мы добавляем .DeCode («UTF8») Часть для дополнительной совместимости, поскольку это необходимо для некоторых версий Python на некоторых платформах. Обычно мы проводим некоторое заправка с исключением здесь, так как этот запрос может потерпеть неудачу, если на нашем интернет-соединении сокращаются, если бы служба телеграммы не появилась, или если бы возникла проблема с нашим токеном. Однако для простоты здесь мы просто предполагаем, что все всегда работает (TM).
get_json_from_url Функция получает строковый ответ, как указано выше и анализирует это в словаре Python, используя json.loads () ( Нагрузки коротко для загрузки строки). Мы всегда будем использовать этот, поскольку Telegram всегда даст нам ответ JSON.
Недостатки с нашим ботом
Теперь мы обновим наш бот:
В верхней части файла добавьте новый импорт для Python время модуль
И изменить последние две строки файла, чтобы прочитать следующим образом:
Измените наш бот следующим образом:
- Добавьте функцию, которая рассчитывает наивысший идентификатор всех обновлений, которые мы получаем от GetUpDates. Это должно выглядеть следующим образом.
- Обновите код в Главная () Так что это выглядит так:
Обратите внимание, что мы должны проверить, есть ли новые обновления (которые мы делаем на третьей строке Main () ), и что мы должны всегда отправлять идентификатор обновления, который является одним из них, как предыдущий, который мы видел (т.е. мы на самом деле говорим телеграмму, которую ID мы ожидаем, а не какой мы видели).
Используя длинный опрос
Чтобы наш код использовать длинный опрос, просто обновите наши get_uppdates Способ следующим образом:
Теперь мы всегда проходим вдоль Тайм-аут аргумент Потому что у нас сейчас есть два аргумента, нам также нужно менять, где мы ранее имели ? Offset = <> к & Offset = <> (В URL-адресах мы указываем, что список аргументов начинается с A ? Но дальнейшие аргументы разделены с & ).
Добавьте следующую строку в верхней части вашего файла .py
И теперь измените send_message Функция для чтения следующим образом:
Конец части 1
Представьте, что у вас есть бот в мессенджере, который присылает вам случайно выбранную картинку с собачкой, когда вам захочется. Звучит здорово, да? Давайте сделаем такого.
В этом уроке мы будем использовать Python 3, библиотеку python-telegram-bot и публичный API RandomDog.
В конце урока у вас будет свой бот для снятия стресса, который будет присылать вам милых пёсиков, когда захотите.
Перед тем как писать программу, нам нужно сгенерировать токен для нашего бота. Токен понадобится для доступа к API Telegram’а, и установки необходимых зависимостей.
1. Создаём нового бота в BotFather
Если вы задумали со з давать бота для Telegram, сначала его нужно зарегистрировать, перед тем как использовать. Когда вы регистрируете бота, вы получаете токен для доступа к API Telegram’а
2. Устанавливаем библиотеку
Команда для установки библиотеки:
Если всё прошло гладко, то можно двигаться дальше.
Наш бот должен возвращать изображение с пёсиком, когда мы отправляем команду /bop . Генерировать случайные изображения, нам поможет публичным API от RandomDog.
Рабочий процесс нашего бота очень прост:
1. Импорт библиотек
Для начала импортируем все нужные библиотеки.
2. Доступ к API и получение URL изображения
Давайте создадим функцию для получения URL. Используя библиотеку запросов, мы можем обратится к API и получить json данные.
Оформим этот код в виде функции get_url() .
3. Отправляем картинку
Получить URL изображения можно вызвав функцию get_url() .
Чтобы получить ID получателя, используйте этот код:
Оберните код в функцию bop и убедитесь, что код выглядит следующим образом:
4. Основная программа
И наконец, создайте ещё одну функцию с именем main , чтобы запускать программу. Не забудьте заменить YOUR_TOKEN на токен, который вы сгенерировали ранее.
В итоге, ваш код должен выглядеть вот так:
5. Запуск программы
Отлично! Мы почти закончили. Давайте проверим работу программы. Сохраните файл и назовите его main.py . Теперь её можно запускать, командой:
Отлично! Теперь у вас есть работающий бот.
Есть ещё кое-что. API RandomDog генерирует не только изображения, но ещё видео и гифки. Мы не сможем получить видео или GIF от API, потому что произойдёт ошибка.
Давайте это исправим, чтобы бот отправлял нам только изображения. Если нам попадётся видео или GIF, мы снова будем вызывать API, пока не получим изображение.
1. Проверяем расширение файла с помощью регулярного выражения
Чтобы решить эту проблемы, мы будем использовать регулярное выражение.
Отличить изображение от видео или GIF, можно по расширению файла. Нам понадобится последняя часть URL.
Во-первых, необходимо определить, какие расширения файлов допускаются в нашей программе.
Затем использовать регулярное выражение, чтобы извлечь расширение файла из URL.
Создайте функцию get_image_url() , используя этот код. Она будет перебирать URL, пока вы не получите файл с подходящим расширением (jpg, jpeg, png).
2. Модифицируем код
Отлично! Теперь нам осталось заменить строку url = get_url() в функции bop() на url = get_image_url() . Ваш код должен выглядеть так:
Всё должно работать идеально. Этот код можно найти на моём GitHub.
Поздравляю с окончанием урока, теперь у вас есть классный бот для Telegram.
Текст¶
Если в боте повсеместно используется определённое форматирование, то каждый раз указывать аргумент parse_mode довольно накладно. К счастью, в aiogram можно передать необходимый тип прямо в объект Bot, а если в каком-то конкретном случае нужно обойтись без этих ваших разметок, то просто укажите parse_mode="" (пустая строка):
Подробнее о различных способах форматирования и поддерживаемых тегах можно узнать в документации Bot API.
Медиафайлы¶
file_id уникален для каждого бота, т.е. переиспользовать чужой идентификатор нельзя. Однако в Bot API есть ещё file_unique_id . Его нельзя использовать для повторной отправки или скачивания медиафайла, но зато он одинаковый у всех ботов. Нужен file_unique_id обычно тогда, когда нескольким ботам требуется знать, что их собственные file_id односятся к одному и тому же файлу.
Кстати, про скачивание: aiogram предлагает удобный вспомогательный метод download() для загрузки небольших файлов на сервер, где запущен бот:
Работа с изображениями
Обратите внимание на конструкцию message.photo[-1] . Когда пользователь присылает боту изображение, Telegram присылает не один объект, а целый массив с разными размерами одного и того же изображения, отсортированными по возрастанию. В общем случае нас будет интересовать изображение наибольшего размера, стоящее последним (индекс «минус один»).
Скачивание больших файлов
Боты, использующие Telegram Bot API, могут скачивать файлы размером не более 20 мегабайт. Если вы планируете скачивать/заливать большие файлы, лучше рассмотрите библиотеки, взаимодействующие с Telegram Client API, а не с Telegram Bot API, например, Telethon. Немногие знают, но Client API могут использовать не только обычные аккаунты, но ещё и боты.
А начиная с Bot API версии 5.0, можно использовать собственный сервер Bot API для работы с большими файлами.
Бонус¶
На этом всё. До следующих глав! Ставьте лайки, подписывайтесь, прожимайте колокольчик
- размер шрифта уменьшить размер шрифтаувеличить размер шрифта
- Печать
- Эл. почта
- Станьте первым комментатором!
Сегодня мы рассмотрим отправку изображений с помощью Телеграм-бота.
Мы будем использовать среду разработки, которую мы настроили в статье .
Существует несколько способов отправки изображений:
Сегодня мы рассмотрим первые два способа.
Отправка изображения из URL
Давайте создадим в папке с нашим ботом новый файл image.php
Со следующим содержимым:
Откроем в браузере адрес:
И в нашей группе увидим нашу картинку:
Добавляем подпись для картинки.
Очень часто одной картинки недостаточно. Изображение выглядит намного лучше, если у него есть подпись. Для этого потребуются небольшие изменения в коде, в результате файл image.php примет вид:
Запустим и получим вот такой результат:
Отправляем изображение с подписью наверху
Возможно, вам захочется добавить подпись на самый верх картинки, для этого вы можете воспользоваться следующим способом:
Обратите внимание, между скобок [ ] должен быть пробел!
Запустим и получим вот такой результат:
Загрузка изображения с помощью multipart/form-data
Использование библиотеки Telegrambotsdk позволяет нам серьезно экономить время на разработку! Она умеет автоматически обрабатывать отправку локальных файлов на сервер с помощью multipart/form-data .
Скачаем в папку с ботом файл:
Переименуем файл покороче:
Внесем изменения в файл image.php :
Запустим и получим результат:
Обратите внимание, всё что мы сделали это указали полный путь к локальному файлу, библиотека сама определила, что файл существует и загрузила его на сервер!
Заключение
Сегодня мы рассмотрели отправку изображений с помощью Телеграм-бота на PHP .
Изображения были загружены с помощью URL и посредством прямой загрузки, с использованием multipart/form-data .
Решил немного погрузиться в изучение Python, в процессе поставил задачу отойти от стандартного Hello World и попытаться написать сразу простого бота для Telegram. В итоге, бот может отвечать на заданные фразы, присылать внешний ip адрес и делать снимок с камеры. Скажу сразу, код не идеальный, но в процессе отладки ни один котик не пострадал.
Для начала сразу оговорюсь писать будем на Python версии 3 и будем использовать модули для облегчения жизни нашего проекта.
Пишем мы на Ubunru 19.10, поэтому надо учитывать, что есть две версии установленного Python.
Установим PIP и необходимые пакеты:
Как было указано выше, пишем мы на Ubuntu, поэтому в директории пользователя /home/users-name/ создаем файлы bot-file.py и config.py
Файл bot-file содержит код бота, а файл config необходим для конфигурации бота. В конфигурации необходимо будет указать список пользователей, которым разрешено взаимодействие с ботом.
Начнем с файла конфигурации, там все просто, необходимо просто указать id пользователя Telegram.
Переходим к файлу бота.
formatter = logging . Formatter ( "%(asctime)s | %(levelname)-7s | %(message)s" ) file_info = bot . get_file ( message . document . file_id ) downloaded_file = bot . download_file ( file_info . file_path ) src = '/home/users-name/received/' + message . document . file_name ; file_info = bot . get_file ( message . photo [ len ( message . photo ) - 1 ] . file_id ) downloaded_file = bot . download_file ( file_info . file_path ) bot . send_message ( message . chat . id , 'Привет, ' + user_name + ' Что ты хочешь от меня, собака сутулая!' , reply_markup = keyboard1 ) bot . send_sticker ( message . chat . id , 'CAADAgAD6CQAAp7OCwABx40TskPHi3MWBA' ) bot . send_message ( message . chat . id , 'Тебе сюда нельзя. Твой ID: ' + str ( message . chat . id ) ) bot . send_sticker ( message . chat . id , 'CAADAgADcQMAAkmH9Av0tmQ7QhjxLRYE' ) bot . send_message ( message . chat . id , 'Фото с камеры' ) bot . send_photo ( message . chat . id , img , caption = 'Фото с камеры' , reply_markup = keyboard1 ) bot . send_message ( message . chat . id , 'Тебе сюда нельзя. Твой ID: ' + str ( message . chat . id ) ) bot . send_sticker ( message . chat . id , 'CAADAgADcQMAAkmH9Av0tmQ7QhjxLRYE' ) bot . send_message ( message . chat . id , docum , reply_markup = keyboard1 ) bot . send_sticker ( message . chat . id , 'CAADAgADcQMAAkmH9Av0tmQ7QhjxLRYE' ) bot . send_message ( message . chat . id , 'Тебе сюда нельзя. Твой ID: ' + str ( message . chat . id ) ) bot . send_sticker ( message . chat . id , 'CAADAgADcQMAAkmH9Av0tmQ7QhjxLRYE' )Разберем некоторые интересные моменты, на которые следует обратить внимание.
Прокси
В данном примере используется Socks 5 прокси:
Достаточно указать свои данные и запустить бот.
Token ID
В начале пытался брать Token из файла конфигурации, но бот так и не запустился. Пришлось оставить в коде, поэтому Token бота вписывать придется в сам код.
Авторизация
Клавиатура
Красивые кнопочки любят все. 🙂
Прием документов и фотографий
Бот умеет сохранять документы и фотографии, которые скачиваются в папку received. Папку предварительно необходимо будет создать в профиле пользователя, где создавали файлы бота и файла конфигурации.
С вопросом получения картинки с камеры и внешнего ip адреса пришлось повозить подольше. Но в итоге через папку temp и вызов через bash wget все получилось.
Планировщик crontab
Бот запускается через планировщик задач, каждые пять минут происходит проверка запущенного процесса. Так как бот использует прокси и может произойти обрыв канала интернет, то повторный запуск бота не сможет произойти.
Для начала необходимо точно определить где и какая версия Python установлена.
В моем случае Python версии 3.7, поэтому в файле я буду указывать именно его.
Создаем bash скрипт для crontab
/ usr / bin / python3 . 7 / home / users - name / bot - file . pyНе забываем проверить пути до бота и Python.
Делаем файл исполняемым:
Открываем планировщик и вносим задачу:
Делал под пользователем, не под root.
Проверить запустился ли бот, можно командой:
Должен будет выдать номер запущенного процесса, если строка пустая, то бот не запущен.
Заключение
В итоге получили бота, который в случае чего может и документ принять и фоточку с камеры наблюдения прислать. В интернете полно статей на данную тематику, есть и powershell боты и другие. Но мне было интересно решить именно такую задачу. В процессе эксплуатации буду наращивать потенциал бота.
Файлы примера бота можно скачать тут: python-bot
Если есть замечания по коду и его оптимизации, то буду рад вашим комментариям. Так как тема для меня слишком новая и код скорее всего далек от идеала!
Читайте также: