jsonscraper
시장
저널로 돌아가기

캠페인 시작 전 IG 프로필을 브리프와 대조하세요: API 검증

Python 스크립트가 사용자 이름, 공개 여부, 인증 상태와 카운터를 확인한 뒤 불일치 항목을 수동 검토 대상으로 표시합니다.

편집 정책 오류 제보

캠페인 시작 전에 IG 계정 목록을 브리프와 자동으로 대조하고, 주의가 필요한 항목만 CSV로 추릴 수 있습니다. 스크립트는 각 행의 프로필을 요청해 사용자 이름, 비공개 여부, 인증 상태를 예상값과 비교하고, 확인 가능한 카운터도 저장합니다. 이렇게 하면 반복적인 수동 확인을 캠페인 인계 전의 명확한 점검 단계로 바꿀 수 있습니다.

목표: 게시 전에 불일치 찾기

캠페인 표에는 보통 계정 이름과 몇 가지 조건이 들어 있습니다. 프로필은 공개 상태여야 하고, 사용자 이름은 합의된 이름과 일치해야 하며, 인증 배지도 브리프의 기록과 같아야 합니다. 목록을 작성한 뒤 캠페인을 시작하기 전까지 계정 이름이 바뀌거나 비공개로 전환될 수 있고, 비슷한 이름의 다른 프로필일 수도 있습니다. 행을 수동으로 확인하면 절차를 재현하기 어렵고 예외 항목을 빠르게 찾아내기도 힘듭니다.

캠페인 시작 전 IG 프로필을 브리프와 대조하세요: API 검증
요약: 캠페인 시작 전에 브리프에 있는 IG 프로필을 자동으로 확인하세요. 문서화된 jsonscraper 엔드포인트에서 정보를 가져와 예상값과 비교하고, 검토가 필요한 항목을 명확히 정리해 저장합니다.
이미지 역할: 표지 — 핵심 아이디어
섹션: 목표: 게시 전에 불일치 찾기
시각적 주제: 캠페인 계획표와 서로 다른 IG 프로필 여러 개를 배치한 편집 스타일 정물화
사전 점검은 프로필을 브리프의 예상 조건과 대조하고, 수동 평가가 필요한 행을 추립니다.© jsonscraper · AI 생성

이런 사전 진단에는 사용자 이름으로 프로필 정보를 가져오는 것만으로 충분합니다. jsonscraper의 IG 엔드포인트 문서에는 GET /v1/user/by/username 경로와 username 매개변수가 명시되어 있으며, cache_timeout도 선택적으로 사용할 수 있습니다. 응답에는 사용자 이름, 전체 이름, private 및 verified 여부, 게시물·팔로워·팔로잉 수, 자기소개가 포함될 수 있습니다. 구체적인 필드는 실제 응답을 확인해야 합니다. 스키마 스냅샷은 관찰 당시 해당 필드가 있었음을 보여줄 뿐, 값이 달라지거나 누락될 수 있습니다.

표와 점검 규칙 준비하기

username, expected_private, expected_verified 열이 있는 profiles.csv 파일을 만드세요. 두 예상값 열에는 true 또는 false를 입력하고, 사용자 이름에는 @ 기호를 붙이지 않습니다. 특정 프로필에 대한 예상값을 모르면 해당 셀을 비워 두세요. 스크립트는 예상값이 없다는 이유만으로 오류로 처리하지 않아야 합니다.

username,expected_private,expected_verified
examplebrand,false,true
anotheraccount,false,false

여기서 점검하는 것은 두 가지입니다. 가져온 사용자 이름이 요청한 이름과 일치하는지, 그리고 비공개 여부와 인증 상태가 기록된 예상값과 다른지 확인합니다. 카운터와 자기소개는 맥락과 수동 평가를 위해 저장하며, 이를 오디언스의 품질이나 크리에이터의 캠페인 적합성을 입증하는 자료로 해석하지 않습니다.

IG Scraper API 연결하기

