Портрет 4X_Pro
Был в Сети 28 авг. 2025 г., 22:35
Мультиблог
4X_Pro
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb, slow lifer.

Социальные сети


Новости сайта в Telegram

t.me/4x_pro

Лог жизни

Лог моей жизни, где я фиксирую наиболее эмоционально значимые для меня события и текущее настроение. Является продолжением блога, который я вел в ЖЖ с ноября 2004 по апрель 2018 года.


Итоги интеграции

4X_Pro

Вчера занялся настройкой трансляции из Instagram в свой блог с помощью сервиса IFTTT. Дело шло плохо. Для начала я сделал специальный скрипт для того, чтобы посмотреть, что и в каком формате вообще можно получить из IFTTT. Когда стал запускать, обнаружилось, что в $_SERVER не передаётся заголовок Authorization, хотя в основном IntB я мог его получить. Оказалось, что Apache не передаёт заголовок Authorization напрямую из соображений якобы безопасности, и только при использовании mod_rewrite его получается вытащить. Но этого я не знал, и сначала предполагал, что проблема в самом IFTTT.
Выяснилось, что информации приходит не так уж много: только текст записи, URL первой картинки, HTML-код для вставки и ссылка на URL записи в самом Instagram. Остальные картинки, увы, не получить. Пришлось вручную собирать сообщение такого вида: текст записи, потом картинка, потом ссылка «смотреть все фото в Instagram». Потом было долгое и мучительное тестирование. Во-первых, приходилось каждый раз выкладывать новую тестовую запись в Instagram, а потом её удалять, во-вторых, глючил сам IFTTT, то и дело начиная выдавать ошибку 403. В третьих, долго ломал голову над вопросом, убирать ли фото под cut или же картинки по 200 Кб в наше время не такая уж и проблема. Даже опрос в своём чате устроить пытался. Но в итоге решил, что лишнее действие на то, чтобы развернуть cut — это всё же хуже. И вот, наконец, около полуночи после очередного запуска тестовое сообщение появилось в блоге в том виде, в котором мне и было нужно!
В общем, Великую Интеграцию можно считать завершённой, по крайней мере, первый её этап. Получилось весьма громоздко и костыльно: задействованы целых четыре сторонних сервиса и нет единообразия: с каждой соцсетью взаимодействие строится по-своему. Да и в самом IntB тоже пришлось применить весьма спорное решение: ввести новый request_type, в котором вся выдача, в том числе и заголовков, обрабатывается внутри конкретного action (аналога контроллера в MVC), а не в основной части скрипта, как при обычном режиме работы. «Костылём» это назвать нельзя, поскольку в логику работы IntB в целом это вписывается. Но вот что я заметил: решения, которые слишком сильно отличаются от общепринятых, даже мной самим через какое-то время начинают восприниматься как что-то странное. В большинстве frameworkов в контроллер передаётся объект для HTTP-ответа, который используется для вывода результатов, кода HTTP-ответа, Content-Type и других заголовков. (Собственно, даже в MLCE я сделал так, только там один объект отвечает за работу и с запросом, и ответом). А в IntB сделано иначе: есть несколько предопределённых request_type: обычный запрос с выводом результата в полном шаблоне, AJAX-запрос с выводом куска HTML-кода, RSS и теперь добавил вывод без обработки. И то, какой из request_type применить, определяется отдельным методом get_request_type, который можно переопределить для каждого модуля и в нём сделать проверки на нужный action.
А ещё не хватает гибкости. Например, обычно публикации в Instagram транслируются только в «Лог жизни» и ЖЖ, но не ВК и Twitter. Но иногда бывают и такие, которые хорошо бы отправить и в Twitter, и в Lor.Sh. Например, сейчас хочу нарисовать схему взаимодействия всех сервисов, чтобы наглядно показать результаты интеграции. Но увы, ВК и в Lor придётся копировать её вручную.
Зато пришло в голову ещё одно решение: как реализовать те типы сообщений, которых в IntB не предполагается в принципе, например, геолокации, check-inа, репоста. Оно оказалось очень простым — ввести соответствующие BoardCode. А для reply-to и repost — ещё и сделать асинхронную задачу, которая будет вытаскивать и кешировать информацию о странице из OpenGraph или h-entry. И потом показывать такие ссылки оформленными примерно так же, как оформлен предпросмотр ссылок ВК или Telegram.
Ещё решил немного поменять формат канала в Telegram: не транслировать туда разделы «Мировоззренческое» и «Идеи» (для первого потом отдельный канал сделаю, если буду писать активно), а вместо этого транслировать новости и «Интересные материалы». Так он будет более единообразным по формату. Когда стал это настраивать, обнаружилось, что нужно не только добавить RSS-ленты и бота на канал, но и включить канал в настройках самого бота. И только после этого трансляция будет работать. А ещё возникла мысль, что когда выложу MLCE, выложить в левой колонке подборку ссылок на GitHub-репозитории с моими основными проектами. Правда, для этого нужно туда ещё и TextCMS отправить, и Intellect Board, но для последнего тогда нужно выстроить правильный workflow с branchами, на что пока нет внутреннего ресурса.

