
GitPrey 源碼架構剖析一個單文件爬蟲工具的代碼設計與實現思路【免費下載鏈接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words項目地址: https://gitcode.com/gh_mirrors/gi/GitPreyGitPrey 是一個基于關鍵詞的 GitHub 敏感信息掃描工具它能按企業名或指定關鍵詞搜索代碼庫找出其中泄露的敏感文件與敏感代碼內容。整個掃描器的核心邏輯只寫在約 284 行的 GitPrey.py 單文件中堪稱單文件爬蟲的極簡范本。本文帶你剖析它的源碼架構三階段掃描流水線如何搭建、為什么放棄官方 API 改爬網頁、外部化模式庫又是如何設計的。 項目速覽一個文件撐起整個掃描器GitPrey 的工作目標很明確輸入一個關鍵詞比如公司名輸出所有可能泄露敏感信息的倉庫、文件和代碼行。它的技術選型非??酥浦灰蕾?4 個第三方庫依賴用途requests發送 HTTP 請求、模擬登錄BeautifulSoup解析搜索結果網頁lxml提供 HTML 解析引擎colorama終端彩色輸出全部核心邏輯登錄、檢索、解析、過濾、輸出集中在GitPrey.py的GitPrey類中第 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即代碼內容或文件路徑中出現該關鍵詞。這里有兩個精巧的細節去重每頁結果先經set()去重累加進unique_project_list迭代排除找到一批倉庫后把它們拼成-repo:xxx -repo:yyy追加到查詢里再查第一頁——因為已發現的倉庫被排除第一頁永遠是新鮮結果這樣巧妙地繞開了 GitHub單次搜索最多 1000 條的硬性上限。第二階段敏感文件名掃描project_miner()函數第 255 行把第一階段找到的所有倉庫拼成repo:xxx repo:yyy ...字符串再交給sensitive_info_query()第 101 行。filename 模式下程序讀取pattern/path.db中的 41 個敏感文件名如htpasswd、netrc、bash_history、private.key拼成filename:xxx filename:yyy與倉庫條件做隱式 AND 組合讓 GitHub 只在這些倉庫里找這些高危文件。第三階段敏感內容掃描與逐行正則過濾content 模式的流程更精細在__file_content_inspect()方法第 122 行中從pattern/info.db讀取敏感詞password、pwd、private_key 等由于 GitHub 單次搜索的 OR 操作符最多 5 個程序用math.floor(len/5)1做分批輪詢每 5 個詞查一輪命中文件后把頁面鏈接的 host 從 GitHub 換成 raw 地址第 134 行的replace(HOST_NAME, RAW_NAME)直接拉取原始文件內容在本地對每一行做正則匹配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、pgpasspattern/file.db限定內容搜索的文件范圍config、credential、secretpattern/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 個設計思路單文件不等于單職責糊在一起一個文件里仍按檢索 → 掃描 → 輸出嚴格分層方法命名search_project/sensitive_info_query自解釋數據與邏輯分離掃描規則放在.db文本文件擴展規則零代碼改動展示與業務分離換一套輸出風格只需替換 ColorPrint 模塊防御性兜底缺依賴友好報錯、429 重試、登錄失敗快速退出每一步異常都有歸宿。也要理解它的邊界README 中坦誠列出GitHub 只索引默認分支、單次搜索上限 1000 條、僅檢索 384KB 以下的文件——因此結果可能存在漏報關鍵詞未進路徑/內容或誤報第三方倉庫恰好引用了關鍵詞把它當作線索發現器而非審計終審工具才符合定位。 獲取并運行 GitPreygit 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 行的文件里??偨YGitPrey 的架構魅力在于用最小代碼量解決了一個多階段問題單文件承載檢索、解析、過濾全鏈路pattern 庫承載掃描規則ColorPrint 承載展示。它給新手的核心啟示是——架構清晰不取決于文件數量而取決于職責邊界是否干凈。讀懂這一個文件你就讀懂了爬蟲類工具最常見的骨架登錄態維護、分頁檢索、HTML 解析、本地精篩與結果落盤?!久赓M下載鏈接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words項目地址: https://gitcode.com/gh_mirrors/gi/GitPrey創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考