Перейти к содержимому
SEO Tools AI
SEO Tools AIЗарегистрироваться

Рецепт

Синхронизация оценок ссылок из таблицы или n8n

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

Исследовательская команда SEO Tools AI ·

Бумажные рабочие, строящие мост, соединяющий архив с дорогой

Рецепт в пяти шагах

01

Экспорт доменов

Возьмите столбец с сайтами из ваших списков, удалите протокол и пути, а также дубликаты. Дубликаты не стоят дополнительных денег, но усложняют этап сопоставления.

02

Разбейте на группы по 2 000

bulk_dr принимает до 2 000 доменов за один вызов. Таблицу на 5 000 строк поэтому нужно обработать в три приема.

03

Отправить, проверить ok

Вызовите API, прочитайте JSON и остановитесь, если ok равно false. Логируйте _credits, чтобы видеть баланс после каждого запуска.

04

Записать обратно с датой

Сохраните оценку и сегодняшнюю дату в двух столбцах. Никогда не перезаписывайте хорошее значение пустым.

05

Запланировать один раз в месяц

Запускайте его первого числа месяца. Индекс обновляется примерно раз в месяц, поэтому более частые запуски ничего не дают.

Выберите, что запускает задачу

Триггер определяет частоту вызовов, поэтому выберите его перед созданием сопоставления. Два варианта запуска покрывают почти все сценарии для каталогов.

Расписание на первое число месяца — самый простой вариант. Он соответствует ритму обновления индекса, и никому не нужно помнить о кнопке.

Расписание для ежемесячного обновления

Поставьте триггер расписания первым, установите его на первое число каждого месяца и дайте ему читать всю таблицу списков. Каждый запуск делает один пакет вызовов bulk_dr, размером, соответствующим количеству строк.

Сохраняйте расписание, даже если таблица небольшая. Ежемесячная задача, запущенная на маленькой таблице, стоит один кредит и поддерживает актуальность дат оценок.

Триггер на каждую новую строку

Допустим, списки поступают по одной строке каждые несколько дней. Триггер, срабатывающий на каждую новую строку, кажется привлекательным, но каждый вызов оплачивается отдельно, поэтому одна строка в вызове стоит дороже, чем один пакет за месяц.

Если вам нужна оценка быстро, пусть поток по новой строке записывает пустой dr, а ежемесячный запуск заполнит его. Строка получит число без отдельного вызова при каждом поступлении.

Если списки поступают партиями, объединяйте новые строки в один пакет в конце недели. Это стоит один вызов, и таблица больше не обновляется только раз в месяц.

Дата, отмечающая готовые строки

Сохраняйте dr_checked_on в каждой строке, которую вы оценили. Запуск, начинающийся с фильтра по этой дате, пропускает то, что уже сделано в этом месяце, и отдельная очередь не нужна.

Когда запуск прерывается посередине, уже отмеченные строки остаются отмеченными. Следующий запуск продолжает с того места, где остановился предыдущий, что является самым дешевым способом восстановления.

Перед автоматизацией чего-либо

Сначала проверьте вручную пять списков. Используйте бесплатное действие overview для каждого, которое не требует ключа, и сравните то, что вы видите, с тем, что ожидали.

Это поможет рано выявить распространенные сюрпризы: список, указывающий на поддомен, продукт, расположенный по пути на крупном сайте, домен, который перенаправлял прошлой весной. Оценка принадлежит домену, а не продукту.

Решите, как ваша таблица отмечает такие случаи, например, с помощью столбца с пометкой shares domain. Читатели гораздо охотнее прощают сноску, чем оценку, которая выглядит неверно.

Когда пять выглядят разумно, переходите к пакету. В вашем справочнике по полям перечислены столбцы, а в примере стоимости показано, сколько стоит запуск.

Небольшая версия на Python

Требуется пакет requests. Это набросок структуры задачи: сначала распечатайте реальный ответ, затем сопоставьте нужные поля с вашими столбцами.

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)
Бумажные шестерни и конвейеры, сортирующие блоки по группам

Выполнение в Google Sheets или n8n

Sheets может вызывать URL из Apps Script с помощью UrlFetchApp, а в n8n есть узел HTTP Request. Оба делают то же самое, что и скрипт выше.

В n8n поставьте триггер расписания первым, затем узел, который читает вашу таблицу или базу данных, затем шаг разделения элементов, который формирует группы по 2 000, затем HTTP Request. Добавьте финальный узел для записи оценки и даты обратно.

Храните ключ в хранилище учетных данных платформы, а не в тексте рабочего процесса. Рабочие процессы часто делятся, копируются и вставляются на форумах, и ключ, вставленный вместе с ними, — это потраченные деньги.

Без кода или скрипт: какая форма подходит вашей команде

Оба варианта делают один и тот же вызов. Разница в том, кому придется поддерживать поток через год и насколько легко будет объяснить его этому человеку.

Выберите форму, которую вы все еще сможете прочитать после перерыва в несколько месяцев. Умный поток, который никто не понимает, хуже простого скрипта, которому может следовать каждый.