Есть поддержка MicroPub

4X_Pro

Весь день сегодня занимался тем, что реализовывал поддержку протокола MicroPub на своём сайте. И таки сделал: это будет первое сообщение, которое я отправлю из Indigenous!
Вообще, чем меня радуют протоколы, используемые в Indieweb, так это наличием сайтов типа webmention.rocks или micropub.rocks, где есть набор готовых тестов для проверки корректности своей реализации. Благодаря им выявил ряд проблем с совместимостью, о которых иначе бы даже не догадался (эх, не быть мне хорошим тестировщиком).

День хороших новостей

4X_Pro

В последние дни жизнь казалась бесперспективной и было чувство усталости от всего. Но со вчерашнего вечера вдруг посыпались позитивные новости. Началось всё с того, что я всё-таки опубликовал заметку про мышление инженера и бизнесмена. Почему-то опасался, что её раскритикуют, но в итоге она набрала уже больше десятка лайков ВК и несколько репостов (что крайне редко бывает с моими материалами). А непосредственно на моём сайте её прокомментировал пользователь с Сетевым именем nekr0z, который также является сторонником IndieWeb. Также он обнаружил, что у меня не работает отображение WebMentions. Сначала я подумал, что это баг в IntB — где-то напутал с роутингом запросов. Но когда подключился к своему VDS и попытался сделать тестовый запрос через curl, получил ошибку TLS. Оказалось, дело в корневых сертификатах. Сделал обновление системы, перезапустил Apache, и всё заработало! А ещё очень приятно было узнать, что есть всё же в Рунете люди, которые не только знают про IndieWeb, но и используют его на своём сайте!
Вторую новость я узнал днём. Мне снова написал Ал.Л. и сообщил, что книга по типологиям, которую он готовил, вышла, и что в неё включена и глава про информионику, которую я посылал ему в начале года. Так что наконец-то что-то из того, что я делал, оказалось увековечено в печатном слове! Я очень обрадовался и объявил об этом и в сообществе ЕТП ВКонтакте, и у себя в Instagram, и в личных новостях. Причем в Instagram появилась возможность отправлять сообщения с компьютера, которой мне ну очень не хватало — третья хорошая новость.
Ещё вчера я нашёл способ реализовать трансляцию в свой блог из Instagram. Оказывается, в IFTTT и Zapier всё же есть возможность делать произвольные POST-сообщения. Просто искать нужно было по ключевому слову Webhooks, что крайне неочевидно. (В Zapier они платные, поэтому придётся использовать IFTTT, таким образом для всей цепочки репостов будет задействовано три разных сервиса). Так что теперь осталось доделать поддержку протокола WebPub в Intellect Board, чтобы делать из IFTTT запрос для репоста из Instagram в раздел «Лог жизни», и на этом Великая Интеграция будет завершена. Можно, конечно, сделать проще — обычный POST-запрос, такой же как при отправке из формы на сайте, но это как-то идеологически неправильно. Плюс WebPub даст возможность писать и из приложения Indigenous, хотя вряд ли я буду этим пользоваться.
А в том же IFTTT я узнал о существовании сервиса Webflow — визуального конструктора сайтов, где обещают возможность генерировать чистый и качественный код. Начал смотреть — первые впечатления довольно положительные. Только экспорт на бесплатном тарифе сделать так просто нельзя (но если постараться, можно вытащить код обходными путями).

