# Бороздим интернет без браузера
hugeping(ping,1) — All
2021-02-08 08:53:07


После погружения в gemini и создания своей "капсулы" в нём, мне стало интересно сделать какие-то свои сервисы. Сначала, я прикрутил прогноз погоды по данным METAR-станций. Потом -- добавил поиск по Библии. И тут я понял, что формат gemini просто идеален для использования его как простого интерфейса для личных сервисов!

Выдача gemini -- простой текст. При этом, ссылки всегда находятся на отдельной строке. Это очень наглядно и здорово. Имея свой gemini-сервер и наполняя его нужными сервисами, ты получаешь удобный, чистый и наглядный интерфейс из любого уголка сети!

В Plan9 нет (и не может быть) современного браузера. Почему его не может быть, хорошо описано здесь: https://habr.com/ru/post/541196/ Это сильно пересекается с моей заметкой о ненастоящей победе open source: ii://HZhphc84EsazyASVPck3 Поэтому, в Plan 9 я уже сталкивался с ситуациями, когда мне приходилось делать запросы к веб-ресурсам руками, чтобы авторизоваться, получить нужную информацию в удобном виде и т.д. Но каждый раз это была уникальная ситуация.

А что если совместить всё? Формат gemini -- как чистая выдача. Прямые запросы -- для получения той информации сети, которая нужна. Очищенная от тонн мусора. Оформление полученного инструмента как утилит командной строки, для применения их прямо в acme, а также в виде сервисов gemini! Это может быть интересно!

Есть ситуации, когда сайт предоставляет свой контент через rss. Здесь всё понятно. Но таких сайтов немного. Особенно тех, которые предоставляют в ленте статьи целиком. Есть ситуации, когда сайт отдаёт свои данные по общедоступному rest API. Но это тоже не является общей ситуацией и требует детального изучения этого API. Поэтому я начал с утилиты, которая бы делала GET запрос и вытаскивала из HTML только те узлы документа, которые мне нужны.

Написал, конечно же, на go: https://github.com/gl00my/clearweb/tree/master/htmlcut

Утилита крайне простая! Мы просто задаём тип элемента, одно из ключевых свойств и режим поиска: regexp/совпадение/нахождение подстроки. Если какой-то узел попал в выборку, то в неё же попадёт и все вложенные элементы. Не смотря на свою примитивность, оказалось, что таких функций достаточно. Добавив режим отрицания логики и запуская утилиту в UNIX-конвеерах я смог получать дистиллированный текст статей из: живого журнала, хабра, stackoverflow...

У нас есть текст статьи, но читать его с html тегами невозможно. На github я нашёл утилиту html2gmi и оказалось, что она отлично работает!

Я почистил её от лишних мне функций, и немного поменял для нужного мне поведения: https://github.com/gl00my/clearweb/tree/master/htmlgmi

В качестве примера работы утилит в связке, приведу пример чтения статьи на habr:

curl -s "$1" | htmlcut -val '(post\_full|comment\_\_message|user\-info\_inline)' -regexp | htmlgmi -m -n

А вот фрагмент выдачи для статьи, которую я упоминал выше:

Увидев вот эту публикацию [8] про браузерные войны, я хотел было написать альтернативное наблюдение за тем, как мы докатились до такой жизни. Но Дрю ДеВолт уже всё сказал за меня.

Начиная с первых войн между Netscape и IE, главным инструментом в конкурентной борьбе браузеров стала функциональность. Вот только стратегия неограниченного роста и расширения — совершенно безумная. Слишком долго мы позволяли ей продолжаться.

С помощью wget я скачал все 1217 спецификаций W3C [9], опубликованных на текущий момент 1. Существенная часть из них должна быть реализована в браузере, чтобы современный веб работал. Я подсчитал объём этих спецификаций. Как думаете, насколько сложен современный веб?

=> https://habr.com/ru/post/541180/ [8]
=> https://www.w3.org/TR/ [9] спецификаций W3C

Не знаю как у вас, а у меня при просмотре статьи в таком формате радостно щемит сердце.

Результат меня вдохновил! Я понял, что могу читать интернет прямо в acme! Просто запуская нужные скрипты. Или написав прокси-скрипт, который сам анализирует ссылки и обрабатывает выдачу.

