Рецепт
Синхронизация оценок ссылок из таблицы или n8n
Большинство каталогов инструментов хранятся в таблице, базе Airtable или небольшой базе данных. Этот рецепт превращает проверку обратных ссылок в заполнение столбца: один запрос на 2 000 строк.
Исследовательская команда SEO Tools AI ·

Рецепт в пяти шагах
Экспорт доменов
Возьмите столбец с сайтами из ваших списков, удалите протокол и пути, а также дубликаты. Дубликаты не стоят дополнительных денег, но усложняют этап сопоставления.
Разбейте на группы по 2 000
bulk_dr принимает до 2 000 доменов за один вызов. Таблицу на 5 000 строк поэтому нужно обработать в три приема.
Отправить, проверить ok
Вызовите API, прочитайте JSON и остановитесь, если ok равно false. Логируйте _credits, чтобы видеть баланс после каждого запуска.
Записать обратно с датой
Сохраните оценку и сегодняшнюю дату в двух столбцах. Никогда не перезаписывайте хорошее значение пустым.
Запланировать один раз в месяц
Запускайте его первого числа месяца. Индекс обновляется примерно раз в месяц, поэтому более частые запуски ничего не дают.
Выберите, что запускает задачу
Триггер определяет частоту вызовов, поэтому выберите его перед созданием сопоставления. Два варианта запуска покрывают почти все сценарии для каталогов.
Расписание на первое число месяца — самый простой вариант. Он соответствует ритму обновления индекса, и никому не нужно помнить о кнопке.
Расписание для ежемесячного обновления
Поставьте триггер расписания первым, установите его на первое число каждого месяца и дайте ему читать всю таблицу списков. Каждый запуск делает один пакет вызовов bulk_dr, размером, соответствующим количеству строк.
Сохраняйте расписание, даже если таблица небольшая. Ежемесячная задача, запущенная на маленькой таблице, стоит один кредит и поддерживает актуальность дат оценок.
Триггер на каждую новую строку
Допустим, списки поступают по одной строке каждые несколько дней. Триггер, срабатывающий на каждую новую строку, кажется привлекательным, но каждый вызов оплачивается отдельно, поэтому одна строка в вызове стоит дороже, чем один пакет за месяц.
Если вам нужна оценка быстро, пусть поток по новой строке записывает пустой dr, а ежемесячный запуск заполнит его. Строка получит число без отдельного вызова при каждом поступлении.
Если списки поступают партиями, объединяйте новые строки в один пакет в конце недели. Это стоит один вызов, и таблица больше не обновляется только раз в месяц.
Дата, отмечающая готовые строки
Сохраняйте dr_checked_on в каждой строке, которую вы оценили. Запуск, начинающийся с фильтра по этой дате, пропускает то, что уже сделано в этом месяце, и отдельная очередь не нужна.
Когда запуск прерывается посередине, уже отмеченные строки остаются отмеченными. Следующий запуск продолжает с того места, где остановился предыдущий, что является самым дешевым способом восстановления.
Перед автоматизацией чего-либо
Сначала проверьте вручную пять списков. Используйте бесплатное действие overview для каждого, которое не требует ключа, и сравните то, что вы видите, с тем, что ожидали.
Это поможет рано выявить распространенные сюрпризы: список, указывающий на поддомен, продукт, расположенный по пути на крупном сайте, домен, который перенаправлял прошлой весной. Оценка принадлежит домену, а не продукту.
Решите, как ваша таблица отмечает такие случаи, например, с помощью столбца с пометкой shares domain. Читатели гораздо охотнее прощают сноску, чем оценку, которая выглядит неверно.
Когда пять выглядят разумно, переходите к пакету. В вашем справочнике по полям перечислены столбцы, а в примере стоимости показано, сколько стоит запуск.
Небольшая версия на Python
Требуется пакет requests. Это набросок структуры задачи: сначала распечатайте реальный ответ, затем сопоставьте нужные поля с вашими столбцами.
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 может вызывать URL из Apps Script с помощью UrlFetchApp, а в n8n есть узел HTTP Request. Оба делают то же самое, что и скрипт выше.
В n8n поставьте триггер расписания первым, затем узел, который читает вашу таблицу или базу данных, затем шаг разделения элементов, который формирует группы по 2 000, затем HTTP Request. Добавьте финальный узел для записи оценки и даты обратно.
Храните ключ в хранилище учетных данных платформы, а не в тексте рабочего процесса. Рабочие процессы часто делятся, копируются и вставляются на форумах, и ключ, вставленный вместе с ними, — это потраченные деньги.
Без кода или скрипт: какая форма подходит вашей команде
Оба варианта делают один и тот же вызов. Разница в том, кому придется поддерживать поток через год и насколько легко будет объяснить его этому человеку.
Выберите форму, которую вы все еще сможете прочитать после перерыва в несколько месяцев. Умный поток, который никто не понимает, хуже простого скрипта, которому может следовать каждый.
Поток, который вы можете объяснить следующему редактору
Короткий поток n8n с четырьмя помеченными узлами легко передать: триггер, чтение, пакет, запись обратно. Называйте каждый узел по его функции, а не по умолчанию.
Избегайте нагромождения множества ветвей для крайних случаев. Каждая ветвь — это еще одно место, где домен может получить неверную оценку.
Когда скрипт заслуживает своего места
Скрипт имеет смысл, когда входные данные — это папка с CSV-файлами или когда задача требует логики, которую поток обрабатывает неуклюже. Набросок выше подходит для этого случая.
Поместите скрипт в систему контроля версий и храните ключ в переменной окружения. Скрипт, который читает ключ из файла в той же папке, — это утечка, ожидающая общего диска.
Учебные материалы, пропускающие сложную часть
Многие видео показывают поток, который работает с первого раза с тремя строками. Реальные списки содержат пустые значения, дубликаты и странные домены, и именно там поток требует внимания.
Сначала постройте поток на своих пяти тестовых строках. Если учебное пособие не выдерживает этих строк, оно никогда не было полной задачей.
Когда вы передаете поток другому человеку, включите пять тестовых строк в качестве образца. Следующий человек увидит, как выглядит хороший запуск, прежде чем касаться реальных данных.
Что означают ошибки
| Сигнал | Значение | Что делает задача |
|---|---|---|
| HTTP 401 | Отсутствует или неверный ключ | Остановить, оповестить человека |
| HTTP 402 | Кредиты закончились | Остановить, сохранить старые оценки, пополнить |
ok равно false | Вызов не удался | Записать тело в лог, повторить в следующем запуске |
| Пустой результат для домена | Не в индексе | Оставить ячейку пустой |

