Перед запуском кампанії можна обробити список акаунтів 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. Почніть із невеликої вибірки, перевірте фактичну форму відповідей і налаштуйте правила звітування відповідно до свого процесу.