Ещё один шаг к Великой Автоматизации

4X_Pro

Всё! Я сделал трансляцию статей из разделов своего мультиблога в Twitter и на стену ВК! В Twitter (и оттуда в Mastodon на lor.sh) трансляция идёт через RSS с помощью сервиса Zappier. В отличие от IFTTT и dlvr.it, которые я использовал раньше, он позволяет управлять что именно из RSS идёт в Twitter: название, описание или ссылка. В частности, для разделов «Новости» и «Интересные материалы» мне нужна трансляция только самого текста без ссылок, а IFTTT и dlvr.it вставляли их принудительно, из-за чего лента выглядела ужасно: под каждым твитом — мой портрет и ссылка на главную 4xpro.ru. Теперь же всё работает как надо: из микроблогов — только текст, из больших блогов — название статьи и ссылка на неё.
От Facebook пришлось отказаться — там некоторое время назад поменялись правила, и теперь автоматическая трансляция на стену профиля то ли вообще невозможна, то ли сильно усложнена. По крайней мере, все сервисы предлагают транслировать только в группы (Facebook Pages, как их сейчас называют). Можно было бы создать такую, но с другой стороны, а так ли мне нужен Facebook вообще?
Ещё создал канал в Telegram и настроил трансляцию и туда с помощью ManyBot. Но у него есть ограничение: не более 5 потоков RSS, поэтому от трансляции микроблогов пришлось отказаться. Впрочем, возможно, потом напишу своего бота для этих целей, а также для отправки объявлений о создании новых тем на форуме.
Для ВКонтакте добавил процедуру через API прямо в код IntB (так же, как раньше и для отправки в ЖЖ из раздела «Лог жизни»), а также возможность отключить экспорт для отдельно взятых сообщений. Смущает, конечно, такая разнородность: где-то средствами IntB, где-то сторонними сервисами. Но зато получилось решение, которое работает уже сейчас, а не когда-нибудь. Ну и плюс не нужно писать запрос на получение доступа к Twitter API (собственно, это и есть главная причина).
Теперь ещё осталось доделать импорт из Instagram в раздел «Лог жизни» и Великую Автоматизацию можно будет считать завершённой! Хотя нет предела совершенству: верхние уровни соответствия принципам IndieWeb предполагают ещё и сбор комментариев и лайков, а также динамическое связывание, чтобы транслировалось не только исходное сообщение, но и последующие правки. Но на данный момент я воспринимаю это как бессмысленную работу, так как для моих блогов правки обычно несущественны.
Правда, как всегда, это оставляет двоякое чувство. Слишком по-разному сделанное оценивают мои субличности. Одна (которой соответствует архетип Тота из Эль-Тат) довольна тем, что решена очередная инженерная задача. Но другая (Гор по Эль-Тат) понимает, что в должной степени оценить важность этого могут только те, у кого тоже есть сайты на самописных CMS. Но много ли таких людей осталось в Интернете и в моём окружении? А всякие пользователи Joomla, Drupal и прочих Wordpressов давно могли поставить соответствующие plug-ins. Про тех, у кого есть только соцсети, а полноценных сайтов и вовсе нет, и говорить не приходится…

Начал работу над фотогалереей для IntB

4X_Pro

Никак не могу определиться, как же быть с OwnYourGram: то ли переделывать его так, чтобы были вызовы через API вместо парсинга, то ли просто сделать свой аналогичный сервис, никак с OYG не связанный, то ли искать способы сделать так, чтобы Instagram парсинг не блокировал. Поэтому в воскресенье решил взяться за другое — за модуль фотогалереи для сайта, сделать который хотел очень-очень давно, но всё откладывал. Там тоже всё идёт очень медленно и тяжело, как говорится, со скрипом. Хотя по серверной части уже почти всё готово, осталась, в основном, вёрстка и действие по выводу всех фотографий на одной странице.

