lonk: Gemini клиент honk
Проект lonk это Gemini клиент (то есть альтернативный фронтенд) к ActivityPub (Fediverse) серверу honk:
Код выполнен в виде VGI: CGI-подобный скрипт для Gemini сервера Vostok:
Исходный код
Git репозиторий с исходным кодом сервера:
ssh://anonymous@got.any-key.press/lonk
Код написан на языке программирования python (тестировался на версии 3) в виде одного файла lonk.py и использует ТОЛЬКО стандартную библиотеку.
Цели проекта
В общем и целом мне нравится honk. Но есть минимум две тонкости, которые не позволяют мне катомизировать его "под себя" до конца:
- Проект написан на Go. Я ничего не имею против Go, но я пробовал вникнуть в этот язык и мне не понравилось. Просто личная "вкусовщина".
- Родной WEB фронт написан на JavaScript. Тут мне принципиально не нравится необходимость исполнения скриптов на стороне моего браузера.
Так а что же хочется менять? Главную страницу. У honk, условно, есть два вида ленты с постами людей, на которых подписан:
- home: выводятся все посты вперемешку (начала тем и ответы на темы). Тут, как по мне, полный хаос и часто непонятно на какой пост написан очередной ответ.
- first: отображаются только начала новых тем тех, на кого подписан. То есть если я подписан на Х, который отвечает в ветку У, то на странице first я этого не увижу. А хотелось бы.
Поэтому весь lonk был задуман ради своей главной страницы. На ней я постарался совместить относительный хронологический порядок и древовидное представление. Алгоритм следующий: берем все треды обсуждений со страницы home, стартовые сообщения получаем (если необходимо) и оформляем как подразделы второго уровня, а ответы на них как подразделы третьего уровня. Это не идеально, нет строгой хронологической последовательности (алгоритм опирается на последовательность сообщений на странице home), но так лично мне удобнее.
Мой экземпляр lonk/honk
Я не вижу необходимости описывать какую-то инструкцию развёртывания собственного экземпляра lonk (во всяком случае пока), но я думаю, что любой желающий с минимальным опытом сможет это сделать. Если возникнут какие-то сложности/вопросы/предложения или тому подобное, то можете не стесняться и выходить на связь со мной.
Мой экземпляр крутится на той же машине, что и сам honk, поэтому запросы между ними выполняются более-менее сносно (по скорости). Это позволило не кэшировать ответы от honk сервера. Главная страница формируется менее 10 секунд, что меня вполне устраивает.
Если у вас есть уже есть аккаунт в honk и вы доверяете моему серверу хранить токен доступа, то вы можете воспользоваться моим экземпляром lonk.
Если у вас нет honk аккаунта, но вы хотели бы попробовать, то пишите мне на электронную почту, указав желаемое имя пользователя. После получения обратного письма с данными регистрации нового пользователя вы сможете воспользоваться как "родным" HTTPS-клиентом honk, так и моим экземпляром lonk.
Вопрос-ответ
Клиентский сертификат
Я открываю ссылку gemini://any-key.press/vgi/lonk, а там от меня требуют клиентский сертификат. Выглядит это как-то так:
>
SERVER SAYS: Certificate required
The site any-key.press is requesting a client certificate.
This will allow the site to recognise you across requests.
>
Что это? Зачем это?
Серверная часть должна аутентифицировать клиента honk. В протоколе Gemini нет, например, cookie, которые сохраняют сеанс аутентификации в HTTP. Вместо этого Gemini сервер может идентифицировать запросы от одного и того же клиента по клиентскому сертификату. Выполняя обычные запросы ваш Gemini клиент (скорее всего) не предоставляет клиентский сертификат, что бы, помимо прочего, не дать серверу возможность вас отследить. Такие запросы со стороны клиента можно условно назвать анонимными (хотя стоит держать в голове, что сервер, как минимум, знает IP адрес и URL, с которыми вы пришли). Но как только серверу становится необходимо идентифицировать пользователя он отдаёт специальный ответ, который сообщает клиенту, что дальнейшее взаимодействие возможно только с сертификатом со стороны клиента. Именно это требование вы и видите в своём Gemini клиенте.
После успешного получения сертификата нового клиента lonk будет последовательно запрашивать:
- URL сервера honk (для моего экземпляра это https://honk.any-key.press/);
- имя honk пользователя (для моего личного аккаунта это continue);
- пароль honk пользователя.
После успешной аутентификации на honk сервере lonk получит в ответ токет и сохранит его в базу данных вместе с URL сервера honk (имя пользователя и пароль от honk больше не нужны, lonk их не хранит). В следующий раз, когда вы откроете ссылку gemini://any-key.press/vgi/lonk с уже аутентифицированным lonk'ом клиентским сертификатом, не нужно будет передавать никаких дополнительных чувствительных данных (логин/пароль).
Ссылки по теме:
Обратная связь
Вопросы, предложения и тому подобное вы можете:
- слать по электронной почте: lonk@to.any-key.press
- выкладывать в виде поста в ActivityPub (Fediverse), упомянув меня: @continue@honk.any-key.press