キャンペーン開始前に、IGアカウントの一覧をスクリプトで処理し、名前ごとのAPI応答を含むJSONレポートを作成できます。jsonscraperのIG Scraper APIは、外部ステータスとプロフィールオブジェクトを返します。確認できるスキーマには、ユーザー名、非公開・認証済みのフラグ、投稿数、フォロワー数、フォロー数が含まれます。これらのフィールドは手動確認が必要なレコードの抽出に役立ちますが、応答がない、または予期しない応答になった理由までは説明しません。

課題:アカウント一覧は正しそうでも、すぐに使えるとは限らない
キャンペーンの作業用シートには、名前を変更したアカウント、入力ミス、非公開プロフィールが含まれていることがあります。事前確認をせずにリストの分析を始めると、担当者がアカウントを一つずつ開かなければなりません。自動処理を行えば手作業を減らし、リクエストした各名前に対してAPIが何を返したかを一貫したログに残せます。
この手順の目的は限定的です。一覧を順に処理して実際のHTTP応答とJSONを保存し、キャンペーンに必要な条件を備えたプロフィールを手動確認の対象として抽出します。レポートが記録するのは観測したデータであり、プロフィールが返されなかった理由やリクエストがエラーになった理由を特定するものではありません。
リクエストで確認する内容
jsonscraperのドキュメントには、GET /v1/user/by/usernameというエンドポイントが記載されています。必須パラメーターはusernameで、キーはlicense_keyとして渡します。任意のcache_timeoutパラメーターでは、指定した秒数のキャッシュを有効にできます。0を指定すると無効のままです。確認できる成功応答のスキーマには、外側のstatusとプロフィールフィールドを含むigオブジェクトがあります。
診断では、次の3点を分けて確認します。HTTPリクエストを実行できたか、解析したJSONにigオブジェクトが含まれているか、そのオブジェクトにどのフィールドがあるかです。いずれかの段階で期待どおりに完了しなかった場合、スクリプトは技術的な結果と元の応答を記録できます。こうした結果は確認が必要であることを示しますが、障害の原因を特定するものではありません。
入力データとキーを準備する
usernames.txtを作成し、各行に@を付けずにユーザー名を1つずつ記入します。空行と重複を除き、キャンペーンに関係するアカウントだけを残します。結果を後から比較できるよう、確認日とプロジェクトIDは別に保存してください。
キーはソースコードやリポジトリに書かず、環境変数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は、スクリプトが期待した構造を取得できなかった段階だけを示します。アカウントが削除された、非公開になった、あるいは特定の理由でアクセスできないことを証明するものではありません。応答を保存し、ユーザー名とキーを確認してから、リクエストを再試行するか、通常のサポート窓口に問い合わせてください。
フィールドがない場合は不明のままにし、0やfalseとして扱わないでください。プロフィールのカウンターが示すのは、リクエスト時点で返された状態です。タイムスタンプがあれば、次回の実行結果と区別できます。
観測可能性を保ちながら自動化する
実行をタスクスケジューラーまたは既存のETLプロセスのステップに組み込みます。確認日、リクエストしたユーザー名、結果、ステータス、応答本文を保存してください。別のステップでJSONを表に取り込み、確認が必要なレコードだけを担当者に送ることもできます。
変更を検出するには、選択したフィールドについて同じプロフィールのスナップショットを比較します。投稿数の変化はプロフィールを開いて確認するきっかけにはなりますが、投稿が公開された正確な日時を示すものではありません。フォロワー数もリクエスト時点の値なので、保存したスナップショットから推移を把握します。
一覧が大きい場合は、リクエスト頻度を管理し、上限付きの再試行を追加して、エラーログを記録してください。URLを含むログにキーを出力しないでください。入力一覧と結果を分けて保存すると、どのアカウントを処理済みか把握しやすくなります。
期待される結果
出力されるJSONファイルには、指定した各ユーザー名の処理結果、タイムスタンプ、取得可能な属性、保存した応答が含まれます。アカウント一覧をキャンペーンに渡す前に、名前が一致したもの、非公開プロフィール、技術的な問題があったものを抽出し、手動確認に回せます。次のステップの基準はチームが決めます。
エンドポイントとパラメーターはIG APIのドキュメントに、製品情報はIG Scraper APIのページに記載されています。まず少数のアカウントで始め、実際の応答形式を確認し、自分たちの業務プロセスに合わせてレポートのルールを設定してください。