Hoppa till innehåll
SEO Tools AI
SEO Tools AISkapa konto

Recept

Synkronisera länkskor från ett ark eller n8n

De flesta verktygskataloger finns i ett kalkylblad, en Airtable-bas eller en liten databas. Detta recept förvandlar en backlink-kontroll till en kolumnfyllning: en begäran per 2 000 rader.

SEO Tools AI forskarteam ·

Pappersklipparbetare som bygger en bro som förbinder ett arkivskåp med en väg

Receptet i fem steg

01

Exportera domänerna

Ta kolumnen med webbadresser från dina listningar, ta bort protokoll och sökvägar samt ta bort dubbletter. Dubbletter kostar inget extra men gör steg för kartläggning rörigt.

02

Dela upp i grupper om 2 000

bulk_dr accepterar upp till 2 000 domäner per anrop. Ett ark med 5 000 rader kräver därför tre anrop.

03

Skicka, kontrollera ok

Anropa API:et, läs JSON:en och avbryt om ok är false. Logga _credits så att du ser saldot efter varje körning.

04

Skriv tillbaka med ett datum

Lagra betyget och dagens datum i två kolumner. Överskriv aldrig ett bra värde med ett tomt.

05

Schemalägg en gång i månaden

Kör det den första i månaden. Indexet förändras ungefär månadsvis, så oftare ger inget utbyte.

Välj vad som startar jobbet

Utlösaren bestämmer hur ofta anropen sker, så välj den innan du bygger kartläggningen. Två startmetoder täcker nästan alla kataloger.

En schemaläggning den första i månaden är det enklaste alternativet. Det matchar indexets rytm, och ingen behöver komma ihåg en knapp.

En schemaläggning för den månatliga uppdateringen

Placera en schemaläggningsutlösare först, ställ in den på den första dagen i varje månad och låt den läsa hela listningstabellen. Varje körning gör då en batch med bulk_dr-anrop, anpassad efter antalet rader.

Behåll schemaläggningen även när tabellen är liten. Ett månatligt jobb som körs på ett litet ark kostar ett kreditpoäng, och det håller betygen daterade och aktuella.

En utlösare för varje ny rad

Antag att listningar anländer en och en, varannan dag. En utlösare som triggar per ny rad är frestande, men varje anrop faktureras en gång, så ett anrop per rad kostar mer än en batch för månaden.

Om du vill ha betyget snabbt kan du låta flödet för nya rader skriva ett tomt dr och låta den månatliga körningen fylla i det. Raden får sitt nummer utan ett anrop vid varje ankomst.

Om listningar anländer i svängar, samla de nya raderna till en batch i slutet av veckan. Det kostar ett anrop, och arket ändras inte bara en gång i månaden.

Ett datum som markerar färdiga rader

Lagra dr_checked_on på varje rad du betygsätter. En körning som startar med ett filter på detta datum hoppar över vad som redan är gjort denna månad, och ingen separat kö behövs.

När en körning stannar mitt i, förblir de redan stämplade raderna stämplade. Nästa körning fortsätter där den föregående slutade, vilket är den billigaste återhämtningen.

Innan du automatiserar något

Kör kontrollen manuellt på fem listningar först. Använd den gratis overview-åtgärden för varje, vilket inte kräver någon nyckel, och jämför vad du ser med vad du förväntade dig.

Detta fångar de vanliga överraskningarna tidigt: en listning som pekar på en subdomän, en produkt som finns på en sökväg på en större webbplats, en domän som omdirigerades förra våren. Ett betyg tillhör en domän, inte en produkt.

Bestäm hur ditt ark markerar dessa fall, till exempel med en notskolumn som läser shares domain. Läsare tolererar en fotnot långt hellre än ett betyg som ser fel ut.

När de fem ser rimliga ut, gå vidare till batchen. Din fältreferens listar kolumnerna, och kostnadsexemplet visar vad en körning kostar.

En liten Python-version

Kräver paketet requests. Det är ett utkast för formen på jobbet: skriv ut ett verkligt svar först, mappa sedan fälten du behöver till dina egna kolumner.

python
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)
Papperskugghjul och transportband som sorterar block i grupper

Att göra det i Google Sheets eller n8n

Sheets kan anropa en URL från Apps Script med UrlFetchApp, och n8n har en HTTP Request-node. Båda gör samma sak som skriptet ovan.

I n8n, placera en schemaläggningsutlösare först, sedan en node som läser ditt ark eller bord, sedan ett steg för att dela upp objekt som bygger grupper om 2 000, sedan HTTP Request. Lägg till en slutlig node som skriver tillbaka betyg och datum.

Behåll nyckeln i plattformens behörighetslagring, inte i arbetsflödets text. Arbetsflöden delas, kopieras och klistras in i forum, och en nyckel som klistras in med dem är utgiftade pengar.

No-code eller ett skript: vilken form passar ditt team

Båda vägarna gör samma anrop. Skillnaden är vem som måste underhålla flödet om ett år, och hur lätt det är att förklara det för den personen.

