Telegram CLI

Всем привет. На днях начал своё знакомство с консольным клиентом для Telegram. Решил по этому поводу написать пару статей. Для начала расскажу, как это дело установить, в следующей части опишу, как запускать telegram-cli в виде демона в системах с systemd, а в качестве бонуса будет статья о том, как написать обёртку под всё это для zsh, и, моё любимое, автодополнение по tab’у.

Установка

У меня стоит Fedora 22 в репозиториях которой присутствует telegram-cli, поэтому если вы в таких же условиях, то можно сделать так:

sudo dnf install telegram-cli

Но мы пойдём другим путём и установим его из сорцов, тем более что это делается очень просто.

Сборка из исходников

Историческая справка
Раньше в UNIX системах директория /opt использовалась для пакетов сторонних производителей. opt это сокращение от option, что можно перевести как опциональный или необязательный; туда, например попадали пакеты, за которые вы заплатили деньги. В BSD Unix системах вместо /opt для этих целей использовали /usr/local.
via

Я предпочитаю устанавливать сторонние программы в директорию /opt. Перейдём в неё и клонируем репозиторий

sudo git clone --recursive https://github.com/vysheng/tg.git /opt/tg
cd /opt/tg

Дальше нужно установить зависимости. В исторукции из репозитория написано установить libjansson-devel, который моему dnf’у найти не удалось, зато он нашёл jansson-devel.

sudo dnf install -y lua-devel openssl-devel libconfig-devel readline-devel libevent-devel jansson-devel python-devel

Мы уже находимся в каталоге /opt/tg поэтому начнем сборку.

./configure
make

Если всё прошло хорошо, то в папке bin должен появиться telegram-cli. Осталось запихнуть его куда-нибудь в пути.

ln -s /opt/tg/bin/telegram-cli /usr/bin/

Пробуем запустить

telegram-cli

Получилось? Тогда учимся пользоваться.

Запуск

Сначала telegram-cli спросит номер телефона. Вводим. Ждём сообщения с кодом. Вводим код. Получаем доступ к командной строке.

Вид из командной строки Пришедший код

Использование

Что первым делом нужно вводить в любую консоль?

help

Посмотрим, что у нас есть

Доступные команды

Для начала сделаю лирическое отступление и расскажу, что такое 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 - подождать завершения всех запросов и выйти

Практика

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

telegram-cli -W
msg Данила ping

Готово! Вы восхетительны.

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