Автоматизация кросс-постинга: боремся с трудностями API Facebook | 2026-05-23T14:28:22

Доделал в лучшем виде кросс-постинг из фейсбука на два моих сайта-блога [на которые почти никто не заходит] — beinginamerica точка com и raufaliev точка com. При публикации нового поста в фейсбуке по расписанию стартует механизм перевода поста на английский, разбор приложенных картинок, генерация описаний к ним, создание заголовка на основе текста поста и описания картинок, создание тегов на их же основе, запись поста в turso db — это облачная база, бесплатная до определенных лимитов, создание эмбеддингов через openai, запись в qdrant cloud — это тоже облачная база, но уже векторная, ну и загрузка изображений в wordpress по API, и публикация поста на английском и на русском по API.

Все бы хорошо, но из всех API самый дурацкий — у фейсбука. Во-первых, для страниц как у меня, переведенных в New Experience, нет возможности использовать почти все из этого API. Точнее, есть, но нужно долго доказывать фейсбуку, что это реально надо, показывая документы на стартап, демонстрируя приложение и т.д. Очевидно, им не хочется иметь дело с чем-то уносящим контент из их системы во вне. Кроме этого, токен, который дает доступ к последним сообщениям, относительно короткоживущий (возможно, несколько недель), и получать его заново нужно через браузер только. То есть, любая автоматика требует регулярного внимания, иначе она ломается.

Если протупил и вовремя не выгрузил последние посты через этот Facebook Graph API, они просто исчезают из списка последних и все, больше по API к ним не обратиться. Единственный способ — запросить выгрузку архива у фейсбука. Эта выгрузка тоже довольно дурацкая — там нужно много трансформаций делать и убирать лишнее. Например, в файле с постами, который я обрабатываю, там почему-то хранятся ссылки, которые я отправлял в комментариях без сопроводительного текста. А комментарии там идут в отдельном файле!

Чтобы назначить теги, пришлось решить отдельный челендж. Вот есть около 10000 постов за все время. Это большой кусок, и по нему теги построить нельзя, потому что он в контекстное окно LLM не помещается. А надо. Поэтому я делал так: скрипт берет случайные посты из 10000 в таком объеме, чтобы их суммарный размер был чуть меньше указанного лимита в токенах, и в конец этого блока добавляется промпт «сгенери мне наиболее частые теги, 30 штук» (промпт привожу упрощенно). В итоге я запустил это 10 раз и получил 10 наборов тегов по 30 штук, сгенерированных для разных срезов базы. Получилось 300 тегов, из которых конечно есть полные дубликаты, а есть синонимы и близкие по смыслу. Это все скармливается LLM, и получаем список тегов и иерархию тегов. Теперь у нас есть ограниченный набор тегов, которые максимально отражают 10000 постов. Так получилось, что за почти 20 лет на фейсбуке у меня расклад такой:

Тег Постов

==================================================

#Russia 3412

#Thoughts 3146

#Tech 3105

#Culture 2765

#Hobbies 2726

#AI 1603

#Science 1367

#Software 1358

#Travel 1298

#Learning 1138

#Society 1050

#Nature 958

#Education 915

#Business 902

#Art 894

#Programming 889

#Humor 840

#History 807

#Gadgets 750

#Moscow 713

#USA 614

#Cinema 567

#Webdev 493

#Music 476

#Sports 473

#Mindset 443

#Auto 400

#Books 386

ну и так далее. Этот список включает как теги из ограниченного списка, так и теги, которые LLM поставила материалу просто потому, что не нашла в ограниченном ничего подходящего.

Теги из ограниченного списка стали категориями на сайте. Остальные теги + эти стали просто тегами wordpress.

Поиск по картинкам. У меня было две идеи как его сделать. Первая — OpenCLIP. Это довольно просто, но требует хостинга модели где-нибудь. На своей машине легко, но каждый раз ее запускать неудобно, плюс я планировал переносить мигратор на дешевый сервер в амазон. В облачных моделях тоже нормально считать, но хоть немного за это надо платить, а это еще одна dependency. Но главное — что и без этого неплохо работает. Я с помощью OpenAI , который и так используется для перевода на английский, генерю описания к картинкам, и дальше по этим описаниям делаю embeddings с помощью large модели. Пока что все тесты на поиск проходят на ура. Особенно, когда на картинке есть текст, и большой вопрос разобрал бы ли его OpenCLIP.

