Автоматизація відправки повідомлень між соцмережами

Більше місяця як активно використовую IFTTT для перехресних публікацій в соціальних мережах. Хочу поділитися як до цього дійшов і на які хитрості пішов, щоб досягти кроспостингу близького до того, який мені потрібен.


Я пишу в соціальних мережах для себе, а не для роботи. І мені зручно писати з того місця, де я проводжу час, тому програмне забезпечення для SMM мені не підходило, воно дороге, ще й вимагає писати з іншого місця.

В основному я проводжу час в Twitter і Telegram, фотографії розміщую в Instagram, а нещодавно ще почав вести подкаст на Anchor. Деякі повідомлення зручніше написати в одній мережі, деякі — в іншій. До того ж хочеться мати хоч якийсь контроль над своїми повідомленнями, щоб не втратити їх в один момент через рішення якоїсь корпорації. Тому ще приєднався до децентралізованої соціальної мережі, Fediverse, та завів собі особисту Friendica, куди просто дублюю мої дописи з інших соцмереж.

При виборі рішення до приєднання до Fediverse зупинився на Friendica, тому що воно на PHP, з котрим працюю щодня на роботі, за потреби можу модифікувати рушій під себе та розгорнути на віртуальному хостингу. Friendica не влаштовує лише тим, що не дозволяє гостям залишати коментарі, але оскільки це більше рішення для резервного копіювання, то це не критична проблема. У інших застосунках, що спробував чи переглянув, було більше критичних недоліків для мене.

Багато людей переходять на децентралізовані соціальні мережі, бо не хочуть, щоб корпорації слідкували за ними, аналізували, знали все про них. Мене це не дуже хвилює, з цим я змирився, але мене більше хвилює те, що корпорація будь-коли може видалити всі мої повідомлення, всю мою історію.

Копіювати повідомлення вручну мені ліньки та дорого витрачати час на це, тому почав детально розглядати рішення для автоматичного постигну повідомлень меж соцмережами.


Кілька останніх років я користувався безкоштовним планом IFTTT, котрий дозволяв користуватися готовими аплетами та мати три своїх, в котрих можуть бути поєднані лише дві ланки. Цього вистачало, щоб автоматично постити з Instagram і Twitter в Telegram, іноді не в тому форматі, що потрібен мені. І цього вистачало навіть дублювати все те в Friendica, але хотілося більшого контролю. Хотілося, щоб можна було задавати формат для всіх повідомлень, що пересилаються, та було бажання робити довші дописи в Telegram, котрі будуть обрізатися та відправлятися в Twitter без повернення знову в Telegram створюючи дублювання. Для цього безкоштовного плану IFTTT не вистачало, тому почав дивитися на альтернативи.

Спочатку глянув на вітчизняний ApiX-Drive, котрий орієнтується на бізнес-клієнтів. У них багато крутих інтеграцій, котрі потрібні бізнесу, але поки що немає інтеграції з Twitter. Як я вже казав, для бізнесу є купа SMM-рішень, котрі роблять дописи в потрібні соцмережі як треба, тому зазвичай сервіси автоматизації не дуже орієнтуються на соцмережі, бо їх клієнтам це менше потрібно від них. Та й не готовий я платити поки 19 доларів в місяць для кроспостингу повідомлень в особисті мікроблоги. Тому ApiX-Drive довелося відкласти.

Потім детально почав вивчати n8n, котрий мені рекомендував колега на роботі. Сам сервіс з відкритим вихідним кодом і його можна безкоштовно запустити у себе, якщо є навички та комп'ютер для цього. Спочатку спробував хмарну версію сервісу, котра коштує 20 доларів в місяць, але дає перший місяць безкоштовно. Потрібні інтеграції сервіс має та є дуже гнучким, дозволяє гнучко зробити складні речі в автоматизації. Але майже одразу спіткнувся на тому, що з Twitter отримує лише обрізані повідомлення до 140 символів. В теорії в API-запиті можна передати параметр, котрий примусить повертати повні повідомлення, чи змінити версію API, що ще більш складно. Але для цього треба модифікувати вихідний код, отже хмарна версія не підходила та треба було підіймати сервіс на локальній машині.

У мене не вийшло підійняти локально на Windows 10 сервіс, котрий зроблений на Node.js. Якби я професійно працював з Node.js чи сидів на UNIX-подібній операційній системі, то можливо це у мене вийшло б. Та й на Windows у мене це вийшло б після багатьох годин копання в мануалах і пошуку порад на форумах, але я не хотів на це витрачати купу часу. Тримати такий сервіс на локальній машині не варіант, це потрібно орендувати сервер, на котрому розміщувати застосунок на Node.js, а це знову години чи дні часу на вивчення того, як хостити щось так. Спробував потикатися в безкоштовні сервіси хостингу Node.js, але там взагалі щось складно і витрачати купу часу було дорого, та не було бажання, тому відмовився від n8n.

