jsonscraper
שווקים
חזרה ליומן

בדקו את פרופיל IG מול בריף הקמפיין לפני ההשקה: אימות באמצעות API

סקריפט Python בודק את שם המשתמש, את הגדרות הפרטיות, את סטטוס האימות ואת המונים, ואז מסמן פערים לבדיקה ידנית.

מדיניות עריכה דיווח על שגיאה

לפני השקת קמפיין אפשר להשוות אוטומטית רשימת חשבונות IG לבריף ולהפיק CSV עם הרשומות שדורשות תשומת לב בלבד. עבור כל שורה הסקריפט יבקש נתוני פרופיל, ישווה את שם המשתמש, את הגדרות הפרטיות ואת סטטוס האימות לערכים הצפויים, וישמור גם את המונים הזמינים. כך הופכת בדיקה ידנית שחוזרת על עצמה לשלב בקרה ברור לפני העברת הקמפיין לביצוע.

המשימה: לזהות פערים לפני הפרסום

בטבלת קמפיין מופיעים בדרך כלל שם החשבון וכמה ציפיות: הפרופיל צריך להיות ציבורי, שם המשתמש צריך להתאים לשם שאושר, וסימון האימות צריך להתאים לרישום שבבריף. בין הכנת הרשימה להשקה, חשבון עשוי לשנות את שמו, להפוך לפרטי או להתגלות כפרופיל אחר בעל שם דומה. כשבודקים את השורות ידנית, קשה לשחזר את התהליך ולבודד במהירות חריגים.

מאמר: בדקו את פרופיל IG מול בריף הקמפיין לפני ההשקה: אימות באמצעות API
תקציר: לפני השקת הקמפיין, בדקו אוטומטית את פרופילי IG שבבריף: שלפו נתונים דרך endpoint מתועד של jsonscraper, השוו אותם לערכים הצפויים ושמרו רשימה ברורה של חריגים.
תפקיד התמונה: תמונת שער — הרעיון המרכזי
מקטע: המשימה: לזהות פערים לפני הפרסום
נושא חזותי: טבע דומם עריכתי: דף תכנון קמפיין ובו כמה פרופילי IG שונים
בדיקה מקדימה משווה את הפרופיל לפרמטרים הצפויים בבריף ומבליטה שורות להערכה ידנית.© jsonscraper · נוצר בעזרת AI

לצורך אבחון מקדים כזה, די לקבל פרופיל לפי שם משתמש. בתיעוד שפורסם של jsonscraper מצוין הנתיב GET /v1/user/by/username עם הפרמטר username; יש גם פרמטר אופציונלי בשם cache_timeout. התשובה עשויה לכלול שם משתמש, שם מלא, סימוני private ו-verified, מספר פוסטים, עוקבים ונעקבים, וכן ביוגרפיה. יש לקרוא את השדות מהתשובה בפועל: תמונת מצב של הסכמה מאשרת שהם הופיעו בתשובה שנצפתה, אך הערכים עשויים להשתנות או לא להופיע.

הכינו טבלה וכללי בדיקה

צרו קובץ CSV בשם profiles.csv עם העמודות username, expected_private ו-expected_verified. בשתי העמודות האחרונות הזינו את הערכים הצפויים true או false, ואת שם המשתמש כתבו בלי התו @. אם הציפייה לגבי פרופיל מסוים אינה ידועה, השאירו את התא ריק: הסקריפט לא אמור להתייחס להיעדר ציפייה כשגיאה.

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

כאן הבדיקה מטפלת בשתי משימות ממוקדות: היא קובעת אם שם המשתמש שהתקבל תואם לזה שהתבקש, ומזהה הבדלים מהציפיות המתועדות לגבי פרטיות ואימות. המונים והביוגרפיה נשמרים לצורך הקשר והערכה ידנית, ולא נחשבים הוכחה לאיכות הקהל או להתאמת היוצר לקמפיין.

התחברו ל-IG Scraper API

שמרו את מפתח הגישה במשתנה הסביבה JSONSCRAPER_INSTAGRAM_LICENSE_KEY. אל תכתבו את הסוד בקובץ CSV, בקוד המקור או ביומני הרצה. התיעוד הרשמי של endpoint IG מתאר את הנתיב ואת שמות הפרמטרים; כתובת הבסיס של ה-API היא https://ig.jsonscraper.com, ושם הפרמטר למפתח הוא license_key.

לפני עיבוד הרשימה המלאה, בצעו קריאת ניסיון אחת עבור שורת בדיקה, בדקו את מבנה ה-JSON וודאו שלחשבון שלכם יש גישה. מאחר שה-endpoint מקבל שם משתמש, אין צורך במזהה פרופיל ידוע או בנתיבים נוספים עבור התרחיש הפשוט הזה.

דוגמה: בקשות, השוואה ו-CSV של חריגים

