Raspberry Pi является хорошим инструментом для реализации многих интересных проектов в электронике благодаря наличию мощного процессора на архитектуре ARM и Linux-подобной операционной системе. В этом проекте мы рассмотрим использование Telegram бота для обмена данными (файлы/фото/видео/аудио и др.) между платой Raspberry Pi и мобильным телефоном (смартфоном).
Наверняка вы уже знаете что Telegram – это один из самых популярных мессенджеров в настоящее время, доступный в настоящее время для операционных систем Android и Windows, а также для смартфонов Iphone. Он предоставляет продвинутые возможности чата и обмена файлами/сообщениями, по своим характеристикам и скорости работы он превосходит другой популярный мессенджер современности – Whatsapp.
Одной из "продвинутых" возможностей приложения Telegram является то, что оно поддерживает ботов. Это означает, что возможностями данного приложения могут пользоваться не только люди, но и "машины". В нашем случае в роли "машины" будет выступать плата Raspberry Pi. Как только вы обучите Raspberry Pi выполнять роль Telegram бота, она сможет "сидеть в чате" с обычным человеком и "расшаривать" фото, картинки, документы и аудио файлы. Также такого бота можно натренировать чтобы он был вашим персональным помощником (Personal assistant).
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress), подключенная к сети интернет (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
- Запущенное на смартфоне приложение Telegram.
Настройка Raspberry Pi в качестве Telegram бота
Для того, чтобы ваша плата Raspberry Pi могла исполнять роль Telegram бота, выполните следующую последовательность шагов.
Шаг 1 . Установка приложения Telegram на ваш смартфон
Приложение Telegram доступно для платформ на основе операционных систем Android, IOS и даже для Windows. Скачайте его на свое устройство (смартфон), установите и пройдите простую процедуру регистрации. После этого оно будет готово к работе.
Шаг 2. Создание нового бота Telegram
В правом верхнем углу главного экрана приложения Telegram есть иконка поиска, нажмите ее и выполните поиск “botfather” ("отец ботов"). Botfather – это бот, который поможет создать вам нового бота. Нажмите в нем start и затем выберите newbot как показано на рисунке ниже. После этого Botfather попросит вас ввести параметры нового бота: имя бота и пользовательское имя бота. Заполните эти детали и запомните введенное имя пользователя (username) – оно нам понадобится в дальнейшем.
Шаг 3. Получение вашего токена (token) доступа (маркера доступа)
Мы назвали бота circuitdigest, а в качестве его пользовательского имени (username) мы использовали circuitdigestBot. После этого приложение botfather выдаст вам маркер доступа (Token for access) – это своеобразный пароль для бота, другие люди могут использовать вашего бота если они знают его ключ доступа (token key). Поэтому храните этот ключ в надежном месте и не показывайте его никому. Как только вы получили этот ключ доступа, можно переходить к работе на Raspberry Pi.
Шаг 4. Установка приложения Telegram на Raspberry Pi
Использовать Telegram бота в Raspberry Pi можно с помощью пакета на python под названием Telepot. Необходимо установить данный пакет в Raspberry Pi с помощью соответствующих команд в Lx терминале:
1 2 |
sudo apt-get install python-pip sudo pip install telepot |
После того как Telepot будет импортирован в Raspberry Pi, вы можете использовать возможности этого пакета в своей программе на python чтобы взаимодействовать с вашим Telegram ботом.
Шаг 5. Написание программы для платы Raspberry Pi
Созданный вами в предыдущих шагах бот пока что подобен "ребенку" – он не сможет делать что то полезное пока вы не научите его этому. Обучить бота можно с помощью платы Raspberry Pi и скрипта на Python.
В этом проекте мы запрограммируем бота чтобы он мог выполнять основные операции: передача сообщения, фото, аудио и документов. То есть когда вы будете давать ему конкретную команду он будет выполнять определенное действие. Список доступных команд для нашего бота представлен в следующей таблице:
Команда от Telegram | Действие платы Raspberry Pi |
/hi | Передает в ответ строку “Hi! CircuitDigest” |
/time | Передает в ответ текущее время |
/logo | Передает в ответ изображение |
/file | Передает в ответ файл |
/audio | Передает в ответ аудио файл |
Полный код программы для бота приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программу необходимо импортировать (подключить) все необходимые библиотеки, на этом этапе нам обязательно нужно подключить библиотеку telepot – без нее мы не сможем управлять нашим Telegram ботом. Также мы будем использовать библиотеки time и timedate для считывания текущего времени в Raspberry Pi. После этого мы создадим объект, в котором будет храниться считанное значение времени.
1 2 3 4 5 |
import time, datetime import telepot from telepot.loop import MessageLoop now = datetime.datetime.now() |
Далее нам необходимо создать функцию, которая будет в зависимости от поступающих команд выполнять соответствующие действия. Команды будут поступать от приложения Telegram на смартфоне. Эту функцию назовем именем action. Внутри этой функции бот будет "оживать". Наш бот не сможет поддерживать разговор с нами, он сможет только отвечать если мы что-нибудь у него спросим. То есть каждый раз когда мы будем что то спрашивать у бота, будет формировать идентификатор чата (chat id). Данный идентификатор чата подобен адресу, только используя данный идентификатор бот сможет нам ответить. То есть первым делом в этой функции необходимо считать этот идентификатор чата (chat id) и сам текст сообщения (команды). Мы будем выводить текст принятого сообщения на экран дисплея в целях отладки.
1 2 3 4 5 |
def action(msg): chat_id = msg['chat']['id'] command = msg['text'] print 'Received: %s' % command |
Далее внутри функции мы будем сравнивать текст принятого сообщения (команды) с заранее определенными командами и на основании результата этого сравнения выполнять соответствующие команды. Если мы примем сообщение (команду) “/hi”, то мы будем отвечать на него “Hi! CircuitDigest”.
1 2 |
if command == '/hi': telegram_bot.sendMessage (chat_id, str("Hi! CircuitDigest")) |
Если мы примем сообщение (команду) “/time”, то в ответ на него мы будем передавать текущее время. Текущее время и дата хранятся у нас в объекте now, нам здесь просто необходимо выделить (вычленить) из этого объекта значения часов и минут с помощью функции str и затем сложить их.
1 2 |
elif command == '/time': telegram_bot.sendMessage(chat_id, str(now.hour)+str(":")+str(now.minute)) |
Если мы примем сообщение (команду) “/logo”, то в ответ на него мы считаем изображение с определенного url адреса и передадим его в ответ на принятое сообщение. Вместо считывания изображения с url адреса его также можно считывать с жесткого диска вашего компьютера. В данном случае мы использовали изображение, являющееся логотипом сайта CircuitDigest.com.
1 2 |
elif command == '/logo': telegram_bot.sendPhoto (chat_id, photo="https://i.pinimg.com/avatars/circuitdigest_1464122100_280.jpg") |
Если мы примем сообщение (команду) “/file”, то в ответ на него мы будем передавать файл с именем Aisha.py с жесткого диска нашего компьютера. Вы можете использовать любой другой файл, внеся соответствующие изменения в данный фрагмент программы.
1 2 |
elif command == '/file': telegram_bot.sendDocument(chat_id, document=open('/home/pi/Aisha.py')) |
Если мы примем сообщение (команду) “/audio”, то в ответ на него мы будем передавать mp3 файл с жесткого диска нашего компьютера. Мы использовали файл с именем test.mp3, однако вы можете использовать файл с любым другим именем, внеся соответствующие изменения в программу.
1 2 |
elif command == '/audio': telegram_bot.sendAudio(chat_id, audio=open('/home/pi/test.mp3')) |
И, наконец, мы подошли к самому важному фрагменту нашей программы, в котором мы должны предоставить доступ нашему Telegram боту к скрипту на Python. Имя у нашего бота – telegram_bot, к нему мы будем обращаться с помощью маркера/токена доступа (token address), который нам был выдан ботом botfather на шаге 3. В команде, которая приведена ниже, мы в целях безопасности нашего бота удалили из его маркера/токена доступа несколько последних цифр. Также мы будем использовать команду print чтобы отображать детали взаимодействия с ботом на экране дисплея.
1 2 |
telegram_bot = telepot.Bot('468382312:AAFhURMxpVlMWEdFzbIQLszBPFEUpXXXXXX') print (telegram_bot.getMe()) |
Шаг 6. Исполнение программы на Raspberry Pi
Полный текст программы приведен в конце статьи. Не забудьте в тексте программы заменить токен (маркер доступа) на свой. После этого запустите код программы на выполнение и вы должны увидеть параметры (детали) вашего бота в окне как на приведенном ниже рисунке. Пользовательское имя (user name) нашего бота – circuitdigestBot. Если вы видите в этом окне имя вашего бота – значит все в порядке.
Если вы видите надпись “up and running” – это значит что ваш бот готов к работе и способен отвечать на ваши сообщения/команды.
Шаг 7. Тестирование работы проекта
Теперь, когда все уже готово, нам осталось лишь протестировать работы бота. В приложении запустите поиск бота по имени, в нашем случае это будет “circuitdigestBot”. Поиск можно также запускать по пользовательскому имени бота.
После того как вы нашли своего бота, нажмите в нем на start и введите в нем одну из описанных ранее команд: /hi, /time, /file, /logo или /audio. На каждую из этих команд бот должен дать соответствующий ответ.
Примечание: у вас могут возникнуть проблемы с командами /audio и /file если в тексте программы вы не изменили каталог и имя файла для этих типов файлов на те, которые есть в вашей Raspberry Pi.
Более подробно работу проекта можно посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import time, datetime import telepot from telepot.loop import MessageLoop now = datetime.datetime.now() def action(msg): chat_id = msg['chat']['id'] command = msg['text'] print 'Received: %s' % command if command == '/hi': telegram_bot.sendMessage (chat_id, str("Hi! CircuitDigest")) elif command == '/time': telegram_bot.sendMessage(chat_id, str(now.hour)+str(":")+str(now.minute)) elif command == '/logo': telegram_bot.sendPhoto (chat_id, photo = "https://i.pinimg.com/avatars/circuitdigest_1464122100_280.jpg") elif command == '/file': telegram_bot.sendDocument(chat_id, document=open('/home/pi/Aisha.py')) elif command == '/audio': telegram_bot.sendAudio(chat_id, audio=open('/home/pi/test.mp3')) telegram_bot = telepot.Bot('468382312:AAFhURMxpVlMWEdFzbIQLszBPFEUpAeOLFQ') print (telegram_bot.getMe()) MessageLoop(telegram_bot, action).run_as_thread() print 'Up and Running....' while 1: time.sleep(10) |
Здравствуйте, подскажите, как научить телеграмм бота, при нажатии на один из GPIO Raspberry Pi делать снимок с прикреплённой камеры и отправлять его в группу телеграмм (в которой он состоит). Заранее спасибо.
Добрый вечер. Посмотрите вот этот проект системы мониторинга посетителей на основе Raspberry Pi и камеры. Из него возьмите фрагмент кода, который при нажатии кнопки делает фото с камеры и сохраняет его в файле. А отправка изображения Telegram ботом описана в представленной статье (ответ на команду '/logo')