Telegram Native API

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

Telegram Native API интеграция

39
Взаимодействие с 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.

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

39

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

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

См. также

Лучшие комментарии
3. Infactum 267 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 376 24.05.18 20:50 Сейчас в теме
заметка в большей степени ... про правильную, по мнению автора, разработку native внешних компонент

вот этот момент совсем не раскрыт в статье, стоило уделить этому внимание. В остальном - плюс за проделанную работу.
3. Infactum 267 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 399 26.05.18 07:19 Сейчас в теме
Жаль что вашей статьи не было, когда писал свою компоненту по рисованию графов, теперь её даже стыдно выкладывать на GiHub :)
5. azubar 34 26.05.18 09:51 Сейчас в теме
Очень круто и востребовано, я верю в то что телеграмм переплюнет и китайский вичат и пайпал вместе взятые.
Вопрос: сейчас отправить можно только тестовое сообщение, файлы/изображения?
6. Infactum 267 26.05.18 10:05 Сейчас в теме
(5) Отправить можно все, что поддерживается протоколом. Виды контента описаны тут.
8. oyti 20 28.05.18 14:36 Сейчас в теме
Windows 7 x64,
1С:Предприятие 8.3 (8.3.12.1412),
Бухгалтерия предприятия, редакция 3.0 (3.0.61.47)
Прикрепленные файлы:
9. oyti 20 28.05.18 14:43 Сейчас в теме
(8) 1С:Предприятие 8.3 (8.3.11.2867) - ошибка та же
10. Infactum 267 28.05.18 14:47 Сейчас в теме
(8) Разрядность клиента 1С какая?
Если попробовать подключить напрямую dll, а не через бандл, что скажет?
ПодключитьВнешнююКомпоненту("<Путь_к_DLL>", "Telegram", ТипВнешнейКомпоненты.Native)
11. oyti 20 28.05.18 17:47 Сейчас в теме
x86
Если явно задать путь к dll на диске, вроде работает
12. Anton64 219 01.06.18 09:26 Сейчас в теме
У меня Win 7, появляется окно с вводом номера телефона, после нажатия Далее ничего не происходит...

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

Если есть желание разобраться в проблеме, то рекомендую скачать на гитхабе последнюю сборку. В ней есть возможность включения журнала tdlib - метод УстановитьКаталогЖурнала(<Путь>).
14. Anton64 219 01.06.18 12:03 Сейчас в теме
(13) Про блокировку понял, думаю что в ней дело.
Тогда возникает вопрос, можно ли как-то указать прокси сервер для работы компоненты?
15. Infactum 267 01.06.18 12:31 Сейчас в теме
(14) Можно через setProxy. Текущая версия TDLib только Socks5 умеет.
16. Mopo3 282 19.09.18 20:07 Сейчас в теме
Круто! Помучался, но научился получать сообщения от пользователей, из секретных групп, что и требовалось для задачи.
Замечательная библиотека и пример, спасибо!
17. Mopo3 282 03.10.18 00:59 Сейчас в теме
(0), подскажите пожалуйста. Я правильно понимаю, что если я хочу получить/отправить сообщения от пользователей БЕЗ использования бота, то это можно сделать ТОЛЬКО через TDLib и более никак?
То есть использовать для этого

Соединение = Новый HTTPСоединение("api.telegram.org",443,,,Прокси,,Новый ЗащищенноеСоединениеOpenSSL());
ПараметрыЗапроса = "?chat_id=[chat_id]";
ТекстЗапросаHTTP = "getChatHistory" + ПараметрыЗапроса;

Запрос = Новый HTTPЗапрос(ТекстЗапросаHTTP);
Запрос.УстановитьТелоИзСтроки(ПараметрыЗапроса);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

не получится при всем желании, т.к. он предназначен ТОЛЬКО для ботов?
18. Infactum 267 03.10.18 08:21 Сейчас в теме
(17) С использованием REST вы можете работать только с BOT API. Для использования всех возможностей (например чтобы стать инициатором сообщения или использовать секретный чат) нужен Telegram API. Так вот TDLib - это лишь одна из реализаций (правда официальная). Можете воспользоваться любой другой (на GitHub полно), но к ним биндингов на 1С нету.
19. dtybr 15 10.10.18 17:51 Сейчас в теме
Добрый день.
Подскажите пожалуйста как можно настроить опции TDLib (https://core.telegram.org/tdlib/options)
Мне нужно чтоб библиотека отправляла запросы через мое собственное DNS имя. Или так нельзя. Только прокси (setProxy)
С ним не смог разобраться.
Делаю вот так после соединения:
ФорматированныйТекст = Новый Соответствие;
	ФорматированныйТекст.Вставить("@type", "proxySocks5");
	ФорматированныйТекст.Вставить("server", "176.94.2.84");
	ФорматированныйТекст.Вставить("port", "1080");
	ФорматированныйТекст.Вставить("username", "");
	ФорматированныйТекст.Вставить("password", "");
	
	ЗапросКомпоненты = Новый Соответствие;
	ЗапросКомпоненты.Вставить("@type", "setProxy");
	ЗапросКомпоненты.Вставить("proxy", ФорматированныйТекст);
		
	ОтправитьЗапрос(ЗапросКомпоненты);
Показать


Но не работает не приходит СМС
20. Infactum 267 10.10.18 17:57 Сейчас в теме
(19) Не понимаю, что значит "отправлять запросы через DNS имя".
Для разбора проблемы прокси рекомендую включить лог и заглянуть туда. Так же надо выяснить, на какой версии TDLib ваша компонента, т.к. в последней (той, что на TDLib 1.3) метода setProxy больше нету.
New methods addProxy, editProxy, enableProxy, disableProxy, removeProxy and getProxies were added instead of setProxy and getProxy.
21. dtybr 15 10.10.18 19:08 Сейчас в теме
У меня есть transparent Proxy по адресу telegram.mysite.com если TDLib будет запросы отправлять через него то оно не будет заблокировано РКН.
И это не SOCKS5 поэтому его прописать в список прокси нельзя. ( И поэтому я обратил внимание на опцию http://prntscr.com/l4icxi


TDLib у меня скорей 1.3 так как библиотеку качал с GITHub сегодня.
Так что видимо придется использовать новые методы.

Скажите я вам можно поручить задачу по разработке подсистемы с 4 методами которые будут через TDLib 1.3 работать:
- НайтиКонтактТелеграмм()
- СоздатьКОнтактТелеграмм()
- ОтправитьСообщениеТелеграмм()
- ПринятьСообщенияТелеграмм()

Методы должны быть в серверном модуле и выполняться на сервере WINx64
Могу сформулировать более точные требования.
Оставьте свое сообщение