用途
该技能用于通过 Frevana 的 instagram/profile 接口,按 Instagram 用户名(handle)获取个人资料数据。同系列的 instagram-profile 技能使用另一套 API,需要 profile_id 而非 handle,二者不可混用。
主要能力
- 输入 required 的
handle(不带 @ 的用户名,例如 instagram)。 trim(true/false):为 true 时跳过近期帖子,速度更快且价格相同,但author.last_post_at与computed.engagement_rate为 null。async(true/false/1/0):转为后台任务;JSON 输入接受布尔值、整数 0/1、字符串 "true"/"false"/"1"/"0"。contact_email(可选字面字符串 "1"):当能从多个 bio 邮箱中逐字、可信地选出个人联系邮箱时,补充author.ext.contact_email,否则为 null;public_email不受影响,不额外计费。- 未知属性与错误类型会在网络请求前被拒绝。不支持 include、limit、cursor、since、until 等未声明字段,也不提供频道补全或分页控制。
使用方式
需要 Bash 与 Python 3.9+(macOS/Linux),并在运行环境中提供 FREVANA_TOKEN。请求使用 Authorization: Bearer <FREVANA_TOKEN>;不要把凭证写入文件、命令行参数、日志或返回元数据。仅需 Frevana 认证,无需扩展或守护进程。
# FREVANA_TOKEN must already be configured in the runtime environment.
bash <skill-path>/scripts/instagram_profile.sh run \
--handle instagram --trim true \
--state-file ./out/instagram-operation.json
# Resume after interruption/timeout.
bash <skill-path>/scripts/instagram_profile.sh resume \
--state-file ./out/instagram-operation.json
# Resume an already-known task even when no local state exists; never POSTs.
bash <skill-path>/scripts/instagram_profile.sh resume \
--task-id TASK_ID --state-file ./out/recovered-operation.json
也可用 --input-file PATH 传入输入对象,但不能与输入参数混用。每次逻辑操作应选定一个持久的 --state-file 路径并在所有重试中复用;助手会生成一个 client_task_id,并在发送前原子化持久化完整原始 POST 载荷。已有状态会被复用,变更输入、客户端 ID 或 API 源会被拒绝。run --task-id TASK_ID 同样用于恢复而非重新提交。包含已完成结果的状态会直接返回缓存结果。FAILED 与 REVIEW_REQUIRED 会立即停止,应检查任务元数据而非自动替换操作。保存的 HTTP 409 会停止自动重放。
API 基础地址默认为 https://api.frevana.com,可通过 FREVANA_API_BASE_URL 或 --api-base-url 选择 HTTP localhost mock 或 HTTPS 源;重定向会被拒绝。运行选项包括 --timeout(总预算,默认 120 秒)、--request-timeout(每请求,默认 30 秒)、--retries(额外瞬时重试,默认 2)与 --output(同时保存 stdout JSON)。固定 wrapper 的 response_mode 为 "json"。
任务行为与输出
向 Frevana 任务创建 API POST,仅包含 endpoint_id、client_task_id、input、response_mode。HTTP 200 + READY + 内联数据可立即完成(包括 null 或空数据),无需状态/结果请求。HTTP 202 会持久化任务 ID 并按 next_poll_after_ms 轮询状态;状态响应只提供进度,即使含数据也不能作为完成依据。READY 会触发 GET 结果,仅有 READY 结果才可完成操作。瞬时网络失败与 HTTP 429/500/502/503/504 会使用相同 POST 字节与客户端 ID 进行有界重试;请求超时立即交回控制权。
总/请求超时返回 outcome="timeout" 与可恢复元数据,超时不会取消后端工作,应保留状态文件并重跑 resume。标准输出为 JSON 对象,包含 outcome、endpoint_id、未修改的结构化数据/分页(若有)、task_id、client_task_id、status、error_code、server_error_code、error_source、http_status、next_poll_after_ms、state_file、resumable、request_payload 与最新原生 api_response。凭证不会出现在状态/输出中,若被服务器回显也会被遮盖。
本地文件错误单独记录在 client_errors:OUTPUT_SAVE_FAILED 会保留任务结果、数据与恢复元数据;初始状态保存失败则不发送 API 请求;后续检查点失败会停止后续请求并返回 STATE_SAVE_FAILED 与已知任务元数据。
退出码:0 完成,2 输入/运行时配置无效,3 超时/待处理,4 任务/HTTP/传输/协议失败,5 状态无效或本地状态/输出持久化失败。非零退出码不代表可以新建任务。
适用场景与限制
适用于需要按用户名获取 Instagram 资料、且希望具备幂等提交、断点续跑、超时恢复与后台任务能力的场景。限制包括:仅支持上述输入字段,不提供分页、频道补全或未声明字段;需要有效 FREVANA_TOKEN;必须妥善使用状态文件并在中断后恢复;不承诺超出输入描述的 profile 字段可用性;不要自动启用补全或抓取额外页面。
离线验证
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover \
-s skills/instagram-profile-details/tests -v
测试使用 mock 传输,不访问网络或付费 API。