5 мин чтенияИнженерия

Импортёр миграции с TinyURL: как он работает и где пробелы

Как работает импортёр миграции с TinyURL в Elido: токен на входе, алиасы на выходе, правила конфликтов, лимиты и известная ошибка с несуществующим эндпоинтом.

Marius Voß
DevRel · edge infra
Схема конвейера: API-токен TinyURL поступает в воркер импорта Elido, который записывает ссылки в таблицу links по правилам конфликтов suffix, skip или fail

Импортёр миграции с TinyURL принимает API-токен, целевой домен Elido и стратегию конфликтов, а затем копирует ваши ссылки TinyURL в Elido одной фоновой задачей. У него есть один серьёзный известный дефект: он вызывает GET /aliases на api.tinyurl.com, а этого пути нет в опубликованном API TinyURL. В этой статье - что делает импортёр, что мы проверили и что нет.

Если вам нужно практическое руководство по планированию ухода с TinyURL (что можно перенаправить, соответствие полей в CSV, чек-лист переключения), читайте Миграция с TinyURL. Здесь - инженерная сторона.

Известная ошибка

Запрос страницы в импортёре строится так:

GET https://api.tinyurl.com/aliases?page=1&per_page=100
Authorization: Bearer <token>

и ожидает в ответ {"data": [{alias, url, title, tags}], "meta": {"total", "has_more"}}.

В спецификации OpenAPI TinyURL (данные на 2026-10-02) путь /aliases не определён. Перечисление выполняется через GET /urls/{type}, где type - available или archived, с необязательными фильтрами from, to и search (префикс alias: или tag:). В спецификации нет параметров page и per_page и нет лимитов запросов. Операции с алиасами находятся под /alias/{domain}/{alias}.

Так что контракт пагинации в нашем коде никогда не брался у TinyURL. Наш юнит-тест отдаёт написанный вручную ответ такой формы и проходит, а это доказывает лишь, что парсер соответствует нашему предположению, и ничего не говорит о TinyURL. Мы не запускали импортёр на живом аккаунте TinyURL, потому что для этого нужен токен платного плана. Пока мы этого не сделали, не стройте на нём план миграции. Исправление отслеживается в нашем внутреннем бэклоге: перейти на /urls/available (а /urls/archived - за флагом), листать окнами from/to, разбирать ответ защитно и тестировать на реальном захваченном ответе. Что приходит в реальном ответе, список или одиночный объект, спецификация оставляет неясным.

Что воркер делает после получения страницы

Страница интеграций панели Elido в демо-пространстве, где запускаются источники миграции

Страница интеграций в DEMO-пространстве с синтетическими данными. Миграция с TinyURL запускается отсюда.

Всё после HTTP-вызова не зависит от вопроса об эндпоинте. Эту часть мы можем описать по коду.

  • Старт. POST с token, target_domain_id и необязательным conflict_strategy. Обработчик отклоняет пустой токен, отсутствующий домен и любую стратегию, кроме suffix, skip, fail, затем отвечает 202 с задачей и запускает воркер в фоновой горутине, отделённой от запроса.
  • По каждой ссылке. Строка без URL или без алиаса считается неудавшейся с указанием причины. В остальных случаях алиас становится слагом, назначение и заголовок копируются (заголовок обрезается до 200 символов), а теги копируются с добавлением imported:tinyurl.
  • Прогресс. Счётчики сбрасываются в строку задачи каждые 50 ссылок. На одну задачу логируется не больше 1000 строк ошибок.
  • Ошибки авторизации и лимитов. 401 или 403 завершает задачу неудачей с сообщением "проверьте bearer-токен", а 429 - неудачей по ограничению частоты. Повторных попыток и отката нет: задача останавливается.

Правила конфликтов

Список ссылок Elido в демо-пространстве с короткими ссылками, назначениями, тегами, кликами за 30 дней и статусом

Список ссылок в DEMO-пространстве. Импортированные ссылки несут тег imported:tinyurl, поэтому партию можно отфильтровать для проверки.

Перед каждой вставкой воркер делает один индексированный запрос по (domain, slug).

  • suffix (по умолчанию) пробует alias-2, alias-3, до alias-50, и помечает строку неудавшейся, если все заняты.
  • skip не трогает существующую ссылку Elido и записывает исходную строку в журнал.
  • fail завершает задачу неудачей при первом конфликте.

TinyURL называет их алиасами, Elido - слагами. Это одно и то же: символы после хоста. Если целевой домен пуст, алиасы переносятся без изменений.

Лимиты

Один общий набор констант, который используют все вендоры миграции: 50 000 ссылок за запуск, бюджет 30 минут, прогресс каждые 50 ссылок, 1000 записанных ошибок.

Стоит знать о двух особенностях. Когда достигнут лимит в 50 000, цикл просто останавливается, и задача завершается; она не падает и не просит с кем-то связаться. Сравните итоговые счётчики с общим числом в источнике. Когда 30-минутный бюджет исчерпан, задача помечается неудавшейся с указанием числа ссылок, импортированных к этому моменту.

Воркер живёт внутри api-core. Деплой или сбой посреди выполнения убивает его, а проверка, которая запускается каждые пять минут, переводит задачи без прогресса в течение 30 минут в failed. Сохранённого курсора нет, поэтому задачу нужно запускать заново. Повторный запуск безопасен при suffix или skip, хотя при suffix он создаст копии с -2 для ссылок, которые первый запуск уже записал, поэтому для повторного запуска лучше skip.

Обработка токена

