Rețetă
Sincronizează scorurile linkurilor dintr-un spreadsheet sau n8n
Majoritatea directoarelor de tool-uri sunt stocate într-un spreadsheet, o bază de date Airtable sau o mică bază de date. Această rețetă transformă verificarea backlinkurilor într-un simplu completare de coloane: o singură cerere pentru fiecare 2.000 de rânduri.
Echipa de cercetare SEO Tools AI ·

Rețeta în cinci pași
Exportă domeniile
Ia coloana cu site-uri web din listările tale, elimină protocolul și căile, apoi elimină duplicatele. Duplicatele nu costă extra, dar îngreunează etapa de mapare.
Grupează în loturi de 2.000
bulk_dr acceptă până la 2.000 de domenii per apel. Un spreadsheet cu 5.000 de rânduri va necesita trei apeluri.
Trimite, verifică ok
Apelează API-ul, citește JSON-ul și oprește-te dacă ok este false. Loghează _credits pentru a vedea soldul după fiecare execuție.
Răspunde cu o dată
Stochează evaluarea și data de azi în două coloane. Nu suprascrie niciodată o valoare bună cu una goală.
Planifică o dată pe lună
Rulează pe prima zi a lunii. Indexul se actualizează aproximativ lunar, deci rularea mai frecventă nu aduce beneficii.
Alege ce declanșează jobul
Declanșatorul decide frecvența apelurilor, așa că alege-l înainte de a crea mapping-ul. Două tipuri de declanșare acoperă aproape toate cazurile.
Un planificator pe prima zi a lunii este opțiunea cea mai simplă. Se potrivește cu ritmul indexului și nu trebuie să ții minte un buton.
Un planificator pentru reîmprospătarea lunară
Pune un trigger de planificare la început, setează-l pe prima zi a fiecărei luni și lasă-l să citească întreaga tabelă de listing-uri. Fiecare rulare va efectua un lot de apeluri bulk_dr, dimensionat în funcție de numărul de rânduri.
Menține planificarea chiar și când tabelul este mic. Un job lunar care rulează pe un fișier mic costă un credit și menține scorurile actualizate și datare corectă.
Un trigger pe fiecare rând nou
Presupunem că listing-urile apar câte unul, la fiecare câteva zile. Un trigger care se declanșează pentru fiecare rând nou este tentant, dar fiecare apel este facturat separat, deci un apel per rând costă mai mult decât un lot lunar.
Dacă vrei scorul rapid, lasă fluxul pentru rânduri noi să scrie un dr gol și lasă rularea lunară să îl completeze. Rândul va primi scorul fără un apel pentru fiecare apariție.
Dacă listing-urile apar în valuri, grupează rândurile noi într-un singur lot la sfârșitul săptămânii. Acest lucru costă un singur apel și tabelul nu se mai modifică doar o dată pe lună.
O dată care marchează rândurile finalizate
Salvează dr_checked_on pe fiecare rând pe care îl evaluezi. Un rul care începe cu un filtru pe acea dată omite ceea ce a fost deja făcut în această lună, iar un coadă separată nu este necesară.
Când un rul se oprește pe jumătate, rândurile deja marcate rămân marcate. Următorul rul preia de unde s-a oprit cel precedent, ceea ce reprezintă cea mai ieftină metodă de recuperare.
Înainte de a automatiza orice
Rulează verificarea manual pe cinci listări mai întâi. Folosește acțiunea gratuită overview pentru fiecare, care nu necesită o cheie API, și compară ceea ce vezi cu ceea ce te așteptai.
Asta prinde surprizele comune de la început: o listare care indică către un subdomeniu, un produs care se află pe o cale a unui site mai mare, un domeniu care a făcut redirect în primăvara trecută. O evaluare aparține unui domeniu, nu unui produs.
Stabilește cum marchează foaia de calcul aceste cazuri, de exemplu cu o coloană de note care conține shares domain. Cei care citesc acceptă mult mai ușor o notă de subsol decât o evaluare care pare greșită.
Când cele cinci par rezonabile, treci la lot. Referința câmpurilor listează coloanele, iar exemplul de cost arată cât costă un rul.
O versiune mică în Python
Necesită pachetul requests. Este un schiță pentru structura jobului: tipărește mai întâi un răspuns real, apoi mapază câmpurile de care ai nevoie în propriile coloane.
import csv, requests
KEY = "sk_live_..."
BASE = "https://seotoolsai.org/api.php"
rows = list(csv.DictReader(open("listings.csv")))
domains = sorted({r["domain"] for r in rows})
for i in range(0, len(domains), 2000):
chunk = domains[i:i + 2000]
r = requests.post(BASE, params={"action": "bulk_dr", "key": KEY},
data={"domains": ",".join(chunk)}, timeout=60)
if r.status_code in (401, 402):
raise SystemExit(f"stop: HTTP {r.status_code}")
data = r.json()
if not data.get("ok"):
raise SystemExit("api said not ok")
print(data["_credits"]) # cost and remaining balance
open(f"raw_{i}.json", "w").write(r.text)
Folosind Google Sheets sau n8n
Sheets poate apela o URL din Apps Script cu UrlFetchApp, iar n8n are un nod HTTP Request. Ambele fac același lucru ca scriptul de mai sus.
În n8n, pune mai întâi un trigger de programare, apoi un nod care citește foaia de calcul sau tabela, apoi un pas de împărțire a itemilor care construiește grupuri de 2.000, apoi HTTP Request. Adaugă un nod final care scrie înapoi evaluarea și data.
Păstrează cheia în stocul de credențiale al platformei, nu în textul fluxului de lucru. Fluxurile de lucru sunt partajate, copiate și lipite în forumuri, iar o cheie lipită împreună cu ele este bani cheltuiți.
Fără cod sau un script: care formă se potrivește echipei tale
Ambele rute fac aceeași apelare. Diferența este cine va trebui să mențină fluxul peste un an și cât de ușor este să i-l explici acelei persoane.
Alege forma pe care o poți citi încă după o pauză de câteva luni. Un flux clever pe care nimeni nu îl înțelege este mai rău decât un script simplu pe care toată lumea îl poate urma.
Un flux pe care îl poți explica editorului următor
Un flux n8n scurt cu patru noduri etichetate este ușor de predat: trigger, read, batch, write back. Numește fiecare nod după ceea ce face, nu după eticheta implicită.
Evită suprapunerea multor ramuri pentru cazuri de limită. Fiecare ramură este un loc în plus unde un domeniu poate primi o evaluare greșită.
Când un script își câștigă locul
Un script are sens când inputul este un folder de fișiere CSV, sau când jobul necesită logică pe care un flux o gestionează greoi. Schița de mai sus se potrivește acestui caz.
Pune scriptul în controlul versiunilor și păstrează cheia într-o variabilă de mediu. Un script care citește cheia dintr-un fișier din același folder este o scurgere care așteaptă un drive partajat.
Tutorialele care sar peste partea grea
Multe videoclipuri arată un flux care funcționează de la prima încercare cu trei rânduri. Listările reale au goluri, duplicate și domenii ciudate, iar acolo este unde fluxul are nevoie de atenție.
Construiește fluxul pe propriile tale cinci rânduri de test mai întâi. Dacă un tutorial nu poate supraviețui acestora, tutorialul nu a fost niciodată jobul întreg.
Când preiei fluxul de la altcineva, include cele cinci rânduri de test ca eșantion. Următoarea persoană poate vedea cum arată un rul bun înainte de a atinge datele live.
Ce înseamnă erorile
| Semnal | Semnificație | Ce face jobul |
|---|---|---|
| HTTP 401 | Cheie lipsă sau incorectă | Oprește, alertează un om |
| HTTP 402 | Creditul s-a epuizat | Oprește, păstrează scorurile vechi, reîncarcă |
ok este fals | Apelul nu a reușit | Loghează corpul, reîncearcă la următoarea execuție |
| Rezultat gol pentru un domeniu | Nu este în index | Lasă celula goală |

