jsonscraper
市场
返回期刊

如何在导入 CRM 前核验 TikTok 线索的 IG 账号

收集 TikTok 上发现的公开信号,并核验相关 IG 个人资料,再由人工评估联系人

编辑政策 报告错误

营销人员可能会在 TikTok 上找到一段作者正在讨论相关产品的视频,但从这样的信号进一步找到可核实的联系人并不容易:作者在 TikTok 和 IG 上使用的名称可能不同,个人资料也可能设为私密,或者根本没有经过证实的证据表明两个账号属于同一个人。切实可行的结果不是一份自动生成的“现成线索”名单,而是一张核验表:原始视频、TikTok 作者、推测的 IG 用户名、API 响应,以及供后续审查的状态。

下面介绍一个适用于此任务的基础 Python 流程。它会按关键词搜索公开视频、提取可获取的作者字段,并且只在你已有合理依据确定待查用户名时,才检查 IG 个人资料。API 可以根据用户名获取个人资料数据,但不会自动确认两个账号是否属于同一个人。

适合自动化的结果是什么

设想一个销售家用咖啡设备的团队,希望找到发布公开饮品制作视频的创作者。人工搜索有助于初步了解内容,但反复执行时,很难记录是哪段视频带来了联系人、个人资料名称从何而来,以及究竟核验了哪些信息。

文章:如何在导入 CRM 前核验 TikTok 线索的 IG 账号
摘要:这套分步 Python 流程将公开 TikTok 视频与视频作者关联,再通过 jsonscraper 检查相应的 IG 账号。最终生成供人工核验的表格,平台数据彼此分开,缺失字段保留为空。
图片用途:封面——核心主题
章节:适合自动化的结果是什么
视觉主题:营销人员研究工作台的编辑风格照片
可核验的流程将找到的视频与 IG 个人资料的独立人工核验步骤关联起来。© jsonscraper · AI 生成

这条流程将任务分为三个步骤:搜索 TikTok 视频、保存可观察到的数据,以及核验推测的 IG 个人资料。这样,分析人员打开一个 CSV 文件,就能查看每个候选对象的信息来源链。只有在公开个人简介或作者链接中找到用户名,或者由人工通过其他可用材料核实后,才应填写 IG 字段。

这种方法适用于代理机构、研究团队或内部营销人员,尤其是需要一份规模较小、可重复生成的名单供人工评估时。它保留了发现内容的背景信息,也不会把名称相似直接当成身份相同的证据。

可以获取哪些字段

有文档说明的 TikTok 路由 /searchVideo 要求提供 keyword 参数;也支持 count、date_posted、sort_by、region 和 cursor。在观察到的响应中,可能包含视频 ID、描述、发布日期、链接、作者数据以及公开互动指标。实际字段可能有所不同,因此下面的代码会安全读取数据,并在字段缺失时使用空值。

此流程使用有文档说明的 IG GET 路由 /v1/user/by/username,并通过 username 参数查询。响应可能包括用户名、显示名称、隐私与验证状态、帖子数、粉丝数、关注数以及个人简介。这些信息用于查看,并供专业人员进一步判断;它们不是对创作者的评分。

TikTok API 文档介绍了搜索参数,而IG API 文档说明了 IG 的方法和参数。jsonscraper 内置的 API 定义也记录了路由、参数名称及观察到的响应形式;此处引用的检查日期为 2026 年 10 月 25 日。

配置密钥并准备候选名单

将 API 密钥保存在环境变量 JSONSCRAPER_TIKTOK_LICENSE_KEY 和 JSONSCRAPER_INSTAGRAM_LICENSE_KEY 中。不要把密钥写进源代码、CSV 文件或任务日志。使用 python -m pip install requests 安装 requests 库。下面的示例适用于 Python 3.8 及更新版本。

import csv
import os
import sys
from urllib.parse import urlencode

import requests

TIKTOK_KEY = os.environ.get("JSONSCRAPER_TIKTOK_LICENSE_KEY")
INSTAGRAM_KEY = os.environ.get("JSONSCRAPER_INSTAGRAM_LICENSE_KEY")

if not TIKTOK_KEY or not INSTAGRAM_KEY:
    sys.exit("Set JSONSCRAPER_TIKTOK_LICENSE_KEY and JSONSCRAPER_INSTAGRAM_LICENSE_KEY")


