Telegram CLI
Всем привет. На днях начал своё знакомство с консольным клиентом для Telegram . Решил по этому поводу написать пару статей. Для начала расскажу, как это дело установить, в следующей части опишу, как запускать telegram-cli в виде демона в системах с systemd, а в качестве бонуса будет статья о том, как написать обёртку под всё это для zsh, и, моё любимое, автодополнение по tab’у.
Установка
У меня стоит Fedora 22 в репозиториях которой присутствует telegram-cli , поэтому если вы в таких же условиях, то можно сделать так:
Но мы пойдём другим путём и установим его из сорцов, тем более что это делается очень просто.
Сборка из исходников
Историческая справка
Раньше в UNIX системах директория /opt использовалась для пакетов сторонних производителей. opt это сокращение от option, что можно перевести как опциональный или необязательный; туда, например попадали пакеты, за которые вы заплатили деньги. В BSD Unix системах вместо /opt для этих целей использовали /usr/local .
via
Я предпочитаю устанавливать сторонние программы в директорию /opt . Перейдём в неё и клонируем репозиторий
Дальше нужно установить зависимости. В исторукции из репозитория написано установить libjansson-devel , который моему dnf’у найти не удалось, зато он нашёл jansson-devel .
Мы уже находимся в каталоге /opt/tg поэтому начнем сборку.
Если всё прошло хорошо, то в папке bin должен появиться telegram-cli . Осталось запихнуть его куда-нибудь в пути.
Получилось? Тогда учимся пользоваться.
Запуск
Сначала telegram-cli спросит номер телефона. Вводим. Ждём сообщения с кодом. Вводим код. Получаем доступ к командной строке.
| Вид из командной строки | Пришедший код |
|---|---|
![]() |
Использование
Что первым делом нужно вводить в любую консоль?
Посмотрим, что у нас есть
Доступные команды
Для начала сделаю лирическое отступление и расскажу, что такое peer и как его употреблять.
Из официальной документации Peer это имя контакта или диалога; можно дополнять по TAB’у. Все пробелы заменяются на нижние подчеркивания.
Если у двух пользователей одинаковые имена, то к ним добавляется номер телефона. (например, Имя_Фамилия будет Имя_Фамилия#1, Имя_Фамилия#2 и так далее)
Чтобы появилась возможность отправлять сообщения, нужно сначала получить все диалоги с помощью dialog_list , либо запускать клиент с параметром -W . Рекомендую второе.
peer я оставлю без перевода и буду писать пир
Общение
- msg <peer> Text — отправить сообщение пиру
- fwd <user> <msg-seqno> — переслать сообщение пользователю. Вы можете видеть номера сообщений, запуская клиент с опцией -N
- chat_with_peer <peer> — начать переписку с этим пиром. /exit или /quit для завершения этого режима.
- add_contact <phone-number> <first-name> <last-name> — попытаться добавить контакт в список контактов по номеру телефона
- rename_contact <user> <first-name> <last-name> — попытаться переименовать контакт. Если у вас есть несколько устройств, то будет битва
- mark_read <peer> — отметить прочитанными все сообщения от пира
- delete_msg <msg-seqno> — удалить сообщение (но не полностью)
- restore_msg <msg-seqno> — восстановить удалённое сообщение. Невозможно для серкретного чата. Возможно только некоторое время спустя (один час, я думаю) после удаления
Мультимедия
- send_photo <peer> <photo-file-name> — отправить фото
- send_video <peer> <video-file-name> — отправить видео
- send_text <peer> <text-file-name> — отправить содержимое файла текстом
- load_photo/load_video/load_video_thumb/load_audio/load_document/load_document_thumb <msg-seqno> — загрузить фото/видео/аудио/документ в директорию загрузок
- view_photo/view_video/view_video_thumb/view_audio/view_document/view_document_thumb <msg-seqno> — загрузить фото/видео в папку загрузок и открыть стандартным просмоторщиком
- fwd_media <msg-seqno> послать медиа файл в сообщении. Используйте это, чтобы скрыть информацию об авторе медиа файла (хотя всё ещё будет возможно найтиuser_id из самого медиа файла, но невозможно получить access_hash этого пользователя)
- set_profile_photo <photo-file-name> — установить фотографию профиля. Обрезается до квадрата
Групповые чаты
- chat_info <chat> — вывести информацию о чате
- chat_add_user <chat> <user> — добавить пользователя в чат
- chat_del_user <chat> <user> — удалить пользователя из чата
- rename_chat <chat> <new-name>
- create_group_chat <chat topic> <user1> <user2> <user3> … — создать групповой чат с пользователями, используйте chat_add_user чтобы добавить больше пользователей
- chat_set_photo <chat> <photo-file-name> — поставить фото на чат. Обрезается до квадрата
Поиск
- search <peer> pattern — поиск pattern в сообщениях с пиром
- global_search pattern — поиск pattern во всех сообщениях
Секретный чат
- create_secret_chat <user> — создать секретный чат с пользователем
- visualize_key <secret_chat> — вывести визуализацию ключа шифрования. Вы должны сравнить его с ключем вашего собеседника
- set_ttl <secret_chat> <ttl> — установить ttl в секретном чате. Не смотря на то, что клиент игнорирует это, вашему собеседнику это может быть полезно
- accept_secret_chat <secret_chat> — вручную принять секретный чат (действенно только если клиент запущен с ключём -E)
Статистика и информация
- user_info <user> — вывести информацию о пользователе
- history <peer> [limit] — вывести историю (и пометить прочитаными). Лимит по умолчанию = 40
- dialog_list — вывести информацию о диалогах
- contact_list — вывести информацию о пользователях в вашем списке контактов
- suggested_contacts — вывести информацию о пользователях с которыми у вас много общих друзей
- stats — для отладки
- show_license — показать лицензию(GPLv2)
- help — вывести этот хэлп
- get_self — получить инфорцию о своем пользователе
Карточки
- export_card — вывести ваше ‘карточку’ которую каждый позже может импортировать себе в контакты
- import_card <card> — получить пользователя по карточке. После этого вы сможете писать ему сообщения
Остальное
- quit — выйти
- safe_quit — подождать завершения всех запросов и выйти
Практика
Напишем сообщение Даниле и посмотрим, что он ответит. Отправить сообщение можно не сразу, сначала нужно дождаться, пока прогрузяться все контакты.

Готово! Вы восхетительны.
В следующей статье мы рассмотрим, как сделать из этого добра systemd демона, чтобы не ждать каждый раз прогрузки контактов.
Создание Python Telegram бота и его deploy на виртуальную машину
Рынок чат-ботов в России растет с бешеной скоростью и ожидается ежегодный прирост на 30% в течение ближайших трех лет. В 2020 г. количество запросов на чат-боты увеличилось на 17% по сравнению с 2019 г. Большим спросом стали пользоваться голосовые боты, количество запросов на них выросло в четыре раза. В 2021 г. ожидается рост числа запросов на чат-боты на 15-20% от организаций из госсектора, образования, медицины, логистики, ретейла и e-commerce, промышленных и добывающих компаний.
Создаём нашего telegram бота.
Пишем код под наши задачи и тестируем его работоспособность.
Выбираем надежный сервис виртуальных машин.
Переносим нашего бота на виртуальную машину для его дальнейшей работы.
Настраиваем беспрерывную работу бота.
Шаг 1. Создание бота в Telegram
Первые три шага опишу максимально кратко, так как статей на эту тему много и обычно это не вызовет у пользователей никаких трудностей. Для создания бота нам понадобится написать BotFather.

Шаг 2. Напишем простейшего чат-бота и протестируем его
Для работы будем использовать библиотеку telebot, которую можно установить при помощи следующей команды:
$ pip install pytelegrambotapi
Для установки других библиотек, в случае того, если вы не ограничиваетесь базовым функционалом вам поможет господь Google.
Напишем простого бота, который будет присылать нам в ответ на различные Emoji их размытые PNG копии:
Наш бот готов, теперь осталось его протестировать. Заходим по ссылке, которую прислал BotFather.

Поздравляю, наш бот теперь работает. И тут мы подходим к главной проблеме: как только мы выключим наш компьютер с запущенным кодом, бот мгновенно перестанет работать. Для решения этой проблемы нам-то и понадобится сервис предоставляющий виртуальные машины.
Шаг 3. Выбираем виртуальную машину!
Что вообще такое эта виртуальная машина?
Виртуальная машина (ВМ ) — это виртуальный компьютер, который использует выделенные ресурсы реального компьютера (процессор, диск, адаптер). Эти ресурсы хранятся в облаке и позволяют ВМ работать автономно. Простыми словами, виртуальная машина позволяет создать на одном компьютере ещё один компьютер, который будет использовать его ресурсы, но работать изолированно.
Именно виртуальная машина поможет нашему боту отвечать на все запросы и работать 24 на 7.
Как выбрать виртуальную машину?
ВМ выбирается исключительно отталкиваясь от ваших потребностей бюджета. Чем больше вам необходимо мощности и памяти, тем выше будет ее стоимость. В настоящее время есть множество хороших сервисов, предоставляющих пробный период с которым вы сможете определиться, подходит ли вам сервис.
Лично я могу рекомендовать следующие сервисы:
Mail cloud solutions — Предоставляют 3000 р. на два месяца тестового периода. (Именно его я и буду использовать в дальнейшей работе).
Yandex.Cloud — Представляют 2000 р. на два месяца тестового периода.
Google Cloud Platform — Предоставляют 300$ на три месяца тестового периода.
После выбора сервиса, пройдем регистрацию и создадим новую виртуальную машину.
Создание виртуальной машины.
Я выбрал минимальные параметры, так как нашему боты не нужны какие-то большие энергоресурсы.

Настройка сети.

Для подключения будем использовать протокол SSH. Для подключения к нашей виртуальной машине, нам необходимо будет выпустить новую связку ssh-ключей.
Для этого перейдем в терминал и пропишем следующую команду:
Затем пропишем имя нашего ключа и нажмем Enter. Наш ключ создан. Для подключения нам понадобится public-key с расширением .pub. Копируем содержимое нашего файла и вставляем его в соответствующее поле «Ключ виртуальной машины».
Переходим к следующему шагу.
Подключение к виртуальной машине
Для подключения к нашей виртуальной машине пропишем следующую команду:
/.ssh/ИмяВашегоКлюча ubuntu@ваш публичный IP-адрес
В случае удачного подключения вы увидите нечто подобное:

Мы подошли к самому сложному шагу, который я надеюсь, благодаря моей статье перестанет быть столь трудным для освоения.
Установим на наш сервер последнюю версию Python. Для этого последовательно вводите следующие команды:
Установим и создадим виртуально окружение:
Установим и запустим Redis-server:
Проверить, запущен ли наш Redis-server, необходимо прописать «ping»

Если в ответе вы получили PONG, поздравляю, все готово к дальнейшей работе!
Перенесем все необходимые файлы на наш виртуальный сервер. Для этого я буду использовать очень удобную программу CyberDuck
Выбираем новое подключение по SFTP, вводим IP-адрес вашей виртуальной машины, !ПРИВАТНЫЙ! ssh-ключ, логин и пароль от вашей виртуальной машины.
Мы попадаем фактически на наш сервер, с уже установленным Python, папкой с названием нашего бота и виртуальным окружением. Остается перенести все данные нашего бота. Для этого копируем ВСЕ необходимые файлы и вставляем их на сервер.
Поздравляю, мы на финишной прямой, остается запустить нашего бота на сервере и проверить его работоспособность.
Проверяем работу, если все в порядке, прописываем в терминале deactivate. Нам остается последний шаг. Настроить непрерывную работу нашего бота.
Шаг 5. Настройка беспрерывной работы нашего бота.
Пропишем следующую команду: nano /lib/systemd/system/НазваниеБота.service
Нажимаем CTRL+O → Enter → CTRL+X для сохранения. Эти настройки помогут запускать или перезапускать нашего бота.
Последний шаг: Снова запускаем нашего бота, но уже с беспрерывной работой.
ГОТОВО! Наш бот запущен и теперь работает 24/7, независимо от того, включен наш с вами компьютер или нет. Если что-то не работает, тщательно проверьте, правильно ли вы прописали путь к файлам. Если терминал выдает ошибку авторизации, попробуйте добавить перед командой «sudo» (Команда от имени администратора)
vysheng/tg
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md

Telegram messenger CLI
Command-line interface for Telegram. Uses readline interface.
API, Protocol documentation
Documentation for Telegram API is available here: http://core.telegram.org/api
Documentation for MTproto protocol is available here: http://core.telegram.org/mtproto
Upgrading to version 1.0
First of all, the binary is now in ./bin folder and is named telegram-cli. So be careful, not to use old binary.
Second, config folder is now $
Third, database is not compatible with older versions, so you’ll have to login again.
Fourth, in peer_name ‘#’ are substitued to ‘@’. (Not applied to appending of ‘#%d’ in case of two peers having same name).
Clone GitHub Repository
Python support is currently limited to Python 2.7 or Python 3.1+. Other versions may work but are not tested.
Install libs: readline, openssl and (if you want to use config) libconfig, liblua, python and libjansson. If you do not want to use them pass options —disable-libconfig, —disable-liblua, —disable-python and —disable-json respectively.
On Ubuntu/Debian use:
Other methods to install on linux
On Gentoo: use ebuild provided.
The client depends on readline library and libconfig, which are not included in OS X by default. You have to install these libraries manually.
Thanks to @jfontan for this solution.
Install these ports:
- devel/libconfig
- devel/libexecinfo
- lang/lua52
If you manage to launch it on other UNIX, please let me know.
If you would like to ask a question, you can write to my telegram or to the github (or both). To contact me via telegram, you should use import_card method with argument 000653bf:0738ca5d:5521fbac:29246815:a27d0cda
By default, the public key is stored in tg-server.pub in the same folder or in /etc/telegram-cli/server.pub. If not, specify where to find it:
Client support TAB completion and command history.
Peer refers to the name of the contact or dialog and can be accessed by TAB completion. For user contacts peer name is Name Lastname with all spaces changed to underscores. For chats it is it’s title with all spaces changed to underscores For encrypted chats it is <Exсlamation mark> Name Lastname with all spaces changed to underscores.
If two or more peers have same name, number is appended to the name. (for example A_B, A_B#1, A_B#2 and so on)
