GitPrey 源码架构剖析:一个单文件爬虫工具的代码设计与实现思路
2026/9/19 8:07:47 网站建设 项目流程

GitPrey 源码架构剖析:一个单文件爬虫工具的代码设计与实现思路

【免费下载链接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words项目地址: https://gitcode.com/gh_mirrors/gi/GitPrey

GitPrey 是一个基于关键词的 GitHub 敏感信息扫描工具,它能按企业名或指定关键词搜索代码库,找出其中泄露的敏感文件与敏感代码内容。整个扫描器的核心逻辑只写在约 284 行的 GitPrey.py 单文件中,堪称"单文件爬虫"的极简范本。本文带你剖析它的源码架构:三阶段扫描流水线如何搭建、为什么放弃官方 API 改爬网页、外部化模式库又是如何设计的。

🔍 项目速览:一个文件撑起整个扫描器

GitPrey 的工作目标很明确:输入一个关键词(比如公司名),输出所有可能泄露敏感信息的仓库、文件和代码行

它的技术选型非常克制,只依赖 4 个第三方库:

依赖用途
requests发送 HTTP 请求、模拟登录
BeautifulSoup解析搜索结果网页
lxml提供 HTML 解析引擎
colorama终端彩色输出

全部核心逻辑(登录、检索、解析、过滤、输出)集中在GitPrey.pyGitPrey类中(第 44 行起),这也是理解整个架构的关键入口。

📁 目录结构:核心逻辑只在一个文件里

项目目录小而清晰,每个文件职责单一:

GitPrey/ ├── GitPrey.py # 主程序:扫描器核心逻辑(单文件) ├── config/ # 配置包:用户在此放入自己的 Config.py ├── include/ │ └── ColorPrint.py # 彩色打印 + 文件日志模块 └── pattern/ ├── path.db # 敏感文件名列表(如 htpasswd、netrc) ├── file.db # 内容搜索的文件范围(如 config、secret) └── info.db # 敏感内容关键词(如 password、pwd)

几个值得注意的设计:

  • config/目录出厂只带一个空的__init__.py,用户需要自行创建Config.py填入 GitHub 账号密码。这样设计避免了示例配置被误提交,也降低了主程序对具体配置的耦合。
  • pattern/目录把"扫描什么"从"怎么扫描"中剥离,后面会详细讲这种数据与逻辑分离的好处。

⚙️ 三阶段扫描流水线:核心架构

GitPrey 的整体架构是一条三段式流水线,每一段的输出都是下一段的输入:

关键词项目检索敏感文件名扫描敏感内容扫描

第一阶段:按关键词圈定"疑似项目"

入口是GitPrey类的search_project()方法(GitPrey.py第 66 行)。它构造的搜索查询是:

{keyword} in:file,path

即"代码内容或文件路径中出现该关键词"。这里有两个精巧的细节:

  1. 去重:每页结果先经set()去重,累加进unique_project_list
  2. 迭代排除:找到一批仓库后,把它们拼成-repo:xxx -repo:yyy追加到查询里,再查"第一页"——因为已发现的仓库被排除,第一页永远是新鲜结果,这样巧妙地绕开了 GitHub"单次搜索最多 1000 条"的硬性上限。

第二阶段:敏感文件名扫描

project_miner()函数(第 255 行)把第一阶段找到的所有仓库拼成repo:xxx repo:yyy ...字符串,再交给sensitive_info_query()(第 101 行)。

filename 模式下,程序读取pattern/path.db中的 41 个敏感文件名(如htpasswdnetrcbash_historyprivate.key),拼成filename:xxx filename:yyy与仓库条件做隐式 AND 组合,让 GitHub 只在这些仓库里找这些"高危文件"。

第三阶段:敏感内容扫描与逐行正则过滤

content 模式的流程更精细,在__file_content_inspect()方法(第 122 行)中:

  1. pattern/info.db读取敏感词(password、pwd、private_key 等);
  2. 由于 GitHub 单次搜索的 OR 操作符最多 5 个,程序用math.floor(len/5)+1做分批轮询,每 5 个词查一轮;
  3. 命中文件后,把页面链接的 host 从 GitHub 换成 raw 地址(第 134 行的replace(HOST_NAME, RAW_NAME)),直接拉取原始文件内容
  4. 在本地对每一行做正则匹配(re.search,忽略大小写),只输出真正包含敏感词的那几行代码。

"服务端粗筛 + 客户端精筛"的组合,既省流量又提高了准确率。

🚀 关键设计决策剖析

为什么放弃官方 API,选择爬网页?