Välj den form du fortfarande kan läsa efter en paus på flera månader. Ett smart flöde ingen förstår är sämre än ett enkelt skript alla kan följa.

Ett flöde du kan förklara för nästa redaktör

Ett kort n8n-flöde med fyra märkta noder är lätt att överlämna: trigger, läs, batch, skriv tillbaka. Döp varje node efter vad den gör, inte efter standardnamnet.

Undvik att stapla många grenar för kantfall. Varje gren är en plats där en domän kan få fel betyg.

När ett skript förtjänar sin plats

Ett skript är rimligt när inmatningen är en mapp med CSV-filer, eller när jobbet behöver logik som ett flöde hanterar klumpigt. Utkastet ovan passar det fallet.

Lagra skriptet i versionskontroll och behåll nyckeln i en miljövariabel. Ett skript som läser sin nyckel från en fil i samma mapp är en läcka som väntar på en delad enhet.

Guider som hoppar över den svåra delen

Många videor visar ett flöde som fungerar vid första försöket med tre rader. Verkliga listningar har tomrum, dubbletter och konstiga domäner, och det är där flödet behöver uppmärksamhet.

Bygg flödet på dina fem testrader först. Om en guide inte klarar av dem var guide aldrig hela jobbet.

När du överlämnar flödet till någon annan, inkludera de fem testraderna som ett exempel. Nästa person kan se hur en bra körning ser ut innan de rör live-data.

Vad felen betyder

API:ets beteende och vad ett synkroniseringsjobb bör göra.
SignalBetydelseVad jobbet gör
HTTP 401Saknad eller felaktig nyckelStoppa, varna en människa
HTTP 402Krediterna är slutStoppa, behåll gamla betyg, ladda upp
ok är falseAnropet lyckades inteLogga kroppen, försök igen nästa körning
Tomt resultat för en domänInte i indexetLämna cellen tom
Pappersodlare som räddar en sned växtstam i en trädgård

Håll arket rent mellan körningarna

Ett synkroniseringsjobb är bara lika bra som arket det skriver till. Några vanor stoppar den långsamma skada som byggs upp mellan en körning och nästa.

De flesta problem börjar med en oskyldig redigering: en kolumn infogad ovanför betyget, eller en kopierad rad som tyst ändrar en domän.

Behåll råa svar i sin egen flik

Lagra varje rått svar i sin egen flik, eller som JSON Lines med ett svar per rad. Den kopian låter dig bygga om de synliga kolumnerna utan ett andra betalt anrop.

En rå flik svarar också på frågan en redaktör ställer sex månader senare: vad returnerade API:et på det datumet.

Döp varje rå flik efter dess batchdatum, så att kopiorna sorteras i ordning när du scrollar tillbaka genom dem.

Lås rubrikraden

Frys rubrikraden och infoga aldrig en kolumn ovanför betyget. En kartläggning som pekar på kolumn F kommer att läsa fel data efter en infogning, och det kommer att göra det utan något fel.

Döp kolumnerna i kartläggningen, inte efter position. Ett namn överlever en omordning, och en position gör det inte.

Räkna raderna före och efter

Skriv radantalet i loggen före körningen och igen efter den. De två siffrorna ska skilja sig endast med de rader du avsett att lägga till, och ett gap berättar att något gick fel.

Sortera arket efter betygskolumnen en gång i månaden och titta på de översta och nedersta raderna. Udda värden där pekar vanligtvis på en domän som mappats till fel listning.

Testa på en kopia först

Duplicera arket och kör flödet mot kopian innan du rör den verkliga. En kopia kostar inget att göra.

En dålig kartläggning skriven över live-betyg är svår att ångra, eftersom de gamla värdena är borta. Behåll kopian tills den första ärliga körningen matchar vad du förväntade dig.

Ta bort kopian först efter att den andra schemalagda körningen har matchat den. Två rena körningar i rad är en bättre signal än en.

Första live-körningen

  • Nyckeln ligger i plattformens behörighetslagring eller en miljövariabel, inte i arbetsflödets text.
  • Ett gratis overview-anrop kontrollerades manuellt mot en känd listning.
  • Körningen testades på en kopia av arket, och kopian matchade vad du förväntade dig.
  • Jobbet skriver datumet bredvid varje betyg det rör vid.
  • Status 401 och 402 stoppar jobbet och skickar ett meddelande till en person.

Synkroniseringsfrågor

Hur undviker jag att betala två gånger om jobbet kraschar mitt i?

Skriv datumet bredvid varje betyg medan du arbetar, och låt nästa körning hoppa över rader som redan är stämplade denna månad. Chunkar om 2 000 betyder att en krasch kostar högst ett kreditpoäng, så risken är liten, men vanan håller arket prydligt.

Kan en icke-programmerare sätta upp detta?

De flesta gånger ja. En HTTP Request-node i n8n eller Make behöver bara en URL, en nyckel och en lista. Den kluriga delen är att omvandla svaret till kolumner, så gör ett testanrop och titta på JSON:en innan du bygger kartläggningen.