Telegram Native API

Программирование - Внешние компоненты

37
Взаимодействие с Telegram без Bot API. Только C++ компоненты. Только хардкор.

Сразу хочу отметить - заметка в большей степени не про telegram, а про правильную, по мнению автора, разработку native внешних компонент.

Сама технологии создания внешних компонент с native API существует уже много лет, но несмотря на это, найти достойный пример open source реализации внешней компоненты крайне сложно. Вполне вероятно, что все компоненты с открытыми исходными кодами можно пересчитать по пальцам одной руки. Буду рад увидеть ссылки в комментариях, чтобы понять, что не прав.

В конечном счете я решил исправить эту несправедливость и опубликовать не слишком сложный пример компоненты "по фэн-шую". И первой проблемой, которую предстояло решить, был функционал компоненты. В итоге выбор пал на интеграцию с telegram.

Сегодня тема взаимодействия с telegram уже не так популярна, как ранее. С одной стороны на это повлияли действия РКН, с другой - библиотека инфостарта уже изрядно наполнена примерами взаимодействия с Bot API. Но что делать, если функционала bot API недостаточно? Допустим, мы хотим сами писать пользователю, или хотим использовать секретные чаты с end-to-end шифрованием, или, о боже, хотим написать полноценный telegram клиент на 1С? Выход - TDLib.

Telegram database library - это официальная библиотека для создания Telegram клиентов, предоставляющая доступ ко всему функционалу MTProto. Один из вариантов работы с библиотекой - JSON. Все методы описаны в документации.

Внешняя компонента доступна на Github. Она предоставляет доступ к следующим методам TDLib: Отправить / Send, Получить Receive, Выполнить / Execute, а так же реализует метод УстановитьАсинхронныйРежим / SetAsyncMode для получения ответов компоненты через внешние события (естественно работает только на клиенте).

CI сборки реализованы для Windows x86/x64 и Linux x64. 

Для желающий просто оценить компоненту в работе, мною был сделан примитивный пример, реализующий следующий тестовый сценарий: авторизация в telegram и отправка сообщения абоненту с указанным номером телефона (даже если его еще нет у вас в контактах). Пример проверен на Windows 10 + 8.3.11 и на Ubuntu 18.04 + 8.3.12.

На данный момент демо-обработка содержит множество допущений. В частности:

  • Авторизация выполняется только для существующих учетных записей
  • Ввод некорректного кода подтверждения никак не обрабатывается
  • Не реализована двухфакторная аутентификация
  • Не указывается куда отправлен код подтверждения (Telegram / SMS)
  • Не задаются настройки TDLib. База всегда хранится в каталоге временных файлов. Токены app_id и api_hash совпадает с тестовыми для TDLib.

В общем, самый, самый минимум.

37

Скачать файлы

Наименование Файл Версия Размер
TelegramDemo
.epf 49,76Mb
23.05.18
17
.epf 49,76Mb 17 Скачать

См. также

Лучшие комментарии
3. Infactum 263 24.05.18 22:37 Сейчас в теме
(2) Тогда пусть будет в комментах. Из репозитория можно подчерпнуть следующую полезную информацию.

- Не надо использовать шаблон с ИТС, т.к. он был написан еще до C++11.
- Ориентируемся на кросплатформенность с начала разработки, т.к. надо 1С на Linux далеко не экзотика. Поэтому точно не стоит использовать wchar_t для хранения строк. Только 2х байтовые char16_t.
- Для преобразования строк из UTF-8 в UTF-16 лучше брать проверенное временем решение. Например ICU (как у меня), либо iconv. Но только не велосипеды из шаблона с ИТС.
- Используйте CMake. Далеко не все разработчики предпочитают Visual Studio даже под Windows. Да и единообразие сборочного процесса на различных система не повредит.
- Решая проблему русских названий методов не надо сохранять исходники в Win-1251. Да, в студии сработает. Но правильный и универсальный вариант это UTF8+BOM.
- Обязательно настройки CI. Не только потому, что CI это "круто", но и потому, что так вы точно не забудете, что еще необходимо установить на чистую систему для сборки. Сборка в C++, особенно больших проектов - боль.
- Не забываем про кэш при сборке на CI. В моем "проекте" tdlib с нуля собирается минут 30 + еще 10 минут другие зависимые библиотеки. При наличии кэша время сборки, даже с учетом подготовки виртуалки меньше минуты. Пример реализации кэша можно увидеть как для Windows: тут сделан пакет tdlib для vcpkg, так и для Linux - там сборка идет через Docker контейнер, а актуальный образ сборщика в docker hub.

P.S. В Appveyor теперь есть поддержка Linux. Лучший CI для подобных проектов на сегодняшний день.
pbazeliuk; AlkB; shurik_shurik; JohnyDeath; baton_pk; Synoecium; azubar; +7 Ответить
Остальные комментарии
Сортировка: Древо
2. baton_pk 374 24.05.18 20:50 Сейчас в теме
заметка в большей степени ... про правильную, по мнению автора, разработку native внешних компонент

