レシピ
シートまたはn8nからリンクスコアを同期
ほとんどのツールディレクトリはスプレッドシート、Airtableベース、または小規模データベースに保存されています。このレシピは、ツールバックリンクチェックを列への入力に変換します:2,000行ごとに1リクエスト。
SEO Tools AI リサーチチーム ·

5つのステップでレシピを実行
ドメインをエクスポート
リストの「ウェブサイト」列からプロトコルとパスを削除し、重複を除外します。重複は追加コストはかかりませんが、マッピング工程を混乱させます。
2,000ずつのグループに分割
bulk_drは1回の呼び出しで最大2,000ドメインを受け付けます。したがって、5,000行のシートには3回の呼び出しが必要です。
送信し、正常に完了したか確認
APIを呼び出し、JSONを読み取り、okがfalseの場合は停止します。_creditsをログに記録し、各実行後の残高を確認できるようにします。
日付付きで記録
評価と本日付を2つの列に保存します。良い値を空の値で上書きしないようにしてください。
月1回のスケジュールを設定
月の初めに実行します。インデックスは月次で更新されるため、それ以上の頻度では効果がありません。
ジョブの開始方法を選択
トリガーは呼び出しの頻度を決定するため、マッピングを構築する前に選択してください。2つの開始方法でほぼすべてのディレクトリに対応できます。
月の初めに設定されたスケジュールが最も簡単なオプションです。これはインデックスのリズムに合致しており、誰かがボタンを覚える必要がありません。
月次更新用のスケジュール
最初にスケジュールトリガーを配置し、毎月1日に設定して、リスト全体を読み取ります。各実行では、行数に合わせてbulk_dr呼び出しのバッチを1回作成します。
テーブルが小さくてもスケジュールを維持してください。小さなシートで月次ジョブを実行すると1クレジットしかかかりませんが、スコアに日付が付けられ、最新の状態が保たれます。
新規行ごとのトリガー
リストが数日ごとに1つずつ届く場合、新規行ごとにトリガーを発火させるのは魅力的ですが、呼び出しは1回ごとに課金されるため、行ごとの呼び出しは月1回のバッチ呼び出しよりも高コストになります。
スコアを素早く取得したい場合は、新規行フローで空のdrを書き込み、月次実行でそれを入力させます。これにより、各到着ごとに呼び出しを行うことなく、行に数値が反映されます。
リストが一括で届く場合は、週末に新規行を1つのバッチにまとめます。これにより呼び出しは1回で済み、シートは月1回だけでなく更新されます。
完了した行を示す日付
評価したすべての行にdr_checked_onを保存します。その日付でフィルタリングして開始する実行は、今月すでに処理済みの行をスキップするため、別のキューは不要です。
実行が途中で停止した場合、すでにスタンプされた行はそのまま残ります。次の実行は最後の実行が終了した地点から再開するため、これが最も低コストな回復方法です。
自動化する前に
まず5つのリストを手動でチェックしてください。キーが不要な無料のoverviewアクションをそれぞれ使用し、表示される結果と期待値を比較します。
これにより、一般的な予期せぬ事象を早期に発見できます:サブドメインを指すリスト、大規模サイトのパス上に製品がある場合、昨春にリダイレクトしたドメインなど。評価は製品ではなくドメインに属します。
これらのケースをシートでどのようにマークするかを決定します。例えば、shares domainと表示される注釈列を作成します。読者はスコアが間違っているように見えることよりも、脚注を寛大に受け入れます。
5つのリストが正常に処理できることを確認したら、バッチ処理に進みます。フィールドリファレンスには列の一覧が記載されており、コスト例では実行コストが示されています。
小型のPython版
requestsパッケージが必要です。これはジョブの構造を示すスケッチです:まず実際のレスポンスを1つ出力し、必要なフィールドを独自の列にマッピングします。
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)
Google Sheetsまたはn8nでの実装
SheetsはApps ScriptのUrlFetchAppでURLを呼び出すことができ、n8nにはHTTP Requestノードがあります。どちらも上記のスクリプトと同じことを実行します。
n8nでは、最初にスケジュールトリガーを配置し、次にシートまたはテーブルを読み取るノード、次に2,000ずつのグループを構築するアイテム分割ステップ、そしてHTTP Requestを配置します。最後に、評価と日付を記録するノードを追加します。
キーはワークフローテキストではなく、プラットフォームの資格情報ストアに保存してください。ワークフローは共有、コピー、フォーラムへの貼り付けが行われるため、そこに貼り付けられたキーは無駄遣いにつながります。
ノーコードかスクリプトか:チームに合う形状はどちらか
どちらのルートも同じ呼び出しを行います。違いは、1年後にフローをメンテナンスする人が誰であり、その人にフローを説明するのがどれだけ簡単かです。
数ヶ月のブランク後でもまだ読み取れる形状を選択してください。誰も理解できない巧妙なフローは、誰でも追跡できる単純なスクリプトよりも劣ります。
次の編集者に説明できるフロー
ラベル付きの4つのノードからなる短いn8nフローは引き継ぎが容易です:トリガー、読み取り、バッチ、書き戻し。各ノードはデフォルトのラベルではなく、その機能に応じて命名してください。
エッジケースのために多くの分岐を積み重ねないでください。各分岐は、ドメインが間違ったスコアを取得する可能性のある場所が1つ増えることを意味します。
スクリプトがその場所を獲得するとき
入力がCSVファイルのフォルダである場合、またはフローが awkwardly 処理する必要があるロジックが必要な場合に、スクリプトが適切です。上記のスケッチはこのようなケースに適合します。
スクリプトをバージョン管理に配置し、キーを環境変数に保持してください。同じフォルダ内のファイルからキーを読み取るスクリプトは、共有ドライブに置かれた場合、漏洩の温床となります。
難しい部分を省略したチュートリアル
多くのビデオは、3行で初回から成功するフローを示しています。実際のリストには空白、重複、奇妙なドメインが含まれており、それらに対応するためにフローの注意が必要です。
まず独自の5つのテスト行でフローを構築してください。チュートリアルがそれらに耐えられない場合、そのチュートリアルは完全なジョブではありませんでした。
フローを他の人に引き渡す際は、サンプルとして5つのテスト行を含めてください。次の人は、ライブデータに触れる前に、正常な実行がどのように見えるかを確認できます。
エラーの意味
| シグナル | 意味 | ジョブの行動 |
|---|---|---|
| HTTP 401 | キーの不足または不正 | 停止、人間に警告 |
| HTTP 402 | クレジットが枯渇 | 停止、古いスコアを保持、チャージ |
okがfalse | 呼び出しが成功しなかった | ボディをログに記録し、次回の実行で再試行 |
| ドメインの空の結果 | インデックスに存在しない | セルを空白のままにする |

