jsonscraper
市场
返回期刊

IG:如何在活动启动前发现公开个人资料问题

通过 API 检查状态、隐私设置和个人资料基本指标,将手动核查账号列表转化为可复现的报告

编辑政策 报告错误

活动启动前,可以用脚本处理 IG 账号列表,并获取一份 JSON 报告,其中包含每个用户名对应的 API 响应。jsonscraper 的 IG Scraper API会返回外部状态和个人资料对象;在观察到的响应结构中,包含用户名、隐私和认证标记、帖子数、粉丝数及关注数。这些字段有助于筛选出需要人工核查的记录,但单凭这些字段无法解释为何没有返回结果,或为何返回结果出乎预期。

文章:IG:如何在活动启动前发现公开个人资料问题
摘要:活动启动前,自动检查 IG 个人资料:通过 jsonscraper 获取数据、保存响应,并整理出需要人工核查的账号列表。
图片角色:封面——核心主题
章节:
视觉主题:编辑风格照片,画面中有一张活动账号核对清单,旁边的手机显示通用的 IG 个人资料剪影、已勾选的认证框和一张小型 JSON 数据卡;没有其他元素
预检查将用户名列表转换为包含 API 响应和可核验字段的记录。© jsonscraper · AI 生成

问题:账号列表看起来没问题,但真的准备好使用了吗?

活动工作表中可能会出现已改名的账号、拼写错误和私密账号。如果团队未经预检查就开始分析列表,工作人员就得逐个打开账号。自动遍历可以减少人工操作,并留下统一日志,记录 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 的记录交由人工核查。

文章:IG:如何在活动启动前发现公开个人资料问题
摘要:活动启动前,自动检查 IG 个人资料:通过 jsonscraper 获取数据、保存响应,并整理出需要人工核查的账号列表。
图片角色:辅助插图 2——展示另一个具体方面
章节:如何解读结果
视觉主题:俄语信息图:用户名列表 → GET IG 个人资料 API → 检查 HTTP 和 JSON → 个人资料对象及 username 等字段
示意图展示了从用户列表到报告的流程,并区分已获取的个人资料数据与技术错误。© jsonscraper · AI 生成插图

http_error、request_error 和 unexpected_or_missing_profile_object 只表示脚本在哪个环节未能获取预期结构。这些结果不能证明账号已删除、已关闭,或因某个具体原因无法访问。请保存响应、核对用户名和密钥,然后重试请求,或联系服务的常规支持渠道。

如果字段缺失,应将其保留为未知,不要将缺失值视为 0 或 false。个人资料计数器反映的是请求时返回的状态。时间戳可帮助区分这次快照与下一次运行的结果。

在自动化的同时保留可观测性

将运行任务安排到调度器中,或加入现有 ETL 流程。保存检查日期、请求的用户名、结果、状态和响应正文。还可以增加一个步骤,将 JSON 导入表格,并只把需要核查的记录发送给工作人员。

若要发现变化,可以按选定字段比较同一个人资料的快照。帖子数变化是打开个人资料并进行核查的理由,但不能据此准确判断帖子发布的日期。粉丝数同样只是请求时的数值,因此历史记录需要通过保存的快照来建立。

处理较长列表时,应设置可控的请求频率、加入有次数限制的重试,并记录错误日志。不要将密钥写入 URL 日志。将输入列表与结果分开保存,有助于确定哪些账号已经处理。

预期结果

最终会生成一个 JSON 文件,其中包含每个指定用户名的处理结果、时间戳、可用属性和已保存的响应。将列表交给活动团队之前,可以筛选出用户名匹配项、私密个人资料,以及需要人工核查的技术问题。后续步骤的标准由团队自行设定。

IG API 文档介绍了路由和参数;产品信息则见于IG Scraper API 页面。建议先从小批量样本开始,检查实际响应结构,并根据自身流程配置报告规则。

人们

尚未列出本文的人员。

继续阅读将 IG 个人资料转化为每日变更清单
阅读下一篇文章

将阅读内容转化为可用的集成

探索 jsonscraper 社交数据 API、测试请求并构建下一个工作流。

查看 API