Поток, который вы можете объяснить следующему редактору

Короткий поток n8n с четырьмя помеченными узлами легко передать: триггер, чтение, пакет, запись обратно. Называйте каждый узел по его функции, а не по умолчанию.

Избегайте нагромождения множества ветвей для крайних случаев. Каждая ветвь — это еще одно место, где домен может получить неверную оценку.

Когда скрипт заслуживает своего места

Скрипт имеет смысл, когда входные данные — это папка с CSV-файлами или когда задача требует логики, которую поток обрабатывает неуклюже. Набросок выше подходит для этого случая.

Поместите скрипт в систему контроля версий и храните ключ в переменной окружения. Скрипт, который читает ключ из файла в той же папке, — это утечка, ожидающая общего диска.

Учебные материалы, пропускающие сложную часть

Многие видео показывают поток, который работает с первого раза с тремя строками. Реальные списки содержат пустые значения, дубликаты и странные домены, и именно там поток требует внимания.

Сначала постройте поток на своих пяти тестовых строках. Если учебное пособие не выдерживает этих строк, оно никогда не было полной задачей.

Когда вы передаете поток другому человеку, включите пять тестовых строк в качестве образца. Следующий человек увидит, как выглядит хороший запуск, прежде чем касаться реальных данных.

Что означают ошибки

Поведение API и то, что должен делать синхронизирующий запуск.
СигналЗначениеЧто делает задача
HTTP 401Отсутствует или неверный ключОстановить, оповестить человека
HTTP 402Кредиты закончилисьОстановить, сохранить старые оценки, пополнить
ok равно falseВызов не удалсяЗаписать тело в лог, повторить в следующем запуске
Пустой результат для доменаНе в индексеОставить ячейку пустой
Бумажный садовник, выпрямляющий изогнутый стебель растения в саду

Держите таблицу чистой между запусками

Синхронизирующий запуск не лучше таблицы, в которую он пишет. Несколько привычек предотвращают медленное накопление ошибок между одним запуском и следующим.

Большинство проблем начинается с невинного редактирования: столбец вставлен выше оценки или скопированная строка незаметно меняет домен.

Храните сырые ответы в отдельной вкладке

Сохраняйте каждый сырой ответ в отдельной вкладке или в виде JSON Lines по одному ответу на строку. Эта копия позволяет восстановить видимые столбцы без второго платного вызова.

Вкладка с сырыми данными также отвечает на вопрос, который редактор задает через шесть месяцев: что вернул API в ту дату.

Называйте каждую вкладку с сырыми данными датой пакета, чтобы копии сортировались по порядку, когда вы прокручиваете их назад.

Заблокируйте строку заголовка

Закрепите строку заголовка и никогда не вставляйте столбец выше оценки. Сопоставление, указывающее на столбец F, прочитает неверные данные после вставки, и сделает это без какой-либо ошибки.

Называйте столбцы в сопоставлении по имени, а не по позиции. Имя переживает переупорядочивание, а позиция — нет.

Подсчитайте количество строк до и после

Запишите количество строк в лог до запуска и снова после него. Два числа должны отличаться только на строки, которые вы намеревались добавить, а разрыв говорит о том, что что-то пошло не так.

Отсортируйте таблицу по столбцу оценок раз в месяц и посмотрите на верхние и нижние строки. Странные значения там обычно указывают на домен, который был сопоставлен с неверным списком.

Протестируйте на копии

Дублируйте таблицу и запустите поток против копии, прежде чем касаться реальной. Копия стоит ничего для создания.

Неверное сопоставление, записанное поверх реальных оценок, трудно отменить, потому что старые значения потеряны. Сохраняйте копию, пока первый честный запуск не совпадет с тем, что вы ожидали.

Удалите копию только после того, как второй запланированный запуск совпадет с ней. Два чистых запуска подряд — лучший сигнал, чем один.

Перед первым запуском в продакшене

  • Ключ находится в хранилище учетных данных платформы или в переменной окружения, а не в тексте рабочего процесса.
  • Один бесплатный вызов overview был проверен вручную по списку, который вам известен.
  • Запуск был протестирован на копии таблицы, и копия совпала с тем, что вы ожидали.
  • Задача записывает дату рядом с каждой оценкой, которую она затрагивает.
  • Статусы 401 и 402 останавливают задачу и отправляют сообщение человеку.

Вопросы по синхронизации

Как избежать двойной оплаты, если задача прерывается посередине?

Записывайте дату рядом с каждой оценкой по мере продвижения, и пусть следующий запуск пропускает строки, уже отмеченные в этом месяце. Части по 2 000 означают, что сбой стоит не более одного кредита, поэтому риск крошечный, но привычка держит таблицу в порядке.

Может ли не-программист настроить это?

В основном да. Узел HTTP Request в n8n или Make требует только URL, ключ и список. Самая сложная часть — превратить ответ в столбцы, поэтому сделайте один тестовый вызов и посмотрите на JSON, прежде чем строить сопоставление.