commit - 3d83924f0dd1189b4c870f743323c1529bf527f9
commit + 6aae7a73f0c90bb618878e3119a181faa4303229
blob - fc762803c499ce2fddcd1e7856cc72cd75a1f909
blob + 88c057339c44ad9c22b0d3f790bad7bcc9608c43
--- capsule/atom.xml
+++ capsule/atom.xml
<name>continue</name>
<email>continue@to.any-key.press</email>
</author>
- <updated>2025-01-08T09:33:35.328393+00:00</updated>
+ <updated>2025-01-19T15:05:20.498204+00:00</updated>
+ <entry>
+ <id>gemini://any-key.press/python/avk.gmi</id>
+ <link href="gemini://any-key.press/python/avk.gmi" rel="alternate"/>
+ <title>avk ⚛️ формирование Atom-ленты для пабликов ВКонтакте</title>
+ <updated>2025-01-19T15:05:20.498204+00:00</updated>
+ </entry>
<entry>
<id>gemini://any-key.press/trap/2025-01-02_barking_fox.gmi</id>
<link href="gemini://any-key.press/trap/2025-01-02_barking_fox.gmi" rel="alternate"/>
blob - a0c9d939de268bffba476adea0fa63c10785536a
blob + 58bc81810870ae1d06fa95768c3e88c53e8aab38
--- capsule/python/index.gmi
+++ capsule/python/index.gmi
Язык программирования Python
+=> avk.gmi avk ⚛️ формирование Atom-ленты для пабликов ВКонтакте
=> ../vostok/atom2gemfeed.gmi Gemini-лента публикаций из Atom-ленты (реализовано на Python)
=> python3.11-tools.gmi Утилиты, встроенные в Python
=> ../yah2g/ yah2g: ещё один http-в-gemini прокси (реализовано на Python)
blob - /dev/null
blob + ab80c0fd15d67be3edd86f6ce7f98b7431a4a298 (mode 644)
--- /dev/null
+++ capsule/python/avk.gmi
+# avk ⚛️ формирование Atom-ленты для пабликов ВКонтакте
+
+Ещё с конца 2024 года (и, как минимум, первую половину января 2025-го) RSS-bridge стал просто отвратительно работать с ВКонтакте. Видимо всё началось после какого-то обновления со стороны ВК. Сервер https://rss-bridge.org/bridge01/ просто отказался работать. Через какое-то время, спасибо sn4il'у, на сервере https://rss.thedroth.rocks/ стал работать второй мост (VK2). Но и он работал как-то не идеально: чем дальше, тем чаще стал возвращать ошибку (Bridge returned error 500!).
+
+Я, например, не пользуюсь рекомендательными алгоритмами музыкальных платформ и предпочитаю следить напрямую за интересующими меня музыкантами. А некоторые русскоязычные артисты ведут только свой ВК. Но, конечно, зарегистрироваться и сидеть из-за этого в ВК я не намерен.
+
+Поэтому я решил написать свой скапер содержимого пабликов ВКонтакте. Я заметил, что мобильная версия сайта (https://m.vk.com/<xxx>) отдаёт содержимое последних пяти записей. Точнее закреплённую запись (или их может быть несколько?) и четырёх наиболее свежих (или менее). После беглого просмотра дампа работы браузера, я понял что ВК отдаёт содержимое записей при заполненности некоторых кук (cookies). Основную массу значений он отдаёт сам в ответе, но нужно ещё добавить куку с именем "remixmdevice" и значением, например, "1920/1080/1/!". То есть нехитрыми шагами (запрос, добавление куки, второй запрос) мы получаем заглавную станицу ВК-паблика с содержимым пяти записей.
+
+Далее дело за малым: разбираем HTML, следим за тэгами и их классами, запоминаем текущий стек классов элементов <div> и (на основе всего этого) формируем Atom-ленту. Я понимаю, что имена классов это не самое надёжное средство ориентирования в содержимом страницы, но мне кажется, что в будущем мне проще будет перебить новые константы после обновления интерфейса со стороны ВК, чем тащить ради этой задачи какой-нибудь Beautiful Soup, который всё равно не будет универсальным средством.
+
+Простоя реализация avk.py позволила не использовать внешних зависимостей. Для решения задачи хватило стандартной библиотеки Python:
+* urllib.request для выполнения запроса к m.vk.com
+* html.parser для разбора ответа от m.vk.com
+* http.server для HTTP сервера, который и отдаёт Atom-ленту
+
+Получившийся HTTP сервер (https://avk.any-key.press/) ожидает имя ВК-паблика в параметре name. Например, что бы получить Atom-ленту для страницы https://vk.com/security нужно выполнить запрос https://avk.any-key.press/?name=security
+
+```
+$ curl "https://avk.any-key.press/?name=security"
+<?xml version='1.0' encoding='utf-8'?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>Безопасность | ВКонтакте</title>
+ <id>https://m.vk.com/security</id>
+ <updated>2025-01-17T14:31:00+03:00</updated>
+ <generator uri="https://got.any-key.press/?action=summary&path=avk.git" version="0.1">Anonymous Atom feed generator (by VK)</generator>
+ <entry>
+ <id>https://m.vk.com/wall-777107_188655</id>
+ <updated>2025-01-16T17:22:00+03:00</updated>
+ <title>Беспарольная авторизация — это безопасность, скорость и никакого стресса</title>
+ <link rel="alternate" href="https://m.vk.com/wall-777107_188655" />
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <p>Беспарольная авторизация — это безопасность, скорость и никакого стресса. Ещё не попробовали? Пора это исправить! 💙</p>
+ <hr />
+ <p>Новый год встретили, а об итогах 2024-го не рассказали. 🤗 Исправляемся и делимся с вами главными </p>
+ <a href="https://vk.com/press/id-passwords-2024">достижениями</a>
+ <p> VK ID.</p>
+ <br />
+ <br />
+ <p>За прошедший год ⃣ ⃣ млн пользователей VK ID перешли на быстрый вход без пароля — по скану лица, отпечатку пальца или одноразовому коду. Это не только удобно, но и безопасно: такие способы авторизации лучше защищают от взлома путём перебора паролей. </p>
+ <br />
+ <br />
+ <p>🚀 Всего в 2024 году ежемесячная активная аудитория VK ID достигла 126 млн — на 10% больше, чем годом раньше. </p>
+ <br />
+ <br />
+ <p>А количество сайтов, куда можно войти в один клик, увеличилось на 20 000 🔥</p>
+ <br />
+ <br />
+ <p>Продолжаем двигаться только вперёд и совершенствовать VK ID. Следите за новостями и нашими новыми запусками 💙</p>
+ <br />
+ <img src="https://sun9-37.userapi.com/s/v1/ig2/vnyQVf57RoNU8FoUjXvaovfvqwcYLexz3IN3RuLBBfuZNe5ulzEIW1l__4wZC_q3jQcEwqn654lbuMI8LEOtwoe8.jpg?quality=95&as=32x18,48x27,72x40,108x61,160x90,240x135,360x202,480x270,540x304,640x360,720x405,1080x607,1280x720,1440x810,2560x1440&from=bu&u=GVT7OWKLGlGIJaPM_qr5BkBkqtZJutN1wY0O6rrTBUo&cs=807x454" />
+ </div>
+ </content>
+ </entry>
+```
+
+Если кому-то будет полезно - добро пожаловать, пользуйтесь.
+
+Но стоит учитывать, что сервер не хранит состояние. То есть в формируемой ленте всегда будет пять записей (включая закреплённые). Поэтому, если это возможно, стоит настроить частоту обновления в вашем RSS-агрегаторе так, что бы не терять данные. Если между двумя запросами Atom-ленты в ВК-паблике будет опубликовано более пяти сообщений, то часть публикаций будет утеряна.
+
+Исходный код можно найти в git-репозитории:
+```
+ssh://anonymous@got.any-key.press/avk
+```
+=> https://got.any-key.press/?action=summary&path=avk.git Web интерфейс к git репозиторию
+
+Вопросы, предложения и тому подобное вы можете:
+* слать по электронной почте: avk@to.any-key.press
+* оформить ответом к моему посту в ActivityPub:
+=> https://honk.any-key.press/u/continue/h/V32H5ywt345wKmJ3N2