Варто зазначити, що лише в n8n побачив можливість ланцюжок твітів з Twitter перетворити на один допис і вже таким одним повідомленням його відправити в інші місця. Функціонал прикольний, тому з часом ще буду повивалюватися в бік n8n. Можливо щось зміниться, що дозволить його дешево та простіше використовувати для отримання повних повідомлень з Twitter. Ще у n8n є локальне сховище, що спрощує контроль дублювання та зациклення пересилки повідомлень між кількома мережами.

Також спробував Integromat, але в нього на безкоштовному плані Twitter не було, а 9 доларів в місяць також не є мало та платити одразу без проби не було бажання. Глянув Zapier, котрий використовую на роботі для бекапу повідомлень зі Slack в Evernote, але у нього не виявилося інтеграції з Telegram. Хоча про Zapier ще скажу в кінці — їх безкоштовний план іноді дуже рятує.

Як наслідок, я повернувся до IFTTT, подивися на їх платний тарифний план і ризикнув його оплатити.


IFTTT на ринку знаходиться доволі давно й з самого початку вони орієнтувалися на окремих ентузіастів, а не бізнес, тому інтеграція з Twitter в них добре налагоджена. Я не дуже слідкував за сервісом, знаю що нові тарифи вони ввели минулої осені та до того були більш доступними, але тоді мені складна автоматична пересилка не була дуже потрібна. Спочатку вони зробили вартість тарифу 10 доларів в місяць, але зараз мінімальній тариф 4 долари, що з натяжкою влаштовує для особистого блогінгу.

Pro-план IFTTT дозволив створювати аплети, котрі дозволяють виконувати кілька дій, тобто робити відправу в кілька сервісів з одного по тригеру. Ще платний тариф дозволяє фільтрувати дані, котрі надходять з тригеру, та робити запити на отримання додаткових супутніх даних. Але IFTTT не вистачає додаткового сховища даних, щоб мати контроль над тим, що вже було відправлено чи отримано, тому доводиться займатися збоченнями.

Треба було якось контролювати, що повідомлення, котре отримуємо з Twitter, не було раніше відправлене через IFTTT туди. Для цього могла допомогти можливість додатково отримати з Telegram останні повідомлення, котру надає платний план. Але це підходить лише для текстових повідомлень. Якщо в Twitter було послано зображення чи посилання, то з Twitter вони прийдуть уже в вигляді скорочених посилань на t.co, і у випадку відсутності тексту буде повторна підправка повідомлення в Telegram, котре до того було переслане з Telegram в Twitter.

Для запобігання дублювання повідомлень при кростпостингу, довелося використати хак у вигляді невидимого символу нульової довжини, zero-width non-joiner (ZWNJ). Я просто почав додавати цей символ в кінець всіх твітів, що відсилаються через IFTTT, і потім вже ігнорую твіти, котрі мають цей символ. Знаю, що цей символ має інше призначення, але я не пишу повідомлення на мовах, що використовують цей символ, тому для мене він підходить. А для ретвітів просто не виконую цю перевірку.

Можливість ручної обробки повідомлень, що пересилаються, дозволила мені обрізати більш красиво довгі повідомлення, що не вміщаються в один твіт. Автоматично вони просто обрізалися по останньому дозволеному символу і символ трикрапки просто обривав слово на середині. Вручну ж мені вийшло реалізувати знаходження початку останнього проміжку з не літерними символами перед досягненням ліміту і вже замість першого із них ставити трикрапку.

Треба враховувати ще, що довжина скорочених посилань в Twitter становить 23 символи, а з пробілом і невидимим символом це вже 25 додаткових символів, тому якщо обрізається текст і після нього йде посилання на іншу мережу, то ліміт стає 255 символів замість 280.

Фільтрація повідомлень робиться на мові TypeScript, на котрій можна без особливих проблем писати тим, хто пише на JavsScript. Для мене проблема була лише в тому, що відсутні деякі функції, що є в останніх версіях JS.

Далі розгляну логіку кожного з фільтрів детально та наведу їх код, що я написав.


Першою я зробив пересилку повідомлень з Telegram в Twitter і Friendica. Тут все доволі просто. Додавання невидимого символу та обрізання довгого повідомлення після слова, а не посеред слова, про що казав вище.

Якщо повідомлення достатньо коротке, то я не хочу дратувати читачів в Twitter посиланням на оригінал повідомлення в Telegram, тому просто пересилаю повідомлення. Якщо ж повідомлення не вміщується в ліміт 280 символі, то тоді вже обрізаю текст з лімітом в 255 символів і далі розміщую посилання на оригінал повідомлення в Telegram.

