Abhayparashar31/ThirdEye
GitHub: Abhayparashar31/ThirdEye
ThirdEye 是一款基于 Streamlit 的 OSINT 用户名枚举工具,支持在 135 个平台上检查同一用户名并诚实区分四种检测状态,帮助用户进行个人足迹审计和身份关联调查。
Stars: 0 | Forks: 0
# 👁 ThirdEye
**一款用于 OSINT 的用户名枚举工具。**
大多数人在互联网上重复使用同一个用户名,却没有意识到这会暴露多少关联信息。ThirdEye 可以一次性在数十个平台上检查单个用户名——这与 OSINT 调查、背景调查和自我审计中使用的技术相同——并准确向你展示该身份出现在哪里。
使用 Streamlit 构建。无需账户,无需 API key 即可开始使用,除了你自己的机器外,不会在任何地方存储数据。
## 它的实际功能
你只需提供一个用户名。它会对其了解的每个平台检查该用户名,并将结果诚实地分为四类:
| 状态 | 含义 |
|---|---|
| **Found** | 强烈表明账户存在(通过真实的 API 确认,或用户名直接出现在页面上) |
| **Unsure** | 没有明确的信号——通常因为网站对*每个*访问者都显示登录墙,无论账户是否真实存在(LinkedIn、Instagram 及其同类网站就是专门这样设计的) |
| **Not found** | 真实的 404,或者明确说明账户不存在的页面 |
| **Error** | 被拦截、触发频率限制或超时——这不是一种判定,只是干扰信息 |
“Unsure”这一类很重要。许多用户名检查工具会在网站上自信地告诉你“not found”,而实际上该网站只是向所有人显示了登录页面——这是一种伪装成事实的假阴性。ThirdEye 宁愿说“我们不知道”,也不愿乱猜。
Found 和 Unsure 平台将被渲染为卡片——包括 logo、任何可以提取的个人资料数据(bio、粉丝数、头像、近期帖子等),以及指向该个人资料的链接。Not found 和 Error 结果会列在下方,错误消息会用通俗易懂的语言而不是原始状态码来描述。
## 它如何判定“found”与“not found”
根据平台的不同,分为两个层级:
1. **Dedicated check**——对于在 [`platforms/`](./platforms) 中拥有独立文件的平台,检查会直接通过该文件进行。这些检查通常由真实的公共 API(GitHub 的 REST API、Reddit 的 `about.json`、Dev.to 的 API、Medium 的 RSS feed)或已知可靠的 endpoint 提供支持,因此结果是值得信赖的,并且通常附带真实的个人资料数据——bio、粉丝数、头像等一应俱全。
2. **Generic check**——对于其他所有平台,`detection.py` 会抓取一次页面,并查看标题、标题标签和带有错误特征的元素以寻找信号:用户名是否出现?它看起来像不像模板化的“not found”页面?它是否被重定向到了登录墙?在同一次请求中,它还会伺机提取 Open Graph meta 标签(标题/描述/图片)以获取一些额外细节——无需第二次请求。
无论哪种情况,都不会仅仅因为页面返回了 HTTP 200 就将其标记为“found”。返回了 200 但没有真实信号的情况会被报告为“unsure”,而不是被瞎猜成假阳性。
## 两种运行方式
### Full mode——`app.py`
检查 [`platform_list.py`](./platform_list.py) 中的**每一个**平台(目前有 135 个,精选自开发、社交、媒体、游戏、安全、AI、加密货币等领域)。拥有独立文件的平台会进行可靠的检查;其他所有平台则回退到基于页面的通用检查。
```
streamlit run app.py
```
### Lite mode——`app_lite.py`
仅检查在 `platforms/` 中拥有**独立文件**的平台——完全没有通用回退机制。平台数量较少,但每一个结果都来自真实的 API 或已知可靠的方法。这里的平台数量永远精确等于“`platforms/` 中的文件数量”。
```
streamlit run app_lite.py
```
## 开始使用
```
git clone
cd thirdeye
pip install -r requirements.txt
streamlit run app.py # or app_lite.py
```
就是这样——不需要 API key。(可选:设置 `GITHUB_TOKEN` 环境变量,可将 GitHub 的频率限制从每小时 60 次请求提高到每小时 5,000 次。)
## 项目结构
```
thirdeye/
├── app.py # Main app — full mode (135 platforms)
├── detection.py # Decides found/not_found/unsure/error for every platform
├── progress_ui.py # Runs the scan, drives the progress bar + rotating quotes
├── helper.py # Shared headers and small utility functions
├── card_renderer.py # Turns a result into a styled card (or a list entry)
├── platform_list.py # The master list: name, URL pattern, category, domain
│
├── platforms/ # One file per platform with a dedicated, reliable check
│ ├── github.py # via GitHub's public API
│ ├── X.py # via X endpoint
│ ├── devto.py # via Dev.to's public API
│ ├── medium.py # via each user's public RSS feed
│ ├── hackerrank.py # via HackerRank's frontend JSON endpoint
│ ├── facebook.py # best-effort (same story)
│ ├── .....
│
├── requirements.txt
└── .streamlit/
└── config.toml # theme config
```
## 添加新平台
这就是 `platforms/` 文件夹的全部意义所在——它是一个插件系统,而不是你必须记得在五个地方更新的配置文件。
在 `platforms/` 中放入一个新文件,遵循以下格式:
```
# platforms/x.py
PLATFORM = "X (Twitter)"
CATEGORY = "social"
DOMAIN = "x.com"
URL_TEMPLATE = "https://x.com/{}"
def check(username, url=None, session=None):
"""Must return {"status": "found"|"not_found"|"unsure"|"error",
"detail": str or None,
"extra": dict or None}"""
...
```
就是这样。`app.py` 和 `app_lite.py` 都会在下次运行时自动识别它——无需添加 import,无需更新注册表,也无需修改其他任何内容。如果该平台有真实的 API,请使用它并返回丰富的 `extra` 数据。如果没有,`platforms/_common.py` 中有一个 `best_effort_check()` 辅助函数,它可以处理通用的页面抓取模式(soft-404 检测、登录墙检测、Open Graph 提取),因此你不必从头重写这些逻辑。
## 关于它能告诉你什么以及不能告诉你什么的说明
- “Found”结果意味着有真实的信号表明该账户存在——这并不意味着所显示的个人资料内容必定是准确或最新的。
- “Unsure”结果并不是软弱的“可能不存在”——它真正的意思是检查无法确认任何一种情况,最常见的原因是该平台无论访问者是否登录,都向每个人显示相同的页面。
- 该工具只会查看未登录状态下公开可见的内容。它不会绕过身份验证,不会访问私人数据,也不会尝试对抗 CAPTCHA 或反机器人系统。
## 预期用途
专为 OSINT 研究、个人足迹审计,以及了解你多年来注册的各种平台上的自身暴露情况而构建。在你自己的账户上使用它,或者在合法、授权的研究背景下使用。请勿用于在没有正当理由的情况下骚扰、跟踪或去匿名化他人。
## License
在此处添加你选择的 License(对于此类工具,MIT 是常见的选择)。
标签:ESC4, Kubernetes, OSINT, Python, Streamlit, 实时处理, 无后门, 用户名枚举, 访问控制, 逆向工具