Но сначала нужно было решить проблему с поиском. Мне нужно было искать в acme! Ну, или из консоли.

В gemini на капсуле Толстоевского gemini://rawtext.club/~tolstoevsky/ я узнал о таком метапоисковике как searx, который использует в своей работе google, duckduckgo и так далее. При этом, он не собирает телеметрию. SearX показался мне очень удобным и для начала я просто прогнал его выдачу через свои утилиты:

curl -s -X POST -F 'q='"$q" -F 'category_general=1' -F 'pageno='"$page" https://search.fedi.life/search | htmlcut -val '(result.content|external.link|result.header)' -regexp | htmlgmi -l 0 -m -n

Результат понравился:
INSTEAD [1]
http://instead-hub.github.io
Instead | Definition of Instead by Merriam-Webster [2]

=> http://instead-hub.github.io [1].

Просто абзац текста, ссылка. Абзац текста, ссылка. Где то на этом моменте я начал плакать от умиления. Но парсинг HTML вывода это всё-таки грубо. Почитав про API SearX я узнал, что можно получать выдачу прямо в RSS! И написал ещё одну примитивную программу на go, которая делает всю работу:

https://github.com/gl00my/clearweb/tree/master/searx

Итак, мечта сбылась. Я могу искать в интернете откуда угодно. Из консоли. Из acme. На сервере gemini. И мне не нужен браузер!

Теперь не составило труда оформить поисковик в виде gemini сервиса. Что я и сделал. gemini://hugeping.tk/searx

Я немного увлёкся, и проксировал вывод выдачи на stackoverflow.com так, что теперь можно искать статьи и читать их не уходя из gemini.

Скрипт вывода статьи на stackoverflow получился таким:
curl -s "$1" | htmlcut -val '(js\-post\-body|answers\-subheader)' -regexp | htmlcut -val '(js\-filter)' -regexp -not | htmlgmi -l 0 -m -n

Узнавать нужные элементы вёрстки удобно в инспекторе Firefox.

Что дальше?

За бортом осталась OAuth авторизация. Она тоже может быть оформлена в виде небольших утилит, но пока я этим не занимался.

Главное открытие, которым я хотел поделиться в этой статье, состоит в том, что победить интернет можно и это не так сложно, как кажется на первый взгляд! Да, в выдаче большинства ресурсов находится 99% шлака, но вырезать %1 нужного контента -- посильная задача. И вдруг оказывается, что доступ к нужной информации в веб не обязательно предполагает запуск браузера и приём тонн мусора в свою голову. Эта мысль вдохновляет и поощряет на дальнейшие эксперименты.

> Но на вершине самой высокой и неприступной скалы сидят золотой и красный дракон. Кто это? А это банковские сайты и госуслуги. Удастся ли приручить и их? Пока страшно об этом даже думать, правда? :)

P.S. Edited: 2021-02-09 06:27:39

# Re: Бороздим интернет без браузера
vvs(ping,12) — hugeping
2021-02-08 13:10:54


youtube-dl же. Если удалось вытащить все из youtube, то можно все. Но какой ценой? Тот-же youtube-dl новые версии вынужден делать очень часто. И каждый раз надо реверсить все новые хитрости гугла. Столько усилий оправдано только большим спросом на видео. Стоит ли бороться с каждым отдельно взятым банком?

# Re: Бороздим интернет без браузера
artur(ping,3) — hugeping
2021-02-08 16:32:00


>Главное открытие, которым я хотел поделиться в этой статье, состоит в том, что победить интернет можно и это не так сложно, как кажется на первый взгляд!

>победить интернет

Это современный жирный или вообще?=)

# Re: Бороздим интернет без браузера
hugeping(ping,1) — artur
2021-02-09 13:05:14


>>победить интернет
artur> Это современный жирный или вообще?=)

Это я скорее, как фигура речи. :)

# Re: Бороздим интернет без браузера
artur(ping,3) — hugeping
2021-02-09 18:41:30


А, понял.

С каждым месяцем всё больше убеждаюсь, что таскать "чисто текст" не так уж и неудобно. Вот и гемини удобный...
На подобные настроения подбивает слабый интернет, жирные популярные сайты (ВК, сервисы Google, например).
А пост в закладочки добавлю, лишним не будет=)