В итоге:

1) вордпресс raufaliev точка com — бесплатный

2) вордпресс beinginamerica точка com — бесплатный

3) turso db где хранятся все посты — бесплатный

4) qdrant cloud где хранятся эмбеддинги — бесплатный

5) openai для перевода и описания картинок — не бесплатный, но недорогой (обработка постов за год потребовала 30 баксов).

Прикладываю два скриншота — как работает поиск по изображениям, и по текстам, а также дашборд мигратора.

Лисы и Юки: Встречи в золотом свете | 2026-05-09T03:10:53

Гуляем с Юки. Он очень нравится лисам. Они всегда его долго разглядывают. Видео в комментариях

Разбор полетов: что скрыто внутри очистителя воздуха | 2026-05-03T15:00:42

Сломался очиститель воздуха, купил такой же б/у с новым картриджем по цене стоимость сменного картриджа+40 долл. Старый полностью разобрал, заодно извлек компоненты, которые можно переиспользовать, и понял, как оно работает. Прям как в школе 🙂

В общем, внутри:

— контроллер на ESP32-WROOM-32D. Но на плате сгорела часть, отвечающая за напряжения, поэтому в помойку.

— газовый (CO) сенсор MQ-7 (к сожалению, впаянный в плату, но можно выпаять). Правда, для корректной работы нужен цикл нагрева. Сначала 5В (60 сек) для очистки сенсора, затем 1.5В (90 сек) для измерения. Но тоже можно использовать где-нибудь.

— Plantower PMS9103M — высокоточный лазерный датчик концентрации взвешенных частиц в воздухе (PM1.0, PM2.5, PM10). Можно подключить к Arduino, есть специифкация.

— микроволновый датчик движения (радар), модель RCWL-0516. Можно подключить к Arduino, очень простой по интерфейсу. Видит на 5-7 метров вокруг себя 360 градусов.

— 200W мотор Snowfan YY225H310B. Подключить тоже довольно просто, только там напряжение 310V DC плюс 15V управляющее оборотами. Но зато больше ничего нет.

— датчик Холла (магнит)

Самое ценное — мотор. На eBay он стоит 100 долл. Правда, надо бы и его проверить сначала, не сгорел ли он.

Тишина за шесть центов: революция в борьбе со храпом | 2026-04-24T18:25:22

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

Осенние и весенние причуды Юки | 2026-04-09T14:31:01

У Юки снова включился режим «уууу» (7 апреля 2026). Обычно длится несколько дней в апреле и октябре.

Предыдущие разы были —

— 15-20 октября 2025

— 11 апреля 2025

— 1-4 апреля 2024

— 2 февраля 2023,

— 27 октября 2022,

— 15 марта 2022

Изменения в поведении в этот период такие:

1) может петь песни час напролет. Например, в шесть утра.

2) внезапно ему нравится гулять. Обычно не нравится. При том, что у него всегда открыт двор, ему нужно именно на прогулку. Может подойти к двери и стукать по ней лапой. Обычно на слово гулять он улепётывает на третий этаж.

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

И да, начинает он хотеть гулять часов в шесть утра, а в следующий раз — вскоре после возвращения с прогулки.

3) на прогулке сует нос в траву каждые пять минут, и его еле оттуда отдерешь. Обычно такое редко, а тут прям постоянно.

4) может полчаса сидеть и смотреть на закат.

5) нестабильный аппетит, временами. Кладешь ему мясо сверху корма, он на него даже не смотрит.

Надежда Шульга | 2026-03-12T18:55:57

За последнюю неделю Nadezhda Shulga нарисовала в первый раз в жизни картину маслом и в первый раз в жизни села играть на пианино одной рукой Умку! Надя, ты молодец!!! Она столько раз меня просила рисовать природу, что в итоге взяла и нарисовала сама