접근 키를 JSONSCRAPER_INSTAGRAM_LICENSE_KEY 환경 변수에 저장하세요. 비밀 키를 CSV, 소스 코드 또는 실행 로그에 기록하지 마세요. 기본 API 주소는 https://ig.jsonscraper.com이며, 키 매개변수의 이름은 license_key입니다.

전체 목록을 처리하기 전에 테스트 행 하나로 요청을 보내 JSON 구조를 확인하고 계정에 접근 권한이 있는지 확인하세요. 엔드포인트는 사용자 이름을 받으므로, 이 간단한 시나리오에는 알려진 프로필 식별자나 추가 경로가 필요하지 않습니다.

예시: 요청, 비교, 예외 CSV 만들기

다음 스크립트는 Python 3.8 이상과 호환됩니다. CSV를 읽고 프로필마다 GET 요청을 한 번씩 보내며, 응답의 외부 상태를 확인한 뒤 주요 원본 필드와 비교 결과를 저장합니다. python -m pip install requests 명령으로 의존성을 설치한 다음 실행 전에 키를 내보내세요.

캠페인 시작 전 IG 프로필을 브리프와 대조하세요: API 검증
요약: 캠페인 시작 전에 브리프에 있는 IG 프로필을 자동으로 확인하세요. 문서화된 jsonscraper 엔드포인트에서 정보를 가져와 예상값과 비교하고, 검토가 필요한 항목을 명확히 정리해 저장합니다.
이미지 역할: 보조 일러스트 2 — 다른 구체적 측면
섹션: 예시: 요청, 비교, 예외 CSV 만들기
시각적 주제: 확인된 데이터 흐름을 보여주는 러시아어 인포그래픽
CSV에서 프로필 엔드포인트를 거쳐 비교 결과인 일치, 수동 검토 또는 오류로 이어지는 흐름을 보여줍니다.© jsonscraper · AI 생성 일러스트
import csv
import os
import time
from pathlib import Path

import requests

BASE_URL = "https://ig.jsonscraper.com/v1/user/by/username"
API_KEY = os.environ["JSONSCRAPER_INSTAGRAM_LICENSE_KEY"]
INPUT_FILE = Path("profiles.csv")
OUTPUT_FILE = Path("preflight_results.csv")


def parse_expected(value):
    value = (value or "").strip().lower()
    if value == "true":
        return True
    if value == "false":
        return False
    return None


def profile_from_response(payload):
    # 문서에 설명된 관찰 응답에서는 프로필 필드가 "ig" 안에 들어 있습니다.
    if payload.get("status") != "ok":
        raise ValueError("API 응답 상태가 ok가 아닙니다")
    profile = payload.get("ig")
    if not isinstance(profile, dict):
        raise ValueError("응답에 'ig' 아래의 프로필 객체가 없습니다")
    return profile


with INPUT_FILE.open(newline="", encoding="utf-8") as source:
    rows = list(csv.DictReader(source))

results = []
for row in rows:
    requested = (row.get("username") or "").strip().lstrip("@")
    if not requested:
        results.append({
            "requested_username": "",
            "result": "missing_username",
            "error": "username이 비어 있습니다",
        })
        continue

    try:
        response = requests.get(
            BASE_URL,
            params={"username": requested, "license_key": API_KEY},
            timeout=30,
        )
        response.raise_for_status()
        profile = profile_from_response(response.json())

        actual_username = profile.get("username")
        actual_private = profile.get("is_private")
        actual_verified = profile.get("is_verified")
        expected_private = parse_expected(row.get("expected_private"))
        expected_verified = parse_expected(row.get("expected_verified"))

        checks = []
        if actual_username and actual_username.casefold() != requested.casefold():
            checks.append("username_mismatch")
        if expected_private is not None and actual_private != expected_private:
            checks.append("privacy_mismatch")
        if expected_verified is not None and actual_verified != expected_verified:
            checks.append("verification_mismatch")

        results.append({
            "requested_username": requested,
            "username": actual_username,
            "full_name": profile.get("full_name"),
            "is_private": actual_private,
            "is_verified": actual_verified,
            "media_count": profile.get("media_count"),
            "follower_count": profile.get("follower_count"),
            "following_count": profile.get("following_count"),
            "result": "review" if checks else "matched",
            "checks": ";".join(checks),
            "error": "",
        })
    except (requests.RequestException, ValueError, KeyError) as exc:
        results.append({
            "requested_username": requested,
            "result": "request_or_response_error",
            "error": str(exc),
        })

    # 짧은 지연을 두어 요청 간격을 띄웁니다. 문서화된 할당량 보장은 아닙니다.
    time.sleep(0.5)