Держите таблицу чистой между запусками
Синхронизирующий запуск не лучше таблицы, в которую он пишет. Несколько привычек предотвращают медленное накопление ошибок между одним запуском и следующим.
Большинство проблем начинается с невинного редактирования: столбец вставлен выше оценки или скопированная строка незаметно меняет домен.
Храните сырые ответы в отдельной вкладке
Сохраняйте каждый сырой ответ в отдельной вкладке или в виде JSON Lines по одному ответу на строку. Эта копия позволяет восстановить видимые столбцы без второго платного вызова.
Вкладка с сырыми данными также отвечает на вопрос, который редактор задает через шесть месяцев: что вернул API в ту дату.
Называйте каждую вкладку с сырыми данными датой пакета, чтобы копии сортировались по порядку, когда вы прокручиваете их назад.
Заблокируйте строку заголовка
Закрепите строку заголовка и никогда не вставляйте столбец выше оценки. Сопоставление, указывающее на столбец F, прочитает неверные данные после вставки, и сделает это без какой-либо ошибки.
Называйте столбцы в сопоставлении по имени, а не по позиции. Имя переживает переупорядочивание, а позиция — нет.
Подсчитайте количество строк до и после
Запишите количество строк в лог до запуска и снова после него. Два числа должны отличаться только на строки, которые вы намеревались добавить, а разрыв говорит о том, что что-то пошло не так.
Отсортируйте таблицу по столбцу оценок раз в месяц и посмотрите на верхние и нижние строки. Странные значения там обычно указывают на домен, который был сопоставлен с неверным списком.
Протестируйте на копии
Дублируйте таблицу и запустите поток против копии, прежде чем касаться реальной. Копия стоит ничего для создания.
Неверное сопоставление, записанное поверх реальных оценок, трудно отменить, потому что старые значения потеряны. Сохраняйте копию, пока первый честный запуск не совпадет с тем, что вы ожидали.
Удалите копию только после того, как второй запланированный запуск совпадет с ней. Два чистых запуска подряд — лучший сигнал, чем один.
Перед первым запуском в продакшене
- Ключ находится в хранилище учетных данных платформы или в переменной окружения, а не в тексте рабочего процесса.
- Один бесплатный вызов
overviewбыл проверен вручную по списку, который вам известен. - Запуск был протестирован на копии таблицы, и копия совпала с тем, что вы ожидали.
- Задача записывает дату рядом с каждой оценкой, которую она затрагивает.
- Статусы 401 и 402 останавливают задачу и отправляют сообщение человеку.
Вопросы по синхронизации
Как избежать двойной оплаты, если задача прерывается посередине?
Записывайте дату рядом с каждой оценкой по мере продвижения, и пусть следующий запуск пропускает строки, уже отмеченные в этом месяце. Части по 2 000 означают, что сбой стоит не более одного кредита, поэтому риск крошечный, но привычка держит таблицу в порядке.
Может ли не-программист настроить это?
В основном да. Узел HTTP Request в n8n или Make требует только URL, ключ и список. Самая сложная часть — превратить ответ в столбцы, поэтому сделайте один тестовый вызов и посмотрите на JSON, прежде чем строить сопоставление.