Изучение механизмов поиска в Telegram

Дата публикации: 2018-08-23
Автор: A B (@abtelegramuser)
Tags: Метки: ,

Введение

Изучение механизма глобального поиска в Telegram было интересно ввиду некоторых неточностей поиска, о которых рассказывалось ранее на докладе в DC7495. Дополнительной мотивацией послужил конкурс на поиск в Telegram от PCL – Private Chat Leaks (https://t.me/JoinPrivateChatAnnouncements/8).

Неочевидный результат поиска

Для тестирования поиска использовались следующие клиенты:

– веб-версия Telegram (web.telegram.org, через браузер Opera Mini для Android);

– Telegram X для Android (более удобен для поиска, чем официальные мобильные клиенты).

В отдельных случаях для сравнения результатов использовался Telegram Desktop для Linux и Windows, а также iOS-клиент.

По результатам изучения был написан скрипт на Python, осуществляющий поиск странных и неочевидных результатов-аккаунтов по случайным сочетаниям символов.

Первые результаты анализа

Из очевидных вещей о поиске в Telegram сразу стоит отметить следующее:

  1. Поиск может выполняться как в веб-версии Telegram, так и в приложении, при этом производится параллельно поиск сообщений и аккаунтов (групп, каналов, людей — далее “глобальный поиск”).
  2. Максимально возможное количество результатов глобального поиска — 3. Насколько известно, это ограничение API Telegram.
  3. Через приложение Telegram для Android или iOS, применяя стандартную клавиатуру, невозможно набрать смайлики emoji в поле поиска. В то же время, через web-версию Telegram поиск по смайликам возможен.

В настоящее время результаты поиска соответствуют введённым в поиске символам и частично предсказуемы. Поиск производится только по полям “First name” и “Last name” пользователя либо “Name” группы, а также по полю “username” (@-идентификатор). Username может отсутствовать у пользователя или у приватной группы, такие в результаты поиска не попадут.

Механизм поиска

Поиск производится следующим образом:

  1. Поля, по которым производится поиск, разбиваются на слова. Слова могут быть разделены пробелом, подчёркиванием, символами пунктуации. Также отдельными словами считается всё, что начинается с заглавной буквы. Например, ThisIsMyChat – 4 слова, а не одно. Каждый смайлик emoji считается отдельным словом.
  2. Порядок слов, по которым производится поиск, не важен, результаты будут одинаковыми
  3. Основной язык поиска – английский. Вводя в поиске английские буквы, можно найти в том числе группы с русскими именами, и наоборот (хотя последнее не всегда наблюдалось). Английские буквы совпадают с русскими через транслит. Однозначного соответствия между русскими и английскими буквами нет. Например, русская буква «к» соответствует английским «k» и «q»
  4. Все слова, указанные в поиске пользователем, сравниваются со словами в имени группы. Совпадением считается, когда любое слово из имени группы начинается со слова в поиске.
  5. Минимальное количество символов для поля поиска – 5 букв или 3 смайлика emoji (иногда срабатывают только 5 смайликов). Можно обойти лимит на минимум 5 символов в строке поиска – написать символ 3 раза через пробел, например, “K K K”.

Также из нескольких одинаково начинающихся слов в поисковой выбирается длинное, остальные игнорируются. Например, поиск по “Di Bi B” аналогичен поиску по “Di Bi”.

В первую очередь, насколько можно судить, происходит матчинг по юзернейму, это наблюдается в подавляющем количестве результатов. Однако, бывает, что матчинг полностью происходит по имени группы, если оно длинное (пример: “z W 14 C” матчится с “7 АПР. 14:00 Мастер Класс – как зарабатывать 1 МЛН. в МЕС. с телефона”, при этом в запросе нет начала юзернейма группы @onemlnivent).

Отдельного внимания заслуживает матчинг латиницы и кириллицы, который явно происходит не по общеиспользуемым правилам транскрибирования. Как можно убедиться, есть неоднозначные соответствия, например, “к” соответствует “k” и “q”. (пример: «my group q» матчится с «Мировая Кли group», my – МИровая, q – Кли). При этом возможны неожиданные частичные совпадения: буква “ш” в результатах на буквы “ss” в запросе (пример: “w ss о” матчится с “Визы в США @ohmyvisa”, Визы – w, ss – США (ssha), o – ohmyvisa).

Другие такие же соответствия приведены в таблице ниже.

Кириллические символыЛатинские символыПримеры запросов
вv,wv ok l
ввvwO u M vW vW
кk,qmy group q
шssh,ssw ss о
йj,ij t 3 i
щschSC F gb
я,юjHM J l

Как показала практика, если выдается не 3, а 1-2 результата, это не значит, что не появится дополнительных результатов при уточнении поиска (при добавлении ещё буквы к одному из поисковых слов или при добавлении слова).

Кроме того, было замечено, что количество результатов на разных клиентов может разниться.
Предположительно, такое происходит потому, что некоторые группы (с малым количеством пользователей или содержащие нежелательный контент) имеют более низкий приоритет в поиске.

Вероятно, наличие/отсутствие строчки в результате поиска может неочевидным образом зависеть от устройства/приложения, которое используется для работы с Telegram. Однако результаты полностью не скрываются и оказываются доступными при добавлении букв в поисковый запрос.

Примеры:

ЗапросAndroid / WebiPhone
my group hGo my group @httmonyGo my group @httmony
My lovely Handbeg Group @Lovelyhandbag
my group hiHirogeneral (it’s my dog name) Coin Group @f2fbitcoinsgHirogeneral (it’s my dog name) Coin Group @f2fbitcoinsg
my group haMy lovely Handbeg Group @Lovelyhandbag
hardware group @myhardware
My lovely Handbeg Group @Lovelyhandbag
hardware group @myhardware

 

Результат поиска в iPhone

Результат поиска в Telegram Desktop

 

Примеры:

ЗапросDesktop (Linux)WebiPhone
Y Y YЯндекс @yandex
yandex @ya
Яндекс @yandex
Яндекс.Касса: платежи @YandexCheckoutPaymentBot
yandex @ya
Яндекс @yandex
Яндекс.Касса: платежи @YandexCheckoutPaymentBot
yandex @ya
Y Y Y 2Aliexpress гид @important_2_you
DJ_Yayo_Music @DJ_YaYo_2018
יד שנייה הרשמי @yad_2
Aliexpress гид @important_2_you
DJ_Yayo_Music @DJ_YaYo_2018
יד שנייה הרשמי @yad_2
Aliexpress гид @important_2_you
Dunyo Yangiliklari @dunyo_yangiliklar_2018
יד שנייה הרשמי @yad_2

Результат поиска в Telegram Desktop

Результат поиска в Telegram Web

 

Автоматизация

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

Проверка мультиязычного соответствия потребовала составления минимального словаря сочетаний символов для русского и английского:

Основная работа выполняется с помощью подключенного через библиотеку telethon клиента Telegram, который производит поиск:

В процессе разработки и тестирования были найдены самые разные комбинации запросов, при которых появлялись неожиданные с точки зрения программной проверки результаты. Некоторые скриптом не парсятся корректно и в текущий момент. Предлагаем каждому посмотреть на такие запросы и найти странности: “OG Y RO”, “W T l”, “7 l PE”, “fY k F 4”, “q 2p c”, “8 qW v”, “y i US dE”, “sK W C k”, “W 3Y V”, “G G c 1o”, “u t Oq”, “P 9 Tt”.

Полный исходный код доступен на Github. Учтите, что для запуска необходимо создать свой app_id и подключить реальный аккаунт (номера телефона) при первом запуске!

Поиск по сообщениям

Отдельно стоит рассказать про поиск по сообщениям. Он ведётся по диалогам, каналам и группам, в которых состоит пользователь. При полнотекстовом поиске учитываются словоформы, определяется часть речи, в том числе для не существующих в природе слов.

Пример:

«яча» находит фразу «Но это не о ячем не говорит это мог быть…»

«шорек» находит «шорьки»

«воркаться» находит «воркался»

«воркало» _не_ находит «воркался», но находит «воркает»

«нов» находит «нове»

Полнотекстовый поиск может осуществляться даже через web-версию телеграма, причём результаты включают в себя старые сообщения двухлетней давности (2016 года).

Таким образом, информация о всех сообщениях в (по крайней мере, публичных) чатах доступна для ПО на серверах Telegram в незашифрованном виде, слова в сообщениях индексируются и сортируются по словоформам, причём данный индекс, по-видимому, не имеет срока давности.