Два дисгармоничных дня

4X_Pro

Вчерашний день начался просто замечательно. Я собрался и быстро сделал то, о чём писал недавно — возможность авторизации в IndieAuth по URL подразделов для пользователя-владельца. Затем решил вопрос с OwnYourGram: установил его на хостинг, где стоят мои старые сайты. Там можно выбирать любую версию Процесс шёл тяжело и мучительно. Оказалось, что хотя на хостинге пишется, что у меня 5 сайтов из 7, реально можно создать только пять, как раньше. То есть хостер обновил тариф, но у старых пользователей автоматически ничего не поменялось. Написал в техподдержку, они ответили, что нужно сменить тариф в панели управления на такой же. После этого заработало, но на ожидание ответа потерялся почти час.
Я уже предвкушал, как объявлю о том, что сделал траснляцию из Instagram в личный блог. Но тут неприятности посыпались дальше. Началось всё с того, что OwnYourGram не находил ссылку на мой сайт для трансляции. Стал разбираться, в чём дело, и обнаружил, что от Instagram вообще ничего не приходит. После недолгой отладки выяснил, что OwnYourGram использует сервис XRay берёт данные напрямую со страницы Instagram, а не через API. Но публичную копию XRay Instagram давно заблокировал, поэтому ничего не работало. Попытался было запустить копию у себя. Но то же самое: ошибка 429 — превышено количество запросов. Хотя на ноутбуке XRay отрабатывает нормально и данные возвращает.
В общем, провозился с этим всю вторую половину дня. И под вечер ощутимо стал нервничать на тему «опять ничего не успеваю», так как над душой висит ещё пара задач по freelance, делать которые категорически не хочется, да ещё в последние дни в мессенджерах стали писать больше, прямо хоть снова закрывай всё.
Поздним вечером хотел было сделать то, что обещал corsico, и даже начал, но скоро понял, что в таком состоянии ничего хорошего не выйдет. Плюс получилось как всегда: небольшое изменение на давно не обновлявшейся системе (всего-то php-curl поставить надо) тянет за собой необходимость кучи обновлений (в частности, система хочет обновить php до 7.3), которые создают риск, что всё поломается, поскольку скрипты тоже довольно старые… В итоге часа полтора провозились, но ничего вообще не сделали, кроме того, что я послал corsico ссылку, как делать HTTP POST без curl. И отложили всё на сегодня, но сегодня я тоже в не особо работоспособном состоянии, и по-хорошему, нужно всё на четверг-пятницу сдвинуть.
Ночью спал плохо. Несколько раз просыпался без видимых причин. И в итоге встал с существенным недосыпом и весь день подтормаживаю. Попытался было играть в WoT, но это был один из самых ужасных игровых дней за последнее время, вплоть до того, что плохо соображал, куда вообще еду. Потом устроил себе отдых в тёмной комнате, немного пришёл в себя, но за остаток дня ничего толком не сделал.
Есть мысль переделать OwnYourGram так, чтобы он делал вызовы через новую API вместо парсинга страниц, и вроде как это даже не так уж сложно (благо весь код взаимодействия собран в одном месте), но что-то в голове пока не складывается.

Некоторое разочарование в IndieWeb

4X_Pro

В последние дни начались какие-то разочарования, связанные с IndieWeb. Сначала перепутал MicroSub с WebSub. Хотел было сделать возможность читать уведомления в мобильном приложении Indigenos. Прочитал описание WebSub, подумал «надо же, как легко реализовать», а потом оказалось, что для Indigenos нужен MicroSub, который значительно сложнее.
Сегодня решил наладить ретрансляцию сообщений через сервис Bridgy.io Но оказалось, что там далеко не всё так хорошо. Для тех же Instagram и Facebook нужно ставить «костыль» в виде web-расширения для броузера. VK он не поддерживает в принципе. По сути, из того, что мне нужно, там нормально работает только взаимодействие с Twitterом. Но и тут возникли сложности: там нельзя явно указать адрес сайта, а Bridgy берёт его из аккаунта в Twitter. И в результате начинаются сложности из-за того, что у меня мультиблог: endpointы для WebMention находятся в подразделах, а не на главной, и Bridgy их просто не видит (хотя отчасти это можно обойти через явную отправку WebMention-запроса к Bridgy).
В общем, возвращаюсь примерно к тому, с чего когда-то начинал: нужно делать ретрансляцию сообщений в соцсети (POSSE в терминах IndieWeb) своими силами. Только вот для Facebook, насколько я понимаю, получить такие права на приложение можно только после прохождения идентификации, что для меня не вариант. В Twitter нужно писать запрос в свободной форме, но неизвестно, дадут права или нет…
А самое главное, видна тенденция на то, что доступ к API у крупных площадок всё более и более ограничивается. И не окажется ли так, что со временем его закроют вообще, и все мои усилия пропадут напрасно.