Токен идёт из тела запроса в горутину и больше никуда. Строка задачи не записывает токен, и ничего не шифруется при хранении, потому что ничего не хранится. Тело запроса читается с ограничением 4 КБ.

Чего код не делает: он не проверяет токен перед стартом и не проверяет тарифный план. Неверный токен проявляется как неудавшаяся задача после первого запроса, а не как ошибка формы. В более ранних версиях этой статьи описывался предварительный шаг через эндпоинт доменов. Такого шага в коде нет, и в спецификации TinyURL такого пути тоже нет.

Что не переносится

  • История кликов. Импортёр читает только поля ссылок. Новые клики считаются с момента, когда ссылка заработала в Elido.
  • Оформление QR, шаблоны, настройки брендированного домена. Не читаются. Брендированный хост - отдельный шаг: добавьте его как домен Elido и измените DNS, это описано в материале собственные домены для коротких ссылок.
  • Ссылки без аккаунта. Ни один токен не может их перечислить.

Импортёр не создаёт домен за вас, не обрабатывает поле domain TinyURL и не имеет собственной загрузки CSV. Для переноса через файлы используйте форму массового импорта или пошаговое описание в материале массовый импорт из Google Sheets.

Тестирование и обходной путь

Далее два практических раздела. Тестирование импортёра. Перенос без него.

Безопасный способ проверить импорт

Когда эндпоинт исправят, или если вы тестируете импортёр сами до этого, делайте это в малом масштабе. Создайте временное рабочее пространство, добавьте пустой домен и сначала запустите задачу со стратегией fail. Пустой домен означает отсутствие конфликтов, так что любая ошибка - это проблема разбора или авторизации, а не коллизия. Затем сравните три числа: количество в источнике TinyURL, total, которое сообщает задача, и сумму счётчиков импортированных, пропущенных и неудавшихся. Поскольку воркер берёт meta.total из ожидаемого ответа, расхождение между total и вашим реальным числом - первый признак того, что форма ответа отличается от предположений парсера.

Затем отфильтруйте список ссылок по imported:tinyurl и откройте десять случайных ссылок. Сверьте назначение, слаг и заголовок с TinyURL. После этого для любого повторного запуска переключитесь на skip.

Как выгрузить данные из TinyURL без импортёра

Документированный вызов для перечисления - GET /urls/available с bearer-токеном, а для архивных ссылок - GET /urls/archived. Если аккаунт большой, сузьте результат датами from и to, поскольку параметров страниц в спецификации нет. Сначала запишите вывод в файл, затем сократите его до destination, slug, title и загрузите через форму массового импорта. Подробности этого соответствия - в практическом руководстве. Форму живого ответа мы тоже не проверяли, поэтому прежде чем писать скрипт, вручную изучите один ответ.

Что дальше

Последовательность такая: исправить эндпоинт, добавить реальный захваченный ответ как тестовую фикстуру, затем перепроверить каждую цифру в практическом руководстве и на посадочной странице миграции. Пагинацию и реальный лимит на запрос нужно перемерить на живом аккаунте, так как спецификация не даёт ни того, ни другого. Если уйти с TinyURL нужно раньше, сравните варианты в материалах Elido и TinyURL и альтернативы TinyURL и используйте путь через CSV.

Читайте также в блоге

Частые вопросы

Работает ли сегодня импортёр TinyURL в Elido?

Считайте его непроверенным. Воркер запрашивает GET /aliases?page=N&per_page=100 на api.tinyurl.com. В спецификации OpenAPI TinyURL (данные на 2026-10-02) пути /aliases нет; ссылки перечисляются через GET /urls/{type}. Поставляемый юнит-тест проверяет лишь форму ответа, которую мы предположили. Исправление есть в нашем бэклоге, а до его выхода надёжный путь - CSV или массовая вставка.

Что импортёр копирует из каждой ссылки TinyURL?

Целевой URL, алиас (используется как слаг), заголовок и теги, а также тег imported:tinyurl на каждой создаваемой ссылке. Историю кликов, оформление QR и всё остальное он не копирует.

Что происходит, если алиас уже существует в Elido?

Стратегию вы выбираете для каждой задачи. Suffix пробует alias-2, alias-3 и так далее до alias-50, skip оставляет существующую ссылку и записывает строку в журнал, fail помечает задачу как неудавшуюся при первом конфликте. По умолчанию используется suffix.

Сохраняется ли мой токен TinyURL?

Нет. Запрос на старт передаёт токен фоновой горутине, а строка задачи не хранит ссылку на токен. Токен существует в памяти процесса на время запуска.

Есть ли ограничение на число ссылок в одном импорте?

Да. Запуск останавливается после 50 000 ссылок или через 30 минут, смотря что наступит раньше. При достижении лимита ссылок задача завершается как выполненная с первыми 50 000 обработанными, поэтому сверьте счётчики с источником.

Можно ли мигрировать с бесплатного аккаунта TinyURL?

TinyURL привязывает перечисление ссылок к API-токену, а ссылки, созданные без входа, не принадлежат никакому аккаунту, так что перечислять нечего. Соберите список назначений самостоятельно и используйте массовый импорт.

Попробуйте Elido

Вставьте URL - получите короткую ссылку

Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.

Бесплатно, без регистрации · 2 в день

Попробуйте Elido

URL-сокращатель с хостингом в ЕС: собственные домены, глубокая аналитика, открытый API. Бесплатный тариф - без банковской карты.

Теги
tinyurl migration
url shortener
go worker
data migration
engineering
tier 3 integrations

Читать дальше