xpux/CrossTrace

GitHub: xpux/CrossTrace

CrossTrace 通过对多个社交媒体平台导出的粉丝/关注列表进行模糊匹配和图谱分析,实现跨平台的同一用户识别与社交关系映射。

Stars: 9 | Forks: 1

# CrossTrace CrossTrace 接收从任意社交媒体平台导出的原始粉丝/关注列表,并对它们进行分析,以跨平台寻找目标用户、映射他们的社交圈,并通过用户名和显示名称对跨平台匹配进行评分。无需 API。无需抓取。只需使用你已有的文件。 ## 快速开始 ``` git clone https://github.com/xpux/CrossTrace.git cd CrossTrace pip install -r requirements.txt python crosstrace.py --init ``` `--init` 会在首次运行时创建该工具所需的所有文件和文件夹。之后,将你导出的列表放入 `data/users/me/` 并运行: ``` python crosstrace.py ``` ## 功能特性 跨平台匹配:在 TikTok、Instagram、Twitter 等平台上寻找同一个人 模糊匹配:捕获 `johndoe`、`john_doe`、`johndoe_` 等变体并按置信度进行评分 显示名称匹配:同时使用用户名和显示名称作为信号,并具备脚本检测功能,从而实现阿拉伯语名称仅与阿拉伯语名称匹配,CJK 仅与 CJK 匹配等 双向关注检测:识别同时出现在粉丝和关注列表中的账号(互相关注关系),从而更深入地洞察每个平台分组内的双向连接 双向导出系统:以 CSV 和 JSON 格式输出每个分组的双向连接,以便进行外部分析和追踪 交互式双向选择:允许你选择特定的用户/平台分组,或对所有加载的数据集运行双向检测 双向评分集成:与单向关注相比,双向连接被视为更高置信度的关系,从而改善了分析中的关系权重 多用户 / 朋友圈模式:添加多个人的列表以映射共享的社交网络 发现模式:不知道你要找谁?添加多个用户的列表,该工具会找出在所有列表中出现频率最高的人 快速模式:在 config 中设置最低阈值,以便只有高置信度的匹配才会进入审查队列 前 N 个最高频用户:一眼查看在最多列表中出现的人,完全可自定义 持久化连接:经过多次运行后,找出那些在不同会话中反复出现的人 单平台检测:标记仅在一个平台上出现且未找到跨平台匹配的人 人工审查队列:将处于边缘的匹配项标记出来,供你确认、拒绝或标记为知名人物 知名人物过滤:标记名人和公众人物,使其永远不再出现在结果中 反馈学习:你确认/拒绝的决定将改善未来的评分 置信度分析:每个匹配都会解释其获得相应评分的原因 会话命名:每次运行都会保存到其专属文件夹,因此不会覆盖任何内容 统计摘要:每次运行后,查看最活跃的平台、联系最密切的用户以及已确认的匹配数 批量别名建议:该工具根据已确认的匹配建议别名,并允许你保存它们 已知信息系统:将你已有的关于目标的任何文件放入文件夹中,该工具会利用它们来提升匹配度 可自定义的忽略列表:从原始粘贴内容中剔除特定于平台的 UI 文本 别名词典:硬编码已知别名以实现自动确认 灵活的输出:CSV、JSON 或两者兼有 图谱导出:每次运行还会将发现的网络以真实的图谱格式写入 JSON、GraphML(适用于 Gephi、Cytoscape 或 yEd)以及一个可完全离线运行的单体自包含 HTML 查看器中 可脚本化:使用 `--target`、`--discovery`、`--session` 和 `--yes` 无需提示即可运行整个会话,从而轻松融入脚本和自动化流程 ## 工作原理 ### 1. 导出你的列表 前往任意社交媒体平台,导航到你的粉丝或关注列表,然后将内容复制粘贴到 `.txt` 文件中。原始粘贴内容通常如下所示: ``` John Doe johndoe_ Following Jane Smith jane_smith Follow Back ``` CrossTrace 会自动剔除 `Follow`、`Following`、`Followers`、`Follow Back` 等 UI 文本,仅保留用户名和显示名称。你可以在 `ignorelist.txt` 中自定义要剔除的内容。 ### 2. 设置你的文件 将你的文件放在 `data/users/` 文件夹中。你要添加列表的每个人都会拥有自己的子文件夹。请使用以下精确格式命名你的文件: ``` {platform}_{followers or following}{number}.txt ``` 末尾的数字按平台对文件进行分组:所有具有相同数字的文件属于同一个平台。开头的平台名称只是一个可读性标签。 示例: ``` CrossTrace/ ├── config.json ├── ignorelist.txt ├── aliases.txt ├── target.txt ├── crosstrace.py └── data/ ├── known/ └── users/ ├── me/ │ ├── tiktok_followers1.txt │ └── tiktok_following1.txt ├── friend_a/ │ ├── instagram_followers2.txt │ └── instagram_following2.txt └── friend_b/ ├── tiktok_followers1.txt └── instagram_followers2.txt ``` 有效的文件名示例: ``` tiktok_followers1.txt ✓ instagram_following2.txt ✓ twitter_followers3.txt ✓ tiktok_followers.txt ✗ (missing number) followers1.txt ✗ (missing platform name) tiktok1.txt ✗ (missing followers/following) ``` ### 3. 设置目标(或留空) 在 `target.txt` 中,写入你要查找的用户名: ``` johndoe_ ``` 将其留空,CrossTrace 会在你运行时于终端中询问你。如果也将提示留空,则会以发现模式运行。 ### 4. 运行 CrossTrace ``` python crosstrace.py ``` CrossTrace 会在启动时要求你为会话命名。每个会话都会保存到 `output/` 下的专属文件夹中,因此绝不会覆盖之前的运行记录。 ## 模式 ### 模式 1:已知目标 你知道你要找谁。将他们的用户名放在 `target.txt` 中,或在出现提示时输入。CrossTrace 会在所有列表中搜索该用户名及相近的变体,然后映射他们在各平台间的双向连接。 仅使用你自己的列表即可工作,无需其他用户。 ### 模式 2:发现模式 你没有特定的目标。将所有内容留空,CrossTrace 会找出出现在多个用户列表中的所有人,并根据你的群体中有多少人关注他们来进行排名。 重要提示:发现模式需要至少两个用户的列表才能工作。它会寻找人与人之间的交集:因此,如果 `data/users/` 中只有你的列表,就没有可交叉比对的内容,并且不会返回任何结果。要使用发现模式,请在你的列表旁,在另一个属于他们自己的子文件夹(例如 `data/users/friend_a/`)下添加第二个人的列表。添加的人越多,结果就越好。 ## 数据越多,效果越好 CrossTrace 获取的数据越多,准确度就会显著提升。每个人的平台越多,意味着可以在更多平台上寻找匹配项。包含更多人的文件夹意味着可以进行更多的交叉比对。包含反馈的运行次数越多,意味着评分系统会学习你的决定,并随着时间的推移自动确认模式。随着你添加的数据越来越多,你要找的人自然会浮现出来。 ## 已知信息系统 如果你已经拥有关于目标的文件:笔记、旧用户名、你手动打出来的个人简介截图、任何东西:你可以把它们放进一个文件夹里,CrossTrace 会读取它们并利用看起来有用的信息来提升匹配分数。文件格式和命名无关紧要。 在 `config.json` 中进行配置: ``` "known_info": { "enabled": true, "mode": "global", "global_path": "data/known", "target_path": "data/known/{target}" } ``` 有三种可用模式。Global 在每次运行时都会加载 `data/known/`,无论目标是谁。Target 仅在搜索特定人物时加载 `data/known/{target}/`。Both 会同时加载这两个文件夹。 示例结构: ``` data/known/ ├── general_notes.txt ← loaded in global mode ├── old_usernames.md ← loaded in global mode └── johndoe/ ← loaded in target mode when target = johndoe ├── bio_notes.txt └── known_accounts.txt ``` 当这些文件中的提示匹配到某个条目时,它会显示在审查期间的 `why:` 行以及总结中。 ## 置信度等级 | 等级 | 分数 | 操作 | |------|-------|--------| | 自动确认 | 95–100% | 直接保存到结果中 | | 快速审查 | 75–94% | 标记以便快速检查 | | 人工审查 | 50–74% | 需要仔细审查 ⚠️ | | 弱匹配 | 50% 以下 | 优先级低,单独列出 | 分数是根据用户名相似度(模糊匹配)、显示名称相似度(脚本感知)、双向关注检测、平台间共同的双向连接、常见的用户名模式(添加了 `_`、附加了数字、替换了 `.`)、该人是同时出现在粉丝和关注列表中还是仅出现在其中一个中、别名词典命中情况、已知信息提示,以及在多用户模式下关注他们的种子用户数量来计算的。 ## 审查模式 脚本运行后,处于边缘的匹配项将排队等待人工审查。每个案例都会并排显示两个条目及其置信度分数、一行解释该分数的 `why:`,以及三个选项: ``` WARNING: Check each manual case carefully before pressing Yes. This tool can make mistakes. [1/7] MANUAL REVIEW: 67% A: mikegaming / Mike Gaming (tiktok) B: mike_g / Mike G (instagram) why: username similarity 71%, common username variation pattern (1) Yes: same person (2) No: different people (3) Famous / not important: skip ``` 选项 1 将他们确认为同一个人,保存到结果中,将分数提升至 100,并反馈到未来的评分中。 选项 2 拒绝该匹配,并在未来的运行中惩罚相似的模式。 选项 3 将他们标记为知名人物或不相关,将他们保存到 `famous.json` 中,并在所有未来的运行中永久过滤他们。 跨平台审查之后,单平台条目(仅在找到一个平台且在其他平台上没有匹配的人)将单独显示,并提供相同的 1/2/3 选项。 在每次运行结束时,CrossTrace 会建议可以添加为别名的已确认配对,并允许你批准或跳过每一个配对。 你的决定将持久化保存在 `feedback.json` 中,并随着时间的推移提高评分的准确性。 ## 命令行参考 运行不带任何参数的 `python crosstrace.py` 会引导你以交互方式命名会话并输入目标。以下参数允许你跳过提示或运行其他命令。 | 参数 | 功能 | |------|--------------| | `--init` | 创建 CrossTrace 需要的文件夹和文件,然后退出 | | `--target USERNAME` | 针对此目标运行,无需提示 | | `--discovery` | 强制进入发现模式,无需提示 | | `--session NAME` | 命名会话,无需提示 | | `--yes`, `-y` | 非交互式:自动命名会话,无提示,跳过审查 | | `--no-review` | 运行匹配,但跳过人工审查队列 | | `--graph FORMATS` | 选择图谱格式,以逗号分隔的列表,如 `json,graphml,html` | | `--no-graph` | 跳过本次运行的图谱导出 | | `--dry-run` | 预览审查队列,不保存任何内容 | | `--search USERNAME` | 在所有加载的列表中查找用户名 | | `--compare A B` | 比较过去的两个会话 | | `--summary SESSION` | 重新打印过去某个会话的摘要 | | `--history USERNAME` | 显示某个用户名在各会话中的分数 | | `--export-aliases` | 将已确认的匹配直接导出到 `aliases.txt` | | `--stats-only` | 打印上一次会话的统计数据,无需重新运行 | | `--reset` | 擦除 `feedback.json`、`famous.json` 和 `history.json` | | `--version` | 打印版本信息 | 一个完全脚本化的发现模式运行,无提示,仅限 HTML 图谱: ``` python crosstrace.py --yes --discovery --session friday_sweep --graph html ``` ## 图谱输出 CrossTrace 是一个社交图谱分析器,因此每次运行时,它还会重建其发现的网络,并在会话文件夹下以三种方式将其写入。 `graph.json` 是一个简单的节点和边结构,你可以在任何地方加载。如果你想对大型网络进行布局或分析,`graph.graphml` 可直接在 Gephi、Cytoscape 和 yEd 等网络分析工具中打开。`graph.html` 是一个可以在任何浏览器中打开的单体自包含文件:它嵌入了数据并渲染出一个支持拖拽、缩放、搜索和详情面板的交互式力导向视图。它不加载任何外部脚本,也不发出任何网络请求,因此可以完全离线工作,并将所有数据保留在你的机器上,这与该工具的其余部分保持一致。 在目标模式下,节点是账户,边是由置信度加权的人同匹配。在发现模式下,节点是跨列表出现的人以及关注他们的种子用户,这样你就能看到谁处于群体的中心。 使用 `--graph json,graphml,html` 为每次运行选择格式,使用 `--no-graph` 将其关闭,或者在 `config.json` 中设置默认值: ``` "graph": { "formats": ["json", "graphml", "html"] } ``` ``` { "min_match_threshold": 30, "output_format": ["csv", "json"], "review_mode": true, "top_results": 5, "quick_mode": false, "quick_threshold": 70, "min_username_length": 2, "graph": { "formats": ["json", "graphml", "html"] }, "known_info": { "enabled": true, "mode": "global", "global_path": "data/known", "target_path": "data/known/{target}" } } ``` | 选项 | 默认值 | 描述 | |--------|---------|-------------| | `min_match_threshold` | `30` | 不显示低于此置信度 % 的匹配 | | `output_format` | `["csv", "json"]` | 输出格式 | | `review_mode` | `true` | 在运行后启用交互式人工审查 | | `top_results` | `5` | 在摘要中显示多少个排名靠前的活跃人物 | | `quick_mode` | `false` | 在审查队列中仅显示高于 `quick_threshold` 的匹配 | | `quick_threshold` | `70` | 开启快速模式时,要在审查队列中出现的最低分数 | | `min_username_length` | `2` | 忽略短于此长度的已解析用户名 | | `graph.formats` | `["json","graphml","html"]` | 每次运行写入的图谱格式 | | `known_info.enabled` | `true` | 开启或关闭已知信息系统 | | `known_info.mode` | `"global"` | 可选:`global`、`target`、`both` | | `known_info.global_path` | `"data/known"` | 全局已知信息文件夹的路径 | | `known_info.target_path` | `"data/known/{target}"` | 针对特定目标文件夹的路径模板 | ### `ignorelist.txt` 要从原始粘贴内容中剔除的单词或短语。每行一个条目。预填充了常见的平台 UI 文本: ``` Following Followers Follow Back Follow Suggested Verified Mutual Follow ``` 添加你的平台在复制列表时包含的任何额外文本。 ### `aliases.txt` 同一个人的已知别名。CrossTrace 会自动确认这些别名,靠猜测: ``` mikegaming = mike_gaming = mikeg john_doe = johndoe = jdoe99 ``` 此文件以 `aliases.example.txt` 的形式发布,`--init` 会在首次运行时将其复制为 `aliases.txt`。由于真实的别名是人们账户之间已确认的关联,因此 `aliases.txt` 被 git 忽略,永远不会被提交。 ## 输出 每次运行都会保存到 `output/session_name/` 下其专属的文件夹中。 | 文件 | 内容 | |------|----------| | `results_confirmed.csv/json` | 自动确认的跨平台匹配 | | `results_review.csv/json` | 人工审查队列及你的决定 | | `results_weak.csv/json` | 低置信度匹配(低于阈值) | | `summary.md` | 完整运行的人类可读摘要报告 | | `graph.json` | 由节点和边构成的已发现网络 | | `graph.graphml` | 适用于 Gephi、Cytoscape 或 yEd 的相同图谱 | | `graph.html` | 自包含的离线查看器;可在任何浏览器中打开 | 输出示例: ``` ============================================================ CROSSTRACE: RESULTS SUMMARY ============================================================ Total pairs analysed: 348 AUTO-CONFIRMED: 12 QUICK REVIEW: 8 MANUAL REVIEW: 7 WEAK: 321 TOP 5 MOST PREVALENT johndoe_ / John Doe | seen in 2 platform(s): instagram, tiktok jane_smith | seen in 2 platform(s): instagram, tiktok AUTO-CONFIRMED johndoe_ (instagram) → johndoe_ (tiktok) | 100% why: username exact/near match (100%) jane_smith (instagram) → jane_smith (tiktok) | 100% why: username exact/near match (100%) ============================================================ CROSSTRACE: SESSION STATS ============================================================ folders loaded: 3 total lists loaded: 6 confirmed matches: 12 famous filtered out: 4 most active platform: instagram (18 confirmed entries) ``` ## 重置记忆 要擦除所有学习到的状态,请运行 `python crosstrace.py --reset`。这将在一步操作中清除 `feedback.json`(你的确认/拒绝决定)、`famous.json`(被过滤的公众人物)和 `history.json`(过往会话记录)。 ## 安装 ``` git clone https://github.com/xpux/CrossTrace.git cd CrossTrace pip install -r requirements.txt ``` 你也可以将其作为包安装,这会在你的路径中添加一个 `crosstrace` 命令: ``` pip install . crosstrace --version ``` 要求:Python 3.8+ 和 `rapidfuzz`。 适用于 Windows、Linux 和 Mac。 ## 隐私 CrossTrace 完全基于你提供的文件进行工作。它不发出任何网络请求,不调用任何 API,也不会将任何数据发送到任何地方。一切都在你的机器上本地运行。 ## 免责声明 本工具旨在对你拥有合法访问权限的数据进行个人使用。你有责任确保在使用时遵守你所导出数据的任何平台的服务条款,并符合适用的隐私法律。
标签:ESC4, Homebrew安装, OSINT, Python, 代码示例, 多模态安全, 数据分析, 无后门, 模糊匹配, 社交图谱, 跨平台匹配, 逆向工具