実行間でシートをクリーンに保つ
同期ジョブは、書き込み先のシート次第で良し悪しが決まります。実行間で蓄積されるゆっくりとしたダメージを防ぐためのいくつかの習慣があります。
ほとんどの問題は無害な編集から始まります:スコアの上に列が挿入された、またはコピーされた行がドメインを静かに変更したなど。
生レスポンスを独自のタブに保存
各生レスポンスを独自のタブに保存するか、1行に1つのレスポンスとしてJSON Lines形式で保存します。このコピーにより、2回目の有料呼び出しなしで表示列を再構築できます。
生タブは、6ヶ月後に編集者が尋ねる「その日にAPIは何を返したか」という質問にも答えます。
各生タブにバッチの日付を名前として付け、スクロールバックしたときにコピーが順序通りに並ぶようにします。
ヘッダー行をロック
ヘッダー行を凍結し、スコアの上に列を挿入しないようにしてください。列Fを指すマッピングは、挿入後に間違ったデータを読み取り、エラーなしでそうします。
マッピングの列名は位置ではなく名前で指定します。名前は並べ替えに耐えますが、位置は耐えません。
実行前後の行数を数える
実行前に行数をログに記録し、実行後にも記録します。2つの数値は、追加したかった行数のみが異なり、ギャップがある場合は何かが間違っていたことを示します。
シートをスコア列で月1回ソートし、上位行と下位行を確認します。そこにある奇妙な値は、通常、ドメインが間違ったリストにマッピングされたことを示しています。
コピーでテスト
実際のシートに触れる前に、シートを複製し、フローをコピーに対して実行してください。コピーを作成するにはコストがかかりません。
ライブスコアの上書きされた悪いマッピングは元に戻すのが困難です。古い値が消去されているためです。最初の正直な実行が期待値と一致するまでコピーを保持してください。
2回目のスケジュール実行がコピーと一致した後にのみコピーを削除します。連続する2回のクリーンな実行は、1回よりも良いシグナルです。
最初のライブ実行前
- キーはプラットフォームの資格情報ストアまたは環境変数にあり、ワークフローテキストにはありません。
- 1回の無料
overview呼び出しは、知っているリストに対して手動でチェックされました。 - 実行はシートのコピーに対してテストされ、コピーは期待値と一致しました。
- ジョブは、処理したすべてのスコアの隣に日付を書き込みます。
- ステータス401と402はジョブを停止し、人間にメッセージを送信します。
同期に関する質問
ジョブが途中でクラッシュした場合、どのようにして二重支払いを避けますか?
各スコアの隣に日付を書き込み、次の実行は今月すでにスタンプされた行をスキップするようにします。2,000ずつのチャンクでは、クラッシュは最大1クレジットのコストしかかからないため、リスクは非常に小さいですが、この習慣によりシートが整理された状態が保たれます。
非プログラマーでもこれを設定できますか?
ほぼ可能です。n8nまたはMakeのHTTP Requestノードには、URL、キー、リストのみが必要です。難しい部分はレスポンスを列に変換することなので、マッピングを構築する前にテスト呼び出しを行い、JSONを確認してください。