Мне нравится проект Twister. К сожалению, публикаций о нём немного, и вообще, по меткому выражению коллеги, это «микроблог для отщепенцев», причинами чему являются децентрализованная структура и отсутствие лёгких для установки клиентов.

Часто я задавался вопросом: как дать незнакомому с Твистером человеку ссылку на какое-либо сообщение или какого-то пользователя системы. В общем, некая база в интернете, пусть и идущая вразрез с децентрализованностью, но удобная с точки зрения обмена ссылками. В Твистере мне подсказали два сайта: http://yazgi.net/twister/users/ и https://twisterio.com.

Однако ни один мне не понравился, и я решил написать свой. Надеюсь, это как-то поможет Твистеру завоевать любовь новых пользователей или немного подстегнёт других разработчиков помочь проекту.

Встречайте — Твистник (твистер, спутник, вестник).


Зачем ещё один TwisterIO?


Твистерио хорош, и я им достаточно долго (пару недель) пользовался, но есть вещи, которые меня не устраивают. В порядке важности:
  1. Неморфологический поиск.
  2. Проиндексированных данных процентов на 30-40% меньше, чем могло бы быть (у многих пользователей только часть их твистов).
  3. Общая медленность сайта (впрочем, возможно это связано с тем, что он хостится в США, не знаю).

В своём велосипеде я постарался исправить эти недостатки. Получилось или нет — решать вам.

(В довесок ко всему, тема микроблогов и сбора информации с них мне достаточно близка: я собираю твиты и их статистику в Белгородском сегменте Твиттера, около 4 млн твитов. Почему бы и не поупражняться в небольшом проекте для Твистера.)

Устройство


Проект состоит из трёх основных частей: парсера, поискового движка и конечного сайта.

Парсер


Парсер вызывает функции распределённой хеш-таблицы Твистера для получения профилей пользователей и их сообщений.

Ввиду общей структуры распределённых хеш-таблиц (DHT) данные не всегда возможно получить. Иногда публичные сообщения от некоторых пользователей приходится ждать по несколько часов (или дней), даже после того, как ты подписался на этих пользователей. Поэтому необходимо запускать парсер несколько раз на одних и тех же данных (пользователях и их сообщениях).

Вдобавок ко всему, демон twisterd частенько падает по неизвестным мне причинам, поэтому пришлось повозиться с одним только парсером пару дней.

Парсер работает в пяти режимах:
  • сбор новых пользователей (самый быстрый режим);
  • обновление профилей и аватарок пользователей;
  • обновление самых последних написанных сообщений;
  • обновление сообщений самых многопишущих пользователей;
  • проверка всех сообщений всех пользователей (самый медленный и редко доходящий до конца режим).

Эмпирическим путём удалось примерно подобрать необходимую частоту запуска каждого из режимов.

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

Индексация и поиск


Собранные парсером сообщения скармливаются моему любимому поисковому движку Sphinx, который индексирует все тексты с учётом русской, английской и немецкой морфологии.

На данный момент проиндексирован почти миллион твистов; это около 94% от общего числа, если верить статистике сайта yazgi.net.

Сайт


Сайт сделан на фреймворке Yii2, пожалуй, лучшем PHP-фреймворке, который я когда-либо использовал. При поиске больше чем одного ключевого слова сайт предлагает выбор типа сортировки результатов: по релевантности и дате. Расширение Sphinx для Yii2 здесь пришлось кстати. На фронтенде — уже поднадоевший многим (не мне: я совершенно не верстальщик и при виде float: left впадаю в ступор и теряю волю), но от этого не менее замечательный Bootstrap (ассет для него так же есть в Yii2 из коробки).

Никаких дополнительных расширений и Composer-пакетов не потребовалось.

Всё это работает на операционной системе Debian 8 Jessie. Все используемые пакеты (PHP, MySQL и прочее, за исключением поискового движка) — из стабильных репозиториев этого дистрибутива. (Как говорит один мой друг: православие, самодержавие, стабильность.)

Дальше


Морфология


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

Опенсорс


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

Перевод


Твисты: на днях хочу сделать перевод текста сообщений с помощью API Яндекс.Перевода. Чтобы почти как в Твиттере. (Пока форматировал статью под Хабр, сделал.)

Интерфейс сайта: если кто-нибудь знает какой-либо язык (кроме русского или английского) и хочет помочь проекту, напишите мне: там буквально сорок строк перевести, я не думаю, что у знатока языка это займёт больше получаса.

Прочее


Если сайтом будет пользоваться больше полутора человек, надо будет прикупить или найти бесплатный SSL (посоветуйте что-нибудь, кроме бесплатных китайских сертификатов, на которые ругается половина устройств и браузеров).

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

Ну и вообще, любые пожелания приветствуются.

Ссылки




Спасибо за внимание.

PS
PS: Хабр, сделай, пожалуйста, Маркдаун или хотя бы просто <p>: форматировать статьи без параграфов переносами строк, по-моему, как-то не очень семантично.

Комментарии ()