def get_json(base_url, path, params):
    response = requests.get(
        f"{base_url}{path}",
        params=params,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()


def extract_videos(payload):
    """Handle both observed TikTok search result locations."""
    if payload.get("status") != "ok":
        raise RuntimeError(f"TikTok API status: {payload.get('status')}")

    tiktok = payload.get("tiktok") or {}
    videos = list(tiktok.get("aweme_list") or [])
    for item in tiktok.get("search_item_list") or []:
        video = item.get("aweme_info")
        if video:
            videos.append(video)

    unique = {}
    for video in videos:
        video_id = video.get("aweme_id")
        if video_id:
            unique[video_id] = video
    return list(unique.values())


keyword = "домашний кофе"
tiktok_payload = get_json(
    "https://tiktok.evelode.com",
    "/searchVideo",
    {
        "license_key": TIKTOK_KEY,
        "keyword": keyword,
        "count": 20,
        "date_posted": "this-month",
        "sort_by": "relevance",
    },
)

rows = []
for video in extract_videos(tiktok_payload):
    author = video.get("author") or {}
    stats = video.get("statistics") or {}
    rows.append({
        "tiktok_video_id": video.get("aweme_id", ""),
        "tiktok_url": video.get("share_url", ""),
        "video_description": video.get("desc", ""),
        "created_at": video.get("create_time", ""),
        "tiktok_username": author.get("unique_id", ""),
        "tiktok_author_name": author.get("nickname", ""),
        "tiktok_followers": author.get("follower_count", ""),
        "views": stats.get("play_count", ""),
        "likes": stats.get("digg_count", ""),
        "instagram_username": "",
        "instagram_status": "not checked",
        "instagram_followers": "",
        "instagram_is_private": "",
        "manual_match_review": "required",
    })

# 仅在用户名另行找到,且来源经过人工核验后,才填写此字典。
verified_instagram_usernames = {
    # "tiktok_video_id": "instagram_username"
}

for row in rows:
    username = verified_instagram_usernames.get(row["tiktok_video_id"])
    if not username:
        continue

    ig_payload = get_json(
        "https://ig.jsonscraper.com",
        "/v1/user/by/username",
        {
            "license_key": INSTAGRAM_KEY,
            "username": username,
        },
    )
    if ig_payload.get("status") != "ok":
        row["instagram_status"] = "api status: " + str(ig_payload.get("status"))
        continue

    profile = ig_payload.get("ig") or {}
    row["instagram_username"] = profile.get("username", username)
    row["instagram_status"] = "profile returned"
    row["instagram_followers"] = profile.get("follower_count", "")
    row["instagram_is_private"] = profile.get("is_private", "")
    row["manual_match_review"] = "check relationship manually"

if rows:
    with open("social_lead_checks.csv", "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=rows[0].keys())
        writer.writeheader()
        writer.writerows(rows)
else:
    print("No video rows returned for this query.")

为什么处理程序要兼顾两种响应结构

TikTok 搜索结果中的视频可能出现在两个位置:tiktok.aweme_list 和 tiktok.search_item_list[].aweme_info。在观察到的搜索响应中,第一个列表可能为空,而视频条目出现在第二个列表中。因此,示例会合并两个来源,并按 aweme_id 去重。代码首先检查外层的 status,随后读取 tiktok 对象。

文章:如何在导入 CRM 前核验 TikTok 线索的 IG 账号
摘要:这套分步 Python 流程将公开 TikTok 视频与视频作者关联,再通过 jsonscraper 检查相应的 IG 账号。最终生成供人工核验的表格,平台数据彼此分开,缺失字段保留为空。
图片用途:辅助插图 2——展示一个不同的具体方面
章节:为什么处理程序要兼顾两种响应结构
视觉主题:流程图展示 TikTok 搜索结果的两个位置
示意图展示了 TikTok 搜索结果的两个位置,以及发出 IG 请求前的独立人工步骤。© jsonscraper · AI 生成插图

代码只保存响应中实际存在的字段。空值表示收到的对象中没有该字段,不能将其解释为零。除了指标,也值得一并保存视频链接和描述;否则,后续查看表格时就会失去原始背景。

仅在需要时添加分页

示例只请求一页,并处理返回的条目。如果需要继续搜索,文档支持在视频搜索中使用 cursor;其值应取自上一个响应。将 cursor 视为不透明值保存并传递,不要自行计算。当响应表明没有后续结果,或达到团队设定的上限时,停止循环。分页能扩大返回结果的范围,但不能据此声称已经全面覆盖了该主题的所有帖子。

添加自动抓取前,请用自己的密钥检查实际响应,并选择适度的页数。将原始 JSON 与规范化记录一起保存,或按运行日期单独存档:这样可以查明响应字段是否发生变化,并在架构改变时重新处理采集结果。

如何在资格评估中使用 CSV

可以在表格中按视频链接、描述、作者和已填写的 IG 个人资料筛选记录。首轮核验可使用简单状态,例如“已找到视频”“已找到 IG 用户名”“已返回个人资料”“账号关联已由人工核实”和“已排除”。这些状态描述的是核验进度,而不是作者的质量或意图。

如果需要定期生成可重复的报告,可以按计划运行脚本,并在单独一列记录数据获取日期。对比不同时间的快照,就能看出可用字段有哪些变化,例如个人资料的粉丝数。TikTok 和 IG 的指标应分开保存,并标明平台和观察时间,因为它们属于不同情境,也来自不同的 API 响应。

如果数据流量较大,可以用数据库替代 CSV,并以平台和视频 ID 作为复合主键。保存原始文本查询、采集时间和未经处理的响应。应先由人工确认个人资料之间的关联,再发送 Slack 通知或将记录传入 CRM,而不是仅凭名称相似就自动操作。

解读范围与安全运行

关键词搜索返回的是 API 找到的结果,而不是全部帖子。观看次数、点赞数和粉丝数只是请求时的响应快照。它们可以用于工作清单排序和后续核验,但单凭这些数字无法证明商业意向、受众情况或对方同意接受联系。

应依据明确的公开迹象确认账号关联,并记录由谁在何时完成核验。如果 IG 用户名来自没有可验证来源的第三方表格,应保留“待核验”状态。对于私密账号或缺失数据,应将其显示为单独的核验结果,不要试图用猜测填补空缺。

在工作环境的密钥管理服务中保存密钥,限制导出文件的访问权限,并按照研究目的设定数据保留期限。传入 CRM 的字段应仅限于后续人工处理所必需的信息,同时遵守适用的平台规则和数据处理要求。

最终结果

运行后会生成一份 CSV,其中列出找到的视频、作者和可用指标,并为 IG 核验设置独立字段。可以手动运行脚本、在 CI 中定时运行,或通过自动化平台的 HTTP 请求节点调用。关键原则是:自动化数据采集和整理,让账号关联的确认仍由人工以可核验的方式完成。

如需检查路由和可用参数,可先查看 TikTok Scraper API 和 IG Scraper API。产品页面提供请求示例,并链接至相关文档;在将采集纳入常规流程前,建议先从小规模请求开始。

人们

尚未列出本文的人员。

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

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

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

查看 API