fieldnames = sorted({key for item in results for key in item})
with OUTPUT_FILE.open("w", newline="", encoding="utf-8") as destination:
    writer = csv.DictWriter(destination, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(results)

print("저장 완료:", len(results), "개 행 →", OUTPUT_FILE)

코드는 관찰된 응답 래퍼인 외부 status와 프로필 객체 ig를 확인합니다. 공급자가 형식을 바꾸면 구조 검사가 해당 레코드의 처리를 중단하고 오류를 저장하므로, 잘못된 일치 결과를 조용히 만들지 않습니다. 스크립트는 키를 출력하거나 결과 파일에 넣지 않습니다.

결과 읽는 법

preflight_results.csv에서 matched 상태인 행은 설정된 비교 항목을 통과했습니다. review는 하나 이상의 항목이 브리프와 다르다는 뜻이며, checks 열에서 구체적인 항목을 확인할 수 있습니다. 요청 또는 응답 오류는 별도로 표시되므로, 데이터에 접근할 수 없는 상황이 확인된 일치 결과처럼 보이지 않습니다.

팔로워 수와 게시물 수를 보면 요청 시점의 프로필 정보를 신청 내용과 함께 확인할 수 있습니다. 이는 응답에 담긴 특정 시점의 값입니다. 시간에 따른 변화를 평가하려면 날짜가 포함된 실행 결과를 별도로 저장하세요. 한 번의 점검에는 이력이 없습니다. 필드가 비어 있을 수 있으며, 이 경우 신원 및 다른 확인 가능한 특성을 점검할 수는 있지만 누락된 카운터를 비교할 수는 없습니다.

캠페인 시작 전 자동화하기

테스트 CSV를 수동으로 확인한 뒤 스크립트를 일정 작업이나 캠페인 준비 단계에 추가하세요. 점검을 재현할 수 있도록 원본 목록을 따로 보관하고, 실행 날짜를 기록하며, 결과 CSV를 접근이 제한된 작업 저장소에 보관합니다. 사용자 이름이 바뀔 수 있다면 시스템에서 제공하는 안정적인 행 식별자를 사용하는 것이 편리합니다.

목록이 커지면 동시 실행 제한, 일시적인 네트워크 오류에 한정한 재시도, 비밀 정보를 제외한 별도의 오류 코드 로그를 추가하세요. 잘못된 키나 올바르지 않은 사용자 이름에 대해 무한히 재시도하지 마세요. cache_timeout은 필요한 최신성 정책에 맞춰서만 추가하세요. 문서에 따르면 IG은 기본적으로 캐싱이 꺼져 있으며, 0보다 큰 값을 지정하면 해당 기간 동안 캐싱이 활성화됩니다.

프로필 점검은 수동 대조를 예외 목록 확인으로 줄여 줍니다. 이름, 공개 여부, 인증 상태와 확인 가능한 카운터를 캠페인 시작 전에 한 표에서 볼 수 있습니다. API 매개변수와 최신 통합 방법은 IG Scraper API 페이지와 엔드포인트 문서를 참조하세요.

사람들

아직 이 기사에 등록된 사람이 없습니다.

계속 읽으세요IG: 캠페인 시작 전 공개 프로필 오류 확인하기
다음 기사 읽기

읽은 내용을 실제 연동으로 구현하세요

jsonscraper 소셜 데이터 API를 살펴보고 요청을 테스트하여 다음 워크플로를 구축하세요.

API 둘러보기