Păstrează foaia curată între execuții
Un job de sincronizare este la fel de bun cât foaia în care scrie. Câteva obiceiuri opresc deteriorarea lentă care se acumulează între o execuție și următoarea.
Majoritatea problemelor încep cu o editare inocentă: o coloană inserată deasupra scorului sau un rând copiat care schimbă discret un domeniu.
Păstrează răspunsurile brute în propriul lor tab
Stochează fiecare răspuns brut în propriul său tab, sau ca JSON Lines cu un răspuns pe linie. Această copie îți permite să reconstruiești coloanele vizibile fără un al doilea apel plătit.
Un tab brut răspunde și întrebării pe care o pune un editor peste șase luni: ce a returnat API-ul în acea dată.
Numără fiecare tab brut cu data lotului, astfel încât copiile să se sorteze în ordine când derulezi înapoi prin ele.
Blochează rândul de antet
Congelează rândul de antet și nu insera niciodată o coloană deasupra scorului. O mapare care indică coloana F va citi date greșite după o inserție, și va face-o fără nicio eroare.
Numără coloanele în mapare, nu prin poziție. Un nume supraviețuiește unei rearanjări, iar o poziție nu.
Numără rândurile înainte și după
Scrie numărul de rânduri în log înainte de execuție și din nou după aceasta. Cele două numere ar trebui să difere doar prin rândurile pe care ai intenționat să le adaugi, iar un gap îți spune că ceva a mers greșit.
Sortează foaia după coloana scor o dată pe lună și uită-te la rândurile de sus și de jos. Valorile ciudate acolo indică de obicei un domeniu mapat la o listare greșită.
Testează mai întâi pe o copie
Duplică foaia și rulează fluxul împotriva copiei înainte să atingi pe cea reală. O copie costă zero să fie creată.
O mapare greșită scrisă peste scorurile live este greu de anulat, deoarece valorile vechi sunt pierdute. Păstrează copia până când prima execuție onestă se potrivește cu ceea ce te-ai așteptat.
Șterge copia doar după ce a doua execuție programată s-a potrivit cu ea. Două execuții curate la rând sunt un semnal mai bun decât unul.
Înainte de prima execuție live
- Cheia se află în stocul de credențiale al platformei sau într-o variabilă de mediu, nu în textul fluxului de lucru.
- Un singur apel
overviewgratuit a fost verificat manual împotriva unei listări pe care o cunoști. - Execuția a fost testată pe o copie a foii, iar copia s-a potrivit cu ceea ce te-ai așteptat.
- Jobul scrie data lângă fiecare scor pe care îl atinge.
- Status 401 și 402 opresc jobul și trimit un mesaj unei persoane.
Întrebări despre sincronizare
Cum evit să plătesc de două ori dacă jobul se blochează la jumătate?
Scrie data lângă fiecare scor pe măsură ce mergi, și ai următoarea execuție să sară peste rândurile deja stampilate în această lună. Chunk-uri de 2.000 înseamnă că un crash costă cel mult un credit, deci riscul este mic, dar obiceiul menține foaia ordonată.
Poate un non-programator să configureze asta?
În mare parte da. Un nod HTTP Request în n8n sau Make are nevoie doar de un URL, o cheie și o listă. Partea complicată este transformarea răspunsului în coloane, așa că fă un apel de test și uită-te la JSON înainte să construiești maparea.