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

问题:账号列表看起来没问题,但真的准备好使用了吗?
活动工作表中可能会出现已改名的账号、拼写错误和私密账号。如果团队未经预检查就开始分析列表,工作人员就得逐个打开账号。自动遍历可以减少人工操作,并留下统一日志,记录 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 只表示脚本在哪个环节未能获取预期结构。这些结果不能证明账号已删除、已关闭,或因某个具体原因无法访问。请保存响应、核对用户名和密钥,然后重试请求,或联系服务的常规支持渠道。
如果字段缺失,应将其保留为未知,不要将缺失值视为 0 或 false。个人资料计数器反映的是请求时返回的状态。时间戳可帮助区分这次快照与下一次运行的结果。
在自动化的同时保留可观测性
将运行任务安排到调度器中,或加入现有 ETL 流程。保存检查日期、请求的用户名、结果、状态和响应正文。还可以增加一个步骤,将 JSON 导入表格,并只把需要核查的记录发送给工作人员。
若要发现变化,可以按选定字段比较同一个人资料的快照。帖子数变化是打开个人资料并进行核查的理由,但不能据此准确判断帖子发布的日期。粉丝数同样只是请求时的数值,因此历史记录需要通过保存的快照来建立。
处理较长列表时,应设置可控的请求频率、加入有次数限制的重试,并记录错误日志。不要将密钥写入 URL 日志。将输入列表与结果分开保存,有助于确定哪些账号已经处理。
预期结果
最终会生成一个 JSON 文件,其中包含每个指定用户名的处理结果、时间戳、可用属性和已保存的响应。将列表交给活动团队之前,可以筛选出用户名匹配项、私密个人资料,以及需要人工核查的技术问题。后续步骤的标准由团队自行设定。
IG API 文档介绍了路由和参数;产品信息则见于IG Scraper API 页面。建议先从小批量样本开始,检查实际响应结构,并根据自身流程配置报告规则。