הסקריפט הבא תואם ל-Python 3.8 ומעלה. הוא קורא קובץ CSV, מבצע בקשת GET אחת לכל פרופיל, בודק את סטטוס התגובה החיצוני ושומר את השדות הרלוונטיים המקוריים לצד תוצאת ההשוואה. התקינו את התלות באמצעות הפקודה python -m pip install requests, ואז הגדירו את המפתח לפני ההרצה.

מאמר: בדקו את פרופיל IG מול בריף הקמפיין לפני ההשקה: אימות באמצעות API
תקציר: לפני השקת הקמפיין, בדקו אוטומטית את פרופילי IG שבבריף: שלפו נתונים דרך endpoint מתועד של jsonscraper, השוו אותם לערכים הצפויים ושמרו רשימה ברורה של חריגים.
תפקיד התמונה: איור תומך 2 — היבט מסוים ושונה
מקטע: דוגמה: בקשות, השוואה ו-CSV של חריגים
נושא חזותי: אינפוגרפיקה ברוסית המציגה זרימת נתונים מאומתת
התרשים מציג את המסלול מ-CSV דרך endpoint הפרופיל ועד לתוצאות ההשוואה: התאמה, בדיקה ידנית או שגיאה.© 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):
    # The documented observed response wraps profile fields in "ig".
    if payload.get("status") != "ok":
        raise ValueError("API response status is not ok")
    profile = payload.get("ig")
    if not isinstance(profile, dict):
        raise ValueError("Response has no profile object under '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 is empty",
        })
        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),
        })

    # A small delay spaces requests; it is not a documented quota guarantee.
    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("Saved", len(results), "rows to", OUTPUT_FILE)

הקוד בודק את מעטפת התשובה שנצפתה: status חיצוני ואובייקט הפרופיל ig. אם הספק ישנה את הפורמט, בדיקת המבנה תעצור את העיבוד של הרשומה הספציפית ותשמור שגיאה, במקום ליצור בשקט התאמה שגויה. הסקריפט לא מדפיס את המפתח ולא מוסיף אותו לקובץ התוצאה.

איך לקרוא את התוצאה

בקובץ preflight_results.csv, שורות עם הסטטוס matched עברו את ההשוואות שהוגדרו. הערך review פירושו שפרמטר אחד או יותר שונים מהבריף; העמודה checks מציינת אילו מהם. שגיאת בקשה או תשובה מסומנת בנפרד, כך שזמינות נתונים אינה נראית כהתאמה מאושרת.

מספר העוקבים והפוסטים עוזר לאדם לראות תמונת מצב עדכנית של הפרופיל לצד הבקשה. אלה ערכים רגעיים מהתשובה לבקשה. כדי להעריך שינויים לאורך זמן, שמרו הרצות נפרדות עם תאריך; בדיקה יחידה אינה כוללת היסטוריה. שדות עשויים להיות ריקים, ובמקרה כזה הרשומה עדיין מתאימה לבדיקת זהות ולבדיקת מאפיינים זמינים אחרים, אך לא להשוואה של מונה חסר.

אוטומציה לפני השקת הקמפיין

לאחר בדיקה ידנית של קובץ CSV לניסיון, הוסיפו את הסקריפט ללוח זמנים או לשלב ההכנה של הקמפיין. כדי לאפשר בקרה שניתנת לשחזור, שמרו את הרשימה המקורית בנפרד, תעדו את תאריך ההרצה ושמרו את קובץ ה-CSV של התוצאות באחסון עבודה מוגן. לעיבוד חוזר, כדאי להשתמש במזהה שורה יציב מהמערכת שלכם, אם שם המשתמש עשוי להשתנות.

כשהרשימה גדלה, הוסיפו הגבלת מקביליות, ניסיונות חוזרים רק עבור שגיאות רשת זמניות ויומן נפרד של קודי שגיאה ללא סודות. אל תבצעו ניסיונות חוזרים ללא הגבלה במקרה של מפתח שגוי או שם משתמש לא תקין. אפשר להוסיף את הערך cache_timeout רק בהתאם למדיניות העדכניות הנדרשת: לפי התיעוד, שמירה במטמון עבור IG מושבתת כברירת מחדל, וערך גדול מאפס מפעיל שמירה במטמון למשך פרק הזמן שנקבע.

בדיקת הפרופילים מצמצמת את ההשוואה הידנית לרשימה ממוקדת של חריגים: שם, פרטיות, אימות והמונים זמינים מופיעים בטבלה אחת לפני תחילת הקמפיין. לפרמטרים של ה-API ולאפשרויות האינטגרציה העדכניות, עיינו בדף IG Scraper API ובתיעוד הנתיבים.

אֲנָשִׁים

עדיין לא רשומים אנשים עבור מאמר זה.

המשיכו לקרואIG: זיהוי בעיות בפרופילים ציבוריים לפני השקת קמפיין
קרא את המאמר הבא

הפכו את מה שקראתם לאינטגרציה עובדת

גלו את ממשקי ה-API לנתונים חברתיים של jsonscraper, בדקו בקשות ובנו את תהליך העבודה הבא.

גלה API