Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Интеграция с Telegram #4

Open
6 tasks
kulakovt opened this issue Feb 12, 2018 · 40 comments
Open
6 tasks

Интеграция с Telegram #4

kulakovt opened this issue Feb 12, 2018 · 40 comments

Comments

@kulakovt
Copy link
Member

kulakovt commented Feb 12, 2018

Необходимо найти или разработать компонент, который предоставит возможность взаимодействовать с чат-сервисом Telegram.

Обязательные требования:

  • не интерактивное выполнение всех действий;
  • работа с ключами доступа, без использования пароля пользователя (OAuth и т.д.);
  • возможность отсылать сообщения контактам, а так же в каналы и чаты;
  • возможность репостить чужие сообщения;
  • получение списка сообщений в канале;
  • получение количества просмотров и репостов для конкретной записи.
@egorikas
Copy link
Contributor

Буду заниматься. Отписываюсь тут, т.к. повесит на себя не особо могу

@kulakovt
Copy link
Member Author

Самое приоритетное это уметь логиниться и постить в канал (анонсы о митапах). Всё остальное обсуждаемо.

@Sergey-Buyanov
Copy link
Contributor

@egorikas Назначил задачу,
Как будет понятно, что и как возможно сделать. можно будет обсудить интерфейс компонента для реализации (если не найдется готовых).
Если будут вопросы пиши )

@egorikas
Copy link
Contributor

Исследовал что есть.

  1. Есть клиентская либа - https://github.com/sochix/TLSharp
    По апи, она достаточно простая и посылать сообщения в канал можно будет в 50 строк (где-то)
    ссылка на авторизационный пример, придется авторизовываться, т.к. неавторизованные могут делать очень мало тык

  2. Ручной поток авторизации - придется искать либу для работы с Mtp протоколом
    и делать что-то такое

  1. Зарегестрироваться как разработчики
  2. Указать хэши приложения
  3. Отправляем номер телеграмму
  4. Отправляем код, который пришел на этот номер
  5. Получаем авторизационную сессию, храним ее, пользуемся ей
  1. Можно сделать бота (не факт, что нужно), я не особо представляю, как он может пригодиться

@egorikas
Copy link
Contributor

Если нет возражений, я сделаю на готовой либе, а потом будем смотреть, если чего-то не хватает, допилим ручками. @AnatolyKulakov @Sergey-Buyanov есть возражения?

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Sep 30, 2018

По поводу кода и библиотек забыли указать, что нужна поддержка .NET Core
TLSharp можно использовать в .NET Core?
Если нет, возможно помогут библиотеки
https://github.com/OpenTl/OpenTl.ClientApi
https://github.com/egramtel/egram.tel

Также можешь указать, что нам надо хранить на стороне сервера для аутентификации пользователя? + что нужно для уникальной идентифицировать пользователя (userId, Phone?) в Telegram, чтобы можно было на этой основе выдавать права

@egorikas
Copy link
Contributor

Нам не нужна вся функционально, можно куски выдрать из той TLSharp, потому что она под MIT. Либо взять https://github.com/OpenTl/OpenTl.ClientApi, чтобы не изобретать велосипед. egram.tel построен на Rx, поэтому что-то позаимствовать будет проблематично.

Поэтому я наверное настроен попробовать OpenTl.ClientApi, если нет, выдрать куски классов из TLSharp, потому что пул-реквесты в него не мержатся с мая и это очень странно.

Хранить надо:

  1. API_ID и API_HASH - эти штуки берутся из личного кабинета разработчика, на сайте телеграмма
  2. Объект, который вернется от телеграмма
(auth.authorization
  expires:1403938438
  user:(userSelf
    id:603177
    first_name:"John"
    last_name:"Doe"
    phone:"79991234567"
    photo:(userProfilePhotoEmpty)
    status:(userStatusEmpty)
    inactive:(boolTrue)
  )
)

При реализации станет понятно, но скорее всего, можно будет хранить access hash
3. Можно хранить телефон, через который будут проводиться аунтефикации, а можно не хранить. Суть в том, что токен иногда придется обновлять и для этого, нужно будет приложение и код доступа, которое в это приложение придет
As a result of authorization, the client key, auth_key_id, becomes associated with the user, and each subsequent API call with this key will be executed with that user’s identity. The authorization method itself returns the relevant user and the association expiration time, expires. It is best to immediately store the User ID locally in a binding with the key. At some point in time (>= expires), the association will expire, and the authorization process will have to be repeated. (c)

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Sep 30, 2018

Да,давай, как ты говоришь попробуем использовать OpenTi.ClientApi.
Ещё вопрос, для поста в группу достаточно использовать app id + hash. Или для этого нужно ещё аутентифицировать пользователя по коду. Т.е. возможны ли не интерактивные действия?

Т.е например, такой use case возможен? Например, пользователь логинится, через vk. Формируем информацию для публикации и отправляем её в telegram.

@egorikas
Copy link
Contributor