Закатная мелодия: портрет первой лошади-блондинки | 2026-02-27T15:00:15

Ну вот, моя первая лошадь-блондинка //

My first blonde horse

Эффективность по-новому: 9 способов успевать больше | 2026-02-17T22:21:28

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

1. Делаем что нравится. Нужно делать в данный момент то, к чему лежит душа в данный момент. Если заставлять себя, КПД падает в 10 раз.

2. Спортивная злость как катализатор. Нужно относиться к неудаче не как к трагедии, а как к личному оскорблению от задачи. Злость — это самый быстрый способ войти в состояние гиперфокуса, когда «не получилось» превращается в «ах так, ну смотри у меня».

3. Бесшовное переключение. Как только энергия в одной задаче иссякла или дело сделано — перепрыгивать в следующую воронку, которая манит прямо сейчас. Она не всегда может быть связана с работой. Я например играю на ф-но или рисую или что-то программлю или книжку пишу или работой занимаюсь.

4. Доделывать. Брать кусок, который можно прожевать и довести до плюс-минус норм. Не бросать на середине, пока есть инерция. Доделать и дошлифовать — это задача на следующий «приход».

5. Если стена не пробивается — не расшибать лоб. Зафиксировать точку остановки, сказать «я тебя запомнил» и отступить, чтобы вернуться с другим инструментом или другим настроением. Главное — держать этот «незакрытый гештальт» в активной памяти и не убирать его надолго.

6. Внешнее обещание — это святое. Если ты пообещал срок к понедельнику, личный комфорт (сон в субботу) приносится в жертву. Именно эта боль учит фильтровать обещания в будущем. Слово должно иметь физический вес.

7. Принцип плюс один. Делать всегда чуть больше, чем от тебя ждут. Насколько больше — вопрос контекста, ресурсов, желания, но дельта должна быть осязаемой.

8. Принцип полезного результата. Любой продукт деятельности должен быть в форме, которую можно передать. На английском есть для этого слово deliverable. То, что ты разобрался в чем-то — это не продукт. А разобрался и задокументировал в Confluence — это продукт. Письмо, статья, код — что угодно.

9. «Надо, Федя, надо». Выполнять обязательные церемонии и необходимую бюрократию как неизбежное зло, которое просто все равно придется делать. Надо проходить раз в полгода какие-то дебильные тренинги — выделяем для этого час времени и мучаемся.

10. Иметь лучшие инструменты для задачи. Если их нет, стремиться их иметь, и научиться ими пользоваться.

Еще три принципа, которым, кажется, нельзя научить, но которые очень помогают:

0. Не раздражаться и других не раздражать.

1. Способность мгновенно отделять важное от мусора, а срочное от суеты. Это интуиция, которая нарабатывается только годами «в поле». И тотальное любопытство — умение найти азарт в любой теме. Относится ко всему — включая с кем общаться и когда ехать в магазин.

2. Если тебе скучно — значит, ты просто недостаточно глубоко закопался. Интерес — это вопрос масштаба погружения и наличия правильных людей, книг, youtube-роликов и т.д. Со временем просто не остается тем, которые кажутся скучными.

3. Принцип lifetime learning. Любой проект — это легальный повод стать умнее за чужой счет. Искать в рутине то, что тебя зажигает и чему ты давно хотел научиться. Видишь, что задачу изящнее решит скрипт на Haskell, язык, который ты в глаза не видел? Значит, сегодня мы учим Haskell. Правда, азарт не должен похоронить дедлайн. Нужно выдать результат, даже если эксперимент с треском провалился. Сначала — фундамент обещания, сверху — декор нового скилла.

Эти принципы имеют минус. Я очень медленно прогрессирую в игре на фортепиано, например, потому что для хорошего прогресса нужны еще два принципа, который не «дружит» с моими принципами выше:

1. Принцип «еще кружочек». Если сел, и через час устал, нужно потратить еще два, и вот тогда вставать.

2. Принцип «зубы сжал — пошел». Если взялся чему-то учиться, то делать это регулярно, желательно в одно и то же время, и если придется, то через «не хочу»