Написал заметку для IndieWeb Wiki

4X_Pro

Кажется, у меня начинается новый биоритмический максимум!
Сегодня проснулся и сделал то, что собирался почти весь март, — написал о себе и своих разработках для личной страницы в IndieWeb Wiki. Indieweb — сообщество англоязычное, поэтому писать требовалось in English. Но вот объяснить по английски мне концепцию инфохаба или мультиблога было сложно, из-за этого и откладывал. А в случае с мультиблогом смущало ещё то, что никто до подобного не додумался. Правда, перед публикацией решил отправить Tellе и 10geekу с целью убедиться, что написано хоть сколько-то понятно и нет явных ляпов. Но они пока не отписались.

Избавился от внутренней спешки!

4X_Pro

Вчера заметил, что исчезла постоянная внутренняя спешка, которая не давала покоя мне раньше. По крайней мере, это чувствуется в программировании и в игре World of Tanks. Раньше, дописав код, я старался как можно быстрее его запустить. Но в то же время знал, что посыплются ошибки, и я буду, мысленно ругаясь, их устранять. Теперь же перед запуском я неспешно просматриваю код ещё раз и многие мелкие ошибки (типа опечаток) выявляю сразу же. В результате отладка идёт гораздо быстрее.
Да и в WoT стал играть аккуратнее и сливаться одним из последних в случае проигрыша. Хотя на некоторых картах всё ещё не знаю, что делать некоторыми видами техники, и вот тогда начинаю творить дичь.
А сегодня сделал шаг вперёд в плане поддержки IndieWeb — закончил реализацию протокола Webmention в IntB и добавил на этот свой сайт. Но пока что только серверную часть.
Впрочем, сравнивая протоколы IndieWeb и те, которые используются в Mastodon, испытываю некоторое разочарование. В IndieWeb протоколы проще, но вот то, как делается определение адресов для запросов (endpoint discovery), мне не нравится. Вместо запроса по адресу .well-known/что-то-там с формальным ответом в XML или JSON делается парсинг обычной HTML-страницы, где endpoints должны быть указаны в виде link rel. Мало того, что это увеличивает объём страницы для пользователей, так ещё и для извлечения их приходится применять расширение domxml. В результате получается лишняя зависимость, что противоречит моей цели «движок должен работать на любой хостинг-помойке».

Осваиваю IndieAuth

4X_Pro

После нескольких дней переживаний по поводу того, что «всё уже придумано до нас» решил всё же делать поддержку протоколов, используемых в IndieWeb, в Intellect Board. Тем более, большинство из них в реализации куда проще, чем ActivityPub. Единственное что смущает — не получится ли в итоге очередной войны протоколов, и не окажется ли в конце, что я выбрал не то, что нужно.
И сегодня стал разбираться в протоколе IndieAuth. Серверная часть, как выяснилось, в нём реализуется достаточно просто. С клиентской главная сложность в том, чтобы найти все ссылки с rel="me" и авторизовать пользователя через них. Впрочем, как выяснилось, существует сервер indielogin.com, который может взять это на себя. Но когда стал с ним экспериментировать, выснилось, что client_id туда добавляются вручную, и для этого нужно писать создателю этого скрипта. К счастью, на GitHubе есть исходный код, и при необходимости можно будет поднять свою копию для форумов на IntellectBoard, но всё равно как-то несколько разочаровало.


Страницы:
  • 1
  • 2
Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.