Да, возможны, только переодически нужно будет перелогиниваться в систему, для этого, пользователь должен будет ввести код, который приедет ему на телефон, чтобы мы смогли его использовать в запросах
Да, возможен, если пользователь зарегестрирован в телеграмме под тем же номером + ему нужно будет ввести код из приложения телеграмма

@kulakovt
Copy link
Member Author

А нет ли возможности AutoRefreshToken? Кажется что обязательное переодическое перелогиневание - это довольно странная ситуация. Я не хочу внезапно потерять возможность писать анонсы в Канал, только потому что нашей библиотеке понадобилось снова ввести код подтверждения. У меня может с собой рядом не быть телефона, или не быть окна для ввода нового кода или вообще я буду в необитаемом отпуске. Процесс должен работать и без моего вмешательстава. Я хочу один раз дать ей "бесконечный токен", "админский доступ", "вечную жизнь" или "права на автоматическое обновление токена" и всё!

@Sergey-Buyanov
Copy link
Contributor

Вроде возможно также постить новости в группу через бота

@egorikas
Copy link
Contributor

egorikas commented Sep 30, 2018

@AnatolyKulakov авторефреш и прочее, только через бота. Тогда надо будет сделать бота, дать ему админские права к каналу и писать через него. Это конечно добавление уровень сложности, но тоже прекрасно решаемо

@egorikas
Copy link
Contributor

P.s. мне тогда надо будет что-то такое сделать https://medium.com/@xabaras/sending-a-message-to-a-telegram-channel-the-easy-way-eb0a0b32968
А тебе его добавить админом на страничку и вуаля, все счастливы

@kulakovt
Copy link
Member Author

Звучит, аки то что нам надо. У использования бота для этих целей есть минусы?

@egorikas
Copy link
Contributor

  • возможность отсылать сообщения контактам, а так же в каналы и чаты;
    Тут как будет, человек должен будет написать боту и только тогда бот сможет посылать ему сообщения (личные сообщения)
  • получение количества просмотров и репостов для конкретной записи - этого я не нашел, надо будет еще поискать
  • репост, для меня пока не совсем очевидно, но думаю реализуемо

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Sep 30, 2018

@egorikas а что с точки с зрения безопасности? Отсылать сообщение к боту (делать post) сможет любой? При request-е используется какой-то токен?

@egorikas
Copy link
Contributor

egorikas commented Sep 30, 2018

При реквесте надо будет знать уникальный идентификатор бота и токен авторизации, при каждом запросе используется их связка @Sergey-Buyanov

@Sergey-Buyanov
Copy link
Contributor

Давайте сделаем тогда какой-нибудь прототип на основе bot-a, чтобы он делал post в тестовую группу и посмотрим как-это будет работать.

egorikas added a commit to egorikas/AuditServer that referenced this issue Oct 2, 2018
@egorikas
Copy link
Contributor

egorikas commented Oct 2, 2018

@AnatolyKulakov @Sergey-Buyanov
Немножечко поэксмерементировал
https://github.com/egorikas/AuditServer/tree/master/TelegramBotTheory
https://t.me/dot_net_ru_test_channel

  • не интерактивное выполнение всех действий;
    У бота есть ключ, все действия по нему
  • работа с ключами доступа, без использования пароля пользователя (OAuth и т.д.);
    см. предыдущий пункт
  • возможность отсылать сообщения контактам, а так же в каналы и чаты;
    50%50, возможно отсылать сообщение в чаты, а также людям, кто начал взаимодействовать с ботом
  • возможность репостить чужие сообщения;
    нужно знать откуда
  • получение списка сообщений в канале;
    с помощью бота - нельзя
  • получение количества просмотров и репостов для конкретной записи.
    https://stackoverflow.com/questions/42585314/telegram-channels-post-view-count
    нужно будет написать небольшого скрапера, в догонку к боту, который будет забирать количество прочтений в канале

P.s.
примеры всякого с ботом - https://github.com/TelegramBots/Telegram.Bot/tree/master/test/Telegram.Bot.Tests.Integ

@kulakovt
Copy link
Member Author

kulakovt commented Oct 2, 2018

Если рассмотреть вариант, что ключи от бота утекли. Можно ли как-то оперативно забрать у него доступ ко всему? Отозвать ключ?

@egorikas
Copy link
Contributor

egorikas commented Oct 2, 2018

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Oct 2, 2018

Пара вопросов
1 > https://github.com/egorikas/AuditServer/tree/master/TelegramBotTheory
Где в примере используется/нужно использовать ключ?
2. Можешь написать, какие действия нам нужно сделать для создания/регистрации bot-a?
3. > Можно ли как-то оперативно забрать у него доступ ко всему? Отозвать ключ?
Это может делать любой?

@egorikas
Copy link
Contributor

egorikas commented Oct 2, 2018

  1. var botClient = new TelegramBotClient("здесь будет ключ", proxy);
  2. в телеграмме есть бот @Botfather, создается через него. буквально в 3 команды
    image

  1. Нужно вызвать /revoke – Revoke bot access token, вызвать это для бота, сможет только создатель бота