这是全文最值得学习的一个决策,README 里给出了两个量化理由:

  • 代码搜索 API 认证后限流30 次/分钟,根本跑不完批量扫描;
  • API 单页最多返回100 条,而网页端可达1000 条,总召回量差一个数量级。

所以当 API 能力不匹配场景时,"退而求其次"地爬 Web 页面反而是更工程化的选择。

自动登录:绕开 429 限制

未登录状态下,快速翻页约 10 页就会触发429 Too Many Requests__auto_login()方法(第 192 行)模拟浏览器完成登录:先 GET 登录页收集全部隐藏表单字段,再带上账号密码 POST,并把 session cookies 交给后续所有请求。登录失败会直接报错退出,而不是带着"半残"的会话继续跑。

此外,__get_page_html()(第 207 行)对 429 状态码有兜底:休眠后重试;连接错误给出明确提示;读超时返回空串让上层自然跳过。防御性编程贯穿始终。

五级扫描深度:速度与召回的权衡

第 38 行的一行常量定义了全部深度策略:

SCAN_DEEP = [10, 30, 50, 70, 100]

Level 1 到 Level 5 对应检索最近索引的前 10~100 页代码结果,这个数字同时复用为请求超时秒数——一个配置项承担两个职责,简单但实用。官方建议扫描深度与扫描周期正相关:Level 1 适合每天扫,Level 5 可放宽周期。

🗂️ 外部化模式库:三个 pattern 文件的分工

GitPrey 把"扫什么"完全交给pattern/目录下的三个纯文本文件,每行一个条目:

文件作用示例条目
pattern/path.db敏感文件名扫描(第二阶段)htpasswd、netrc、pgpass
pattern/file.db限定内容搜索的文件范围config、credential、secret
pattern/info.db敏感内容关键词(第三阶段)password、pwd、user

读取逻辑只有 8 行——__pattern_db_list()方法(第 173 行)逐行读入即可。这意味着普通用户不改一行代码,就能扩展扫描规则:往path.db里加一行myservice.conf,下次扫描就多盯一个文件。这是"配置即数据"最直观的收益。

🎨 辅助模块:ColorPrint 与命令行入口

include/ColorPrint.py把"怎么显示"从主逻辑中拆了出来,提供 5 个语义化函数:

  • error_print红色——错误
  • info_print绿色——进度信息
  • project_print青色——项目信息
  • file_print黄色——命中文件
  • code_print白色——命中代码行

更妙的是第 16~20 行:模块初始化时挂了一个FileHandler,所有打印同步落盘到 GitPrey.log。终端看着是彩色进度条,实际已是一份完整审计日志,几乎零成本实现了"所见即所记"。

命令行入口init()函数(第 229 行)用 argparse 只暴露两个参数:-l搜索深度(1~5)、-k关键词(必填),并用正则做关键词合法性校验——配置项从配置文件挪到命令行,正是 v2.2 版本的一次重要简化。

💡 新手可借鉴的 4 个设计思路

  1. 单文件不等于单职责糊在一起:一个文件里仍按"检索 → 扫描 → 输出"严格分层,方法命名(search_project/sensitive_info_query)自解释;
  2. 数据与逻辑分离:扫描规则放在.db文本文件,扩展规则零代码改动;
  3. 展示与业务分离:换一套输出风格,只需替换 ColorPrint 模块;
  4. 防御性兜底:缺依赖友好报错、429 重试、登录失败快速退出,每一步异常都有归宿。

也要理解它的边界(README 中坦诚列出):GitHub 只索引默认分支、单次搜索上限 1000 条、仅检索 384KB 以下的文件——因此结果可能存在漏报(关键词未进路径/内容)或误报(第三方仓库恰好引用了关键词),把它当作线索发现器而非审计终审工具,才符合定位。

📥 获取并运行 GitPrey

git clone https://gitcode.com/gh_mirrors/gi/GitPrey cd GitPrey pip install requests beautifulsoup4 lxml colorama

随后在config/下创建Config.py填入 GitHub 账号(登录态是规避 429 的前提),即可运行:

python GitPrey.py -k "你的关键词" -l 1

从进度条到彩色报告,你会看到三阶段流水线依次执行——而这背后,全部架构就藏在那个不到 300 行的文件里。

总结

GitPrey 的架构魅力在于用最小代码量解决了一个多阶段问题:单文件承载检索、解析、过滤全链路,pattern 库承载扫描规则,ColorPrint 承载展示。它给新手的核心启示是——架构清晰不取决于文件数量,而取决于职责边界是否干净。读懂这一个文件,你就读懂了爬虫类工具最常见的骨架:登录态维护、分页检索、HTML 解析、本地精筛与结果落盘。

【免费下载链接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words项目地址: https://gitcode.com/gh_mirrors/gi/GitPrey

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询