вот этот момент совсем не раскрыт в статье, стоило уделить этому внимание. В остальном - плюс за проделанную работу.
3. Infactum 263 24.05.18 22:37 Сейчас в теме
(2) Тогда пусть будет в комментах. Из репозитория можно подчерпнуть следующую полезную информацию.

- Не надо использовать шаблон с ИТС, т.к. он был написан еще до C++11.
- Ориентируемся на кросплатформенность с начала разработки, т.к. надо 1С на Linux далеко не экзотика. Поэтому точно не стоит использовать wchar_t для хранения строк. Только 2х байтовые char16_t.
- Для преобразования строк из UTF-8 в UTF-16 лучше брать проверенное временем решение. Например ICU (как у меня), либо iconv. Но только не велосипеды из шаблона с ИТС.
- Используйте CMake. Далеко не все разработчики предпочитают Visual Studio даже под Windows. Да и единообразие сборочного процесса на различных система не повредит.
- Решая проблему русских названий методов не надо сохранять исходники в Win-1251. Да, в студии сработает. Но правильный и универсальный вариант это UTF8+BOM.
- Обязательно настройки CI. Не только потому, что CI это "круто", но и потому, что так вы точно не забудете, что еще необходимо установить на чистую систему для сборки. Сборка в C++, особенно больших проектов - боль.
- Не забываем про кэш при сборке на CI. В моем "проекте" tdlib с нуля собирается минут 30 + еще 10 минут другие зависимые библиотеки. При наличии кэша время сборки, даже с учетом подготовки виртуалки меньше минуты. Пример реализации кэша можно увидеть как для Windows: тут сделан пакет tdlib для vcpkg, так и для Linux - там сборка идет через Docker контейнер, а актуальный образ сборщика в docker hub.

P.S. В Appveyor теперь есть поддержка Linux. Лучший CI для подобных проектов на сегодняшний день.
pbazeliuk; AlkB; shurik_shurik; JohnyDeath; baton_pk; Synoecium; azubar; +7 Ответить
4. Synoecium 383 26.05.18 07:19 Сейчас в теме
Жаль что вашей статьи не было, когда писал свою компоненту по рисованию графов, теперь её даже стыдно выкладывать на GiHub :)
5. azubar 34 26.05.18 09:51 Сейчас в теме
Очень круто и востребовано, я верю в то что телеграмм переплюнет и китайский вичат и пайпал вместе взятые.
Вопрос: сейчас отправить можно только тестовое сообщение, файлы/изображения?
6. Infactum 263 26.05.18 10:05 Сейчас в теме
(5) Отправить можно все, что поддерживается протоколом. Виды контента описаны тут.
8. oyti 17 28.05.18 14:36 Сейчас в теме
Windows 7 x64,
1С:Предприятие 8.3 (8.3.12.1412),
Бухгалтерия предприятия, редакция 3.0 (3.0.61.47)
Прикрепленные файлы:
9. oyti 17 28.05.18 14:43 Сейчас в теме
(8) 1С:Предприятие 8.3 (8.3.11.2867) - ошибка та же
10. Infactum 263 28.05.18 14:47 Сейчас в теме
(8) Разрядность клиента 1С какая?
Если попробовать подключить напрямую dll, а не через бандл, что скажет?
ПодключитьВнешнююКомпоненту("<Путь_к_DLL>", "Telegram", ТипВнешнейКомпоненты.Native)
11. oyti 17 28.05.18 17:47 Сейчас в теме
x86
Если явно задать путь к dll на диске, вроде работает
12. Anton64 212 01.06.18 09:26 Сейчас в теме
У меня Win 7, появляется окно с вводом номера телефона, после нажатия Далее ничего не происходит...

Попробовал так: ПодключитьВнешнююКомпоненту("D:\Telegram.dll", "Telegram", ТипВнешнейКомпоненты.Native) - пишет, что либо не предназначен для выполнения под управлением Виндоус или содержит ошибку и т.д.
13. Infactum 263 01.06.18 11:31 Сейчас в теме
(12)
Если появилось окно ввода телефона, значит компонента успешно подключилась - лучше конечно проверить отладчиком.
После ввода телефона может ничего не происходить, потому что нет подключения к ДЦ телеграма (спасибо РКН).

Если есть желание разобраться в проблеме, то рекомендую скачать на гитхабе последнюю сборку. В ней есть возможность включения журнала tdlib - метод УстановитьКаталогЖурнала(<Путь>).
14. Anton64 212 01.06.18 12:03 Сейчас в теме
(13) Про блокировку понял, думаю что в ней дело.
Тогда возникает вопрос, можно ли как-то указать прокси сервер для работы компоненты?
15. Infactum 263 01.06.18 12:31 Сейчас в теме
(14) Можно через setProxy. Текущая версия TDLib только Socks5 умеет.
16. Mopo3 281 19.09.18 20:07 Сейчас в теме
Круто! Помучался, но научился получать сообщения от пользователей, из секретных групп, что и требовалось для задачи.
Замечательная библиотека и пример, спасибо!
Оставьте свое сообщение