@egorikas
Copy link
Contributor

egorikas commented Oct 2, 2018

image
Пример генерации нового токена

@kulakovt
Copy link
Member Author

kulakovt commented Oct 2, 2018

@Sergey-Buyanov , думаю, во время интеграции снова встанет вопрос про Key Chain (который мы затрагивали при обсуждении VK интеграции). Нам нужно обеспечить общий механизм хранения, раздачи, создания и перевыпуска ключей для всех внешних сервисов.

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Oct 2, 2018

Да, согласен, и это отдельная тема.
@egorikas вообще можно автоматизировать получение/обновление bot access token? Я так понимаю минимум для этого нам надо сделать аутентификацию пользователя в telegram, от которого будут делаться эти действия

Ещё, @AnatolyKulakov в рамках текущей задачи, хотим делать аутентификацию пользователя у нас на сервере через Telegram?

@kulakovt
Copy link
Member Author

kulakovt commented Oct 2, 2018

автоматизировать получение/обновление bot access token

Думаю на первом этапе можно просто описать в wiki как это сделать вручную. Всё-таки авторизация новых интеграций это не самая частая операция. А автоматизироваться подобные задачи могут сложно.

в рамках текущей задачи, хотим делать аутентификацию пользователя у нас на сервере через Telegram

В рамках этой точно не надо. Да и домен управления пользователями у нас ещё не придуман. Надо заняться этой задачей на ближайшем собрании.

@egorikas
Copy link
Contributor

egorikas commented Oct 2, 2018

Я считаю, что токен в конфиге - это оптимальный выбор. Чтобы совсем это автоматизировать - это путь с вводом кода из приложения, как я уже говорил. + он бессрочный и если его особо не раскрывать, вероятность того, что он утечет не особо большая + бота можно ограничить только постингом сообщений в канал.

@Sergey-Buyanov
Copy link
Contributor

Да, думаю сделаем пока в конфиге appsettings.json. Для тестовых целей выделим access token тестового бота и тестовый канал
Потом в appveyour можно будет зашифровать и деплоить с рабочим ключом

@egorikas давая тогда сделаем интерфейс для компонента(фасада) работы с Telegram и позволяющего пока только постить сообщения в канал и который будем использовать в проекте
положить думаю можно сюда src/Components/DotNetRu.Components.Telegram.Contract
сделаю branch для этого

@egorikas
Copy link
Contributor

egorikas commented Oct 3, 2018

Я вечером сегодня или завтра набросаю интерфейс и обсудим

@kulakovt
Copy link
Member Author

kulakovt commented Oct 3, 2018

Да, думаю сделаем пока в конфиге appsettings.json. Для тестовых целей выделим access token тестового бота и тестовый канал

Для тестов да. Но всё же хотелось бы начать пользоваться Сервером как только в нём появится минимальный функционал (Публикация). Поэтому предлагаю создать таску по написанию нормального «Секретного хранилища» и начать там его обсуждение.

И хотелось бы чтобы уже сейчас Телеграмная интеграция просто попросила зависимостью ISecretManager, который в тестовой реализации использует AppSettings. Чтобы при реализации таски можно было не менять все интеграции (VK, Twitter), а просто подменить реализацию провайдера с паролями.

@Sergey-Buyanov
Copy link
Contributor

Да, надо подумать
Как мне видится, в реализации компонента, хотелось бы только только зависимости от сторонних библиотек. Настройку осуществлять в точке сборке Autofac, беря значения из абстрактного хранилища

@egorikas
Copy link
Contributor

egorikas commented Oct 3, 2018

Так что в итоге, откуда и как мне брать токены для бота? Есть какое-то окончательно понимание?

@Sergey-Buyanov
Copy link
Contributor

Для компонента должно быть без разницы, а так пока из appsettings.json сервиса

@egorikas
Copy link
Contributor

egorikas commented Oct 4, 2018

Я скорее про то, если ли какой-то интерфейс для секретов. Или сделать по классике, через инекцию Options в компонент?

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Oct 4, 2018

Можно завести в компоненте нужный тебе интерфейс, также IOptions вполне подойдет
В дальнейшем, мы сможем смаппить его на что угодно

@Sergey-Buyanov
Copy link
Contributor

Sergey-Buyanov commented Oct 5, 2018

Если что, буду доступен только в понедельник

@egorikas
Copy link
Contributor

egorikas commented Oct 5, 2018

Хорошо, я как раз думаю к нему сделаю.

@egorikas
Copy link
Contributor

egorikas commented Oct 9, 2018

@AnatolyKulakov в каком формате обычно сообщения в канал? Просто текст?
Достаточно будет только текста для первой итерации?

@kulakovt
Copy link
Member Author

kulakovt commented Oct 9, 2018

Обычно это просто текст и ссылка (на регистрацию или материалы).
Вот тут примеры: https://t.me/spbdotnet

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants