Долой Тильду: как один скрипт сэкономил SMM-модератору часы работы и вырос в мини-веб-сервис

Вначале было… не совсем слово, нет. Была рабочая задача, которую дали моему коллеге — SMM-модератору в контент-агентстве: копирайтер отдаёт ему статьи в формате .docx, в статьях есть ссылки на сайт компании, нужно расставить в них UTM-метки для отслеживания трафика рекламной кампании. Нюанс в том, что источник (utm_source) должен соответствовать соцсети, в которой опубликована статья, а площадок для публикации было 5 штук, при этом в один сеанс публикации могло входить несколько статей с различными рекламными кампаниями. Коллеге дали стандартный UTM-генератор Тильды и сказали «Выполняй».

😩 В чём заключалась боль?

Коллега попробовал поработать по этой схеме и быстро понял, что процесс при всей своей простоте превращается в монотонную каторгу:

  1. Взять ссылку из документа.
  2. Вставить её в тильдовский генератор и ввести параметры.
  3. Скопировать размеченную ссылку и вставить обратно в документ.
  4. Повторить это для каждой ссылки в тексте.
  5. Повторить весь цикл для оставшихся 4 соцсетей.

Риск человеческой ошибки при постоянном копипасте стремился к 100%, а доступные ручные методы оптимизации (например, скопировать в генератор одну ссылку, а остальным только добавлять готовый UTM-«хвост», меняя источник под разные соцсети) делу помогали слабо. В итоге коллега пришел ко мне, SMM-аналитику в том же агентстве, с жалобным вопросом: «А нельзя ли это как-то автоматизировать?..»

🛠 От скрипта на коленке до первых сэкономленных часов

Поскольку мой основной рабочий инструмент — Python, я сразу пошла искать готовые решения и наткнулась на библиотеку python-docx. Порывшись на Stack Overflow, я набросала алгоритм, который парсит структуру документа, находит гиперссылки и на лету модифицирует их URL-параметры под нужные соцсети. Чтобы коллеге было удобно пользоваться инструментом локально, я оформила скрипт в графический интерфейс на Tkinter.

Результат: Инструмент с ходу начал экономить коллеге порядка 5 часов чистого рабочего времени в неделю. Скрипт успешно справлялся с задачами несколько месяцев, пока проект не закрыли.

🚀 Эволюция в полноценный веб-сервис (SaaS)

Но на этом история не закончилась. Я подумала: ведь с такой проблемой наверняка сталкивается ещё множество маркетологов и SMM-щиков. Но заставлять их скачивать Python, ставить библиотеки через pip и запускать скрипты из консоли — это плохая идея. Инструмент должен быть доступен в один клик в браузере.

Так родилась идея полноценного веб-сервиса. Уходить в PHP мне не хотелось, поэтому бэкенд я написала на Python-фреймворке FastAPI.

В процессе разработки приходили новые идеи о том, что в принципе могло бы в таком скрипте понадобиться, и я добавила в сервис дополнительные фичи:

  • Кастомные поля: Возможность гибко настраивать любые параметры меток.
  • Массовая обработка (Batch): Реализовала загрузку ZIP-архива со статьями и разметку полей через управляющий Excel-манифест.
  • Защита и безопасность: Чтобы сервис не положили спам-боты, я выставила жёсткие лимиты на количество запросов (rate-limiting) и размер файлов. Также включена защита от zip-бомб (они могут мгновенно сожрать дисковое пространство на сервере), уязвимости Path Traversal (путём игнорирования имени загружаемого файла), XML-инъекций через структуру файла docx и загрузки некорректных файлов (чтобы избежать заливки на сервер shell-скрипта). Помимо этого, ограничена длина вводимых пользователем строк, чтобы процессор сервера не захлебнулся в обработке огромных массивов.
  • Приватность: загруженные пользователем файлы не хранятся на сервере и сразу удаляются после обработки.

В итоге проект обрёл свое финальное production-лицо: я упаковала бэкенд в Docker-контейнер, развернула его на персональном VDS (который у меня был арендован ещё до этого как раз для мелких пет-проектов), настроила окружение и закрыла сервис от внешних угроз через Cloudflare.

🎁 Пользуйтесь!

Если вам знакома эта боль — готовить статьи в Word или Google Docs и часами расставлять кучу меток под разные каналы — забирайте инструмент себе в арсенал. Он полностью бесплатный и без рекламы.

👉 Попробовать сервис в действии: utmdoc.click

📂 Посмотреть исходный код на GitHub: github.com/OSP-Scata/Docx_UTM_gen_web (будет здорово, если подкинете звёздочку репозиторию!)

💾 А здесь можно посмотреть тот самый первый скрипт, из которого вырос сервис: github.com/OSP-Scata/Docx_UTM_generator

☕ Поддержать автора: Если сервис сэкономил вам время, меня можно угостить кофе на Boosty (но это исключительно по желанию, я не обижусь).

Буду рада вашему фидбеку и конструктивной критике в комментариях! Возможно, вам бы хотелось видеть в таком автоматизаторе какие-то определённые фичи, до которых я не додумалась на момент разработки?

22