На початку йде ще один хак для повідомлень, котрі складаються лише з посилання без тексту. Просто невидимий символ перед такими не можна додати, бо телеграм його знищить, тому спочатку перед першим посилання додаю невидимий символ і пробіл, а потім заміняю пробіл невидимий символ пробіл на невидимий символ пробіл, щоб не мати два пробіли, якщо перед посиланням був якийсь текст.


Далі йде пересилання фотографій з Telegram в Twitter і Friendica. IFTTT не дуже працює з альбомами. Кожне фото з альбому буде пересланим окремим повідомленням, а коментар до альбому буде доданий лише до першого зображення. Поки що доводиться пам'ятати не постити альбоми в каналі Telegram і пильніше поглядати в бік n8n. Хоча за допомогою додатково запиту до Telegram можна реалізувати ігнорування інших зображень в альбомі. Але хочеться мати можливість відправляти альбоми в інші місця, хоча не дуже сильно хочеться — не часто це потрібно.

При відправленні зображення в Twitter треба брати до уваги, що саме зображення також стане посиланням, тому ліміти на текст зменшуються до 255 і 230, відповідно. В іншому вся логіка та сама, ще лише назви атрибутів змінюються.


Основні хитрощі виходять при пересиланні нових твітів в інші місця. IFTTT не може одразу відреагувати на появу нового твіта та просто робить регулярну перевірку кожні 5 хвилин.

Спочатку я виділяю текст з твіта, котрий йде до першого посилання, і потім порівнюю той текст з початками останніх повідомлень і описів фотографій, що є в каналі Telegram. Якщо дописи в Telegram починаються на текст твіта, то пересилання такого повідомлення припиняється. В цій логіці в моєму випадку немає сенсу, бо я використовую хак з невидимим символом, але я її був до того написав і шкода видаляти, а тут вона тим паче може комусь згодитися.

Плюсом IFTTT є те, що система враховує твіти, котрі відправив сам собі у відповідь, коли робиш ланцюг твітів у треді. Частина систем, та ж Friendica, такі твіти ігнорує. Тому довелося вимкнути в Friendica автоматичне зчитування твітів і постити їх через IFTTT, бо Friendica втрачає всі твіти, що написані у відповідь собі. При цьому ретвіти Friendica відображає дуже гарні, IFTTT не може такі ретвіти зробити, бо зчитує не достатньо даних про автора твіта, котрий ретвітиш.

Довелося зробити додатковий хак в Friendica. Там увімкнув читання та копіювання твітів і ретвітів з Twitter, а в самому коді зробив повернення з методу, що повинен оброблювати твіти, котрі сам написав. Таким чином у мене Friendica сама зараз дублює ретвіти з Twitter, а в IFTTT в фільтрі я заборонив відправляти ретвіти в Friendica. Правильно було б розібратися більш детально в плагіні, що взаємодіє з Twitter в Friendica, та додати налаштування, але це все час, тому тоді просто додав один рядок в код і тепер метод не спрацьовує, що має копіювати не ретвіти з Twitter. Можливо в майбутньому зроблю як треба.

Шкода, що Friendica не вміє оброблювати коментарі до ретвітів, вона бере лише твіт з коментарем, а не обробляє той ретвіт, що коментується. Коментар без того, що коментується, зазвичай не має сенсу. Поки що доводиться пам’ятати та миритися з тим, що ретвіти ретвітів-коментарів йдуть в Friendica без основного змісту.

Далі в IFTTT-фільтрі після перевірки на ретвіт йде та перевірка на невидимий символ і якщо він є, то відміняю відправу в Telegram і Friendica. І в самому кінці для Telegram замінюю символи нового рядка на відповідний HTML-тег, бо Telegram ігнорує символи нового рядка та для форматування повідомлень через API вимагає HTML-розмітку.


З Instagram свої складності, хоча водночас і простіше, бо з нього лише треба зчитувати нові фотографії та не треба в нього нове відправляти. Відправлення фото в Instagram це кропіткий процес, де треба відредагувати відповідно фотографію та підібрати хештеги. Ось вони й представляють складність.

Треба додавати багато тегів в Instagram, щоб фотографію могли знайти та побачити інші, хто не підписаний на тебе. Хоча деякі скажуть, що теги навпаки не потрібно додавати, щоб публікацію автоматом показало іншим, але алгоритми Instagram постійно змінюються, а я звик додавати теги до кожного фото.

