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

Вчера занялся настройкой трансляции из 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ами, на что пока нет внутреннего ресурса.