Importatorul de migrare TinyURL primește un token API, un domeniu Elido țintă și o strategie de conflict, apoi copiază linkurile tale TinyURL în Elido ca un singur job de fundal. Are un defect grav cunoscut: apelează GET /aliases pe api.tinyurl.com, iar acea cale nu există în API-ul publicat de TinyURL. Acest articol acoperă ce face importatorul, ce am verificat și ce nu am verificat.
Dacă vrei ghidul practic pentru planificarea unei mutări de la TinyURL (ce poate fi redirecționat, maparea CSV, lista de comutare), citește Migrare de la TinyURL. Aceasta este partea de inginerie.
Bugul cunoscut
Preluarea unei pagini de către importator construiește această cerere:
GET https://api.tinyurl.com/aliases?page=1&per_page=100
Authorization: Bearer <token>
și se așteaptă să primească înapoi {"data": [{alias, url, title, tags}], "meta": {"total", "has_more"}}.
Specificația OpenAPI a TinyURL (accesată 2026-10-02) nu definește nicio cale /aliases. Listarea este GET /urls/{type}, unde type este available sau archived, cu filtre opționale from, to și search (un prefix alias: sau tag:). Specificația nu definește parametri page sau per_page și nici limite de rată. Operațiile cu alias-uri se află sub /alias/{domain}/{alias}.
Așadar, contractul de paginare din codul nostru nu a fost niciodată luat de la TinyURL. Testul nostru unitar servește un răspuns scris de mână în acea formă și trece, ceea ce dovedește că parserul se potrivește presupunerii noastre și nimic despre TinyURL. Nu am rulat importatorul pe un cont TinyURL real, pentru că ar necesita un token de plan plătit. Până o facem, nu planifica o migrare în jurul lui. Corecția este urmărită în backlogul nostru intern: trecerea la /urls/available (și /urls/archived în spatele unui flag), parcurgerea ferestrelor from/to, parsare defensivă și testare pe un răspuns real capturat. Dacă răspunsul real conține o listă sau un singur obiect este ceva ce specificația lasă neclar.
Ce face workerul după ce primește o pagină
Pagina de integrări într-un spațiu de lucru DEMO cu date sintetice. Migrarea TinyURL se pornește de aici.
Tot ce urmează după apelul HTTP este independent de întrebarea despre endpoint. Această parte o putem afirma din cod.
- Pornire.
POSTcutoken,target_domain_idșiconflict_strategyopțional. Handlerul respinge un token gol, un domeniu lipsă și orice strategie în afarasuffix,skip,fail, apoi răspunde cu202cu jobul și rulează workerul într-un goroutine de fundal detașat de cerere. - Per link. Un rând fără URL sau fără alias este numărat ca eșuat, cu un motiv. Altfel, alias-ul devine slug, destinația și titlul sunt copiate (titlul trunchiat la 200 de caractere), iar tagurile sunt copiate cu
imported:tinyurladăugat. - Progres. Contoarele sunt scrise în rândul jobului la fiecare 50 de linkuri. Se înregistrează cel mult 1,000 de rânduri de eroare per job.
- Erori de autentificare și de rată. Un 401 sau 403 oprește jobul cu mesajul „verifică tokenul bearer", un 429 îl oprește ca limitat de rată. Nu există retry sau backoff: jobul se oprește.
Reguli de conflict
Lista de linkuri într-un spațiu de lucru DEMO. Linkurile importate poartă tagul imported:tinyurl, deci poți filtra un lot pentru verificare.
Înainte de fiecare inserare, workerul face o căutare indexată pentru (domain, slug).
- suffix (implicit) încearcă
alias-2,alias-3, până laalias-50, și marchează rândul ca eșuat dacă toate sunt ocupate. - skip lasă în pace linkul Elido existent și înregistrează rândul sursă.
- fail oprește jobul la primul conflict.
TinyURL le numește alias-uri, Elido le numește slug-uri. Același lucru: caracterele de după gazdă. Dacă domeniul tău țintă este gol, alias-urile se preiau neschimbate.
Limite
Un singur set de constante, folosit de toți furnizorii de migrare: 50,000 de linkuri per rulare, un buget de 30 de minute, progres la fiecare 50 de linkuri, 1,000 de erori înregistrate.
Merită știute două comportamente. Când se atinge limita de 50,000, bucla pur și simplu se oprește și jobul se finalizează; nu eșuează și nu îți spune să contactezi pe cineva. Compară numărătorile finale cu totalul din sursă. Când bugetul de 30 de minute se epuizează, jobul este marcat ca eșuat cu numărul importat până atunci.
Workerul trăiește în interiorul api-core. Un deploy sau un crash la mijlocul rulării îl oprește, iar o măturare care rulează la fiecare cinci minute trece în failed joburile fără progres timp de 30 de minute. Nu există un cursor salvat, deci repornești jobul. Rerularea este sigură sub suffix sau skip, deși sub suffix va crea copii -2 ale linkurilor pe care prima rulare le-a scris deja, deci preferă skip pentru o rerulare.
Gestionarea tokenului
Tokenul merge din corpul cererii către goroutine și nicăieri altundeva. Rândul jobului nu înregistrează niciun token, iar nimic nu este criptat în repaus pentru că nimic nu este stocat. Corpul cererii este citit cu o limită de 4 KB.
Ce nu face codul: nu validează tokenul înainte de pornire și nu verifică planul. Un token greșit apare ca un job eșuat după prima cerere, nu ca o eroare de formular. Versiunile anterioare ale acestui articol descriau un pas de preflight față de un endpoint de domenii. Acel pas nu există în cod, iar specificația TinyURL nu are nici ea o asemenea cale.
Ce nu se migrează
- Istoricul de clicuri. Importatorul citește doar câmpurile linkurilor. Clicurile noi se numără din momentul în care un link este activ în Elido.
- Stilizarea QR, șabloanele, setările domeniului de brand. Necitite. Un hostname de brand este un pas separat: adaugă-l ca domeniu Elido și schimbă DNS, tratat în domenii personalizate pentru linkuri scurte.
- Linkuri fără cont. Niciun token nu le poate lista.
Importatorul nu creează domeniul pentru tine, nu tratează un câmp domain din TinyURL și nu are un upload CSV propriu. Pentru mutări bazate pe fișiere folosește formularul de import în masă sau ghidul din import în masă din Google Sheets.
Testarea și ocolirea lui
Urmează două secțiuni practice. Testarea importatorului. Mutarea fără el.
O metodă sigură de a verifica un import
Oricând endpoint-ul este corectat, sau dacă testezi tu importatorul înainte de atunci, fă-o la scară mică. Creează un spațiu de lucru de unică folosință, adaugă un domeniu gol și rulează jobul mai întâi cu strategia fail. Un domeniu gol înseamnă fără conflicte, deci orice eșec este o problemă de parsare sau de autentificare, nu o coliziune. Apoi compară trei numere: numărătoarea sursă din TinyURL, total raportat de job și contoarele importate plus omise plus eșuate. Pentru că workerul ia meta.total din răspunsul pe care îl așteaptă, o nepotrivire între total și numărul tău real este primul semn că forma răspunsului diferă de ce presupune parserul.
Apoi filtrează lista de linkuri după imported:tinyurl și deschide zece linkuri la întâmplare. Verifică destinația, slug-ul și titlul față de TinyURL. După aceea, treci la skip pentru orice rerulare.
Cum exporți din TinyURL fără importator
Apelul documentat de listare este GET /urls/available cu un token bearer, și GET /urls/archived pentru linkurile arhivate. Restrânge rezultatul cu datetime-uri from și to dacă contul este mare, deoarece specificația nu dă parametri de pagină. Scrie rezultatul într-un fișier înainte să faci orice altceva, redu-l la destination, slug, title și încarcă-l cu formularul în masă. Detaliile acelei mapări sunt în ghidul practic. Nici forma răspunsului real nu am verificat-o, deci inspectează manual un răspuns înainte de a scrie un script pe baza lui.
Ce urmează
Secvența este: corectăm endpoint-ul, adăugăm un răspuns real capturat ca fixture de test, apoi re-verificăm fiecare cifră din ghidul practic și de pe pagina de aterizare a migrării. Paginarea și limita reală per cerere trebuie re-măsurate pe un cont real, pentru că specificația nu dă niciuna. Dacă trebuie să pleci de la TinyURL înainte de asta, compară opțiunile în Elido vs TinyURL și alternative la TinyURL și folosește ruta CSV.
Mai multe pe blog
Întrebări frecvente
Funcționează astăzi importatorul TinyURL din Elido?
Consideră-l neverificat. Workerul cere GET /aliases?page=N&per_page=100 pe api.tinyurl.com. Specificația OpenAPI a TinyURL (accesată 2026-10-02) nu are nicio cale /aliases; linkurile se listează prin GET /urls/{type}. Testul unitar livrat verifică doar forma răspunsului pe care am presupus-o. O corecție este în backlogul nostru, iar până atunci ruta de încredere este un CSV sau lipirea în masă.
Ce copiază importatorul din fiecare link TinyURL?
URL-ul de destinație, alias-ul (folosit ca slug), titlul și tagurile, plus un tag imported:tinyurl pe fiecare link pe care îl creează. Nu copiază istoricul de clicuri, stilizarea QR sau altceva.
Ce se întâmplă când un alias există deja în Elido?
Alegi o strategie per job. Suffix încearcă alias-2, alias-3 și tot așa până la alias-50, skip lasă linkul existent și înregistrează rândul, fail marchează jobul ca eșuat la primul conflict. Valoarea implicită este suffix.
Este tokenul meu TinyURL stocat?
Nu. Cererea de pornire poartă tokenul către un goroutine de fundal, iar rândul jobului nu stochează nicio referință la token. Tokenul există în memoria procesului pe durata rulării.
Există o limită pentru câte linkuri gestionează un import?
Da. O rulare se oprește după 50,000 de linkuri sau 30 de minute, oricare vine primul. La limita de linkuri, jobul se încheie ca finalizat cu primele 50,000 procesate, deci compară numărătorile cu sursa ta.
Pot migra dintr-un cont TinyURL gratuit?
TinyURL leagă listarea linkurilor de un token API, iar linkurile create fără autentificare nu aparțin niciunui cont, deci nu există nimic de listat. Reconstruiește singur o listă de destinații și folosește importul în masă.
Încearcă Elido
Lipește un URL, obții un link scurt funcțional
Fără înregistrare. Linkul este activ timp de 30 de zile. Înregistrează-te ca să-l păstrezi pentru totdeauna.
Gratuit, fără înregistrare · 2 pe zi