Тільки в Instagram теги це норма, до них там звикли, та частина з них має сенс лише в Instagram. А ось в інших місцях така кількість хештегів буде дратувати. Twitter взагалі має обмеження на довжину повідомлені та в нього стільки не відправити, а в Telegram і Friendica я просто не хочу бачити всі ті теги та не хочу їх показувати іншим.

Тому спочатку в фільтрі знаходжу перший хештег і залишаю лише текст до нього. Логіка аналогічна тому, як видаляв текст до першого посилання при відправлені з Twitter. Після тексту завжди з нового рядка додаю посилання на оригінальну публікацію в Instagram, бо я не проти нових підписників там.

При обмеженні довжини повідомлення для Twitter використовую обмеження в 230 символі, бо твіт завжди буде мати в собі скороченні посилання на Instagram і на саму фотографію в Twitter.

Оскільки текст змінюється та не відсилається оригінальний, то для Friendica доводиться по новій задавати та складати все тіло для web-запиту.


Нещодавно я почав записувати подкаст з оглядами епізодів телесеріалів. І вирішив також автоматизувати публікацію посилань на нові епізоди в соцмережах. У випадку з Telegram постинг всього mp3-файлу з випуском, бо IFTTT має дію відправлення mp3 в Telegram.

Й ось тут мене IFTTT знову розчарував, бо виявилося, що сервіс не зчитує XML-тег enclosure з RSS подкасту, а саме той тег містить в собі посилання на mp3-файл. Швидко нагуглилась порада, що можна зробити зчитування RSS на Zapier, а з нього вже робити web-запит до IFTTT. Але зараз вебхуки в Zapier стали доступними лише в платних тарифах і з безкоштовного тарифу такі запити не зробити.

Про проблему написав в підтримку IFTTT і попросив їх додати можливість зчитувати вміст тегу enclosure. Відповіли, що передали прохання розробникам. Тепер подивимось, чи з’явиться у них колись можливість отримувати посилання на файл з RSS без збочень.

Після недовгих роздумів я додумався зробити через Zapier генерацію нової RSS, котру вже оброблюю в IFTTT. Zapier зчитує RSS подкасту та при наявності нового епізоду, додає його в свою RSS, при цьому замість посилання на епізод стає посилання на mp3-файл, замість заголовку — посилання на епізод, а замість автора — вже заголовок.

Посилання на mp3 доволі велике і складне, тому не впевнений, що воно не зіпсується, якщо його записати в поле заголовку, а ось посилання на епізод доволі коротке і з ним в заголовку нічого не станеться. Автор подкасту завжди я, інформація в цьому полі мені не потрібна, а ось заголовок не завадить при публікації в Friendica.

Самі заголовки епізодів в соцмережі не пересилаю, бо там лише назва серіалу та номер його епізоду, за котрими подкаст знаходять в різноманітних сервісах прослуховування подкастів. Немає сенсу текст заголовків пересилати в соцмережі.

А ось текст з опису вже є, бо там своїми словами пишу про що випуск подкасту, але після опису йдуть стандартні посилання, котрі треба показати тим, хто прослуховує подкаст в сервісах прослуховування. Ці посилання в соцмережах вже постити не треба, бо в соцмережі й так розміщую посилання на випуск за котрим вже буде випуск з повним описом, що включає ті посилання.

Тому спочатку текст розбиваю на рядки і відбираю всі рядки до першого рідка, що містить в собі посилання. Потім склеюю рядки вже символом нового рідка, а для Telegram відповідним HTML-тегом. Тут ще треба слідкувати, щоб в описі епізоду подкасту не було інших HTML-тегів окрім <br>, а то в Friendica посилається екранований текст і теги стають текстом.

Для Friendica знову доводиться переписувати все тіло вебхука, бо відправляється не оригінальний текст. Варто зазначити, що в Friendica з переданого посилання на епізод подкасту робить публікацію з вкладенням, в котрому автоматом підтягує embed-код з посилання на сервіс Anchor, де я розміщую подкаст, і у себе вже відображає web-плеєр, в котрому можна прослуховувати подкаст без переходу за посиланням.

Для подкасту ще зробив окрему сторінку в Facebook і в неї роблю публікації з описом і посилання на епізод подкасту. Facebook не дозволяє автоматичну публікацію на особистий профіль і не сиджу я в цій мережі, тому в попередніх аплетах ніяк не взаємодіяв з нею.


Результат роботи цих автоматизації можете спостерігати за посиланнями, що йдуть далі.

Twitter: https://twitter.com/Abysim
Telegram-канал: https://t.me/AbysimFeed
Instagram: https://www.instagram.com/abysim.whitelion/
Friendica: https://whitelion.me
Подкаст на Anchor: https://anchor.fm/abysim
Сторінка подкасту в Facebook: https://www.facebook.com/serialni.dumky