Перед запуском кампании можно обработать список IG-аккаунтов скриптом и получить JSON-отчёт с ответом API для каждого имени. Маршрут IG Scraper API jsonscraper возвращает внешний статус и объект профиля; в наблюдаемой схеме есть имя пользователя, признаки приватности и верификации, число публикаций, подписчиков и подписок. Эти поля помогают отобрать записи для ручной проверки, но сами по себе не объясняют причину отсутствующего или неожиданного ответа.

Проблема: список аккаунтов выглядит корректно, но готов ли он к работе?
В рабочей таблице кампании могут оказаться переименованные аккаунты, опечатки и закрытые профили. Если команда начинает анализировать список без предварительной проверки, человеку приходится открывать аккаунты по одному. Автоматический проход уменьшает ручную работу и оставляет единый журнал того, что именно вернул API для каждого запрошенного имени.
Цель этого сценария ограничена: пройти по списку, сохранить фактические HTTP-ответы и JSON, а профили с нужными для кампании признаками вынести на ручную проверку. Отчёт фиксирует данные наблюдения; он не определяет, почему профиль не вернулся или почему запрос завершился ошибкой.
Что проверяет запрос
В документации jsonscraper указан маршрут GET /v1/user/by/username. Обязательный параметр — username; ключ передаётся как license_key. Необязательный параметр cache_timeout включает кэширование на заданное число секунд, а 0 оставляет его выключенным. Наблюдаемая схема успешного ответа содержит внешний status и объект ig с полями профиля.
Для диагностики разделяйте три факта: удалось ли выполнить HTTP-запрос; содержит ли разобранный JSON объект ig; какие поля присутствуют в этом объекте. Если любой этап не завершился ожидаемым образом, скрипт может записать технический результат и исходный ответ. Такой результат указывает на необходимость проверки, но не устанавливает причину сбоя.
Подготовьте входные данные и ключ
Создайте файл usernames.txt, по одному имени пользователя без символа @ на строку. Уберите пустые строки и дубликаты, оставив только аккаунты, относящиеся к кампании. Для последующего сравнения результатов храните отдельно дату проверки и идентификатор проекта.
Ключ храните в переменной окружения JSONSCRAPER_INSTAGRAM_LICENSE_KEY, а не в исходном коде или репозитории:
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="ваш_ключ"
python3 check_profiles.py
Пример использует стандартную библиотеку Python 3.8+ и не требует установки HTTP-пакетов.
Пример: запросить профили и записать отчёт
Скрипт обходит список по одному имени. При успешном JSON-ответе он сохраняет фактическое тело и доступные поля профиля; при HTTP- или сетевой ошибке записывает её как технический исход. Отсутствующие поля остаются null, а сырое тело ответа сохраняется, если его удалось прочитать.
import json
import os
import time
from datetime import datetime, timezone
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
API_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
if not API_KEY:
raise SystemExit("Задайте JSONSCRAPER_INSTAGRAM_LICENSE_KEY")
BASE_URL = "https://ig.jsonscraper.com/v1/user/by/username"
with open("usernames.txt", encoding="utf-8") as f:
usernames = list(dict.fromkeys(
line.strip().lstrip("@") for line in f if line.strip()
))
results = []
for username in usernames:
params = urlencode({"username": username, "license_key": API_KEY})
request = Request(f"{BASE_URL}?{params}", method="GET")
checked_at = datetime.now(timezone.utc).isoformat()
try:
with urlopen(request, timeout=30) as response:
http_status = response.status
raw_body = response.read().decode("utf-8")
try:
payload = json.loads(raw_body)
json_error = None
except json.JSONDecodeError as exc:
payload = None
json_error = str(exc)
profile = payload.get("ig") if isinstance(payload, dict) else None
record = {
"requested_username": username,
"checked_at": checked_at,
"http_status": http_status,
"api_status": payload.get("status") if isinstance(payload, dict) else None,
"check_result": "profile_returned" if isinstance(profile, dict) else "unexpected_or_missing_profile_object",
"response": payload if payload is not None else raw_body,
}
if json_error:
record["json_error"] = json_error
if isinstance(profile, dict):
record["returned_username"] = profile.get("username")
record["is_private"] = profile.get("is_private")
record["is_verified"] = profile.get("is_verified")
record["media_count"] = profile.get("media_count")
record["follower_count"] = profile.get("follower_count")
record["following_count"] = profile.get("following_count")
results.append(record)
except HTTPError as exc:
body = exc.read().decode("utf-8", errors="replace")
results.append({
"requested_username": username,
"checked_at": checked_at,
"check_result": "http_error",
"http_status": exc.code,
"response": body,
})
except (URLError, TimeoutError) as exc:
results.append({
"requested_username": username,
"checked_at": checked_at,
"check_result": "request_error",
"detail": str(exc),
})
time.sleep(0.5)
with open("profile-check.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"Сохранено результатов: {len(results)}")
Это пример интеграции, а не сообщение о проведённом тесте. Ключ передаётся в параметре license_key, но не печатается. Полный ответ может содержать сведения, доступ к которым следует ограничить согласно правилам хранения данных вашей команды.
Как читать результат
Запись profile_returned означает, что скрипт получил JSON-объект ig. Сверьте requested_username с returned_username и просмотрите признаки, важные для процесса кампании. Например, is_private: true можно отправить на ручную проверку, если кампания требует публичный профиль.

Результаты http_error, request_error и unexpected_or_missing_profile_object обозначают только этап, на котором скрипт не получил ожидаемую структуру. Они не доказывают, что аккаунт удалён, закрыт или недоступен по конкретной причине. Сохраните ответ, проверьте имя и ключ, а затем повторите запрос либо обратитесь к штатной поддержке сервиса.
Если поле отсутствует, оставьте его неизвестным — не трактуйте отсутствие как ноль или false. Счётчики профиля описывают состояние, возвращённое в момент запроса. Временная отметка позволяет отличить этот снимок от результатов следующего запуска.
Автоматизация без потери наблюдаемости
Перенесите запуск в планировщик задач или этап существующего ETL-процесса. Храните дату проверки, запрошенное имя, результат, статус и тело ответа. Отдельным шагом можно загрузить JSON в таблицу и отправлять специалисту только записи, требующие проверки.
Для обнаружения изменений сравнивайте снимки одного профиля по выбранным полям. Изменение числа публикаций — повод открыть профиль и проверить его, а не точная дата появления публикации. Счётчик подписчиков также является значением на момент запроса, поэтому история наблюдений строится из сохранённых снимков.
При большом списке задайте контролируемый темп, добавьте повторные попытки с ограничением и ведите журнал ошибок. Не включайте ключ в логи URL. Раздельное хранение входного списка и результатов помогает определить, какие аккаунты уже обработаны.
Ожидаемый результат
На выходе получается JSON-файл с результатом обработки каждого заданного имени, временной отметкой, доступными атрибутами и сохранённым ответом. Перед передачей списка в кампанию можно отфильтровать совпавшие имена, закрытые профили и технические случаи для ручной проверки. Критерии следующего шага задаёт сама команда.
Маршрут и параметры описаны в документации IG API; сведения о продукте приведены на странице IG Scraper API. Начните с небольшой выборки, проверьте фактическую форму ответов и настройте правила отчёта под свой процесс.