# TgWitness · 繁體中文 > Documentation edition: 繁體中文. Project version: `0.9.1`. Source branch: `main`. This index links the Markdown editions of the public pages. The complete handbook is built from the same page content, including source URLs. Untranslated sections retain the English original; a language edition is not a claim that every section has been translated. - [Project context, installation, measured scale and verification limits](https://phishdestroy.github.io/TgWitness/docs/reference/overview/index.md) - [English project summary](https://phishdestroy.github.io/TgWitness/llms.txt) - [Complete handbook · 繁體中文](https://phishdestroy.github.io/TgWitness/zh-Hant/llms-full.txt) - [Complete handbook as Markdown · 繁體中文](https://phishdestroy.github.io/TgWitness/zh-Hant/llms-full.md) - [Source code and release history](https://github.com/phishdestroy/TgWitness) - [Collection modes and evidence levels](https://phishdestroy.github.io/TgWitness/zh-Hant/guides/modes.md) - [Published checks and measurements](https://phishdestroy.github.io/TgWitness/docs/validation/index.md) ## Complete documentation map ### Guides - [瀏覽檔案庫](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/archive/index.md): 載入歷史紀錄、搜尋已儲存的記錄、檢視 AI 來源,並串接您的工具。 - [GitHub Actions 擷取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/index.md): 在臨時 GitHub runner 上選擇 Takeout、一般 API 匯出或聊天日誌. - [專用帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/dedicated-account/index.md): 請準備一個專用的 Telegram 帳號用於資料蒐集。 - [幾分鐘內即可開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/start/index.md): 透過一條指令安裝,連接 Telegram 帳號,即可在 Windows、Linux 或 macOS 上匯出可驗證的封存檔。 - [連結帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/accounts/index.md): 透過 QR 碼、電話號碼或會話匯入功能連接 Telegram。選擇資料來源,並確認新訊息已成功傳送至您的日誌。 - [選擇代理伺服器](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/proxies/index.md): 維護自動 MTProxy 路由,或使用您自己的代理伺服器。選擇 IP 模式、備用規則以及外部請求的路由。 - [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/index.md): 匯出擷取的 Telegram 通訊紀錄、驗證簽名,並將日誌與獨立見證人保留的檢查點進行比對。 - [了解證據如何運作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/concepts/index.md): 追蹤訊息從擷取到檢查點的整個過程。修改一個範例記錄,重新計算其 SHA-256 鏈,並觀察保留的檢查點會偵測到什麼變化。 - [跨所有聊天室進行調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/index.md): 針對頻道、群組、私人聊天及機器人,進行端到端的 Telegram 調查:包含整個帳戶的擷取、歷史紀錄、聯絡人、連結、檔案、時間軸及經驗證的證據。 - [建立「案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/case-board/index.md): 在私人看板上彙整已儲存的觀察結果、精確標記內容及操作片段,與團隊進行討論,並彙整成一份報告。 - [設計報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/index.md): 選擇報告資料、八種設計樣式之一及內容,接著預覽並匯出 HTML、已簽署的 PDF 或完整的證據包。 - [準備一份分享用副本](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/index.md): 選擇收件者可接收的紀錄與欄位,檢視最終版本,並驗證其已簽署的清單及來源日誌邊界。 - [管理一組帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/groups/index.md): 比較群組工作區、尋找來源、檢視觀察期間,並套用共享設定(可針對個別帳戶設定例外)。 - [確保安全](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/security/index.md): 了解會話、金鑰與證據的儲存位置、哪些資料會離開您的裝置、防護措施涵蓋的範圍,以及如何強化系統安全性。 - [分享案例](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/access/index.md): 讓審查員和分析師能夠存取選定的帳戶和聊天室,並設有獨立的權限、會話限制及可撤銷的存取憑證。 - [設定 Witness 機器人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/index.md): 透過獨立的見證者(配有專屬金鑰及唯讀收集器存取權限),將簽署過的日誌檢查點發佈至您的 Telegram 頻道。 - [讓它持續運作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/server/index.md): 請在具備持久儲存空間、私人控制台存取權限、備份功能,且重啟後能自動執行檢查的伺服器上運行 TgWitness。 - [找出問題所在](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/troubleshooting/index.md): 請透過針對各問題的正確訊號,檢查控制面板存取權限、Telegram 連線狀態、訊息遺失、FloodWait 及 Witness 狀態。 ### Reference - [秘密聊天:實作與示範](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/secret-chats/index.md): 請理解「秘密聊天」的獨立實作方式,試用虛構的介面,並檢視尚未解決的缺陷。 - [TgWitness:起始點、規模與證據](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/overview/index.md): 透過單一指令安裝,或於 GitHub Actions 上進行擷取。了解調查選項、已發布的規模,以及檔案庫所驗證的內容。 - [載入來源歷史紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/index.md): 從已啟用的來源載入過往訊息、暫停與恢復操作,並驗證經簽署的進度報告。 - [檔案分析](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/index.md): 搜尋已儲存的訊息、檢視 AI 輸入內容,並保存附有來源參考的分析報告。 - [命令列](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/index.md): 可透過腳本和代理程式進行搜尋、讀取上下文、統計活動次數,並匯出已儲存的訊息,具備 --json 輸出格式、穩定的退出代碼,以及範圍限定的唯讀憑證。 - [全文搜尋](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/index.md): 可透過詞形、精確短語、網域及 @用戶名 搜尋已儲存的訊息,結果依最符合的順序排列,且索引與簽名日誌綁定。 - [唯讀 MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/index.md): 將 MCP 客戶端連接到選定的工作區和聊天室,並賦予其具有有效期限且可撤銷的存取權限。 - [本地 OCR 與文字轉錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/index.md): 透過本地工作程序識別擷取的圖像與音訊;並將衍生的文字與其原始檔案保持關聯。 - [外發 Webhook](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/webhooks/index.md): 將特定範圍的事件傳送至 HTTPS 接收端,並附帶 HMAC 簽名、重試機制及傳送狀態。 - [操作員不相容通知](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/notice/index.md): 關於 Taylor Wessing 及其來源記錄的操作員公告。 - [授權說明及架構不相容聲明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/license/index.md): TgWitness 採用 MIT 授權,供所有人使用,並說明其為何在架構上與 Taylor Wessing 的工作流程不相容。 - [快速入門](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/index.md): 安裝與啟動 TgWitness 的各種方式:Windows 套件、Python、Docker 以及合成示範,並包含初步檢查步驟。 - [帳戶與會話格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/index.md): 可透過手機、QR 碼或授權金鑰登入,匯入 Telethon、Pyrogram 或 Telegram Desktop 的會話紀錄,並同時管理多個帳戶。 - [存取與權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/index.md): 針對帳戶和聊天室設定權限範圍、選擇權限、限制連線數與 IP 位址,並撤銷存取權限。 - [連線、代理伺服器與資料保護](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/index.md): 驗證、自動代理伺服器池、IP 模式、備用策略、外部請求及機密資料儲存。 - [部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/index.md): 可在 Windows、Linux、macOS 或 Docker 環境中,透過 HTTPS 運行 TgWitness 服務,並具備備份與更新功能。 - [資料蒐集原理](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/index.md): 觀察範圍、即時更新、重新核對、附件、使用者操作以及「缺口」的含義,皆以逐筆記錄的方式呈現。 - [工作流程與操作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/index.md): 控制面板的日常操作:運作模式、監控類別、參數、通知、匯出、備份及容量。 - [調查模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/index.md): 涵蓋頻道、群組、私人聊天及機器人的完整帳戶調查,從調查範圍到經核實的案件檔案包。 - [「案件看板」參考說明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/index.md): 書籤、精確標註、操作片段、討論、範圍限定存取,以及「案件看板」所使用的簽名註解歷史紀錄。 - [報告配置與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/index.md): 報告篩選器、八種設計範本、內容預設值、已儲存的變更歷史紀錄,以及簽署後匯出檔案中所包含的評估結果。 - [功能與限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/index.md): TgWitness 的現行蒐集模型、多帳號工作流程、匯出功能及操作範圍。 - [證據的運作方式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/index.md): 文中以驗證者實際使用的精確公式,詳盡闡述了雜湊鏈、簽名、檢查點及見證者的運作原理。 - [證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/index.md): 簽名 ZIP 檔案的內容、記錄類型、處理回執、使用者檔案、異地備份及離線驗證。 - [獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/index.md): 請使用具備專屬金鑰與機器人的「Witness」執行程序,將簽署過的檢查點發佈至頻道,並據此核對匯出資料。 - [時間戳記](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/index.md): 簽名檢查點的 RFC 3161 時間戳記:傳送至授權機構的內容,以及如何驗證回應。 - [安全性與資料處理](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/index.md): 威脅模型、存取模型、靜態機密資料、網路暴露風險、會話匯入,以及如何回報漏洞。 - [架構](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/architecture/index.md): 說明收集器、控制面板、日誌、工作節點及見證節點等組件,以及資料在這些組件間的流動方式。 - [已測試的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/index.md): Telegram 即時測試、自動化檢查、瀏覽器檢查,以及尚未經核實的內容。 - [更新紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/index.md): 按版本列出所有變更,包含尚未發布的變更。 - [面板指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/index.md): 面板中的每個畫面:聊天、日誌、來源、匯出、額外功能、保護模式以及程式碼檢查。 - [首次設定與設定選項](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/index.md): 設定精靈、目標、介面層級、連線路徑,以及由帳戶群組共享的設定。 - [安裝、驗證與更新](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/index.md): 只需一則指令即可安裝、檢查簽名與雜湊值,並更新或移除安裝。 - [儲存與還原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/index.md): 備份功能、將舊檔案移至您的雲端儲存空間、在 Object Lock 下的副本,以及在新裝置上的資料恢復。 - [帳戶匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/index.md): 匯出該帳號當前可讀取的內容:範圍、可恢復的任務、經簽名的存檔,以及已最小化的共享副本。 - [公開展示](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/showcase/index.md): 透過會過期且可撤銷的連結,發佈所選公開頻道的已儲存訊息及經簽名的快照。 - [高可信度部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/index.md): 位於 Hetzner 或 Phala Cloud 上的全天候密封伺服器、Gateway DNS,以及第三方可重複驗證的檢查機制。 --- # Telegram · 幾分鐘內即可開始使用 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/start/ 透過一條指令安裝,連接 Telegram 帳號,即可在 Windows、Linux 或 macOS 上匯出可驗證的封存檔。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 只需一則指令即可安裝,連結 Telegram 帳號並選擇要儲存的內容。 ## 安裝至您的電腦 安裝程式包含 Python 及其依賴項。請從聊天記錄匯出開始;待需要時,再新增觀察與調查工具。 ### Linux / macOS ``` curl -fsSL https://get.destroy.tools/install.sh | bash ``` ### Windows · PowerShell / CMD ``` powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "irm https://get.destroy.tools/install.ps1 | iex" ``` Ubuntu 伺服器:以 root 身分執行。桌面版:以您的一般使用者身分執行。 開啟安裝程式顯示的面板網址,並使用其存取金鑰。接著連結您的 Telegram 帳號。面板金鑰與您的 Telegram 授權是分開的。 [安裝、簽名與更新](https://phishdestroy.github.io/TgWitness/docs/reference/installation/) 說明已下載的建置檔、本地存取及伺服器選項。[原始碼與 Docker 操作說明](https://phishdestroy.github.io/TgWitness/docs/reference/quickstart/) 仍可使用。 ## 選擇您的第一個任務 1. [透過電話號碼、QR 碼或受支援的會話匯入功能連接](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/accounts/) 帳戶。 2. 選擇聊天室、資料夾或帳戶範圍。 3. [匯出選取的歷史紀錄](https://phishdestroy.github.io/TgWitness/docs/reference/account-export/),或開始監測以記錄未來的變更。 4. [將檔案](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/) 與另一組受信任的金鑰指紋進行比對驗證。 ## 使用臨時 GitHub Runner [《GitHub Actions 操作指南》](https://phishdestroy.github.io/TgWitness/docs/capture/) 將引導您完成分支、授權、範圍及存檔密碼的設定。執行完成後,請下載加密結果及其工作流程溯源資訊。此工作流程無需永久性的收集器伺服器。 ## 無需註冊即可瀏覽 [開啟瀏覽器示範版](https://phishdestroy.github.io/TgWitness/demo/?lang=zh-Hant),以探索虛構訊息、比較編輯內容並檢視匯出檔案,再進行任何安裝。 ![TgWitness 對話檢視畫面及範例訊息](https://phishdestroy.github.io/TgWitness/assets/chats-dark.png) 一個範例工作區。您的個人日誌將另行建立。 ## 繼續調查 針對持續進行的工作,請根據您的案例需求,新增所需的來源、檔案政策、搜尋、報告及分享權限。[啟動、擴展與證據;](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) 說明相關選項及已發布的測量結果。 若要進行伺服器安裝,請參閱「[保持運作」指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/server/)。 --- # 請使用獨立的帳戶。切勿使用您的主要帳戶。 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/dedicated-account/ 請準備一個專用的 Telegram 帳號用於資料蒐集。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 連接帳戶前請先閱讀 我們建議您不要使用主要帳戶,這絕非玩笑,而是現實。 主帳戶 - 您應用程式的雜湊值:99% 已登出 - 僅因「低信任度」而遭封禁的情況屢見不鮮 - 使用它真是個極其愚蠢的主意 公開對中的額外帳戶 - 透過這些組合註冊的帳戶已超過一百萬個 - 這些配對已運作超過 5 年 - 透過這些介面,任何人都無法窺見您的任何資訊 01 ## 為何不使用您的主要帳號 這是準確的資訊。我們確切知道這些問題的陷阱所在。 1. ### 您應用程式的雜湊值:99% 已登出 若從您無權存取的帳戶登入 my.telegram.org 以取得應用程式雜湊值,隨後透過該應用程式雜湊值發送任何請求,則該帳戶有 99% 的機率已被登出。您可以自行驗證。 2. ### 僅因「低信任度」而遭封禁的情況屢見不鮮 帳戶被封禁純粹是因為 Telegram 不信任它們,且此類封禁情況屢見不鮮。您也可以自行查證。使用自己的帳戶實在是個極其愚蠢的主意。 3. ### 已複製的會話金鑰可被撤銷 若同時在 Telegram Desktop 和 TgWitness 中執行已匯入的 TData/會話金鑰,可能會觸發 `AUTH_KEY_DUPLICATED` 錯誤。Telegram 會使該授權失效,因此兩份副本均需重新登入。即使使用專用帳戶也無法避免此情況。 請完全退出原始客戶端,並在使用其匯入的會話期間保持該客戶端關閉。若需並行使用,請透過手機或 QR 碼登入 TgWitness 以建立獨立的授權;其他已獲得獨立授權的客戶端可保持登入狀態。 [請閱讀會話匯入警告](https://phishdestroy.github.io/TgWitness/demo/guide.html?lang=zh-Hant#session-warning) Telegram 文件 - [登出錯誤:AUTH_KEY_UNREGISTERED、SESSION_REVOKED](https://core.telegram.org/api/errors) - [建立您自己的應用程式雜湊值:取得 api_id](https://core.telegram.org/api/obtaining_api_id) 02 ## 為何 TgWitness 透過公開的應用程式雜湊值/應用程式 ID 配對運作 這就是為什麼我們以公開的應用程式雜湊值/應用程式 ID 配對為基礎建構 TgWitness。依我們的邏輯,使用這些配對被封禁的機率較低:已有超過一百萬個 Telegram 帳號透過這些配對註冊,且許多不同的程式皆能透過它們運作。 依我們的邏輯,這比直接使用個人應用程式哈希更為穩妥:這些組合肯定已存在超過 5 年。 ### 您自己的新密鑰對 由該帳號於 my.telegram.org 建立。 - 約 99% 的帳戶已登出 - 一個新應用程式,一個帳戶 ### 池中的公開金鑰對 這與許多程式所使用的組合相同。 - 註冊帳戶數已突破一百萬 - 許多不同的程式 - 擁有 5 年以上工作經驗 ### 為何透過這對裝置,無人能窺見您的任何資訊 - #### 該對組合是一個名稱,而非金鑰 當程式連線或請求登入碼時,Telegram 會要求提供 API ID 和 API 雜湊值。這些資訊僅用於識別應用程式,並不會授予任何帳戶的存取權限;Telethon 的文件中指出,一組 API ID 與 API 雜湊值可適用於任何電話號碼。 - #### 您的會話金鑰絕不會離開您的伺服器 登入時,系統會透過您的 TgWitness 與 Telegram 之間的 Diffie–Hellman 交換機制生成授權金鑰;該金鑰本身絕不會被傳送出去。根據 Telegram 的文件說明:授權完成後,該金鑰將與使用者綁定,且所有使用此金鑰的呼叫皆以該使用者身分執行。其他擁有相同密鑰對的程式各有其專屬金鑰,無法使用您的金鑰。 - #### 流量將使用您的金鑰進行加密 每個請求與回應皆使用該會話的授權金鑰進行加密,而非使用 API 雜湊值。即使知曉 API 雜湊值,也無法解密任何內容。 - #### 該對的擁有者無法看到任何內容 Telegram 沒有任何方法可根據 API ID 列出帳戶、會話或訊息。一對帳戶的所有者僅能在 my.telegram.org 上查看其應用程式設定。 - #### 僅您的帳戶能識別該應用程式是哪一款 您個人帳戶的「設定 → 裝置」中,會列出每個連線的應用程式名稱、API ID、裝置、IP 位址及日期。此清單僅您本人可見,不會提供給任何其他人。 Telegram 文件 - [使用者授權:密鑰即使用者](https://core.telegram.org/api/auth) - [auth.sendCode: api_id, api_hash](https://core.telegram.org/method/auth.sendCode) - [initConnection](https://core.telegram.org/method/initConnection) - [建立授權金鑰](https://core.telegram.org/mtproto/auth_key) - [MTProto 加密](https://core.telegram.org/mtproto/description) - [account.getAuthorizations](https://core.telegram.org/method/account.getAuthorizations) - [會話記錄的內容](https://core.telegram.org/constructor/authorization) - [取得 api_id](https://core.telegram.org/api/obtaining_api_id) - [Telegram 應用程式的開源程式碼](https://telegram.org/apps#source-code) 資源庫與討論區 - [Telethon:登入](https://docs.telethon.dev/en/stable/basic/signing-in.html) - [opentele:官方應用程式 API](https://opentele.readthedocs.io/en/latest/documentation/authorization/api/) - [opentele: TelegramClient](https://opentele.readthedocs.io/en/latest/documentation/telethon/telegramclient/) - [Stack Overflow:是否應將 api_hash 保密?](https://stackoverflow.com/questions/49490818/should-telegram-api-hash-be-kept-secret) ### 其他程式中的相同字串對 7 這對官方 Telegram 應用程式是公開的,並已內建於許多獨立程式和函式庫中: - [opentelePython · src/api.py](https://github.com/anmv/opentele/blob/4df17bd8c443d6452afc5a2d29ec7922fad1a5c3/src/api.py#L575) - Desktop 2040 - Android 6 - Telegram X 21724 - iOS 10840 - macOS 2834 - Web 2496 - [opentele2Rust · opentele2-core/src/api.rs](https://github.com/DedInc/opentele2/blob/7e973bc71cd7a714ad13ac703c0895a90d36a735/crates/opentele2-core/src/api.rs#L641) - Desktop 2040 - Android 6 - Telegram X 21724 - iOS 10840 - macOS 2834 - Web 2496 - [GrampoPython · Grampo/ut/api.py](https://github.com/abbas-bachari/Grampo/blob/00aa662d853c4ac2180432371c5e0d9444bbfe9e/Grampo/ut/api.py#L526) - Desktop 2040 - Android 6 - Telegram X 21724 - iOS 10840 - macOS 2834 - Web 2496 - [tgmanagePython · api/schemas/api_app.py](https://github.com/xdsnich/tgmanage/blob/f67c46be0ab234bd04526a8663d3936bd98a8597/api/schemas/api_app.py#L47) - Android 6 - iOS 8 - Desktop 2040 - macOS 2834 - Telegram X 21724 - Web K 2496 - [LyChatBotTDLib · helpers/tdlib/index.js](https://github.com/LyoSU/LyChatBot/blob/fac0ae5d5f2cddb8a26312014f51c0f6f40ec191/helpers/tdlib/index.js#L11) - macOS 2834 - [hsadasdPython · config.py](https://github.com/herobrinovaleksandr-png/hsadasd/blob/6842c74895038c16e219324fcd07dbe8153f37f0/config.py#L68) - Desktop 2040 - Desktop 17349 - Telegram X 21724 - macOS 2834 - iOS 10840 - Web 2496 - +4 - [blb.teamblb.team/threads/…294](https://blb.team/threads/app-hash-app-id-ofitsial-nykh-kliyentov.294/) - Android 4 · 5 · 6 - iOS 8 - Desktop 2040 - Desktop 17349 - macOS 2834 - Telegram X 21724 論壇上公布的官方應用程式配對清單,供註冊帳戶使用 03 ## 建立額外帳戶的方法 Telegram 帳戶需要一個可接收登入驗證碼的電話號碼。請根據該帳戶的預期使用期限來選擇。 - 最佳選擇 ### 預付 SIM 卡或 eSIM ******** 最後 只要您保持餘額充足 請注意 最可靠的方式:Telegram 最能接受真實的行動電話號碼。電信業者收回的號碼會分配給其他人。 - ### 虛擬號碼應用程式 ******** 最後 雖然該應用程式會保留數量 請注意 Telegram 可能會拒絕虛擬號碼、不發送驗證碼,或立即限制新帳戶的使用;部分應用程式會收回未使用的號碼。 - ### 租用編號 ******** 最後 租賃期間 請注意 當此號碼用完時,將轉給下一位客戶。 - ### 一次性啟用 ******** 最後 一段程式碼 請注意 該號碼會立即返回號碼池,通常會附帶先前持有者的使用紀錄。請務必在執行任何其他操作之前,先設定雲端密碼。 日後持有該號碼者可請求登入碼。雲端密碼(兩步驟驗證)可阻止其登入;若未提供該密碼,該帳號將歸屬於該號碼的下任持有者。 Telegram 文件 - [垃圾訊息常見問題:虛擬號碼與前任持有者](https://telegram.org/faq_spam) - [兩步驟驗證](https://core.telegram.org/api/srp) ### 租用的 +888 號碼(Fragment) 部分市場平台及服務提供透過 Fragment 臨時租用 Telegram 官方 +888 號碼的服務。 預估價格:每日 20 美元。 - 您可直接在 Telegram Web 或 Telegram Desktop 上註冊帳號。 - 您可以刪除該號碼下的帳戶並建立新帳戶。 - 此類帳號通常面臨較少的反詐欺檢查,但並不提供豁免權或特殊特權。 該號碼並非您所有。租用期滿後,所有者可取回該號碼。請立即設定雲端密碼,且切勿將此帳號視為長期使用。 自行持有 +888 號碼,或使用您所掌控的預付 SIM 卡,仍是較為可靠的作法。 ### 來自交易平台的現成帳號 部分交易平台(例如 G2G 或 Z2U)販售現成的 Telegram 帳號——包括新帳號、已使用一段時間的帳號,或附帶會話檔案的帳號。 - [G2G:Telegram 帳號列表](https://www.g2g.com/uk/categories/telegram-accounts) - [Z2U:Telegram 帳號列表](https://www.z2u.com/telegram/accounts-5-15140) 切勿使用您的主要帳號!透過此方式建立的專用帳號,仍比將您的主要 Telegram 帳號加入 TgWitness 更為安全。 #### 購買前的警告 - 此舉違反 Telegram 的《服務條款》。 - 許多帳號屬批量註冊(自動註冊)或歷史背景不明。 - 部分賣家可能仍保有恢復權限。 - 來自此類市場的帳號事後經常會遭到封禁或限制。 - 請避免使用那些公開販售帳戶竊取工具、釣魚工具或明顯為盜取帳戶的市集。 - 從公開販售釣魚工具、竊取程式、盜取的會話或帳戶的平台上購買帳戶——即使是標榜「自動註冊」的帳戶——不僅違反 Telegram 的《服務條款》,也違反大多數國家的法律。此舉日後可能導致您的證據失效。請謹慎選擇。 #### 若您使用此選項 1. 請將此帳號視為一次性帳號。 2. 請立即終止所有其他連線、設定雲端密碼,並變更帳戶恢復方式。 3. 請使用 2 至 3 個來自不同服務供應商的帳戶,或您自行註冊的帳戶。 **Premium、刪除與七天延遲** 若該帳號已啟用 Premium 服務,即使有人取得該電話號碼,也無法立即刪除該帳號。您將收到通知,並有七天的時間在帳號被刪除前採取行動。 此事至關重要,因為您的調查取決於該帳號:您仍有時間準備替代方案。 **新帳號與 API 憑證** 若您透過自行註冊的新帳號(使用簡訊服務提供的號碼)取得並使用專屬的 api_id/api_hash,該帳號將在首次 API 請求或會話授權時被登出。規劃調查時請務必謹記此點。 04 ## 建立帳戶 從一個數字到首則記錄的聊天內容。 1. ### 取得一個數字 若帳戶需長期使用,請選用預付 SIM 卡或 eSIM;若僅需短期作業,則可選擇租用或一次性啟用方案。相關服務列表如下。 2. ### 請使用與您的主要帳戶不同的帳戶進行註冊 請在官方 Telegram 應用程式中,透過獨立裝置、模擬器或手機設定檔進行註冊,切勿與您的主要帳戶並存。 3. ### 使用雲端密碼進行鎖定 請立即設定一個僅用於此處的雲端密碼及備用電子郵件。 4. ### 關閉隱私設定 電話號碼 **「無人**」,「透過我的號碼找到我」;「**我的聯絡人**」、「最後一次上線」、「個人頭像」及「個人簡介」;**「無人」**或「**我的聯絡人**」;請關閉聯絡人同步功能。 5. ### 防止其自動銷毀 請將帳戶自動銷毀設定為最長期限,以免 TgWitness 停止運作時導致您失去該帳戶。 6. ### 賦予其中立的形象 請勿使用您其他帳戶的名稱、照片、使用者名稱或個人簡介,亦請勿提供個人聯絡資訊。 7. ### 讓它預熱一下 起初每天加入幾個聊天室即可。新帳號若過於倉促,將首先受到限制。 8. ### 切勿與機器人分享任何資訊 切勿為任何機器人點擊「分享電話號碼」或「分享位置」。請透過該裝置上的 VPN 或代理伺服器開啟連結及 Mini Apps。 9. ### 將其連接到 TgWitness 在您自己的工作區中,透過「**帳戶 → QR 碼**」進行連線,然後點選「**來源 → 調查模式」**。應用程式是您採取行動的地方,TgWitness 則是記錄的載體。 Telegram 文件 - [兩步驟驗證](https://core.telegram.org/api/srp) - [隱私權設定](https://core.telegram.org/api/privacy) - [帳戶自動銷毀](https://core.telegram.org/method/account.setAccountTTL) 05 ## 服務編號 起始選項。國家、價格以及 Telegram 是否允許變更號碼等資訊經常變動;付款前請務必確認。 ### 預付 SIM 卡與 eSIM 11 - [SMARTYsmarty.co.uk](https://smarty.co.uk) - UK - SIM - [VOXIvoxi.co.uk](https://www.voxi.co.uk) - UK - SIM - [iD Mobileidmobile.co.uk](https://www.idmobile.co.uk) - UK - SIM - [Threethree.co.uk](https://www.three.co.uk) - UK - SIM - [Asda Mobilemobile.asda.com](https://mobile.asda.com) - UK - SIM - [Ultra Mobileultramobile.com](https://www.ultramobile.com) - US - 預付 PayGo 方案,價格非常便宜 - [US Mobileusmobile.com](https://www.usmobile.com) - US - 預付 - [Mint Mobilemintmobile.com](https://www.mintmobile.com) - US - 預付 - [Tracfonetracfone.com](https://www.tracfone.com) - US - 預付 - [eSIM Plusesimplus.me](https://esimplus.me) - eSIM - [Numero eSIMnumeroesim.com](https://numeroesim.com) - eSIM ### 虛擬號碼應用程式 20 - [Google Voicevoice.google.com](https://voice.google.com) - US 僅限美國;註冊需提供美國電話號碼 - [TextNowtextnow.com](https://www.textnow.com) - US - CA 若未使用該號碼,系統將收回該號碼 - [TextFreetextfree.us](https://www.textfree.us) - US - [2ndLine2ndline.co](https://www.2ndline.co) - US - CA - [Talkatonetalkatone.com](https://www.talkatone.com) - US - [TextMego-text.me](https://go-text.me) - US - CA - 其他國家 - [textPlustextplus.com](https://textplus.com) [Google Play](https://play.google.com/store/apps/details?id=com.gogii.textplus) - [FreeToneGoogle Play](https://play.google.com/store/apps/details?id=com.textmeinc.freetone) - US [TextMe Up · textmeup.com](https://www.textmeup.com) - [Nextplusnextplus.me](https://nextplus.me) - US - [Dingtonedingtone.me](https://www.dingtone.me) - US - CA - [Burnerburnerapp.com](https://www.burnerapp.com) - US - CA - 付費 附帶試用期 - [Hushedhushed.com](https://hushed.com) - 許多國家 - 付費 廉價 - [Sidelinesideline.com](https://www.sideline.com) - US - [MySudomysudo.com](https://mysudo.com) - US - CA - UK - [2NumberGoogle Play](https://play.google.com/store/apps/details?id=com.bpmobile.second.phone) [App Store](https://apps.apple.com/app/id1216135390) - [SLYNUMBERslynumber.com](https://slynumber.com) [Google Play](https://play.google.com/store/apps/details?id=com.dev.slynumber) - [Phonerphonerapp.com](https://phonerapp.com) - [Onoffonoff.app](https://www.onoff.app) - EU 應用程式中的歐洲手機號碼 - [Sonetelsonetel.com](https://sonetel.com) - 許多國家 - 免費號碼 - [Zadarmazadarma.com](https://zadarma.com) - 許多國家 虛擬號碼 ### 租用與啟用次數 12 租用服務會保留號碼數週或數月。一次性啟用僅提供單一代碼:請於註冊後立即設定雲端密碼。 - [OnlineSimonlinesim.io](https://onlinesim.io) - 租賃 - 啟用 - [SMSPVAsmspva.com](https://smspva.com) - 租賃 - 啟用 - [5SIM5sim.net](https://5sim.net) - 租賃 - 啟用 - [SMSPoolsmspool.net](https://www.smspool.net) - 租賃 - 一次性 - [VAK-SMSvak-sms.com](https://vak-sms.com) - 租賃 - 啟用 - [TextVerifiedtextverified.com](https://www.textverified.com) - 租賃 - 啟用 - [JuicySMSjuicysms.com](https://juicysms.com) - 租賃 - 啟用 - [365SMS365sms.org](https://365sms.org) - 租賃 - 啟用 - [SIMSMSsimsms.org](https://simsms.org) - 租賃 - 啟用 - [GrizzlySMSgrizzlysms.com](https://grizzlysms.com) - 一次性 - [SMS-MANsms-man.com](https://sms-man.com) - 一次性 - [Tiger SMStiger-sms.com](https://tiger-sms.com) - 一次性 --- # Telegram · 連結帳戶 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/accounts/ 透過 QR 碼、電話號碼或會話匯入功能連接 Telegram。選擇資料來源,並確認新訊息已成功傳送至您的日誌。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 一個工作區 = 一個帳戶、它的日誌和它的金鑰。 ## 選擇登入方式 **帳戶** → 新增工作區 → 連線設定。請為此使用另一個帳戶。 - **QR 碼:**在 Telegram 的「裝置」畫面掃描並確認。 - **電話號碼:**號碼、驗證碼,若有兩步驟驗證再輸入密碼。 - **匯入工作階段:**您自己的工作階段檔案或 Telegram Desktop 資料。 使用內建 API 設定檔或您自己的 API ID 和 hash。它只用來識別應用程式,不會讓您登入,也不會隱藏任何東西。 **需要先設定代理伺服器嗎?** 您可以在登入前[選擇並測試連線路徑](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/proxies/)。每個帳戶皆有其專屬的路徑。 ## 選擇監測對象 1. 選擇您需要的聊天室、群組或頻道。 2. 檢查收集設定,包括媒體。 3. 啟動後檢查連線和最近活動。 帳戶必須有存取權。管理員和成員看到的內容不同,日誌顯示的是這個帳戶收到的內容。 整個帳戶?**來源 → 觀察範圍 → 調查模式**,檢查後按**儲存範圍**。完整步驟:[調查整個帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/)。 ## 檢查完整路徑 在測試群組中,用另一個帳戶傳送一則訊息,編輯它,再刪除它。這三個事件都應出現在日誌中。然後[匯出並驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/)。 「已連線」表示連線正常。捕捉到測試訊息才代表事件確實送達。 ## 新增另一個帳戶 在**帳戶**中新增工作區,步驟相同。請記下每個帳戶的金鑰指紋,以便日後區分匯出。 --- # Telegram · 選擇代理伺服器 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/proxies/ 維護自動 MTProxy 路由,或使用您自己的代理伺服器。選擇 IP 模式、備用規則以及外部請求的路由。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 保持帳戶上線,並由您自己決定它是否可以顯示伺服器的 IP。 ## 請先選擇 IP 模式 01**隱藏網址** 僅使用代理。如果都無法使用,就等待。 02**直接作為最後手段** 延遲後直接連線,一旦有代理可用就切回代理。 03**伺服器需透過隧道或 VPN 連線** 可以直接連線。它不會替您設定或檢查 VPN。 路徑決定連線方式。IP 模式決定是否允許直接連線。 ## 讓池來維護路徑 1. **帳戶 → 設定 → 連線設定**。 2. 選擇 IP 模式和**自動 MTProxy**,或固定路由。 3. 儲存,然後**測試 Telegram 連線**(登入前也能用)。 4. 開始收集,並傳一則測試訊息給自己。 新工作區預設使用自動 MTProxy 並開啟**隱藏網址**。代理池會拉取四個公開清單,檢查伺服器,保留好用的,替換失效的。 ## 請使用您自己的代理伺服器 SOCKS5、HTTP CONNECT、Telegram 代理連結或營運方目錄。切換前請暫停觀察。Fake TLS 密鑰(`ee`…)無法使用。 **輪替、分享與重試設定** **參數 → 自動 MTProxy**:失敗門檻、冷卻時間、輪替、每個代理的帳戶數。上限為 1 表示帳戶寧可等待也不共用。不同的代理仍可能共用同一個出口 IP。 ## 將 Telegram 與外部請求區分開來 MTProxy 只承載 Telegram 流量。時間戳記、通知、副本和程式碼檢查走另外的 SOCKS5/HTTP 代理、帳戶的 SOCKS5/HTTP 路由,或在模式允許時直接連線。也可以關閉它們。 `TGWITNESS_PROXY_FEED_PROXY` 設定下載清單所用的路由。[見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/)有自己的設定。這些都不會影響您的瀏覽器或系統網路。 更多:[模式和預設值](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/#ip-modes),[誰可以變更路由](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/access/)。 --- # Telegram · 匯出與驗證 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/ 匯出擷取的 Telegram 通訊紀錄、驗證簽名,並將日誌與獨立見證人保留的檢查點進行比對。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 交給對方能自行對照您的工作區核對的檔案。 保留參考資料匯出已簽署的 ZIP 檔案收件者驗證 不熟悉簽名和檢查點?[修改一筆範例紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/concepts/#chain),看看哪項檢查會發現它。 想將副本存放在收集者之外的地方嗎?請前往 [S3 設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/#s3)、[Object Lock](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/#s3-retention) 或[驗證式還原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/#s3-restore)。 ## 保留可信的參考資料 請把工作區金鑰指紋記在收集器以外的地方。收集期間,也請將簽名檢查點存放在別處,或執行[獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/)。接收方正是用這些來核對金鑰和日誌的早期狀態。 ## 下載已簽署的 ZIP 檔案 **匯出** → 簽名證據 ZIP。其中包含完整日誌和簽名檔案清單。可在 [Report studio](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/) 中製作易讀的報告,或只將選定資料作為[移交擷取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/)傳送。 HTML、PDF 和 JSON 報告帶有各自的封印。CSV 只是工作副本;若需完整性,請使用已驗證 ZIP 內的 CSV。 ## 請使用可信賴的 TgWitness 副本進行驗證 在專案環境中,使用您自己的指紋和路徑: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.json ``` 通過時會顯示 `key_pinned: true` 和 `checkpoint_checked: true`。請將該輸出與封存檔放在一起。檢查點必須位於匯出結尾或之前。 ## 使用驗證結果 - **檔案:**清單綁定它們的雜湊,簽名綁定日誌。任何變更都會顯現。 - **身分:**您保存的指紋證明這就是您預期的金鑰。 - **早期狀態:**檢查點將匯出與移交前保存的日誌前綴進行比較。 - **涵蓋範圍:**空缺、擷取結果以及「傳送 → 編輯 → 刪除」測試,顯示這套設定實際捕捉到什麼。 詳細資訊:[驗證能證明什麼、不能證明什麼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)。 ## 設定 S3 異地備份 在工作區中開啟**匯出 → 異地副本**。支援 AWS S3 以及任何相容 S3 的儲存空間。它會複製日誌區段、已儲存的檔案、附時間戳記的檢查點和已完成的聊天匯出,每一項在離開收集器之前都以 `AES-256-GCM` 加密。 線上展示版會顯示這些控制項,但上傳已關閉。請只在您自己的安裝中輸入真實憑證。 [![完整的異地複製設定面板:終端點、區域、儲存桶、存取金鑰、排程、物件鎖定及復原金鑰控制](https://phishdestroy.github.io/TgWitness/assets/off-site-copy.png)](https://phishdestroy.github.io/TgWitness/assets/off-site-copy.png) 已展開包含進階選項的完整控制面板。畫面中未顯示任何儲存憑證。 | 領域 | 輸入內容 | | --- | --- | | 端點 | 儲存空間 URL,不含 bucket 路徑或憑證。範例:`https://s3.example.invalid`。 | | 地區 | 依服務商要求填寫。預設 `us-east-1`。 | | 儲存桶 | 一個您有寫入權限的現有 bucket。範例:`example-case-backup`。 | | 儲存桶中的資料夾 | 前綴,預設 `tgwitness`。其上還會加上每個工作區的前綴。 | | 存取金鑰 ID / 秘密存取金鑰 | 兩者一起填寫,儲存在金庫中。之後兩者都留空即可保留原值。 | | Path 風格的網址 | 開啟:`endpoint/bucket`。關閉:`bucket.endpoint`。視服務商而定。 | | 複製間隔 | 1 至 1,440 分鐘,預設 5。僅在應用程式執行時有效。 | | Object Lock 資料保留 | 天數和模式,前提是 bucket 支援 Object Lock。填 0 則保留 bucket 預設值。 | 1. 建立 bucket,在不勾選**保留異地副本**的情況下填寫目的地和憑證,按**儲存異地副本**。 2. **測試連線**會上傳一個加密的測試物件。 3. **下載加密金鑰**,並存放在遠離收集器的地方。沒有金鑰就無法復原。 4. 勾選**保留異地副本**,儲存,然後**立即複製**,或讓排程執行。 ## 檢查資料保留狀況與複製進度 在**更多選項**中選擇保留天數以及 `GOVERNANCE` 或 `COMPLIANCE`。TgWitness 會從已上傳的物件讀回保留設定並告訴您:已確認、缺少或檢查失敗。 面板顯示上一輪、物件數量、位元組、已複製的日誌邊界和錯誤。遺失的本機檔案會被回報並在下一輪重試,其餘內容繼續複製。 上傳可走直接連線、SOCKS5 或 HTTP。若路由只有 MTProxy,副本會帶著錯誤等待。 ## 請將恢復金鑰另行存放 金鑰 JSON 包含解密金鑰、目的地、前綴和金鑰指紋。復原時需要它以及具讀取權限的儲存空間憑證。 變更了端點、bucket 或前綴?請重新下載金鑰。新的副本會從新目的地開始;舊的聊天匯出留在原處。 ## 在另一台機器上還原並驗證 您需要一個可信任的 TgWitness 安裝、金鑰 JSON、唯讀儲存空間憑證和一個空資料夾: ### Windows PowerShell ``` $env:TGWITNESS_S3_ACCESS_KEY = 'YOUR_READ_ACCESS_KEY' $env:TGWITNESS_S3_SECRET_KEY = 'YOUR_READ_SECRET_KEY' python -m tgwitness.replica restore --key-file tgwitness-replica-key.json --out restored-evidence ``` ### Linux / macOS ``` export TGWITNESS_S3_ACCESS_KEY='YOUR_READ_ACCESS_KEY' export TGWITNESS_S3_SECRET_KEY='YOUR_READ_SECRET_KEY' python -m tgwitness.replica restore --key-file tgwitness-replica-key.json --out restored-evidence ``` 所有內容會先在私人暫存資料夾中檢查:完整日誌、檢查點、檔案雜湊和大小。不安全的路徑、互相衝突的區段,或比其檢查點更短的日誌都會導致失敗,此時不會寫出任何內容。 成功後您會得到 `events.jsonl`、`media/`、`checkpoints/` 和 `exports/`。請將指令的 JSON 輸出與它們放在一起,並與您自己保存的檢查點或見證紀錄比較。 --- # Telegram · GitHub Actions 擷取 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/ 在臨時 GitHub runner 上選擇 Takeout、一般 API 匯出或聊天日誌. [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 在臨時 GitHub runner 上選擇 Takeout、一般 API 匯出或聊天日誌. 請啟用 JavaScript 以產生金鑰並解密您的檔案庫。 **完整參考資料** [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [Documentation](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [Independent capture](https://github.com/phishdestroy/TgWitness/blob/main/docs/OPTIONAL-CAPTURE.md) ![Independent capture](https://phishdestroy.github.io/TgWitness/assets/chapter-capture.svg) **Preview available from `main`.** A fork launches a pinned reusable workflow from `phishdestroy/TgWitness`. The workflow exports an account, selected chats or one chat's event journal using a newly created Telegram session, attests the evidence ZIP or multipart manifest, and uploads only recipient-encrypted handoffs. The normal administration panel is not exposed. Choose `client=official_web` to run the [official-client witness](https://github.com/phishdestroy/TgWitness/blob/main/docs/OFFICIAL-WITNESS.md) with guarded Telegram Web controls and video. It requires your own upstream proxy and observes one rendered chat. The default `client=api` retains the full-account export modes described below. The verifier checks the archive against its GitHub attestation, the approved workflow and collector commits, and the signed journal and attachment hashes. The collection process uses pinned upstream code and fresh storage. A reviewer can inspect that code and verify the delivered archive against its recorded run. **On this page** - [User flow](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#user-flow) - [Session time budget](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#session-time-budget) - [Choose this mode or a persistent workspace](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#choose-this-mode-or-a-persistent-workspace) - [What is public, and what must stay private](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#what-is-public-and-what-must-stay-private) - [Troubleshooting](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#troubleshooting) - [Local decryption and verification](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#local-decryption-and-verification) - [How the fork is kept outside the capture process](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#how-the-fork-is-kept-outside-the-capture-process) - [Cryptographic handoff](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#cryptographic-handoff) - [Limits and validation](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#limits-and-validation) - [Maintainer release sequence](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/#maintainer-release-sequence) ## User flow The helper explains the five stages and lets you try message or collector substitution on sample data. **Start my capture** opens the wizard. 1. Choose **GitHub Actions capture (preview)** on the project homepage, the workspace login screen, or **Exports → Open capture helper**. You can also open the [official helper](https://phishdestroy.github.io/TgWitness/sealed.html?lang=en) or `tgwitness/static/capture.html` from a trusted checkout in a modern browser. The helper makes no network requests for key or file processing. The helper supports the site's interface languages; the temporary collection panel supports English and Russian. 2. Generate a key and save **sealed-key.json**. This is the only private decryption key. Copy the separate public **recipient** value. Losing the private key loses access to both the connection and the archive. Confirm that you saved it to unlock the next step. If you already have a delivery file, load the saved key and choose **I already have an archive**. 3. Fork TgWitness, enable Actions in the fork, and run **Sealed chat capture**. Paste the public recipient and choose 30, 60, or 120 minutes. Never put a phone number, login code, Telegram password, private key, or session in workflow inputs, commits, issues, or logs. 4. During the run, download **sealed-connection** from Artifacts and unzip it. Load `connection.tgwsealed` in the helper, using the saved private key. The resulting link contains a random access secret in its URL fragment. Keep this link private. The panel removes the fragment and keeps the secret in this tab's session storage; it is not placed in HTTP access logs. 5. Open the connection link. Sign in with a QR code, or with your phone number and the login code. Enter your two-step verification password if Telegram asks for it. The built-in API credential pool is used by default, just like the normal workspace. You may expand the optional custom credentials section and enter both `api_id` and `api_hash` from [my.telegram.org/apps](https://my.telegram.org/apps). Leave both fields empty to use the built-in pool; a partial or malformed pair is rejected. Session imports are not allowed. Choose the export mode and scope. The connection link contains an access secret: keep it private. 6. Choose **Telegram Takeout**, **Regular Telegram API** or **Chat event journal**. For account export, choose all accessible chats or load and select one or more chats, then set dates, chat types, account categories and attachment rules. Check settings and size, optionally save the settings JSON for an independent reviewer, then press **Start capture**. Settings are fixed after starting. Resume works only while this runner exists; finishing early preserves acquired data and records gaps. Deadline expiry after starting produces an explicitly partial archive; expiry before starting or cancellation produces no archive. 7. Wait for **sealed-result**, download and unzip it, and decrypt `delivery.tgwsealed` in the helper. You receive `delivery.zip`, containing `evidence.zip`, `attestation.jsonl`, and instructions. Browser decryption is limited to 256 MiB; larger packages use the streaming local command below. Large results also include `delivery-NNNNNN.tgwsealed` parts; the main `delivery.tgwsealed` then contains `evidence.parts.json` and the attestation. Download every part and assemble locally as described below. 8. End the temporary session in Telegram Settings → Devices if revocation was not confirmed or the runner was killed. Normal completion attempts logout; network failures and forced runner termination prevent an absolute guarantee. The repository must contain the published pinned source and reusable-workflow commits. A local branch alone cannot be invoked by another GitHub repository. ## Session time budget Before collection, **Calculate time and size** estimates the selected history and files from message counts and a bounded sample. The display includes time already spent signing in, estimated collection time and a reserve for packaging. For files, the initial estimate uses 1 MiB/s and a twofold time margin; progress replaces that assumption with the measured rate. Use **Messages only** or select fewer chats when the estimate exceeds the remaining time. Telegram's reported Takeout wait is added to the budget. The collector stops acquisition when the remaining time is needed for packaging, retains acquired data and marks a partial result. A 120-minute session therefore uses its remaining collection window rather than waiting for the deadline before preparing the archive. The display identifies selections whose full size could not be sampled. ## Choose this mode or a persistent workspace | Capture mode | Configurable scope | Difference | | --- | --- | --- | | Telegram Takeout, the default | All accessible cloud chats or selected chats, dates, account categories, media policies and JSON/HTML views | Uses Telegram's official export mechanism; approval or waiting may be required. Takeout can enumerate left channels/groups where Telegram permits it and request additional personal data. | | Regular Telegram API | The same account scope and output choices, subject to methods available through the regular API | Does not initialize Takeout; cannot enumerate left channels/supergroups or fetch Takeout-only personal data. Contacts cover Telegram users rather than the complete saved phone contact list. Rate limits still apply. | | Chat event journal | One selected chat, attachment policies and optional avatars | Captures history and changes observed during this run. Account categories, date filters and Desktop-compatible views do not apply. | All three modes have the same GitHub attestation and encrypted delivery. Takeout is an acquisition method, not a stronger signature. It is never silently replaced by regular API access. JSON/HTML views are generated by TgWitness; they are not Telegram-signed files or guaranteed byte-identical Desktop exports. See the [official Takeout API](https://core.telegram.org/api/takeout). Defaults use Takeout, all accessible chat types including archived chats, all dates, account profile and contacts, compatible JSON and HTML, and file downloads. The initial media budget is 4 GiB, with visible per-type file limits; larger files or exhausted download budgets use server hashes where available. Review these limits before collecting. Hashes cannot reconstruct a file. Optional photos, stories, session metadata and extra personal data remain separate choices. Takeout may require approval in an established Telegram session. Telegram sets the delay; a new login or runner does not bypass it. The maximum capture window is 120 minutes including login and approval, so a large account or long approval wait may not finish. A persistent local export can resume the same session, but does not inherit GitHub attestation. ### Agree and verify the settings After **Check settings and size**, use **Save settings for verification**. Agree the resulting `sealed-export-settings.json` with the reviewer before collection. Changes invalidate the saved assessment. The collector signs the effective settings and their SHA-256, and account-export receipts bind the same options. The verifier reports the actual mode, selection and completeness, and rejects a disagreement between the journal and nested account export. ``` python -m tgwitness.sealed_verify evidence.zip --bundle attestation.jsonl --repo OWNER/TgWitness --expected-selection sealed-export-settings.json --require-complete ``` `--expected-selection` rejects a different transport, chat scope, filter or attachment policy. `--require-complete` rejects partial account exports and chat journals, whose overall completeness is not established. Without these flags, verification still checks provenance and integrity while reporting the recorded settings and gaps. A file supplied only with the finished archive cannot establish what was agreed beforehand. A valid signature never turns omitted data into data that was collected, or proves the owner did not edit/delete messages before capture. | Need | Mode | | --- | --- | | Export accessible account data or selected chats during a limited session and give a reviewer an externally attested archive | GitHub Actions capture (preview) | | Observe several chats continuously, manage accounts, search and read a growing archive | Local or Docker workspace | This starts a separate capture with a new login. It does not upload your existing local journal, export the currently open workspace, or reuse its Telegram session. An unfinished cloud capture cannot resume after its runner is destroyed; a new workflow starts a new capture. The workspace's **Exports → Open capture helper** opens the complete wizard inside the panel. The standalone page uses the same wizard, controls and themes. Both keep keys and decryption in your browser. GitHub workflow startup and the temporary Telegram panel open in separate tabs; the wizard tells you when to return. Locking the workspace clears the wizard's in-memory key. Your saved key file remains on your device. ## What is public, and what must stay private Collection runs on a standard GitHub-hosted runner. GitHub, the approved collector and dependencies, the helper page, the browser and the HTTPS tunnel are trusted parts of this setup. The temporary host processes the Telegram session and plaintext messages; the delivered artifacts are encrypted for the recipient. Forking copies project code into your repository. It does **not** export your Telegram account. The recipient workflow input is a public encryption key. Keep `sealed-key.json`, Telegram credentials, login codes, 2FA passwords and the decrypted connection URL out of commits, workflow inputs and public logs. The workflow publishes encrypted connection/result artifacts for one day. Download both in time; GitHub Actions availability, account limits and billing apply. A public fork is not a promise of unlimited free compute. No payment or GitHub access token is entered into the helper. The private decryption key stays in your browser/file. Telegram session material and plaintext observations necessarily exist inside the temporary collector. GitHub and the HTTPS tunnel remain trusted infrastructure. Attestation may make the archive digest and workflow identity public; the archive contents are not placed in the attestation. The attestation timestamp is not a message timestamp. ## Troubleshooting | Symptom | Next step | | --- | --- | | No **Run workflow** button | Open your own fork, enable Actions, and sync it with upstream `main`. Do not edit the approved upstream pins to bypass a failure. | | No `sealed-connection` artifact | Check whether the job started and completed its startup/upload step. Queue, runner, image download, tunnel or repository policy failures can prevent startup. | | Cannot open the connection | Load the saved key for this run, unzip the downloaded artifact and select `connection.tgwsealed`. The runner must still be active. | | History is paused | Check the panel's status and use Resume while the session remains active, or finish with the data already collected. Telegram limits and inaccessible content can leave gaps. | | No `sealed-result` | Cancellation or expiry before starting collection produces no archive. A failed collection, attestation or packaging step also prevents delivery. Inspect the failed step without posting credentials. | | Browser cannot decrypt a large archive | Use the streaming CLI below for packages larger than 256 MiB. A wrong or lost private key cannot decrypt the result. | | Verification rejects the signer | Use a trusted current TgWitness installation and the exact caller `OWNER/REPOSITORY`. Do not accept a replacement policy supplied with the archive. | | Telegram still lists the temporary session | End it in Settings → Devices. Logout can fail and a forcibly terminated workflow may not run cleanup. | Before relying on this preview, try a small chat you control: create a message and attachment, collect them, decrypt the result, run the verifier, check the coverage/media outcomes and confirm Telegram session revocation. Automated checks use a synthetic Telegram client plus a separate real GitHub certificate test; they do not establish live account acceptance. ## Local decryption and verification Use tools from an independently trusted installation, not executable files supplied by an unknown evidence archive: ``` python -m tgwitness.sealed_crypto decrypt delivery.tgwsealed --key sealed-key.json --out delivery.zip # Unzip delivery.zip using your archive manager, then: python -m tgwitness.sealed_verify evidence.zip --bundle attestation.jsonl --repo OWNER/TgWitness ``` For multipart delivery, decrypt the main package first and keep its extracted manifest beside every encrypted part, then run: ``` python -m tgwitness.sealed_parts evidence.parts.json --key sealed-key.json --out evidence.zip python -m tgwitness.sealed_verify evidence.parts.json --assembled evidence.zip --bundle attestation.jsonl --repo OWNER/TgWitness ``` The manifest is the attested subject and binds every part and the assembled ZIP. Use `--max-gib` to set an appropriate uncompressed verification ceiling for a large archive; the default is 4 GiB. Expected-selection and complete-scope checks also work with multipart delivery. Python 3.11+, the project's dependencies, and a recent GitHub CLI supporting `--signer-digest` and `--deny-self-hosted-runners` are required. A CLI key generator is also available: `python -m tgwitness.sealed_crypto keygen sealed-key.json`. The verifier uses `tgwitness/sealed_policy.json` from the trusted installation. It checks the caller repository, upstream signer workflow, approved signer commit, hosted runner requirement, complete ZIP digest, internal journal and attachment integrity, fresh account-key origin, and expected collector commit. It displays history and media outcomes instead of implying all data was saved. An empty approved-release list fails closed. Updating the policy is an explicit trust decision; never accept an archive's own proposed policy automatically. For offline use, obtain trusted roots ahead of time from a trusted environment: ``` gh attestation trusted-root > trusted_root.jsonl python -m tgwitness.sealed_verify evidence.zip --bundle attestation.jsonl --repo OWNER/TgWitness --trusted-root trusted_root.jsonl ``` The timestamp of the attestation concerns the archive's commitment. It does not authenticate message timestamps or the collector's wall clock. See [GitHub's verification options](https://cli.github.com/manual/gh_attestation_verify). ## How the fork is kept outside the capture process The caller contains a job-level reference to the upstream reusable workflow at a full commit SHA. That workflow explicitly checks out **the upstream repository at a fixed collector SHA**. A default `actions/checkout` in a reusable workflow would check out the caller and is intentionally not used. The workflow does not restore caller caches, consume caller artifacts, execute caller files, or accept source/image URLs, shell commands, prepared ZIP files, or hashes to sign. It accepts a bounded public recipient and session duration. Actions, the Python base image, and cloudflared are pinned by immutable digests; Python dependencies use the existing hash-locked requirements. The image is built from the trusted source without a cache. The collector runs as a non-root user with a read-only image, dropped Linux capabilities, resource limits, and no Docker socket or GitHub-token environment. Its only mounts are fresh configuration, workspace, and output directories. The restricted FastAPI application exposes login, dialogs, configurable account or chat collection, status, resume, finish, and cancellation. There is no plaintext download route, general administration route, import route, or signing endpoint. The supervisor stops the network-facing containers before the attest action reads the final fixed `evidence.zip` or `evidence.parts.json`. The packaging container has no network. The upload steps name only `connection.tgwsealed` and `delivery*.tgwsealed`; neither plaintext evidence nor Telegram credentials are uploaded as artifacts. Cleanup removes the private directories and containers, with no claim of physical disk erasure. Artifact retention is one day; download before expiry. A fork owner can replace the caller or create a different signed file. The strict verifier must reject the resulting **different signer workflow/digest**. This construction still depends on the absence of exploitable bugs in approved code and on the integrity of GitHub's runner and signing infrastructure. ## Cryptographic handoff Each recipient key is RSA-3072 (RSA-4096 imports also accepted), exponent 65537. Each envelope has a fresh random AES-256 key and 96-bit nonce. RSA-OAEP with SHA-256/MGF1-SHA256 wraps the AES key. AES-GCM with a 128-bit tag authenticates the complete prefix and payload. The public recipient is DER SPKI in base64; the private key file contains DER PKCS8 in base64. Envelope bytes are `TGWSEAL1\n`, a big-endian uint32 JSON-header length, the header, ciphertext, and a 16-byte GCM tag. The header has exactly `algorithm`, `key`, and `nonce`; algorithm is `RSA-OAEP-256+A256GCM`. The complete prefix through the header is GCM additional authenticated data. Header size is bounded at 8192 bytes. The CLI streams payloads up to 8 GiB and authenticates before installing the requested output; it refuses overwriting an existing destination. This is a project-specific envelope around standard cryptographic primitives, not an independently audited encryption format. The original evidence bytes are attested **before** placing the evidence and attestation in the encrypted outer package. This avoids a circular dependency between the archive's hash and a certificate included inside that same archive. For public repositories, attestation metadata (repository, workflow, commit, artifact name and digest) is public. Never put chat names in public metadata. ## Limits and validation This mode uses the signed journal and account-export engine. Secret Chats, deleted history from before collection and data inaccessible to the account are excluded. Private cloud chats are eligible when selected. The chat picker is capped at 20,000 dialogs; account export discovers its own inventory. Missing data, failed files and unfinished tasks are recorded. Attachment limits and runner disk/time limits still apply. Large delivery uses encrypted parts instead of a fixed 4 GiB delivery cutoff. Completion means the frozen selected tasks finished, not that every historical Telegram record exists in the archive. The chat journal can also observe live updates; neither mode is an atomic snapshot. Generated screenshots and screen recordings are not part of this mode. Tests cover synthetic fresh login, scope isolation, media, cancellation, partial deadline completion, failed logout, forbidden API paths and fields, preloaded workspace rejection, wrong-key and tamper rejection, required verifier flags, and browser/Python encryption interoperability. The browser acceptance test uses a plainly labelled mock attestation; it is not a real Sigstore test. Real hosted-runner, Docker, GitHub attestation, and live Telegram acceptance must be reported separately from local synthetic checks. [GitHub Actions terms](https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features#actions) restrict use of hosted runners to the software project's lifecycle. A fork does not remove these restrictions; this preview must not be marketed as unrestricted free production hosting. [Cloudflare Quick Tunnels](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/) are also intended for testing and development. The helper/workflows are suitable for evaluating this feature; production service eligibility remains a separate deployment requirement. ## Maintainer release sequence 1. Commit and review the collector, supervisor, container definition and tests. 2. Pin that collector commit in `sealed-collector.yml`, then commit/review the reusable workflow. Never silently derive the checkout from the caller SHA. 3. Pin the reusable workflow commit in `sealed-witness.yml` and add its workflow/collector SHA pair to `sealed_policy.json` in a trusted release. 4. Publish all referenced commits and the helper, then test an independent fork and the real GitHub certificate. Do not squash away commits referenced by these pins unless the references are regenerated and published again. See [reusable workflows and attestations](https://docs.github.com/en/actions/how-tos/secure-your-work/use-artifact-attestations/increase-security-rating) for the distinction between the caller repository and the upstream signer. --- # Telegram · 跨所有聊天室進行調查 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/ 針對頻道、群組、私人聊天及機器人,進行端到端的 Telegram 調查:包含整個帳戶的擷取、歷史紀錄、聯絡人、連結、檔案、時間軸及經驗證的證據。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 一個橫跨頻道、群組、私人聊天和機器人的完整案件:收集、串連線索、重建時間軸、移交。 一個虛構事件,從頭到尾。收集、搜尋和人員檔案找出紀錄,[Case Board](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/case-board/) 整理它們,[Report studio](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/) 呈現它們。 已處理案例/付款目的地變更 ### 一樁事件。四段對話。一條待重構的軌跡。 一則頻道貼文指向一個機器人。一個群組在討論新的付款連結,機器人也顯示了它。貼文被編輯,私人聊天重複了這個連結,一則群組訊息消失了。 每一個版本是由誰發布的?該連結出現在哪裡?哪個檔案被保留下來了?有哪些變更,以及何時進行的? 歷史載入、AI、MCP、OCR 和 webhook:[運用檔案庫](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/archive/)。 ## 1. 建立涵蓋整個帳戶的記錄範圍 整個帳戶範圍只用於專用帳戶。主帳戶只用選定的聊天室或一個資料夾。 1. 在獨立工作區中[連接帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/accounts/)。記下案件編號、帳戶 ID、工作區和金鑰指紋。 2. **來源 → 觀察範圍 → 調查模式**:**整個帳戶**、全部四種來源類型、**自身操作**。每個新聊天室都會保存其資料和最近 **200 則可見訊息**。按**儲存範圍**並確認。 3. **載入對話**並與帳戶的聊天清單比較。上限為 1,000 個對話(在**參數 → 從帳戶清單讀取的聊天室**中最多可設為 20,000);超出上限的聊天室在變得活躍後才會出現。 4. **記錄設定** → **所有可見活動**,檢查附件限制和磁碟空間。啟動後,用一則訊息、一次編輯和一次刪除來測試。 頻道群組私人聊天室機器人 一個帳戶/一個簽署金鑰**所有選定的、帳戶可見的活動 → 整合為一份日誌** 訊息 · 編輯 · 刪除通知 · 可見反應 · 群組活動 · 自身操作 「整個帳戶」是指此帳戶能開啟的每個聊天室,扣除排除項目。不含祕密聊天。新聊天室出現時即加入;舊歷史不會自動下載。 ## 2. 取得歷史紀錄並保存檔案 建立一個 Case Board 集合,將重要內容加入書籤。維護一份來源登記表:聊天室 ID、標題、帳戶、角色、即時擷取開始時間、歷史結果、媒體結果、空缺。 | 需求 | 面板中的操作 | 功能介紹 | | --- | --- | --- | | 已啟用聊天室的歷史紀錄 | 來源 → 載入完整歷史紀錄 | 可用的過往訊息會進入工作區日誌,並具備暫停/恢復功能及經簽署的進度報告。[歷史紀錄指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)。 | | 日誌中的現有聊天內容 | 來源 → 記錄設定 → 歷史快照 | 最近的訊息作為簽名紀錄。預設 500 則,在**參數 → 最大歷史快照**中最多可設為 10,000。 | | 某個聊天室目前可見的完整歷史紀錄 | 完整聊天記錄匯出 → 匯出完整聊天記錄,或 聊天 → 匯出聊天記錄 | 每個聊天室一個獨立的簽名包,含 `chat.json` 和 `chat.html`。 | | 當出現新聊天室時的背景說明 | 監測範圍 → 當出現新的聊天室或機器人時 | 它的資料和最多 1,000 則最近訊息(調查模式下為 200 則)。不套用於既有聊天室。 | | 附件位元組 | 下載可見附件 + 各類別上限 | 尋找附 SHA-256 和大小的 `media.saved`。排隊中、已略過或失敗都代表未保存。 | 聊天匯出不會進入日誌或人員檔案。若要在 TgWitness 內搜尋舊歷史,請使用**載入完整歷史紀錄**或快照。 這裡是:頻道、群組、機器人聊天和私人聊天,以及發票檔案及其雜湊。擷取前已刪除的內容已經不在了。 ## 3. 記錄不斷演變的對話內容以及您自身的行動 保持執行。將熱門聊天室加星號作為優先,在**記錄設定 → 重新檢查**中調整重新檢查,並留意 `recheck.completed`、FloodWait 和媒體結果。 **聊天室 → 個人資料 → 立即儲存個人資料**會保存聊天室的簡介、機器人指令和其他中繼資料。 **作為案件調查的一部分,追蹤機器人或接受邀請** 1. **聊天室 → 開啟 Telegram 連結**,先儲存預覽。連結和預覽會成為簽名紀錄。 2. 如有需要,**加入 / 開啟並觀察**會加入聊天室,或以啟動參數啟動機器人。 3. 若要記錄某個動作,請在面板中回覆或使用**按下按鈕**。您會得到 `interaction.requested` 和 `interaction.result` 以及機器人的回答。 這些是真實動作。在其他應用程式中按下的按鈕看不到,只看得到機器人的回覆。不支援網頁應用程式、付款或電話/位置。 ## 4. 追蹤聊天室中的人員、連結與檔案 1. **日誌**、**所有來源**,搜尋片語、網域或使用者名稱。開啟結果並**新增至案板**。 2. **聊天室 → 人員 → 開啟個人檔案**,選擇一個人:名稱歷史、回覆、活動、**也出現在…**、連結、錢包、電話。開啟被引用的紀錄。 3. 在其他聊天室追蹤同一個數字使用者 ID。相同的名稱、錢包或大頭貼只是線索,不是證據。 4. 比較檔案雜湊。SHA-256 相同 = 位元組相同。是誰分享的則是另一個問題。 案例地圖 / 追蹤參考資料虛構案例 · 非即時圖表 頻道 / 公告**原文 → 編輯後內容** 記錄 #101、#188 訊息 #84 · 未標示發送者 群組 / 運作**使用者 71001 發布了新連結** 記錄 #146 · 訊息 #309 已儲存檔案收據 #151 BOT / 訂購對話**一個按鈕可導向該頁面** 記錄 #173 · 訊息 #12 返回按鈕的元資料 私密 / 後續追蹤**使用者 71001 重複輸入目的地** 記錄 #205 · 訊息 #922 已儲存檔案收據 #209 四個聊天室提供了不同的觀察結果。請追蹤每項連結的原始記錄;該頻道貼文並未標示發送者。 本操作指南中的數字 ID 和記錄參考編號均為虛構。此說明圖示範了如何將搜尋結果、個人檔案與已檢視的記錄相互關聯;「案件看板」則儲存對應的卡片及來源參考資訊。 | 連結 | 輔助觀察 | 結論:保留 | | --- | --- | --- | | 同一 Telegram 帳號 | 群組 #146 及私人聊天室 #205 中的使用者 ID 71001 | 兩個聊天室中的傳送者 ID 相同。這個人在現實中是誰是另一個問題。 | | 重複的目標 | `pay.example.invalid/new` 在 #146、按鈕元資料 #173、編輯過的貼文 #188 及 #205 | 同一個連結出現在四個地方。誰控制它需要其他來源。 | | 相同檔案位元組 | 已完成的媒體收據 #151 和 #209 中的 SHA-256 值完全相同 | 兩個檔案逐位元組相同。 | 檔案只涵蓋在*此工作區*中發過言的人,不是成員清單。每項事實的引用數:**參數 → 每項事實引用的紀錄**。 ## 5. 重建事件序列並標記缺漏處 先在**聊天室**中查看版本,再到**日誌**中選擇**所有來源** + **編輯**、**刪除**、**涵蓋範圍**。時間軸上寫下兩個時間:Telegram 的日期和被觀察到的時間。 1. 09:00 · #101**已擷取的頻道貼文** 原始目標網址已保留。 2. 09:12 · #146 / #151**群組提供了一個不同的連結** 使用者 71001 發佈此內容;附件下載完成。 3. 09:16 · #173**該機器人顯示相同的目的地** 儲存的鍵盤元資料中包含該連結。 4. 09:20 · #188**頻道公告變更** 原始內容與編輯後的內容均予以保留。 5. 09:24 · #205 / #209**私人後續訊息再次重申此點** 所儲存的附件與 #151 具有相同的完整 SHA-256 值。 6. 09:28 · #231**群組刪除通知已送達** 先前的觀察依然成立:系統既未提供刪除者身分,也未提供確切的刪除時間。 示例中的觀察時間與參考資料。其他日誌記錄則位於這些條目之間。 日誌順序是抵達順序,不一定是發生順序。請將即時紀錄、快照、復原的訊息、刪除和「重新檢查時缺少」分開,並將每個空缺標記為未知。 ## 6. 將此案例擴展至其他資料蒐集帳戶 每個帳戶一個工作區,步驟相同。記下每個帳戶的角色和指紋。訊息編號依帳戶計算,所以務必註明是哪個工作區和聊天室。 [帳戶群組](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/groups/)顯示狀態、共用設定並一起匯出所有帳戶,每個帳戶仍有自己的日誌和金鑰。跨帳戶時間軸需要您在筆記中自行整理。 案件時間很長?請加入[獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/),並測試每個帳戶實際捕捉到什麼。 ## 7. 交付可核查的案件資料包 每個工作區的簽名 ZIP(一律是完整日誌,篩選不影響),以及人員檔案、聊天匯出和檔案。 ``` CASE-001/ # assembled by the analyst case-notes.md # question, findings, alternative explanations sources.csv # every chat, role, acquisition result and gap timeline.csv # account + chat + message + seq + both times workspace-A/ evidence.zip # complete signed observation journal retained-checkpoint.json profiles-operations.json # separately signed people profiles history-channel.zip # signed current-history export history-group.zip verification.txt workspace-B/ # separate journal and trusted fingerprint witness/ # retained checks, journal and signed posts SHA256SUMS # hashes of the delivered files ``` 請另外傳送指紋。每份都對照它自己的工作區驗證: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.json python -m tgwitness.verify profiles-operations.json --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --evidence evidence.zip python -m tgwitness.verify history-channel.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 ``` 將驗證工具的輸出、原始檔案、涵蓋範圍和移交紀錄與您的發現放在一起。在 Report studio 中撰寫報告。若接收方需要的更少,請製作[精簡移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/)。 --- # Telegram · 建立「案件看板」 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/case-board/ 在私人看板上彙整已儲存的觀察結果、精確標記內容及操作片段,與團隊進行討論,並彙整成一份報告。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 把保存的訊息變成團隊一起處理的案件。 書籤、精確引文、切片和討論,每一項都連結到來源。每次變更都是一個簽名修訂。 ## 從訊息到案件卡片 1. **調查 → 案件看板**(標準或專家模式)。為案件建立一個集合。 2. 在**日誌**或聊天室中按**新增至案板**(或按 **B**)。卡片會進入收件匣,替它加上標題再移動。 3. 在訊息中選取文字,**標示 → 看板**會保存精確引文和版本。寫下它為什麼重要。 4. 討論、設定狀態,需要時隨時跳回來源。**簡報**帶團隊逐項瀏覽。 ### 請點擊此已變更的付款連結 綜合範例 · 本地化說明 1. **擷取。**開啟已儲存的觀察紀錄 #142 及其訊息版本。 2. **加入書籤。**將引文、來源參考資料及您的問題記錄在卡片上。 3. **審核。**新增團隊評論並將卡片移至「審核」階段。 4. **當前。**逐步引導使用者進行資料蒐集,並開啟引用的來源上下文。 #### 已儲存的觀察記錄 #142 「請使用新的付款連結。」 操作聊天室 · 訊息 38 · 觀察時間 09:12 UTC #### 卡片:變更目的地 > 請使用新的付款連結。 問題:較早版本中出現了哪個目的地? #### 團隊審閱 分析師:請與觀察記錄 #101 進行比對。 狀態:審閱 · 保留修訂版本 #### 來源上下文 卡片 → 已儲存版本 → 較早的觀察記錄 註解與 Telegram 觀察記錄仍可分別識別。 ## 一次儲存一個實用的範圍 按住 Shift 點選兩則訊息進行**區間切片**,使用**按時間切片**,或儲存目前的日誌篩選條件。**顯示自書籤標記後新增的記錄**會顯示後來進來的內容。 時間切片使用觀察時間;訊息 ID 切片會跟著這些訊息的變化。 ## 為每位同事分配適當的角色 **審閱者**閱讀,**分析師**新增卡片和留言,**操作員**還管理集合和決定。聊天室權限同樣適用於卡片。 ## 將此工作轉化為可交付成果 切片可匯出為簽名 JSON 或 CSV。報告可以包含書籤、切片和留言,在 [Report studio](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/) 中設定。對於受限的接收方,請使用[移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/)。 詳細資訊:[Case Board 參考](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)。 --- # Telegram · 設計報告 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/ 選擇報告資料、八種設計樣式之一及內容,接著預覽並匯出 HTML、已簽署的 PDF 或完整的證據包。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 讓讀者從案件問題直接到達保存的紀錄。 Report studio 彙整您挑選的資料、變更歷史、圖表和您的發現。八種設計,HTML 和原生 PDF。每份 HTML、PDF 和 JSON 報告都以您的金鑰封印。 ## 三步驟建立報告 1. **匯出 → 設定與預覽 → 資料**:整個工作區,或選擇聊天室、作者、日期(UTC,即 TgWitness 看到紀錄的時間)和紀錄類型。 2. **設計與內容**:選擇設計和要放入的內容:圖表、參與者、對話紀錄、變更、Case Board 項目、您的案件細節和筆記。 3. **預覽**:檢查數量、活動、樣本和缺少的 ID 範圍。儲存,然後下載所需格式。 ### 請將相同的儲存資料以適合讀者閱讀的方式進行整理 合成範例 · 示意性佈局,並非實際生成的報告 1. **「選取」。**請為本案選擇兩個聊天室及觀察期間。 2. **撰寫內容。**選擇版面配置,並挑選能回答問題的段落。 3. **預覽。**請檢視選取的字數統計及已儲存的「前後對照」文字。 4. **驗證。**生成最終檔案,並將其簽名與可信工作區的指紋進行比對。 #### 精選觀察要點 2 則聊天紀錄 · 1 天觀察期 訊息、編輯及刪除通知 #### 報告結構 ##### 付款目的地已變更 案件問題 → 範圍 → 調查結果 → 記錄參考 **訊息背景** 觀察點 #142:「請使用新的付款連結。」 **已儲存的變更** 原文:old.example.invalid → 譯文:new.example.invalid #### 檢視選項 18 項觀察 · 2 次儲存的編輯 「發送時間」、「編輯時間」和「查看時間」各有獨立標籤。 #### 最終交付成果 簽署過的 PDF + 簽署過的 JSON,或包含可讀報告的簽署 ZIP 檔案 收件者需核對檔案及可信指紋。 ## 選擇閱讀風格 **Classic, Editorial, Briefing, Analytics, Technical, Overview, Reading series, and Ledger & margin**:相同的紀錄,不同的外觀。切換時保留您的選擇和筆記。可使用 25 種語言中的任一種。 PDF 以內建字型產生,不需要瀏覽器。中文、日文和韓文需要伺服器上有 Noto Sans CJK 之類的字型(系統層級或位於 `TGWITNESS_FONT_DIR`),否則只能得到 HTML 和 JSON。 ## 請在上下文中理解變更內容 編輯會顯示前後對照,刪除會顯示最後保存的版本。回覆、轉傳、表情回應、按鈕和附件都保留其參照。 設計預覽使用前 50,000 筆紀錄,資料預覽則精確計算全部。若要查看最終頁面版面,請產生 PDF。 ## 請審慎選擇受眾版本 篩選只影響報告,證據 ZIP 仍包含完整日誌和檔案。若接收方應得到更少,請使用[精簡移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/)。更多:[報告內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/),[驗證匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/)。 --- # Telegram · 準備一份分享用副本 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/handover/ 選擇收件者可接收的紀錄與欄位,檢視最終版本,並驗證其已簽署的清單及來源日誌邊界。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 只分享需要的內容,原始資料維持不變。 移交是一份獨立的簽名擷取:選擇聊天室和人員,隱藏身分或文字,選擇檔案和團隊筆記。清單記錄了保留、裁剪和排除的內容。 ## 準備收件者的擷取檔 1. **匯出 → 移交擷取**:寫明目的,選擇聊天室和期間,若需要具名人員則**載入所選聊天室中的人員**。 2. 其他所有人:使用化名、排除,或依紀錄原樣。文字和檔案是分開的開關;電話和電子郵件可以遮蔽。 3. Case Board:不包含、書籤和切片,或附留言的卡片。團隊成員名稱可換成別名。 4. **下載移交摘要**,開啟、驗證,並在傳送前看過一遍。 ### 一份原始文件,一份經審核後分享的副本 合成範例 · 僅供說明用途 1. **選取。**請包含案件聊天紀錄,並標明該摘錄所涉及的人物。 2. **最小化。**選擇其他參與者在共享副本中的顯示方式。 3. **檢查。**在傳送前,請開啟生成的壓縮檔中的報告與紀錄。 4. **分享。**請提交經核對的譯稿,並另行提供其可信指紋。 #### 原始觀察 Nora · 使用者 71002 「我已收到修訂後的連結。」 原始日誌會保留此項已儲存的觀察記錄。 #### 收件者副本 按記錄顯示:Nora · 使用者 71002 · 「我已收到修訂後的連結。」 化名:P01 · 「我已收到修訂後的連結。」 省略:此參與者的訊息未包含在文本中。 #### 檢視實際檔案 請參閱 report.html 及 records.jsonl 檔案。 請核對身分資訊、文字內容、附件及可選的團隊評論。 #### 已簽署的摘錄 選取項目 + 檔案雜湊值 + 簽名清單 一個獨立的封包,其連結範圍與原始日誌邊界一致 ## 請一併使用這些控制項 | 控制 | 對文案的影響 | | --- | --- | | 人員 | 選定的人員保留名稱;其他人使用化名或被排除。 | | 文字 | 全部文字、只有選定人員和您帳戶的文字,或不包含。 | | 檔案 | 選定人員和您帳戶的檔案、所有顯示的檔案,或不包含。 | | 案件看板 | 不包含、書籤和切片,或附討論的卡片。 | 也請讀一讀文字和檔案:化名不會移除寫在訊息或附件中的名字。若選定的檔案遺失,請將它還原或排除附件。 ## 確保翻譯內容可獨立核對 ``` python -m tgwitness.verify handover.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 ``` 原始封存和檢查點請自行保留。接收方不需取得整個工作區就能驗證其副本。設計:[Report studio](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/)。可信參照:[匯出驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/)。 --- # Telegram · 管理一組帳戶 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/groups/ 比較群組工作區、尋找來源、檢視觀察期間,並套用共享設定(可針對個別帳戶設定例外)。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 同時執行多個帳戶,每個帳戶仍有自己的紀錄和金鑰。 群組將連線狀態、啟動/暫停、共用設定和匯出放在同一個畫面。多個帳戶處理同一案件時很方便。 ## 開啟群組概覽 在**帳戶**中開啟群組。每個帳戶顯示其狀態、路由、延遲和最後保存的訊息。**需注意**列出有問題的帳戶,**修復**直接帶您過去。 **全部開始** / **全部暫停**會先詢問再執行。**群組設定**是共用的,但帳戶自己的值會保留,直到您替換它們。 ### 檢視群組內的路徑變更 合成範例 · 說明性檢查與結果 1. **選取。**選擇群組並檢視哪些帳戶將會變更。 2. **準備。**當需保持獨立時,請保留該帳戶的專屬路徑。 3. **檢查。**測試建議的連線並檢視測量結果。 4. **請進行翻譯。**儲存前請重新檢查,並審閱每個帳戶的翻譯結果。 #### 案件團隊 頻道收集器 · 群組收集器 · 參考帳戶 3 個獨立的工作區 #### 已審閱選段 有 2 個帳戶採用建議的流程。 參考帳戶將維持其原有路徑。 #### 準備檢查 頻道收集器:Telegram 傳輸時間 84 毫秒 群組收集器:Telegram 傳輸時間 91 毫秒 這些數字僅為範例中的虛構數值。 #### 應用結果 頻道收集器:已路由並保存,觀察已恢復。 群組收集器:重新檢查失敗,已還原先前設定。 參考帳戶:保留原有路徑。 ## 在流程中新增「審查」步驟 1. **變更群組路由**,選擇類型和設定。 2. **檢視選擇**:查看哪些帳戶會變更,哪些有自己的路由。 3. **準備並檢查**會測試新的 Telegram 連線,並在可能時測試出口 IP。 4. **套用已檢查的連線**,並查看每個結果。執行中的帳戶會繼續,閒置的維持閒置。 延遲是建立 Telegram 連線的時間,出口 IP 是檢查時路由顯示的位址。結果可能因帳戶而異。 ## 使用重疊存取權限 **多個帳戶可見的聊天室**列出共用來源及其涵蓋範圍。頻道和超級群組可以透過**以 … 個帳戶匯出**由多個帳戶同時匯出。私人聊天和一般群組不行,它們的訊息編號依帳戶計算。 ## 將群組匯出為套件 **匯出群組**會產生一個 ZIP,包含每個帳戶的簽名匯出及其簽名清單。每份匯出都保留自己的指紋以供驗證。合併的時間軸仍需您自行整理。 下一步:[報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reports/),[Case Board](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/case-board/),[驗證匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/)。 --- # Telegram · 了解證據如何運作 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/concepts/ 追蹤訊息從擷取到檢查點的整個過程。修改一個範例記錄,重新計算其 SHA-256 鏈,並觀察保留的檢查點會偵測到什麼變化。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 訊息會變。您對所見內容的紀錄不該改變,而且任何人都應該能核對這一點。 下面是兩個小實驗。訊息是虛構的,一切都在您的瀏覽器中執行,不會傳送到 Telegram。 ## 從聊天記錄匯出到可驗證的紀錄 [Telegram Desktop 匯出](https://telegram.org/blog/export-and-more)將目前可見的歷史儲存為 HTML 或 JSON。TgWitness 增加了持續的變更日誌、每筆紀錄的簽名,以及他人可以對照的檢查點。 | 任務 | Telegram 桌面版匯出 | TgWitness | | --- | --- | --- | | 閱讀已儲存的對話 | HTML 或 JSON 格式,並包含選定的媒體檔案 | 已儲存的聊天紀錄、可搜尋的日誌及離線報告 | | 追蹤隨時間的變化 | 匯出時可用的歷史紀錄 | 舊版本、後續編輯和刪除,全部保留 | | 交接後請檢查檔案 | 標準的 HTML/JSON 匯出檔案均未簽名 | 簽名清單、簽名紀錄和封印報告,以可信任的金鑰核對 | | 與先前保留的狀態進行比對 | 請另行保留一份參考副本或雜湊值 | 已簽署的檢查點、獨立的見證者及可選的外部時間戳記 | 本比較依據截至 2026 年 11 月 2 日的 [Telegram Desktop 匯出程式碼](https://github.com/telegramdesktop/tdesktop/tree/768d47cda6c7f447c10a25d1f363279493a90ed7/Telegram/SourceFiles/export/output)。 ## 一條訊息,三項觀察 一則新訊息、一次編輯和一次刪除會成為三筆獨立的紀錄。編輯不會覆寫第一筆,刪除也不會抹去它。 01 / 訊息流歷程說明性流程圖 Telegram delivers an update to the collector, which appends a journal record. · Telegram · 收集器 · 日誌 · 更新 → · 追加 → 當前聊天視圖 訊息 #42 訊息已刪除 該訊息已從聊天視圖中消失。 觀察日誌 3 筆記錄 1. 01 `message.new` 上午 10:00 見面 ✓ 2. 02 `message.edited` 上午 11:00 見面 ✓ 3. 03 `message.deleted` 關於 #42 的刪除通知 ✓ 所有三項已記錄的觀察結果均保留在日誌中。 針對已選取來源的簡化路徑。操作記錄亦會同步至真實日誌。擷取內容取決於該帳戶的可見範圍以及 Telegram 實際傳送的內容。 Telegram 不會告訴您是誰刪除了訊息,也不會告訴確切時間。TgWitness 將這些欄位留空,而不是去猜測。 ## 修改一則記錄。追蹤雜湊值。 每筆紀錄都包含前一筆的雜湊。存放在別處的檢查點固定了日誌長度和最後一個雜湊。 02 / HASH-CHAIN SANDBOX真實 SHA-256 · 記錄範例 記錄 01**已收到訊息**`h₁ = SHA-256(e₁)`連結至 64 個零 記錄 02**上午 11:00 見面**`h₂ = SHA-256(e₂)`包含 h₁ 記錄 03**已偵測到刪除**`h₃ = SHA-256(e₃)`包含 h₂ 另存於其他處**3 筆記錄 · 標頭 `h₃`**請將此固定邊界與提供的日誌進行比較。 修改事件會改變其雜湊值。重建鏈條會改變其起始節點。移除尾部會使其長度短於保留的檢查點。 **檢視記錄 2 及完整雜湊值** 此為本範例中經過雜湊運算的原始 UTF-8 JSON 內容。數值均為虛構;九個欄位及其序列化格式均符合日誌格式規範。 ``` ``` 已儲存記錄 2 的雜湊值 `` 重新計算的記錄 2 雜湊值 `` 此沙盒僅計算雜湊值,而非簽名。真正的驗證器還會檢查每個事件的 Ed25519 簽名、序列號及連結。僅憑重建雜湊值,無法在可信密鑰下產生有效的簽名。 ## 實際規則,簡要說明如下 雜湊值 + 簽名 h0 = 064 hi = hex(SHA-256(C(ei))) σi = Ed25519.Sign(sk, unhex(hi)) **C** 是以 UTF-8 JSON 表示的九個事件欄位:鍵已排序,無多餘空白,無 ASCII 跳脫,無 NaN/無限大。`previous_hash` 是 hi−1,h0 是 64 個零,簽名涵蓋 32 位元組的原始摘要。 欄位:`seq`、`observed_at`、`source_at`、`kind`、`chat_id`、`message_id`、`actor_id`、`payload`、`previous_hash`。完整規格:[事件編碼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#event-canonicalization)。 保留檢查點 Nexport ≥ Ncheckpoint hexport[Ncheckpoint] = Hcheckpoint 用固定的金鑰檢查檢查點簽名,然後與日誌比較。之後的匯出可以更長,但在檢查點處必須一致。 ## 三個問題,三種不同的檢查方式 [01 / 完整性**這則記錄有變更嗎?** 以您信任的金鑰核對雜湊和簽名。](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/)[02 / 連續性**先前保留了哪些內容?** 將匯出與見證人保存的檢查點比較。](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/)[03 / 交付**這些測試事件是否已送達?** 傳送、編輯和刪除測試訊息,看看每個帳戶捕捉到什麼。](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/) 簽名回答「是否被改過」,檢查點回答「是否與先前一致」,測試訊息回答「我們是否全部捕捉到」。[驗證能證明什麼、不能證明什麼。](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope) 下一步:從開始到案件包的[整個帳戶調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/)。 [Export Clinic: watch the controlled Desktop experiment](https://phishdestroy.github.io/TgWitness/docs/export-clinic/). Compare the two-minute film, the original recording and seven pairs of test exports. Local modification is disclosed. --- # Telegram · 確保安全 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/security/ 了解會話、金鑰與證據的儲存位置、哪些資料會離開您的裝置、防護措施涵蓋的範圍,以及如何強化系統安全性。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 什麼會離開您的電腦,每個密鑰能打開什麼,哪些由保護措施涵蓋、哪些由您負責。 **127.0.0.1**預設為面板位址 **256 位元**隨機面板代碼 **0**內容分發網路(CDN)、分析工具或遠端字型 **Ed25519**每筆記錄均附有簽名 ## 所有內容的匯集之處 收集器、面板和每筆紀錄都留在您的電腦上。預設只連線 Telegram;其他一切都是另外的開關。 06 / 機器留下的痕跡您的安裝 您的電腦或伺服器 **面板**127.0.0.1:8787 · 承載者憑證 **收集器**每個工作區僅限一個 Telegram 客戶端 資料目錄 **日誌**SQLite · 雜湊鏈結 · 簽名 **媒體**檔案名稱採用 SHA-256 生成 **Vault**Fernet · 會話、API 配對、簽名金鑰、代理伺服器 - **Telegram**隨時 · 透過您的路徑 該帳戶的 MTProto 連線方式:直接連線、SOCKS5、HTTP 或 MTProxy。「隱藏 IP」模式會等待可用的代理伺服器;若要啟用直接連線備用機制,則需選用明確允許此功能的模式。 - **站外文案**可選 · 預設為關閉 日誌、檔案及檢查點在上傳至 S3 相容儲存空間前,均會以 AES-GCM 加密。金鑰由您自行保管;附件名稱採用帶有金鑰的雜湊值,而非其內容雜湊值。 - **通知**可選 · 預設為關閉 包含問題清單及聊天室標題的變更次數。訊息摘錄僅在您啟用該功能時才會發送。 - **時間戳權威性**可選 · 預設為關閉 僅包含簽名檢查點的 SHA-256 值與一個隨機的非ce值。不包含任何訊息內容,亦不包含聊天室名稱。 - **見證者**可選 · 預設為關閉 透過唯讀憑證擷取經簽名的檢查點與擷取計數器。該工具無法讀取對話內容或變更設定。 預設設定:僅 Telegram 連線會離開這台機器。 可選的儲存位置可針對每個工作區進行設定。訊息內容與媒體檔案將以未加密形式儲存於資料目錄中:請透過磁碟加密與檔案權限來保護該目錄。 ## 每個秘密所揭示的真相 | 機密 | 儲存位置 | 它能帶來什麼 | 若發生洩漏 | | --- | --- | --- | --- | | **面板代幣** | 資料目錄中的 `panel-token.txt`;瀏覽器依分頁保存 | 每個工作區中的一切 | 停止 TgWitness,刪除 `panel-token.txt`,重新啟動:會產生新的權杖 | | **Telegram 會話** | Vault,加密版(`credentials.enc`) | Telegram 帳號本身 | 請在 Telegram 的*「設定」→「裝置」*中結束該會話 | | **簽名金鑰** | Vault,加密版(`signing.enc`) | 以您的指紋簽署紀錄 | 存放在別處的檢查點、見證人和時間戳記仍能顯示先前存在的內容 | | **金庫金鑰** | 資料旁的 `vault.key`,或外部主金鑰 | 金庫 | 請假定工作階段和簽名金鑰也已外洩 | | **Witness 代幣** | 關於 Witness 主機 | 唯讀:檢查點和健康狀態 | 在見證人頁面刪除它,再建立新的 | | **站外文案關鍵詞** | Vault;只需下載一次即可進行資料恢復 | 異地副本 | 同時取得 bucket 的人可以解密它:請將副本視為已外洩 | ## 保護範圍涵蓋哪些內容 ### 已涵蓋 - 紀錄被修改、刪除或重新排序:雜湊鏈或簽名會斷裂。 - 在您將檢查點存到別處之後,日誌被截短或重建:檢查點就不再相符。 - 猜測權杖:256 位元隨機值,固定時間比較,每分鐘失敗 15 次即封鎖該位址。 - 惡意聊天內容:文字一律是文字,絕不當作 HTML;附件以檔案形式下載;面板不從其他網站載入任何內容。 - 資料目錄被竊但金庫金鑰在外部:工作階段和金鑰仍維持加密。 ### 交由您決定 - 主權杖可以做任何事。請給他人限定範圍的存取權,主權杖留給自己。 - 電腦上的管理員可以讀取一切並重新簽署日誌。請將指紋和檢查點存放在別處。 - TgWitness 不會加密訊息和媒體。請加密磁碟,收緊權限。 - 在 localhost 以外使用一般 HTTP 會洩漏權杖。請使用 HTTPS 或 SSH 通道。 - 簽名不會告訴您遺漏了什麼。請在您自己的帳戶和來源上檢查涵蓋範圍並測試送達。 [分享案件的存取權](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/access/),可設定權限、到期時間和工作階段限制。 ## 強化安裝安全性 已完成 0 / 8 1. **請使用專用的 Telegram 帳號**,絕不要用主帳號。 2. **請將控制面板維持在 127.0.0.1。**遠端存取只透過 HTTPS(內建 Caddy)或 SSH 通道。 3. **請加密存放資料目錄的磁碟**,訊息和媒體以原樣儲存。 4. **將資料目錄限制**為只有服務帳戶可存取(Unix 上為 0700,Windows 上為資料夾權限)。 5. **在伺服器上將金庫金鑰存放在別處**:首次啟動前設定 `TGWITNESS_VAULT_KEY_FILE`。 6. **將指紋和檢查點儲存**在另一個系統上,在另一台主機上執行見證人。 7. **切勿將** `data/`、會話金鑰、`panel-token.txt` 或金庫金鑰**上傳**至 GitHub 或聊天室。 8. 請勿在反向代理伺服器上記錄 `Authorization` 標頭或請求正文。 **我可以在不丟失資料的情況下變更面板代幣嗎?** 可以,它只能打開面板。停止 TgWitness,刪除 `panel-token.txt`,重新啟動。日誌、工作階段和金鑰都會保留。若設定了 `TGWITNESS_TOKEN`,則以該值為準,而非檔案。 **為何訊息在靜止狀態下未經加密?** 收集器必須讀取它們才能搜尋、比較和匯出。放在同一台電腦上的金鑰擋不住原本就能讀取這台電腦的人。磁碟加密防的是磁碟遭竊,權限防的是執行中的系統。 ## 回報漏洞 在 GitHub 上使用 **Security → Report a vulnerability**。提供版本、影響以及使用虛構資料的最小重現。切勿傳送憑證、帳戶資料夾或真實證據。若私人回報已關閉,請開一個 issue 要求私人管道,不要寫漏洞利用細節。 --- # Telegram · 設定 Witness 機器人 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/witness/ 透過獨立的見證者(配有專屬金鑰及唯讀收集器存取權限),將簽署過的日誌檢查點發佈至您的 Telegram 頻道。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 一個獨立程序檢查您的日誌,並將簽名檢查點發布到頻道。 ## 兩台主機,兩組簽名金鑰 部署 / 資料收集器**帳戶 + 日誌** Telegram 會話收集器的簽名金鑰 唯讀檢查點端點 ← 請求簽署的回答 → 主機 B / WITNESS**驗證 + 保留** 固定收集器指紋 獨立的見證簽署金鑰 專屬日誌 + 機器人代幣 Witness → Telegram 機器人 API →**您的頻道 · 經簽名的 TGW1 貼文** Witness 會自行執行驗證。收集器的存取權限為唯讀。機器人發佈時會使用 Witness 的連線與憑證;Witness 不會獲得任何帳戶會話權限。 03 / 檢查點決策示例答案 最後接受日期**120 筆記錄**`head 9c7d…` 下一則答案**128 筆記錄**`head a4f2…` 已接受:計數持續增加,簽名經驗證無誤,且金鑰匹配。該見證者保留此新界限。 所有解答範例均假設具備有效簽名及已釘選的金鑰。此處的雜湊值僅為簡化示意。單憑較大的計數並不能證明整個舊前綴未曾變更;請將匯出資料與保留的檢查點進行比對。 ## 準備一個機器人與一個頻道 用 BotFather 建立機器人,並允許它在您的頻道中發文。請在別處執行見證人:另一台主機,最好由其他人管理,遠比在收集器旁多跑一個程序更有價值。 ## 「進階功能」中的三個步驟 1. **唯讀存取。****擴充功能 → 獨立見證人**,建立權杖並儲存檔案。它只讀取檢查點和健康狀態,別無其他。 2. **頻道和間隔。**Telegram 頻道或 Discord webhook,以及見證人能連到的收集器網址。儲存設定檔。 3. **啟動。**將 `witness.json`、`witness-token.txt` 和 `bot-token.txt` 一起放到見證人主機上並執行: ``` python -m tgwitness.witness run --config witness.json --check-config python -m tgwitness.witness run --config witness.json ``` 等待頻道中出現第一則簽名貼文,然後將見證人指紋保存在安全的地方。 想用 Discord?將 webhook URL 儲存為 `discord-webhook.txt`。一個見證人只發布到一個地方;較長的檢查結果在 Discord 上以檔案形式送達。 ## 選擇發布頻率 每次檢查都發文可以形成穩定的外部紀錄:每五分鐘一次,約等於每個工作區每天 288 則貼文。進階設定可以只在有變化或出問題時發文,使用代理或自訂 Bot API。 **該機器人實際上能證明什麼?** 它向收集器請求簽名檢查點,以預期的金鑰核對,並保存自己的簽名日誌,包括錯過和被拒絕的回應。 它檢查的是日誌狀態,本身並不監看 Telegram。為此,請執行受控的送達測試。 ## 稍後查閱證據 請保留見證人日誌、貼文和指紋。[如何核對它們](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#verify)與收集器匯出是否一致。 --- # Telegram · 瀏覽檔案庫 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/archive/ 載入歷史紀錄、搜尋已儲存的記錄、檢視 AI 來源,並串接您的工具。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 尋找訊息。查證來源。建立案情。 01**導入歷史紀錄** 將已啟用來源的過往訊息拉進工作區。 02**追蹤消息來源** 搜尋,然後開啟每筆結果背後保存的訊息。 03**確保交接流程清晰明確** 您的分析放在一個檔案裡,簽名證據放在旁邊。 擷取的紀錄、辨識出的文字與分析師的結論均保持獨立分明。 ## 載入過往訊息 1. **來源 → 範圍內的聊天室**:檢查已啟用的聊天室,開始觀察。 2. **載入完整歷史紀錄**。它依照當下的來源清單執行。 3. 隨時可以**暫停歷史紀錄** / **繼續歷史紀錄**。重新啟動後請手動繼續。 4. 檢查每個來源的結果和下載佇列,將簽名進度報告與匯出一起保存。 這會填滿工作區。單一聊天室的 HTML/JSON 匯出是另一回事。[詳細資訊](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)。 ## 先搜尋,再決定是否使用 AI 1. **日誌**在本機搜尋,可依來源和時間篩選。 2. 搜尋片語或網域,開啟紀錄及其各個版本。 3. 使用 AI 時,由管理員在**整合功能**中設定服務商。然後**查詢檔案庫**:選擇聊天室和期間,查看**傳送至模型的資料**,取消勾選不該送出的內容。 4. 檢查引用,將回答儲存為報告,加上您的筆記。 搜尋不需要 AI。報告保存自己的來源和修訂版本,與簽名日誌分開。[服務商設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/)。 ## 選擇您所需的連線方式 | 任務 | 開啟 | 設定 | | --- | --- | --- | | 讓 AI 用戶端讀取選定的聊天室 | **整合功能 → MCP** | [安裝 MCP、建立限定範圍的權杖並連線](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/) | | 識別儲存媒體中的文字 | `media.saved` 記錄 → **識別附件** | [設定本機 Docker worker](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/) | | 將事件傳送至 n8n 或 SIEM | **整合功能 → 外發 webhook** | [新增接收端、驗證 HMAC、去除重複 ID](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/webhooks/) | **哪些存取憑證該放在哪裡?** 面板存取是給人用的。MCP 有自己的唯讀權杖,webhook 有自己的 HMAC 密鑰。它們都不需要 Telegram 工作階段。 [分享控制面板存取權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/access/)或[設定 MCP 客戶端](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/)。 ## 提供資料來源與結論 請將報告放在簽名 ZIP 旁邊。報告是您對來源的解讀,ZIP 才是接收方要驗證的內容。 [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/exports/) · [完整調查流程指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/cases/) --- # Telegram · 分享案例 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/access/ 讓審查員和分析師能夠存取選定的帳戶和聊天室,並設有獨立的權限、會話限制及可撤銷的存取憑證。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 分享他人所需的案例。其餘部分則由您掌控。 01**選擇證據** 整個工作區或單一聊天室。 02**選擇操作** 檢視、匯出,或只限他們需要的操作。 03**設定限制** 個人權杖,可依需要設定到期時間、工作階段限制和 IP 規則。 收集範圍決定了記錄的內容;存取範圍則決定了使用者能查看和執行的操作。 ## 授予某人存取權限 1. 以管理員身分開啟**存取**。 2. 命名,選擇工作區和聊天室。 3. 審閱者只需要**檢視**。若要下載請加上**匯出**。 4. 設定權限限制後,請按下「**建立存取權限」**。 5. 複製權杖(只顯示一次),連同面板網址私下傳送。 6. 先在另一個瀏覽器工作階段中檢查他們會看到什麼。 ## 從他們需要完成的工作開始 | 人物 | 存取 | 結果 | | --- | --- | --- | | 審閱者 | 精選對話;僅限檢視 | 閱讀聊天室,不能變更任何內容。 | | 分析師 | 精選對話;檢視與匯出 | 閱讀並下載案件所需內容。 | | 操作員 | 精選完整工作區;來源與蒐集 | 決定觀察哪些內容,啟動和停止收集器。 | 這些只是範例,不是固定角色。限於聊天室的存取權永遠不會取得帳戶設定或完整日誌匯出。所有工作區的存取權包括之後新增的帳戶。 ## 您可隨時改變主意 可隨時編輯存取權,從下一次請求起生效。可結束單一工作階段或全部撤銷。已下載的檔案無法收回。收集會繼續執行。 **會話與 IP 限制** 限制並行工作階段和登入次數,設定結束日期,允許特定 IP 或子網路,或鎖定為首次登入的 IP。到期時間依閒置時間計算,開著的面板算作活動。在代理之後時,請檢查應用程式看到的是哪個用戶端 IP。 **主金鑰與活動日誌** 主權杖留在管理員手上。發出的存取權不能管理他人的存取,也不能開啟管理主控台。存取變更和工作階段會簽名寫入日誌,不含權杖。伺服器管理員仍然看得到一切。 全部七項權限和工作階段規則:[存取參考](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)。 --- # Telegram · 讓它持續運作 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/server/ 請在具備持久儲存空間、私人控制台存取權限、備份功能,且重啟後能自動執行檢查的伺服器上運行 TgWitness。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 讓收集器持續執行,資料在重新啟動後依然安全。 ## 選擇啟動方式 原生:[啟動器](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/start/)加上 [deploy/](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md) 中的服務範本。Docker,在專案資料夾中執行: ``` docker compose up -d --build --wait docker compose exec tgwitness cat /data/panel-token.txt ``` 面板監聽 localhost:8787。在本機或透過 SSH 通道開啟,使用第二個指令輸出的權杖。 ## 請保留整個資料目錄 原生:`data/live`。Docker:`tgwitness-data` 磁碟區。日誌、工作階段和金鑰必須放在一起。簽名匯出是證據,不是備份。 1. 先停止收集。 2. 將整個資料目錄複製到主機以外的安全位置。 3. 在信任它之前,先在另一個安裝上試著還原。 ## 重新啟動後請確認 檢查工作區和金鑰、連線、來源,以及新訊息是否進來。TgWitness 會補上 Telegram 仍保留的內容,而不是停機期間發生的一切。 容器「健康」表示網頁伺服器有回應。收集是否正常,要看測試訊息和見證人。 ## 僅發布您有意發布的內容 HTTPS、磁碟區、更新和還原請見部署參考。實際測試過的內容:[驗證紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)。 --- # Telegram · 找出問題所在 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/troubleshooting/ 請透過針對各問題的正確訊號,檢查控制面板存取權限、Telegram 連線狀態、訊息遺失、FloodWait 及 Witness 狀態。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 從症狀著手,一次檢查一項。 ## 控制面板要求輸入代幣 它要的是啟動器所印出檔案中的面板權杖。Docker:`docker compose exec tgwitness cat /data/panel-token.txt`。不是 Telegram 驗證碼,不是機器人權杖,也不是見證人權杖。 ## Telegram 無法連線 執行連線檢查。若使用公開代理,換一個並儲存。檢查代理類型和密鑰格式。重新整理清單本身不會切換路由。 ## 已連線,但無新訊息 1. 觀察是否正在執行,且在正確的工作區中? 2. 來源是否已選取,且該帳戶看得到? 3. 在測試群組中傳送一則獨特的訊息,然後搜尋它。 4. 在日誌中尋找中斷或 Telegram 錯誤。 安靜的聊天室只是沒有新內容。若完整性很重要,請執行受控的送達測試。 ## 重啟後出現 FloodWait 或間隔 FloodWait 是 Telegram 在說「慢一點」。請等它過去並減輕負載,重新連線沒有用。重新啟動後 TgWitness 會補上 Telegram 仍保留的內容;其餘的是空缺,請記錄下來。 ## 該機器人已設定完成,但尚未發布任何內容 見證人是否正在執行,機器人能否在頻道中發文,它能否連到收集器和 Bot API?在它的日誌中尋找發文失敗。收集器端出現輪詢並不代表貼文已送出。 ## GitHub 憑證整合功能在哪裡? **規劃中。**「額外資訊」部分說明了擬議的分叉與建置驗證工作流程。目前尚無 GitHub 憑證表單,亦無自動驗證機制可確認運行中的安裝環境是否與儲存庫相符。請參閱[當前功能狀態](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/)。 回報 bug?請提供版本、作業系統、步驟和去除個資的錯誤訊息。切勿在公開 issue 中放入工作階段、權杖、私人訊息或資料目錄。 --- # TgWitness: Telegram Export, OSINT & Verification Canonical page: https://phishdestroy.github.io/TgWitness/docs/reference/overview/ Explore TgWitness installation, Telegram capture, investigation tools and evidence verification. Read measured workloads alongside their methods and limits. [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/llms.txt) 透過單一指令安裝,或於 GitHub Actions 上進行擷取。了解調查選項、已發布的規模,以及檔案庫所驗證的內容。 TgWitness 是一款開源的 Telegram 資料匯出工具及調查工作區。只需 一則指令即可安裝,連接帳戶、選擇聊天室,並匯出經簽名的 壓縮檔。它亦支援透過 GitHub Actions 進行臨時資料蒐集,並可透過 儲存的編輯記錄、刪除記錄、搜尋及報告功能,持續進行調查。 ## 從您手邊的任務開始 | 您的任務 | 最短路徑 | 您將收到 | | --- | --- | --- | | 儲存對話或帳戶 | 安裝、連結帳戶、選擇匯出範圍 | 一個經過簽名的存檔,內含選定的歷史紀錄、蒐集結果及驗證資料 | | 在臨時執行環境中進行收集 | 使用 GitHub Actions 進行擷取、授權新的會話並選擇範圍 | 一個包含 GitHub 工作流程來源資訊的加密存檔 | | 追蹤隨時間的變更 | 讓觀察功能持續運作於選定的聊天室中 | 已儲存版本、刪除通知、附件及記錄的涵蓋範圍 | | 調查並分享調查結果 | 搜尋檔案庫、使用「案例看板」,並設定報告或分享副本 | 附有來源連結的發現結果,以及適合收件者的可驗證交接流程 | ### 一指令安裝 安裝程式包含 Python 及其依賴項。原始碼檢出、Docker、AI 服務提供者以及獨立見證人皆為可選項目,並非設定的先決條件。 Linux / macOS: ``` curl -fsSL https://get.destroy.tools/install.sh | bash ``` Windows 系統,於 PowerShell 或命令提示字元中: ``` powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "irm https://get.destroy.tools/install.ps1 | iex" ``` 開啟控制面板,連結您的 Telegram 帳戶,並選擇資料蒐集範圍。 安裝程序本身不會自動啟動資料蒐集。[安裝指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/) 說明了本地存取、伺服器、更新以及檢查已下載版本的方法。 若要使用臨時執行程式,請參照 [GitHub Actions 的擷取流程](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md)。該 工作流程需要 GitHub 分支、授權以及存檔密碼。擷取 頁面會說明這些步驟,以及執行前的會話時間預算。請下載 並保留生成的存檔及其驗證資料。 ## 若任務需要,可提供更多設定選項 單一聊天室的匯出功能需具備帳號並選定範圍。持續監測、 多帳號、代理伺服器、附件政策、報告設計、審閱者存取權限、 外部時間戳記及站外儲存,皆可滿足不同的調查與 交接需求。請於相關情況下配置這些功能。 適用範圍、權限設定及最小化分享副本,可協助操作人員選擇應 收集與揭露的內容。管轄權指引與報告設定皆有助於 此決策;選擇特定設定檔本身並不代表已符合法律規範或 具備證據採納性。請[參閱帳戶匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/)、[存取權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)及 [報告設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/)。 本應用程式運行於選定的電腦或伺服器上。基本資料蒐集功能無需 GPU 或大型語言模型 (LLM)。可選用的 OCR、轉錄及 AI 分析功能各有 其資源需求。請根據訊息傳輸率、附件、 保留的歷史紀錄及同時運作的帳戶數量來規劃部署規模;簡易的安裝流程並不保證 每種工作負載的記憶體佔用量皆固定不變。 ## 無論這能幫助誰,都請保留這份紀錄 其目的是保存所觀察到的資料、背景及變更,無論 這些內容支持何方的立場。證據可能會挑戰蒐集者自身 對事件的敘述。請確保原始觀察結果、遺漏的涵蓋範圍及分析結論 均可辨識,以便他人能評估相同的資料。 其運作邏輯為:帳戶可見的觀察紀錄 → 簽名日誌 → 匯出 → 收件者 驗證。儲存的編輯會新增版本。刪除的觀察紀錄仍會保留先前 擷取的內容。覆蓋記錄會揭露已知的中斷情況。報告與 AI 分析會回溯至儲存的來源;某項詮釋不會僅因出現在簽名報告中, 就成為來源觀察紀錄。 | 驗證檢查 | 收件者可確認的事項 | | --- | --- | | 檔案雜湊值、簽名與日誌鏈 | 所提供的記錄與檔案符合預期的金鑰與日誌邊界 | | 一個獨立保留的檢查點或見證 | 此存檔與先前保留的日誌狀態一致 | | 經驗證的外部時間戳記 | 在所述的信任假設下,所引用的位元組於該時間戳記時點確實存在 | | GitHub 擷取證明 | 該存檔符合核准的工作流程、收集器版本及記錄的摘要 | 這些檢查機制可協助驗證內容的完整性與來源。它們並不會將 訊息內容轉化為真命題,亦無法還原未曾見過的已刪除 訊息。請使用獨立取得的金鑰指紋,並依照[《信任指南》及《](https://github.com/phishdestroy/TgWitness/blob/main/docs/TRUST.md)[證據格式》](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/)中的 驗證步驟進行操作。 ## 已公布的規模與實測效能 以下結果描述了不同的工作負載與日期。計數值不可 互換:日誌事件未必等同於一則唯一的 Telegram 訊息。 | 日期 | 工作量 | 發布結果 | 測量內容 | | --- | --- | --- | --- | | 1 年 11 月 2026 | 運行中的伺服器,十個工作區資料庫 | 1,610,818 筆日誌記錄;900,232 則新訊息事件、80,683 則編輯事件及 400,536 則刪除事件 | 唯讀清單;非吞吐量測試,亦非新的全鏈驗證 | | 5 年 11 月 2026 日 | 在 200 個聊天室中搜尋超過 1,000,000 則合成訊息 | 索引建立時間為 71 秒;單次查詢的中位數搜尋時間為 9–190 毫秒 | 本地搜尋基準測試;非即時 Telegram 傳送 | | 6 年 11 月 2026 | 兩份最新的真實 Telegram 匯出檔案 | 27,030 則訊息與 29,299 則訊息;兩次執行共計 56,329 則 | 每次透過 WARP 執行時,僅處理兩個帳戶(包含文字與元資料),不下載任何附件 | | 6 年 11 月 2026 | 相同的兩項匯出作業,包含前置準備與封裝 | 每秒 127.713 及 141.781 則訊息 | 已測量完整匯出率;兩份檔案均已透過固定金鑰進行驗證 | [驗證記錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/) 提供伺服器清單、即時 資料蒐集檢查及搜尋效能測量。[效能匯出](https://phishdestroy.github.io/TgWitness/docs/validation/) 報告包含兩次實際執行結果、硬體規格、執行時間、存檔雜湊值以及簽名 的測量檔案。這些結果僅針對記錄中的特定版本與 執行條件而定,並非普遍適用的速率或容量上限。 ### 測試歷史與持續時間 維護者報告截至 6 十一月 2026. 此處描述了該專案的測試歷史。上述附有日期的公開測量數據 僅記錄了個別執行次數;它們並未構成經獨立驗證、 且持續六個月不中斷的資料蒐集運行。此外,匯出訊息的存檔時間 也與資料蒐集器實際運行時間不同。 ## 精確解讀功能狀態 針對每個工作流程,依據其實作、已發布的建置版本及記錄的 測試結果進行評估。原始碼目前標示為「預覽版」。該發布標籤與 可運作的資料集、匯出功能、獨立驗證及已發布的規模 測量結果並存。預覽功能與已驗證的工作流程可同時存在於同一 應用程式中;請描述評估背後所依據的具體功能與證據。 請綜合參考[當前的功能](https://github.com/phishdestroy/TgWitness/blob/main/docs/STATUS.md)、[特性與限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/)、 [驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)結果及[變更紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/)。 引用結果時,請記錄已測試的修訂版本。6年11月1日的測量 快照亦保留了失敗與跳過的測試;這些不屬於通過的測試。 ## 可供人類及 AI 工具閱讀 該網站提供簡明版本的 `llms.txt`、完整的英文手冊 `llms-full.txt` 及 `llms-full.md`,以及各頁面的 Markdown 版本。這些是 文件格式,並非運行 TgWitness 所需的 AI 要求。 可選的 [MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/) 及[命令列存取功能](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/),允許經授權的工具讀取 選定的儲存紀錄。訊息內容仍屬不可信的輸入。摘要應 引用來源、區分觀察到的事實與推論,並保留不確定性。 全文搜尋、OCR 及 AI 輸出均不會變更原始的簽名觀察結果。 --- # Telegram · 快速入門 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/ 安裝與啟動 TgWitness 的各種方式:Windows 套件、Python、Docker 以及合成示範,並包含初步檢查步驟。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 安裝與啟動 TgWitness 的各種方式:Windows 套件、Python、Docker 以及合成示範,並包含初步檢查步驟。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) **英文** · [俄語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ru/QUICKSTART.md) · [烏克蘭語](https://github.com/phishdestroy/TgWitness/blob/main/docs/uk/QUICKSTART.md) · [西班牙語](https://github.com/phishdestroy/TgWitness/blob/main/docs/es/QUICKSTART.md) · [葡萄牙語(巴西)](https://github.com/phishdestroy/TgWitness/blob/main/docs/pt/QUICKSTART.md) · [土耳其語](https://github.com/phishdestroy/TgWitness/blob/main/docs/tr/QUICKSTART.md) · [阿拉伯語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ar/QUICKSTART.md) · [波斯語](https://github.com/phishdestroy/TgWitness/blob/main/docs/fa/QUICKSTART.md) · [烏爾都語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ur/QUICKSTART.md) · [印地語](https://github.com/phishdestroy/TgWitness/blob/main/docs/hi/QUICKSTART.md) · [印尼語](https://github.com/phishdestroy/TgWitness/blob/main/docs/id/QUICKSTART.md) · [越南語](https://github.com/phishdestroy/TgWitness/blob/main/docs/vi/QUICKSTART.md) · [簡體中文](https://github.com/phishdestroy/TgWitness/blob/main/docs/zh/QUICKSTART.md) TgWitness 是一款用於監控您帳戶可存取之 Telegram 群組與頻道的獨立應用程式, 它於本地端運行,並擁有專屬的資料目錄。 **初次造訪?**請先[瀏覽示範版本](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/#explore-the-interface),再進行帳戶連結。 [請選擇相關指南](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md),內容涵蓋代理伺服器、Witness、資料匯出或伺服器設定。 ## 安裝與啟動 [透過 GitHub Actions 擷取(預覽版)](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md) 請選擇一種方式。可攜式下載檔將於發行版本發布後提供: | 主機 | 無需安裝任何軟體 | 來源:Python 3.11+ | Docker:Engine/Desktop 搭配 Compose 2.20 以上版本 | | --- | --- | --- | --- | | Windows | 從 GitHub Releases 中提取 `TgWitness--windows-amd64-portable.zip`,雙擊 `TgWitness.cmd` | 雙擊 `Start.cmd` | 雙擊 `scripts\Docker.cmd` | | Linux / macOS | — | `sh start.sh` | `sh scripts/docker-start.sh` | 若採用原始碼方式,請[下載並解壓縮目前的 `main`](https://github.com/phishdestroy/TgWitness/archive/refs/heads/main.zip),或複製儲存庫: ``` git clone https://github.com/phishdestroy/TgWitness.git cd TgWitness ``` 如果找不到合適的 Python,`Start.cmd` 會提議為您的 Windows 使用者安裝 Python 3.12(透過 winget 或經過簽署的 python.org 安裝程式)。若缺少 Python,`start.sh` 會印出適用於您的 Linux 發行版或 macOS 的確切安裝指令。首次從原始碼啟動時,會自動建立 `.venv` 並安裝相依套件。 Docker 會編譯應用程式並在背景中啟動它;無需主機端的 Python 環境。 當容器運作正常時,`scripts\Docker.cmd` 和 `scripts/docker-start.sh` 會輸出控制面板位址與代幣。 在所有受支援的主機上,對應的 Docker 指令如下: ``` docker compose up -d --build --wait docker compose exec tgwitness cat /data/panel-token.txt ``` 開啟 **http://127.0.0.1:8787**。使用 Docker 輔助程式或第二個 Docker 指令所產生的憑證,或針對可攜式或原始碼安裝版本,從 **data/live/panel-token.txt** 讀取憑證。接著請前往 下方的「**連線至 Telegram」步驟**。 原生安裝與 Docker 安裝使用各自的儲存空間; 啟動 Docker 並不會匯入現有的原生日誌。 針對伺服器,[部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/)內容涵蓋自動啟用 HTTPS、重新啟動、 發佈的圖片、更新及備份。 ## 探索介面 1. 請在可攜式套件中執行 **TgWitness-Demo.cmd** ,在 Windows 原始碼 資料夾中執行 **scripts\Demo.cmd** ,或在 Linux/macOS 上執行 `sh start.sh --demo` 。首次從原始碼啟動時,系統會先建立 `.venv` 並安裝依賴項。 2. 開啟 **http://127.0.0.1:8787**。 3. 本地示範版本會自動開啟範例日誌。無需複製存取憑證即可直接進行本地存取。 示範訊息均為虛構。示範模式無法連線至真實的 Telegram 帳號。 ## 連接 Telegram > [!警告] **請勿使用任何您無法承受損失的資源。**我們強烈建議您不要連結 個人或重要帳戶,也不要在您重視的帳戶上建立 API ID / 雜湊值。 Telegram 會不預警且經常永久封禁帳戶,無論使用何種客戶端。 測試能否順利進行取決於 Telegram 本身,而非 TgWitness,且無法保證後續運作的穩定性。 1. 若原生示範程式正在執行,請停止它並執行 **Start.cmd** 或 `sh start.sh`。 否則,請讓上述啟動的即時安裝版本繼續運行。 2. 請使用您所採用安裝方式對應的控制面板代碼來開啟控制面板。 3. 若您需要使用代理伺服器,請前往「**帳戶**」**→「設定」→「連線設定」→「變更連線路徑」**進行設定。 4. 在「**帳戶**」中,輸入您的電話號碼並按下「**繼續**」,選擇 **「QR 碼」→「顯示 QR 碼**」,或選取檔案並按下**「連結帳戶」**。 **API ID + Hash** 為選填項目:工作區會使用其儲存或匯入的配對組合, 或從內建池中選取一組可用的配對組合。若要使用您自己的應用程式,請將一組 `API ID:API Hash` 配對組合貼上至 API ID 欄位。 若需完整的授權金鑰,請選擇**「授權金鑰**」,貼上全部 512 個十六進位 字元,並選取提供的 DC ID。使用者 ID 為選填項目,若輸入則會被勾選。 5. 請完成您所選的登入方式:手機號碼/驗證碼/雙因素驗證(2FA),或透過 已登入的 Telegram 應用程式掃描 QR 碼進行確認,亦可匯入受支援的授權會話。 6. 請確認顯示的帳號 ID。開放**來源**:您的聊天記錄會自動載入;請手動新增您的群組。 7. 在「**選擇要保留的變更」**下,請選取事件類別或「 **訊息、編輯與刪除**」預設值,然後儲存監控設定。 8. 請分別選擇附件設定,然後按下「**開始監測**」。 API 憑證用於識別您的應用程式;它們本身並不會 授權任何帳戶。私人群組無需公開使用者名稱,但您的帳戶必須具備存取權限。 對於現有帳戶,請參閱[帳戶與工作階段格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/):面板接受 Telethon StringSession、Telethon/Pyrogram SQLite、單一帳戶 TData ZIP,以及受支援的帳戶 JSON。請同時選取工作階段及其隨附的 JSON,然後按下**連結帳戶**。也可以使用相同的選用 API 設定進行 QR 碼登入。不支援 TDLib、機器人工作階段,以及 CSV/JSON 帳戶清單。 若有多個帳戶,請使用**帳戶 → 匯入帳戶**並選取其受支援的工作階段檔案。隨附的 JSON 檔案會依主檔名自動配對;每個匯入的帳戶都會獲得各自的工作區。請參閱[大量匯入與帳戶群組](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#bulk-import-and-account-groups)。 若要新增另一個帳戶,請按帳戶選擇器旁的 **+**,或開啟 **「帳戶」→「設定」→「連線設定」→「工作區」**,亦可使用**「帳戶」功能**。各工作區擁有獨立的會話、 日誌、金鑰、來源及佇列。切換檢視畫面時,其他資料擷取程式仍會繼續執行。 在此安裝環境中,同一個 Telegram 帳戶無法指派給兩個工作區。 工作區數量沒有限制;由於它們共用同一個程序,因此容量取決於電腦的效能。 即時面板代幣用於保護您對 Telegram 授權及儲存 資料的存取權限;它與 Telegram API 憑證是分開的。僅有明確啟動且 直接存取的本地示範版本才會自動獲得存取權限。遠端/透過代理伺服器存取的示範版本仍會使用 `data/demo/panel-token.txt`。 ## 檢視與匯出 - **日誌:**可依來源及事件類型搜尋並篩選觀察記錄。 - 選擇一項事件,以檢視其原始記錄、來源資訊及儲存的版本。 - 編輯詳情會顯示可用的「編輯前」與「編輯後」內容。刪除詳情則會顯示 最後擷取的內容(如有);若為未知行為者,其身分仍屬未知。 - **匯出格式:**簽名 ZIP、JSONL、CSV 及離線 HTML。 - **完整聊天記錄匯出**(來源 → 完整聊天記錄匯出):將單一聊天室的完整可見 歷史記錄下載為包含 `chat.json`(Telegram-export 風格)及可讀取 `chat.html` 的簽名封裝檔。若該帳號為群組成員,則可匯出私人聊天記錄。此為當前的 快照,並非已刪除或先前編輯過的訊息之重建。 使用 `python verify.py chat-export.zip --fingerprint TRUSTED_SHA256` 驗證 副本。 - **儲存檢查點:**將簽名日誌的邊界維持在收集器之外。 - **下載簽名執行收據:**保留收集器的程式/版本記錄。 - **準備時間戳記請求:**向時間戳記授權機構提交離線請求; 請參照 [TIMESTAMP.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/) 文件以取得並驗證回應。 - **驗證日誌:**檢查事件簽名與鏈結。ZIP 匯出功能亦會檢查媒體檔案。 受支援的瀏覽器可將大型匯出檔直接儲存至指定檔案。其他瀏覽器 最多僅能緩衝 128 MiB。當伺服器正在運行時,串流命令列介面 (CLI) 支援 更大容量的下載,且無需緩衝整個回應: ``` python -m tgwitness.download --token-file data/live/panel-token.txt --out evidence.zip ``` 若要新增另一個工作區,請透過「**匯出」→「工作區 ID」**新增 `--profile ID`。 若要新增遠端伺服器,請新增 `--url https://your-server`。預設傳輸限制為 5 GiB;`--max-mib` 可變更此限制。簽名 ZIP 內容預設另有 4 GiB 的未壓縮 驗證限制(可透過**「參數」**提高此限制;請使用 `verify.py --max-gib N` 驗證此類檔案)。請使用可信賴的驗證器副本以及 獨立保存的金鑰指紋/檢查點來驗證該檔案。 ## 查看安裝說明 ``` python start.py --setup-only python start.py --check python start.py --check --json ``` `--check` 會偵測本地依賴項、簽名支援、儲存空間、金鑰設定以及 監聽位址。此工具不會安裝任何軟體,也不會連線至 Telegram。若端口 處於繁忙狀態,可能表示另有實例正在運行。請改用其他 `--port`,或先停止該實例。 啟動程式會安裝至 `.venv`。輔助的 `python -m tgwitness...` 指令必須 在 Windows 上使用 `.venv\Scripts\python.exe`,或在 Linux/macOS 上使用 `.venv/bin/python`, 除非該環境已啟用。 ## 會話、保護與操作 封閉且一致的 Telethon SQLite `.session` 檔案可透過 `python -m tgwitness.sessions account.session --out account.tgwitness-session` 在本地端轉換,隨後 載入至 Account。亦支援直接檔案匯入及 QR 碼登入。有關登入格式、SOCKS5、 HTTP CONNECT、MTProxy 及外部主金鑰的詳細資訊,請參閱 [CONNECTION-SECURITY.md。](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/) **暫停監測**將停止資料收集。鎖定僅會關閉瀏覽器存取權限。 關閉分頁後,收集程序仍會繼續運行。停止該程序才會中斷 資料收集;歷史快照無法還原所有遺漏的編輯或刪除紀錄。 了解[資料收集在事件政策、附件佇列、 帳戶隔離及重新啟動行為方面的運作方式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/)。 會話與機密資料均經過加密。訊息內容、媒體檔案及匯出檔案需儲存於 加密磁碟或磁碟區中。簽名僅能依據可信密鑰驗證資料的完整性; 無法驗證訊息源自 Telegram,亦無法防止由 控制資料收集器及其密鑰的操作者進行偽造。 請參閱 [OPERATIONS.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/) 了解備份/還原[操作,DEPLOYMENT.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) 了解託管設定,以及 [deploy/](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md) 中的服務範例。已安裝的 控制面板中亦包含一份離線設定指南,網址為 `/guide.html`。 實際的驗證結果與現存的限制 詳載於 [VERIFICATION.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/) 及 [READINESS.md](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/READINESS.md) 文件中。 --- # 安裝、驗證與更新 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/ 只需一則指令即可安裝、檢查簽名與雜湊值,並更新或移除安裝。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) Translation coverage: this edition includes material from the English original. 只需一則指令即可安裝、檢查簽名與雜湊值,並更新或移除安裝。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) [專案](https://github.com/phishdestroy/TgWitness/blob/main/README.md) · [快速入門](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) · [部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) **本頁內容** - [一指令即可安裝](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#install-with-one-command) - [萬物運行的所在](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#where-everything-runs) - [全文搜尋設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#full-text-search-settings) - [命令列存取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#command-line-access) - [執行前請先驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#verify-before-running) - [更新現有安裝](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#update-an-existing-installation) - [Ubuntu 上的常用指令](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#everyday-commands-on-ubuntu) - [移除 TgWitness](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/installation/#remove-tgwitness) ## 只需一則指令即可安裝 此引導式安裝程式包含一個專屬的 Python 執行環境。日後安裝時請使用相同的網址: 每次發布都會一併更新安裝程式、雜湊值、簽名 及建置資訊。 **Linux / macOS (Bash):** ``` curl -fsSL https://get.destroy.tools/install.sh | bash ``` 在 Ubuntu 伺服器上,請以 root 身分執行以安裝背景服務。在桌面電腦上, 請以一般使用者身分執行。 **Windows(PowerShell 或 命令提示字元):** ``` powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "irm https://get.destroy.tools/install.ps1 | iex" ``` 在 Windows 系統上無需管理員權限。子 PowerShell 程序會讓您的 終端機保持開啟狀態並顯示結果。Python 及其依賴項會保留在安裝目錄中。 在 Ubuntu 上,請選擇「**這台電腦**」、「**臨時 HTTPS 連結**」或「**自有網域**」。 安裝程式會顯示控制面板地址和存取金鑰。若要取得臨時連結,請在瀏覽器中開啟 該 HTTPS 地址並輸入金鑰。若需透過遠端 伺服器進行本地存取,請從您的電腦使用 SSH 轉發 (`ssh -L 8787:127.0.0.1:8787 user@server`) 並開啟 `http://127.0.0.1:8787`。在 macOS 和 Windows 上,本地面板會直接在您的 瀏覽器中開啟;請保持其終端機持續運行。 請在面板中登入 Telegram,並選擇要收集的內容。僅進行安裝 並不會啟動 Telegram 資料收集功能。 ## 一切運作之處 `get.destroy.tools` 是一個**用於提供靜態檔案下載的 Cloudflare Worker**。它沒有 TgWitness 面板、Telegram 會話或使用者證據資料庫。它不會被路由至 專案的 VPS。該應用程式運行於您執行該指令的機器上。 | 安裝 | 程式 | 資料 | | --- | --- | --- | | 以 root 身分使用 Ubuntu | `/opt/tgwitness` | 系統服務: `/var/lib/tgwitness-`;請使用 `tgwitness paths` 以獲取確切路徑。 | | Linux / macOS 使用者 | `~/.local/share/tgwitness` | `data/live` 在該安裝環境下。 | | Windows 使用者 | `%LOCALAPPDATA%\TgWitness` | `data\live` 在該安裝環境下。 | 設定 `TGWITNESS_INSTALL_DIR` 以選擇另一個資料夾。已安裝的版本與資料 是分開儲存的。安裝程式不會將您的帳號、訊息或金鑰上傳至 下載網站。選擇 Cloudflare 隧道會將控制面板的流量導向 Cloudflare;使用您自己的網域則會指向您自己的伺服器。 With `TGWITNESS_TRUSTED_PROXIES`, the panel accepts a single `X-Forwarded-Proto: https` from a trusted proxy to set Secure download cookies. 每個安裝包均包含 **START-HERE.html** 和 **START-HERE.txt** 檔案,其中載有本機 路徑、指令以及儲存庫連結。執行 `tgwitness guide` 以開啟指南。 在 Windows 上,請使用 `& "$env:LOCALAPPDATA\TgWitness\bin\tgwitness.cmd" guide` 在 PowerShell 中執行。 ## 全文搜尋設定 [全文搜尋](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/)(預覽版)無需任何設定。其索引會在更新後於 後台自動建立。 | 變數或指令 | 效果 | | --- | --- | | `TGWITNESS_FULLTEXT=disk` | 預設:索引儲存於 `search/fulltext.sqlite3` 每個工作區中 | | `TGWITNESS_FULLTEXT=memory` | 無索引檔案;每次啟動時都會重新建立索引 | | `TGWITNESS_FULLTEXT=off` | 不提供索引;僅支援精確文字搜尋 | | `tgwitness index status` | 索引每個工作區的狀態 | | `tgwitness stop`, `tgwitness index rebuild`, `tgwitness start` | 從簽名日誌重建所有索引 | 管理員在「**日誌**」**→「篩選器」→「搜尋索引」**中的設定會覆寫 該工作區的變數。指令會尋找執行該指令之安裝版本的 資料目錄;其他情況下,請在路徑後方加入 `--data-dir` 並加入來自 `tgwitness paths`。 若要取得完整的烏克蘭語詞典(GPL-3.0 資料),請在 `pymorphy3-dicts-uk` 至 該安裝的 Python 環境中。 ## 命令列存取 [命令列](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/)(預覽版)會讀取存檔中的腳本和代理程式。 | 變數 | 效果 | | --- | --- | | `TGWITNESS_URL` | 面板位址為 `tgwitness search`, `context`, `messages`, `stats` 以及 `export`;預設 `http://127.0.0.1:8787` 當設定代幣時 | | `TGWITNESS_MCP_TOKEN` | 將連線憑證從**「整合」→「MCP**」中存檔,並與 MCP 客戶端共享; `--token-file` 改為從檔案中讀取該憑證 | | `TGWITNESS_DATA` | 若未提供 `--data-dir`、URL 或憑證時,將直接讀取資料目錄 | ## 執行前請先驗證 這條單行指令會信任 HTTPS 上的初始腳本。該腳本會在安裝前檢查 SHA-256 以及應用程式和限制條件上的專案 RSA 簽名。 您也可以先下載並驗證初始腳本。 公開發佈金鑰為 [release-signing.pub](https://github.com/phishdestroy/TgWitness/blob/main/deploy/installer/release-signing.pub)。 其 SHA-256 為: ``` 039d98a658ccda14253e45a00335b4a68d840976d8ec18b8d4355cc7c458447d ``` 請保留此來自您信任的儲存庫版本的指紋。來自 同一下載伺服器的校驗和可偵測不一致;而獨立受信任的公開 金鑰則是驗證發行簽名的依據。 請為以下驗證下載內容使用一個新的、空的目錄。 **Linux / macOS — 請在新的、空的下載目錄中執行**(需安裝 curl 和 OpenSSL): ``` curl -fSLO https://get.destroy.tools/install.sh && curl -fSLO https://get.destroy.tools/install.sh.sig && curl -fSLO https://get.destroy.tools/release-signing.pub && test "$(openssl dgst -sha256 release-signing.pub | awk '{print $NF}')" = \ '039d98a658ccda14253e45a00335b4a68d840976d8ec18b8d4355cc7c458447d' && openssl dgst -sha256 -verify release-signing.pub -signature install.sh.sig install.sh && bash install.sh ``` 若 `&&` 若下載、金鑰指紋或簽名 驗證失敗,執行鏈將在執行前中止。若在下載腳本與其 簽名之間發生發布更新,請重新下載兩者。舊版安裝程式會保留其不可變的套件 URL。 **Windows — 執行前請檢查 SHA-256:** ``` Invoke-WebRequest https://get.destroy.tools/install.ps1 -OutFile install.ps1 -UseBasicParsing Get-FileHash .\install.ps1 -Algorithm SHA256 Invoke-RestMethod https://get.destroy.tools/SHA256SUMS.txt ``` 將雜湊值與 `install.ps1` 該行進行比對。若要進行獨立的簽名驗證, 請使用 OpenSSL(例如透過 Git Bash)並採用上述相同的公鑰指紋: ``` curl -fSLO https://get.destroy.tools/install.ps1 && curl -fSLO https://get.destroy.tools/install.ps1.sig && curl -fSLO https://get.destroy.tools/release-signing.pub && test "$(openssl dgst -sha256 release-signing.pub | awk '{print $NF}')" = \ '039d98a658ccda14253e45a00335b4a68d840976d8ec18b8d4355cc7c458447d' && openssl dgst -sha256 -verify release-signing.pub -signature install.ps1.sig install.ps1 && powershell.exe -NoProfile -ExecutionPolicy Bypass -File install.ps1 ``` Windows 安裝程式會透過 .NET 自行驗證套件簽名,無需 OpenSSL。這些是獨立的 RSA-3072 / SHA-256 簽名,而非 Authenticode。 [清單檔案](https://get.destroy.tools/manifest.json)記錄了軟體版本、 精確的 Git 提交碼、不可變的發行 ID 以及每個建構產物的 SHA-256。該頁面連結 至對應的原始碼。清單檔案和校驗和清單也具有獨立的 簽名(`manifest.json.sig` 以及 `SHA256SUMS.txt.sig`). ## 更新現有安裝 **新發布的版本會更新下載網站;當您 再次執行安裝程式時,已安裝的程式便會更新。**本工具不提供無人值守的更新程式,也不會自動重新啟動 正在運行的集合。當前的安裝程式通道為**預覽版**;它遵循 來自 `main`發布並經過驗證的建置版本,其提交時間可能比上一個 編號的 GitHub 發行版更晚。該頁面的版本來自 `pyproject.toml`;其提交 與建置 ID 用於區分同一預覽版本內的更新。 當該特定提交通過應用程式與 安全性檢查,且簽名套件通過 Ubuntu 服務及 Windows PowerShell 安裝測試後,系統將自動發布。在檢查執行期間,或若檢查失敗時, 系統將繼續執行相同指令以安裝先前已通過檢查的建置版本。建置清單 會顯示目前可用的提交;預覽更新期間,僅版本號可能保持 不變。 請使用與先前相同的安裝資料夾及作業系統使用者。在停止資料收集時,備份完整的資料 目錄; `tgwitness paths` 以識別該資料夾。經簽名的匯出檔 並非完整的安裝備份。 **Ubuntu 根目錄安裝位於 `/opt/tgwitness`:** ``` curl -fsSL https://get.destroy.tools/install.sh | TGWITNESS_INSTALL_DIR=/opt/tgwitness bash -s -- --no-start ``` 安裝成功後: ``` /opt/tgwitness/bin/tgwitness restart /opt/tgwitness/bin/tgwitness status /opt/tgwitness/bin/tgwitness open ``` 若為 Linux/macOS 用戶安裝,請使用原始 `TGWITNESS_INSTALL_DIR` 或 預設設定,並再次執行第一個安裝指令。更新前請先關閉前台 面板,更新後再重新啟動。若為已設定的 Linux 使用者 服務,請執行其 `tgwitness restart` 指令。 **Windows:**關閉正在運行的面板,再次執行 Windows 安裝指令, 然後在 `bin\tgwitness.cmd` 同一安裝環境中執行。安裝程式會保留資料、 工作階段、存取設定及簽名金鑰。僅當 新環境通過檢查後,才會切換啟動器;若安裝失敗,則 原有的啟動器仍會保留。請保留升級前的備份,以因應儲存格式變更。 ## Ubuntu 上的常用指令 | 指令 | 結果 | | --- | --- | | `tgwitness open` | 當前面板網址與存取金鑰。 | | `tgwitness paths` | 精確的程式、資料及指南路徑。 | | `tgwitness guide --print` | 離線操作說明。 | | `tgwitness status` / `tgwitness logs` | 可用性/服務日誌。 | | `tgwitness stop` / `tgwitness start` | 停止/恢復服務;保留資料。 | | `tgwitness token rotate` | 替換管理員金鑰並結束瀏覽器會話。 | | `tgwitness tunnel off` | 停用公開快速隧道;保留本地面板。 | | `tgwitness tunnel on` / `tgwitness tunnel restart` | 建立快速隧道連結/替換其網址。 | 請參閱[「存取權限」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/) 以了解同事憑證、會話及 IP 限制,以及 「[安裝程式發佈」](https://github.com/phishdestroy/TgWitness/blob/main/deploy/installer/README.md#automatic-publication-from-github) 以了解從 GitHub 到 Cloudflare 的發佈工作流程。 ## 移除 TgWitness 本工具無專用解除安裝程式:請先停止面板運作,再刪除其資料夾。刪除 data 資料夾將永久銷毀日誌、簽名金鑰、Telegram 連線紀錄及儲存的檔案。 執行此操作前: 1. 匯出您所需的內容(**匯出 → 下載已簽名的 ZIP**),並將簽名金鑰 的指紋與檢查點存放在這台機器之外。若要保留工作區本身,請在停止資料收集後, 複製整個資料資料夾。 2. 請從「**您的伺服器」**中刪除在「**附加功能 → 24/7 伺服器」**下建立的伺服器,或透過 `python -m tgwitness.cloud destroy`;服務供應商將持續向您收費,直至該伺服器被刪除為止。 3. 請在 Telegram 的**「設定」→「裝置」**中結束每個帳戶的會話。刪除 檔案並不會在 Telegram 端登出該會話。 **Ubuntu 根目錄安裝。**請注意資料夾位置,停止服務,然後移除 該服務、相關資料夾及捷徑: ``` /opt/tgwitness/bin/tgwitness paths /opt/tgwitness/bin/tgwitness stop systemctl list-unit-files 'tgwitness-*' systemctl disable tgwitness- rm /etc/systemd/system/tgwitness-.service systemctl daemon-reload rm -rf /opt/tgwitness /var/lib/tgwitness- /usr/local/bin/tgwitness ``` **Linux 或 macOS 使用者安裝說明。**關閉面板。已設定的 Linux 使用者服務 將透過 `systemctl --user disable --now tgwitness-`;其單位為 `~/.config/systemd/user/`。接著刪除 `~/.local/share/tgwitness` (或您的 `TGWITNESS_INSTALL_DIR`) 以及 `~/.local/bin/tgwitness` 捷徑。 **Windows。**關閉面板並刪除 `%LOCALAPPDATA%\TgWitness` (或您的 `TGWITNESS_INSTALL_DIR`)。安裝程式不會新增任何服務、排程任務或捷徑。 --- # Telegram · 首次設定與設定選項 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/ 設定精靈、目標、介面層級、連線路徑,以及由帳戶群組共享的設定。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 設定精靈、目標、介面層級、連線路徑,以及由帳戶群組共享的設定。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) [帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/) · [連結](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/) · [存取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/) 開啟新工作區時 `/first-run`:語言與時間、介面層級、目標、 連線、Telegram 及聊天室。每個答案一經變更, 便會立即儲存至伺服器,因此重新載入後將繼續執行同一步驟。最後一個畫面會列出所有答案, 並讓您返回任何一個答案。 語言、IANA 時區、主題及層級皆依操作者及工作區分別儲存。 預設值分別為瀏覽器語言、裝置時區、系統主題以及 「簡易」介面。變更語言後,面板會保留當前會話狀態。經簽名的 日誌中的時間永遠不會改變。 `/settings` 可編輯與精靈相同的記錄。搜尋功能涵蓋主要欄位、 參數及延伸表單;無需變更 權限層級即可開啟隱藏欄位。權限層級僅影響顯示內容:伺服器會自行檢查權限。 集合設定與首次連線由工作區管理員負責。 | 層級 | 欄位 | 側邊欄 | | --- | --- | --- | | 簡單 | 僅保留必要功能 | 首頁、聊天、變更、存檔、設定 | | 標準 | 常見設定與說明 | 新增 Case Board、帳戶與存取權限 | | 專家 | 所有欄位、限制及技術細節 | 新增「來源」、「額外功能」、「詢問存檔」、「參數」、「帳戶」、「系統日誌」及「整合功能」 | [面板指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/)中對各個區塊進行了說明。 ## 目標 | 目標 | 收藏集 | 檔案 | 外部服務 | 伺服器地址 | | --- | --- | --- | --- | --- | | 存檔副本 | 關閉;「**開始」**會執行匯出 | 照片大小上限為 20 MB | 關閉 | 自動 | | 追蹤聊天室 | 持續 | 照片及影片最長 60 秒/20 MB | 時間戳記與問題通知 | 自動 | | 證據 | 持續 | 所有檔案大小上限為 1 GB | 時間戳、drand、通知 | 不,隱藏它 | 建議將「站外副本」、「見證機器人」及「程式碼檢查」用作證據。 儲存空間和通知地址需先設定目標位置。若要使用 與外部服務互動的功能,系統會要求允許發送 Telegram 外部的請求;若關閉此功能, 系統將同時關閉時間戳記、通知及站外副本。 變更目標會優先顯示差異,且手動變更可予以保留。與目標 不符的欄位會標示為「**由您變更」**,並可還原。 設定版本控制機制可防止已審核的差異被套用,以避免覆蓋在 另一個分頁中所做的變更。 ## 連結 **Automatic** 會先嘗試公開的 MTProxy 伺服器,接著是 WARP,最後才是直接連線, 且僅在伺服器地址可能被顯示時才會採用直接連線。Automatic 和 WARP 均可安裝 經過雜湊驗證的元件,並將伺服器註冊至 Cloudflare。WARP 使用 現有的 wgcf/wireproxy 管理程式及本機 SOCKS5 埠;系統路由表 不會被更改。當需要使用外部服務時,Automatic 會優先選擇 WARP 而非 MTProxy。 您的專屬代理伺服器接受 `tg://proxy`, `socks5://`, `http://` 並 `https://`。在將憑證傳送至 HTTPS 代理伺服器之前,系統會先驗證其憑證。 連線檢查有效期為五分鐘,並與路徑、政策及 精靈的回答綁定;若變更其中任何一項,則需進行新的檢查。可選擇**「不檢查而繼續」**, 但此選項並不會取代 Telegram 的登入程序。所選的路徑 會在後台重新檢查,且在連線中斷後,自動模式會再次執行其鏈。當沒有公開代理伺服器回應時, 計數器會轉為紅色,並觸發 WARP 及重新檢查 動作。 ## 帳號群組 同一群組內的帳戶會共用設定。請開啟**「帳戶」→「群組與共用 設定」→「共用設定**」,或在帳戶的「設定」頁面中點選「**群組設定」**。 該群組共享目標、儲存的檔案、時間戳記、drand、問題通知、 站外備份、Telegram 外部請求、IP 模式、記錄內容、重新檢查 時程、通知規則、報告設定、參數以及連線路徑。 通知目的地、代理伺服器憑證及登入資訊均依帳戶而定, 收集的啟動與暫停操作亦同。 - 每位成員皆追蹤該群組。在「設定」中,可將值標記為 🔗 **來自群組**,或 ✏️ **自訂值**;選擇「**恢復為群組值」**即可將其還原。 - 每次變更都會列出受影響的帳戶(**適用於 3 個帳戶中的 2 個**),並在替換原始值之前,針對 每個帳戶進行確認。未勾選的帳戶將保留其原始值。 - 若某個參數未被群組共享,其狀態將維持為 **未共享:每個帳戶皆保留其專屬資料**,直到您按下 **分享此值** 為止。 - **從一個帳戶複製設定時,**系統會將所選帳戶的數值設為該群組的設定。 - 當帳戶移入群組時,系統會詢問**「是否採用該群組的設定?」**;若選擇「否」,則該帳戶將保留 其原有設定,並標示為 ✏️。其後新增的帳戶則預設採用該群組的設定。 - 觀察帳戶會維持其 IP 模式,直到被暫停為止。 每次變更都會記錄在主工作區以及所有 受影響成員的已簽署日誌中。刪除群組時,該群組內的帳戶及其當前值將予以保留。 群組頁面 `/groups/` 會顯示成員名單、待處理事項,以及 多個帳戶共同瀏覽的聊天室。請參閱「[帳戶群組」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#bulk-import-and-account-groups)。 ## 現有工作區 若工作區中已有會話或先前已完成的設定,則不會顯示設定精靈。 頁面載入時,其值不會被目標所取代。隱藏欄位並不會 停用該功能或刪除其值。 大小與時間估算值基於最多三組選定的聊天室,以及每組聊天室中最多 20 則訊息。 此為估算值:無法預測 Telegram 的限制、特定 伺服器的速度,或每組聊天室中的檔案內容。 --- # Telegram · 帳戶與會話格式 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/ 可透過手機、QR 碼或授權金鑰登入,匯入 Telethon、Pyrogram 或 Telegram Desktop 的會話紀錄,並同時管理多個帳戶。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 可透過手機、QR 碼或授權金鑰登入,匯入 Telethon、Pyrogram 或 Telegram Desktop 的會話紀錄,並同時管理多個帳戶。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) TgWitness 透過 MTProto 協議,使用 Telethon 以 Telegram 用戶帳戶(而非機器人)身分登入。每個帳戶皆位於獨立的工作區中(在 API 和命令列工具中稱為「工作區」),並擁有專屬的會話、來源、日誌及簽名金鑰。 會話檔案、會話字串及認證金鑰均屬**帳戶授權憑證**:凡 持有其中任何一項者,皆可代表該帳戶進行操作。這些資料不包含訊息歷史紀錄。 > [!警告] **請勿使用任何您無法承受損失的資料。**我們強烈建議不要連結 個人帳戶或其他重要帳戶,也不要使用您重視的帳戶來建立 API ID 或 API 雜湊值。 這並非因為 TgWitness 未經測試:Telegram 會以不可預測的方式限制並 永久封禁帳號——只要其認為請求量 過高,無論使用何種客戶端或出於何種目的,且未提供充分的文件說明。許多封禁 措施皆無法撤銷。 請使用專用帳號。測試能否順利進行取決於 Telegram,而非 軟體本身,且無法保證後續運作無虞。 - [一覽](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#at-a-glance) - [開始之前:API ID 與 API 雜湊值](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#before-you-start-api-id-and-api-hash) - [電話號碼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#phone-number) · [QR 碼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#qr-code) · [授權金鑰 + DC 識別碼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#auth-key--dc-id) - [帳戶檔案](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#account-files): [Telethon .session](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#telethon-session) · [Pyrogram .session](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#pyrogram-session) · [會話 + JSON 對](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#session--json-pair) · [TData](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#telegram-desktop-tdata) · [StringSession](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#telethon-stringsession) · [帳戶 JSON](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#account-json) - [釐清您所擁有的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#identify-what-you-have) · [不支援的格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#unsupported-formats) - [多個帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#multiple-accounts) · [確保帳戶檔案安全](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#keeping-account-files-safe) · [疑難排解](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#troubleshooting) ## 一覽 | 您現有的內容 | 「**新增帳戶**」分頁 | 您還需要 | | --- | --- | --- | | 電話號碼及其登入代碼的存取權限 | **電話** | 若已啟用,則為雙因素驗證 (2FA) 密碼 | | Telegram 已在另一台裝置上開啟 | **QR 碼** | 若已啟用,則為雙因素驗證 (2FA) 密碼 | | `.session` 檔案(Telethon 或 Pyrogram) | **檔案** | 可選的 JSON 檔案,用於應用程式設定 | | `.session` + `.json`(名稱相同) | **檔案**(請選取兩者) | 通常沒有其他內容 | | Telegram 桌面版中的「`tdata`」資料夾 | **檔案**(ZIP 壓縮檔) | 若已設定,則為桌面版本機通行碼 | | 一場 Telethon StringSession(文字、`.txt`、`.tgwitness-session`) | **檔案** | 無需額外配對的 API | | 一個附帶會話或認證金鑰的 `.json` | **檔案** | 無需額外配對的 API | | 一個授權金鑰(512 個十六進位字元)及其 DC 編號 | **授權金鑰** | 可選使用者 ID | TgWitness 根據檔案**內容**而非檔案名稱來識別檔案。重新命名檔案 絕不會導致其轉換。 ## 開始之前:API ID 與 API 雜湊值 您無需建立 Telegram API 應用程式即可登入。當未輸入、 未匯入或工作區中尚未儲存任何密鑰對時,TgWitness 會從其內建的 50 組公開 API 密鑰對池(`tgwitness/api_pool.py`)中選取一組,若為首次 登入則優先選用 Telegram Desktop 的密鑰對,並優先保留已儲存的密鑰對;其餘候選密鑰對則會隨機排序。 若 Telegram 拒絕某組密鑰對 (`API_ID_INVALID`、`API_ID_PUBLISHED_FLOOD`、`UPDATE_APP_TO_LOGIN`),系統將嘗試下一組, 每次登入最多嘗試八組;遭拒絕的密鑰對將被跳過,直至重新啟動。成功登入的密鑰對將 與該帳戶一同儲存,並供該帳戶重複使用。**API ID** 與 **API 雜**湊值用於向 Telegram 識別應用程式;它們 本身並不會授權任何帳戶。 若缺少連線欄位,則使用捆綁的 [opentele2 2.0.0 目錄](https://github.com/DedInc/opentele2/tree/7e973bc71cd7a714ad13ac703c0895a90d36a735)中預設的確定性裝置/作業系統組合: 桌面版 `2040`、Android `6`、Android X `21724`、iOS `10840`、macOS `2834` 以及 Web `2496`。 Android 的原始碼建置 ID `4` 亦採用 Android 目錄,此資訊可於 [Telegram Android 的 BuildVars](https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/src/main/java/org/telegram/messenger/BuildVars.java) 中查證。 Web 預設為 A;若導入 `K` 應用程式版本後綴或 `macos` 語言套件,則選取 K;版本 `0.7.0` 則選取 Webogram。未知應用程式 ID 將維持 Telethon 的主機 預設值。導入的欄位始終具有優先權,包括較舊的應用程式版本及空的 語言套件。目錄絕不會變更 API ID/雜湊值。其版本快照會 經過明確審查,而非於登入時自動擷取。儲存的設定檔在更新後仍保持穩定。 `account.getAuthorizations` 會回報 Telegram 儲存的授權元資料;這 並非每次執行 `initConnection` 時的即時回響。請將其與實際傳送的設定檔進行比對。 連接現有授權並不會驗證其對應的 API 雜湊值: `initConnection` 會傳送 API ID,而雜湊值則用於登入請求。 在進行新手機或 QR 碼授權後,TgWitness 會依序請求設定檔、最近的數據中心、 線上狀態、語言(當語言套件不為空時)、應用程式更新及 服務條款更新,各次請求之間間隔 0.3 至 1.5 秒。 更新狀態 會短暫將帳戶標記為線上狀態。此流程僅在登入完成時執行一次, 不會在匯入資料、重新連線或重新啟動時執行。授權資訊會優先儲存;若請求失敗, 流程將立即中止,不會重試或捨棄登入資料。結果會 記錄為 `account.initialized`,內容為錯誤名稱而非回應正文。 此流程無法保證帳戶不會受到限制。 對於 `tdesktop` ,若未指定 `tz_offset` ,則會使用伺服器的本地 UTC 偏移量,並透過 [opentele2 演算法](https://github.com/DedInc/opentele2/blob/7e973bc71cd7a714ad13ac703c0895a90d36a735/crates/opentele2-core/src/fingerprint.rs) 四捨五入至 900 秒 (MIT;授權條款見 `tgwitness/client_profiles.LICENSE` )。此值會在每次 連線時更新,以反映夏令時變更。在所有平台上,已匯入的 `tz_offset` 均具有優先權,且會精確保留(包括零值)。其他 `initConnection.params` 項目則予以保留。 HTTP 登入表單接受檔案匯入所回傳的數值時區; 布林值、小數以及超出支援範圍的偏移量均會被拒絕。 直接、SOCKS5 及 HTTP CONNECT 路由均採用 Telethon 的 `ConnectionTcpObfuscated` (經混淆的簡化版 MTProto)。HTTPS CONNECT 維持與代理伺服器之間的 TLS 連線,並在隧道內使用 相同的混淆傳輸協定。MTProxy 則維持其所需的 隨機化中間傳輸協定與密鑰處理機制。路由切換時亦採用 相同的選項。 混淆處理會改變封包的幀結構;它並不會向 Telegram 隱藏 帳戶或其客戶端元資料,亦不表示能免受限制。 在連線至授權客戶端後,TgWitness 會檢查設定、最近的資料中心、 當前授權狀態、已審核的層級基準、語言、應用程式更新 以及服務條款更新。這些診斷程序會在每個客戶端實例中執行一次, 且在資料蒐集之前進行,並會連同執行時間一併顯示於連線詳細資訊中。 `account.connection_checked`會記錄結果,但不包含會話雜湊、IP 位址、 標記或 API 雜湊。它們絕不會接受條款或安裝更新。若發生 請求失敗或 FloodWait 狀態,後續請求將停止;若結果缺失,則維持未知狀態。 即使跳過網路檢查,本地檢查仍可回報其結果。 FloodWait 診斷資訊會保留失敗的 TL 方法、任何 Takeout/range 封裝器、 伺服器要求的等待時間,以及 `telegram.backoff` 中的有效截止時間。 當請求暫停時,連線詳細資訊會顯示方法與截止時間。 該診斷資訊包含自該客戶端建立以來 各方法的客戶端呼叫計數器;這些計數器會分別統計嵌套的對等節點解析次數,但不會計入封包 或 Telethon 的內部重試次數。當前計數器亦可透過狀態 API 中的 `collector.rpc_activity` 取得。 不包含任何請求參數、使用者名稱、存取 雜湊值或例外訊息。最後的診斷記錄與完整截止時間 在重新啟動後仍會保留。較早且未記錄方法的等待狀態 無法事後歸因。請參閱來源審查的[匯出限制](https://github.com/phishdestroy/TgWitness/blob/main/docs/EXPORT-LIMITS.md), 以及「發現」與「歷史資料擷取」之間的區別。 `official_app=True` 或 `False` 是 Telegram 的當前授權標誌。這兩種 值均無法判定該帳號是否受限、受信任或正處於監測狀態。 現有的證據模式 `account.devices` 快照仍保留所有 已登入裝置的歷史紀錄;連線診斷則僅保留當前裝置的描述。 連線前,諮詢性檢查會將 API 平台、語言套件、 裝置/作業系統與應用程式版本格式、行動系統地區設定,以及 Telethon 的實際 架構層,與已審核的目錄基準進行比對。警告訊息會顯示於伺服器 日誌及帳戶狀態元資料中;這些警告絕不會取代匯入的值,也不會變更 架構層。 不同層級僅代表相容性審查訊號,並非證明該 帳號已失效或受限。這些檢查及 `official_app` 並未保證 Telegram 認定該帳號不受限制。已斷開連線的帳號狀態 會使用儲存的個人資料,而非重新生成另一份裝置描述。 若要改用您自己的應用程式(註冊該應用程式的帳戶將面臨風險;請參閱「 [為何需要內建的 API 池?](https://github.com/phishdestroy/TgWitness/blob/main/docs/PROJECT-GUIDE.md#connect-a-telegram-account)」): 1. 開啟 [my.telegram.org](https://my.telegram.org) 並使用您擁有的任何電話號碼 登入。驗證碼將發送至 Telegram 應用程式,而非透過簡訊。 2. 選擇 **API 開發工具**。 3. 建立應用程式:任選標題與簡稱(5–32 個字母),平台選「**桌面版**」。 網址與描述欄位可留空。 4. 請複製 **App api_id**(一個數字)和 **App api_hash**(32 個十六進位字元)。 在登入表單下方的面板中,會顯示「**API ID + Hash**」。您可將一組 `api_id:api_hash` 組合貼上至 **API ID** 欄位,系統便會自動填入兩個欄位。同一組組合可 適用於您所有的帳戶。成功登入後,該組合將以加密形式儲存於 該工作區內,且絕不會傳回瀏覽器。 涉及三種不同的憑證: | 機密 | 開啟 | 存放位置 | | --- | --- | --- | | 面板代幣 | TgWitness 網頁控制面板 | 資料目錄中的 `panel-token.txt`,或 `TGWITNESS_TOKEN` | | API ID + 雜湊值 | 本身並無特殊含義;僅用於識別該應用程式 | 可透過內建配對、匯入設定,或於 my.telegram.org 建立您專屬的應用程式 | | 帳戶授權 | Telegram 帳號 | 可透過手機/QR 碼登入建立,或作為會話匯入 | 若必須透過代理伺服器連線至 Telegram,請先前往「 **帳戶」→「設定」→「連線設定」→「變更連線路徑**」進行設定。 ## 電話號碼 1. 開啟「**帳戶**」頁面,切換至**「電話」**分頁,並以國際格式輸入號碼, 例如 `+44 7700 900123`。空格和連字號會自動移除。 2. 按下「**繼續**」。API ID + Hash 欄位可留空。 3. 請輸入 Telegram 發送的驗證碼(通常發送至 Telegram 應用程式;無法保證會透過簡訊發送)。 4. 若該帳號啟用了兩步驟驗證,請輸入該密碼。此密碼並非控制面板 代幣,亦非裝置通行碼。 5. 登入後請確認顯示的帳號 ID,然後選擇資料來源。 登入代碼與雙因素驗證 (2FA) 密碼絕不會寫入磁碟。 ## QR 碼 當該帳號已在手機或另一台電腦上登入時,請使用此功能。 1. 點擊「**QR 碼」**→ **顯示 QR 碼**。API ID + Hash 欄位可留空。 2. 在已登入的裝置上:**設定 → 裝置 → 連結桌面裝置**,掃描條碼 並確認。 3. 若 Telegram 要求,請在 TgWitness 中輸入雙因素驗證 (2FA) 密碼。 此 QR 碼圖像係於本地端產生。QR 碼會過期;請按「**產生另一個 QR 碼」** 以重新嘗試。若鎖定面板、切換工作區或啟動另一組登入程序,將取消 待處理的 QR 碼。 ## 授權金鑰 + DC 識別碼 授權金鑰(Auth Key)是每個 Telegram 連線背後 256 位元的原始授權資料,以 **512 個十六進位字元**表示,並附有資料中心編號 **DC 1–5**。 1. 「**Auth key**」分頁。請貼上完整的金鑰;若金鑰中包含「`…`」等縮寫,則無法正常運作。 2. 請選擇隨金鑰一併提供的 DC ID。 3. 可選擇輸入**使用者 ID**。若 Telegram 回報 帳戶不符,TgWitness 將拒絕連線。 4. Press **Connect 帳戶**。 授權金鑰(512 個字元)並非 API 雜湊值(32 個字元)。同一組金鑰亦可 以 JSON 格式匯入,詳見「[帳戶 JSON](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#account-json)」。 ## 帳戶檔案 開啟**「新增帳戶」→「檔案」**,並選取最多**四個屬於同一帳戶的檔案**(總計 **8 MiB**),然後按下「**連線帳戶」**。 「**檔案**」、**「授權金鑰」**及「批量匯入」表單會在連線前顯示 「並行會話」警告。預設情況下,匯入的授權將被重複使用。當其金鑰 在此處使用時,請保持原始 客戶端關閉。**檔案**與**授權金鑰**亦提供 「**建立獨立授權**」功能,詳見下文說明。批量匯入仍使用 直接模式。手機及互動式 QR 碼登入會建立獨立的授權。 警告標題在匯入表單中始終可見;當提供檔案或金鑰/會話字串時,其完整說明會 自動展開。閱讀後可將其收起, 以便在手機上仍能正常使用檔案瀏覽器與連線控制項。 - 檔案會在您的 TgWitness 伺服器**記憶體中**進行轉換。上傳的檔案不會被儲存, ZIP 檔案不會解壓縮至磁碟,也不會與任何外部服務進行連線。 - 隨後會將生成的會話記錄與 Telegram 進行比對。若檔案中載明使用者 ID, 則該 ID 必須與 Telegram 回報的帳戶相符。 - 描述不同帳戶或不同 API 憑證的檔案將被拒絕 而非僅選擇其中一個。 - **密碼或會話文字**欄位包含 TData 的本地密碼欄位,此處可貼上 StringSession 並**讀取檔案**,**無需登入**(填寫表單時無需 聯繫 Telegram)。 ### 建立獨立的授權機制 請選擇「在連線前**建立獨立授權」**並匯入檔案,或 選用「授權金鑰」。TgWitness 會短暫連線至匯入的「捐贈者」,利用其核准 新客戶端的 QR 登入憑證,並在核准後立即斷開與「捐贈者」的連線。 新客戶端擁有專屬的授權金鑰,以及獨立選定的桌面 設定檔。「捐贈者」提供的 API 憑證與裝置設定檔僅用於 與「捐贈者」的連線。現有的授權不會被登出或撤銷。 **在此步驟中,請務必將捐贈者的原始客戶端完全關閉。**初始 連線仍使用其複製的金鑰,因此此模式無法消除該初始 並行使用的風險。一旦建立新的授權連線,擁有者即可重新開啟 原始客戶端,並獨立使用兩者。互動式 **QR 碼**登入功能可讓 原始客戶端在無需在此處複製或連線其金鑰的情況下,批准此次登入。 若 Telegram 要求雙因素驗證(2FA),此模式會使用選取的 JSON 檔案中的 `twoFA`(若存在), 否則將要求輸入密碼。若匯入的密碼遭拒,系統將返回密碼輸入表單。 密碼不會被儲存。候選金鑰會以加密形式儲存於 `independent_login.enc` 中,包含資料中心遷移期間的變更。發生 中斷後,請選取相同的來源帳號並選擇此選項,以恢復已儲存的候選金鑰。 工作區仍會為該帳戶保留;即使完成進程失敗,也不會刪除 新的工作區。請保留其資料目錄和金庫金鑰。最終的憑證及 `account.authorized`日誌記錄將包含匯入方法、輸入格式以及 來源 API ID,但不會包含來源金鑰或密碼。 2026年11月5日,一個專用帳戶通過了 Telethon、Pyrogram 及 TData 捐贈者的即時驗證:2 因素驗證(2FA)完成、獨特的新授權金鑰、捐贈者與新客戶端 的並行存取,以及閱讀公開頻道。 Telethon 案例中, 系統亦在密碼輸入步驟中發生中斷後,成功恢復了已儲存的候選帳戶。每個新的 授權皆完成了登入後的六項初始化請求,且其簽署過的 日誌已通過驗證。原始會話在所有四種提供的格式中均保持可用。 Telegram 的 [RPC 錯誤資料庫](https://core.telegram.org/api/errors.json)將 `FRESH_CHANGE_ADMINS_FORBIDDEN` 與變更管理員、`FRESH_CHANGE_PHONE_FORBIDDEN` 與變更電話號碼,以及 `FRESH_RESET_AUTHORISATION_FORBIDDEN` 與 撤銷其他會話、變更其有效期或註冊通行金鑰相關聯。 `SESSION_TOO_FRESH_*` 和 `PASSWORD_TOO_FRESH_*` 涉及所有權轉移以及 收益或禮物提領。這些並非資料擷取操作;新登入並不 意味著全面性的 24 小時讀取禁令。匯出功能可另行返回 `TAKEOUT_INIT_DELAY_*`。TgWitness 會保留伺服器要求的暫停狀態,且不會自動重試 代幣接受或撤銷會話以規避限制。 ### Telethon `.session` | | | | --- | --- | | 產品簡介 | 由 Telethon 衍生工具所建立的 SQLite 資料庫,例如 `my_account.session` | | 獲以下機構認可 | 表格 `sessions`(連同 `dc_id`、`server_address`、`port`、`auth_key`)及 `version` = 7 或 8 | | 要求 | 僅有一筆授權會話記錄;一個封閉且完整的数据庫 | 請先關閉建立該檔案的程式。若其旁邊存在 `my_account.session-journal` 或 `my_account.session-wal`,表示資料庫尚未完成:請正常開啟並 關閉原始客戶端。刪除這些輔助檔案可能會留下損壞的副本。 ### Pyrogram `.session` | | | | --- | --- | | 產品簡介 | 基於 Pyrogram 的工具所建立的 SQLite 資料庫 | | 獲以下機構認可 | 表格 `sessions` 包含 `dc_id`、`auth_key`、`test_mode`、`user_id`、`is_bot`;`version` = 2 或 3 | | 要求 | 生產環境網路中僅允許一個授權**使用者**會話。機器人及測試資料中心(test-DC)的會話將被拒絕 | 登入時,系統會將儲存的用戶 ID 與 Telegram 進行比對。 ### 會話 + JSON 對 帳戶資料通常以兩個同名檔案的形式分發,例如 `447700900123.session` 和 `447700900123.json`。請一次選取**兩者**。 - 根據 JSON 資料,TgWitness 使用 `app_id`/`api_id` 及 `app_hash`/`api_hash`,因此您 通常無需手動輸入 API 憑證。 - 連線設定檔使用 `device_model`(別名 `device`)、`system_version` (別名 `sdk`)、`app_version`、`lang_code`、`system_lang_code`(別名 `system_lang_pack`)、 `lang_pack` 以及可選的 `tz_offset`(以秒為單位的 UTC 偏移量,範圍為 -43200 至 50400)。 手動填入的欄位優先於系統生成的預設值及控制面板/瀏覽器的 語言設定。若別名發生衝突,則不予接受。解析後的設定檔將儲存於 加密的工作區憑證中,並在重新啟動後重新使用,其中包含其應用程式版本。 - `phone`、代理伺服器設定及裝置代碼將被**忽略**。`twoFA` 僅在 選取「**建立獨立授權」**時為唯讀;直接匯入則會忽略此項目。 - 若 JSON 缺乏受支援的授權欄位,則僅為元資料。請新增其 會話檔案,或繼續使用手機或 QR 碼登入。若 JSON 包含受支援的會話或 授權金鑰,即可自行完成授權;詳見「[帳戶 JSON](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#account-json)」。 ### Telegram 桌面版 (TData) TData 即是 Telegram Desktop 應用程式(來自 desktop.telegram.org 的跨平台 應用程式)中的 `tdata` 資料夾。 | 系統 | 預設位置:`tdata` | | --- | --- | | Windows | `%APPDATA%\Telegram Desktop\tdata`(可攜式 Telegram:位於 `Telegram.exe` 旁邊) | | Linux | `~/.local/share/TelegramDesktop/tdata` | | macOS | `~/Library/Application Support/Telegram Desktop/tdata` | 若要導入此工具: > **並行會話警告。**直接匯入 TData 會重複使用 Telegram Desktop 的授權 金鑰。請勿同時在 Desktop 和 TgWitness 中使用該金鑰。Telegram 可能會透過 `AUTH_KEY_DUPLICATED` 使授權失效,導致兩份副本在重新登入前皆無法使用。 > > > > 請完全關閉 Desktop(包括其系統托盤進程),並在 TgWitness 使用匯入的會話期間保持該副本關閉。**請直接關閉程式,切勿登出或撤銷會話:** 撤銷會話也會使匯入的副本失效。若您需要同時運行兩個客戶端, 請選擇**「建立獨立授權」**,並在 新登入成功前保持 Desktop 關閉,或透過手機或 QR 碼登入 TgWitness。建議使用 專用帳戶,但這並不能確保複製的金鑰在並行使用時是安全的。 > > > > 此規則同樣適用於匯入的 `.session` 檔案、StringSession 文字及 Auth Key HEX。 其他擁有獨立建立之授權的用戶仍可保持登入狀態。 請參閱 [Telegram 的 AUTH_KEY_DUPLICATED 文件](https://core.telegram.org/api/errors#406-not-acceptable)。 1. 完全退出 Telegram Desktop。 2. 請從 `tdata` 中擷取僅包含以下兩項內容的 ZIP 檔案: - `key_datas` - 其旁邊以 `s` 結尾的 16 字元檔案,通常為 `D877F783D5D3EF8Cs` 將整個資料夾連同其媒體快取一併壓縮為 ZIP 檔時,通常會超過限制 (512 筆記錄,解壓縮後 32 MiB)。 3. 在**「檔案**」中選取 ZIP 檔。若 Telegram Desktop 設有**本機密碼**,請先在 **「密碼」或「會話文字」**欄位中輸入該密碼。此並非雙因素驗證 (2FA) 密碼。 支援功能:每個存檔僅限一個帳戶、現代化的 `key_datas`/`key_data0`/`key_data1` 儲存技術, 以及本機密碼。不支援功能:包含多個已登入帳戶的資料夾、較舊的桌面版 介面佈局、受密碼保護的 ZIP 檔案,以及獨立的原生 macOS 應用程式「Telegram for macOS」。 ### Telethon StringSession 單行文字,通常以 `1` 開頭,長度約 350 個字元。請將其 載入為 `.txt` 或 `.tgwitness-session` 檔案(最大 4 KiB),或貼至 **「密碼」或「會話文字」**欄位下方。僅接受 Telethon 字串;Pyrogram 和 TDLib 字串採用不同格式。 ### 帳戶 JSON 一個 JSON 物件,大小最多 **64 KiB**,存於副檔名為 **`.json`** 的檔案中。 | 欄位(別名) | 含義 | | --- | --- | | `api_id` (`app_id`) | 應用程式 ID,一個正整數 | | `api_hash` (`app_hash`) | 應用程式雜湊值,32 個十六進位字元 | | `string_session`(`session_string`、`session_str`;舊版 `session`) | Telethon StringSession 文字內容,並非檔案名稱 | | `auth_key` (`auth_key_hex`) + `dc_id` | 完整的 512 字元授權金鑰及 DC 1–5 | | `user_id` (`id`) | 可選;在儲存授權前會與 Telegram 進行比對 | | `device_model` (`device`) | 連線裝置說明 | | `system_version` (`sdk`) | 連線作業系統版本 | | `app_version` | 發送至 Telegram 的應用程式版本 | | `lang_code`, `system_lang_code` (`system_lang_pack`), `lang_pack` | 客戶端語言、系統語言及客戶端語言套件;允許使用空的 `lang_pack` | | `tz_offset` | 可選的 UTC 偏移量(以秒為單位),透過 `initConnection.params` 傳送;格式為整數或十進位整數字串 | 若同時存在別名與主名稱,兩者必須一致。明確的 Telethon 會話欄位優先於其他格式的通用 `session` 二進位資料。若 兩者均包含可識別的 Telethon 會話,則必須描述相同的授權。 若無明確欄位,`session` 必須為有效的 Telethon StringSession。範例: ``` { "app_id": 1234567, "app_hash": "0123456789abcdef0123456789abcdef" } ``` ``` { "api_id": 1234567, "api_hash": "0123456789abcdef0123456789abcdef", "auth_key": "REPLACE_WITH_ALL_512_HEXADECIMAL_CHARACTERS", "dc_id": 2, "user_id": 123456789 } ``` 第一個範例僅需填入 API 憑證;您可透過手機或 QR 碼登入,或新增一個會話 檔案。系統不接受批次清單(帳戶的 JSON 陣列)。 ## 釐清您所擁有的內容 | 您會看到 | 它是一項 | 使用說明 | | --- | --- | --- | | `*.session`;在文字編輯器中開啟時,頂端顯示 `SQLite format 3` | Telethon 或 Pyrogram SQLite | **檔案**(自動偵測) | | 一個名為 `tdata` 的資料夾,其中包含 `key_datas` | Telegram 桌面版 TData | 將兩個檔案壓縮為 ZIP 檔,然後前往「**檔案」** | | 以 `1` 開頭的一行文字,約 350 個字元 | Telethon StringSession | **檔案** | | `*.json` 搭配 `app_id`/`app_hash` | 相關元資料 | **檔案**及其對應的會話 | | `*.json` 搭配 `auth_key` 或 `string_session` | 帳戶 JSON | **檔案** | | 512 個字元 `0-9a-f` | 授權金鑰 | **授權金鑰** | | 32 個字元 `0-9a-f` | API 雜湊值 | **API 識別碼 + 雜湊值** | | 來自 TDLib 應用程式的 `td.binlog` 或 `db.sqlite` | TDLib 儲存 | 不支援 | | `123456789:AA…` | 機器人代幣 | 不支援 | ## 不支援的格式 | 格式 | 替代版本 | | --- | --- | | TDLib 儲存 (`td.binlog`) 及 TDLib 匯出功能 | 透過手機或 QR 碼登入 | | Pyrogram 會話**字串** | 請使用 Pyrogram `.session` 檔案,或透過手機/QR 碼 | | TData 附帶多個已登入的帳戶 | 請在 Telegram Desktop 中登出其他帳戶,或使用各帳戶專屬的會話檔案 | | 機器人代幣 | 不支援:TgWitness 僅以使用者帳戶身分進行監測 | | 包含多個帳戶的 CSV/JSON 清單 | 透過**帳戶 → 匯入帳戶**匯入受支援的工作階段檔案,或在個別的工作區中透過電話號碼/QR 碼登入 | | Test-DC 或 機器人會話 | 請使用正式運作的用戶帳戶 | ## 多個帳戶 請按下帳戶選擇器旁的 **+**,或開啟 **帳戶 → 設定 → 連線設定 → 工作區**,輸入標籤並 登入。 - 可建立任意數量的工作區,包含主工作區在內。每個工作區皆擁有獨立的會話、代理 路由、來源、擷取政策、日誌、簽名金鑰、檢查點及匯出設定。 - 切換顯示中的工作區並不會暫停其他工作區的運作。 - 日誌會與建立它的帳戶綁定。若以其他 帳戶登入,則需建立另一個工作區,且一個帳戶無法被指派至兩個 工作區。 - 主面板中的「代幣」功能可控制所有工作區。[所發出的存取權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)可將其他使用者限制在選定的帳戶和聊天室中,並可設定獨立的權限與會話限制。 - **帳戶會**重新命名一個工作區,並刪除已新增的工作區,連同其會話、日誌、 來源及簽名金鑰一併刪除。主工作區無法從控制面板中刪除。 ### 批次匯入和帳戶群組 請使用「**帳戶」→「匯入帳戶」**來新增多個帳戶,根據檔案基名配對檔案 並查看每個登入結果。每個帳戶都會擁有專屬的工作區。 群組可將相關帳戶彙整在一起,同時不會合併其會話、金鑰或 證據。在「**帳戶」**中**開啟「群組」**將導向其頁面: `/groups/`: - **帳戶:**每位成員的連線路徑、觀察記錄及最後一則訊息,並附有 「**全部**啟動」與「**全部暫停」功能**。 - **需要注意:**已登出、無法使用,或存在 連線、匯入、來源或媒體問題的帳戶;每個名稱皆可導向其對應的卡片。 - **多個帳戶可查看的聊天內容包含:** 共享來源、正在監看這些來源的帳戶,以及 可用工作區監看期間(最長七天)內的中斷情況。**使用 N 個帳戶進行匯出時,** 系統會將頻道或超級群組的匯出內容分配至各帳戶,並對單一存檔進行簽署。 - **匯出群組:**包含一個 ZIP,其中每個帳戶的簽名匯出檔位於 `accounts/` ,並 `manifest.json` 列出其SHA-256與金鑰指紋,並由主 工作區在 `manifest.signature.json`。請使用 `python -m tgwitness.verify` 並使用該帳戶的可信指紋,分別驗證每個帳戶的存檔。 成員共享群組的設定;每個帳號可保留其自身的設定值。 請參閱「[共享設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/#account-groups)」、 [「匯入與群組指南」](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Accounts.md#import-accounts-and-share-settings) 以及 [MTProxy 資料池儀表板](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Proxies.md#pool-dashboard-and-custom-sources)。 ## 登出 「**帳戶 → 登出 Telegram**(暫停監測)」會要求 Telegram 終止該 連線,因此該連線也會從帳戶的「**設定 → 裝置**」中消失,並將該 連線從工作區金庫中移除。日誌、來源、設定和簽名金鑰仍會保留,且 日誌會記錄此次登出操作。 該工作區仍歸屬於其帳戶:僅有該 帳戶可再次連線至該工作區。若 Telegram 未回應,該連線仍會在此處被移除 ,且控制面板會顯示此訊息;請在 Telegram 的「**設定」→「裝置」**中結束該連線。 ## 確保帳戶檔案安全 - 請將每個 `.session`、TData ZIP、StringSession、Auth Key 及帳戶 JSON 視同 密碼般嚴加保護。TgWitness 會將匯入的授權資訊儲存於其加密金庫中;您可 於事後刪除原始檔案。 - 請勿同時在兩個程式中執行相同的授權。Telegram 可能會撤銷該授權 (`AUTH_KEY_DUPLICATED`),屆時兩個程式都將無法運作。 - 已過期或遭撤銷的連線無法透過轉換恢復。請重新登入。 ## 疑難排解 | 訊息或徵兆 | 操作指南 | | --- | --- | | *無法讀取此會話。請關閉其原始客戶端……* | SQLite 檔案目前處於開啟狀態或尚未完成(`-journal`/`-wal` 輔助檔案)。請先正常關閉原始程式,然後重新複製該檔案。 | | *支援的 Telethon SQLite 資料結構:7 及 8* / *Pyrogram … 2 和 3* | 此檔案是由非常舊或來源不明的函式庫版本所建立。請改用手機號碼/QR 碼登入。 | | *僅支援經授權的生產環境使用者會話* | 該 Pyrogram 檔案屬於某個機器人或測試網路。 | | *TData 存檔已超過 512 筆記錄或 32 MiB* | 僅包含 ZIP 檔案 `key_datas` 和 `D877F783D5D3EF8Cs`,而非整個資料夾。 | | *無法解密 TData。請檢查桌面本機密碼* | 請在「**密碼」或「會話文字」**欄位中輸入 Telegram Desktop 的本地密碼。 | | *每次僅可匯入一個 TData 帳戶* | Telegram Desktop 擁有多個帳戶;請參閱「[不支援的格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#unsupported-formats)」。 | | *選定的檔案描述了不同的帳戶或 API 憑證* | 僅選取單一帳戶的檔案。 | | *JSON 內容中未包含任何受支援的 API 憑證或授權資訊* | 請檢查 [Account JSON](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#account-json) 中的欄位名稱。 | | *僅限 API 元資料* | 該 JSON 檔案未包含會話資訊。請新增 `.session` 檔案,或使用手機/QR 碼。 | | *授權金鑰的十六進位值必須包含全部 512 個十六進位字元* | 金鑰已被截斷或包含「`…`」。 | | 帳號 ID 與匯入的帳號不符 | 該檔案的用戶 ID 與 Telegram 所顯示的不符;此檔案屬於另一個帳號。 | | 該帳號已屬於另一個工作區 | 請開啟該工作區,而非重複新增該帳號兩次。 | | 已連線,但「**來源」**中的聊天清單缺少一個私人群組 | 檢查會員資格。篩選器會檢查前 1,000 個對話;請在「**參數」**中提高此限制。 | | 代理連線失敗 | 請檢查路由與 IP 模式。自動模式 MTProxy 會嘗試其他可用的入口。隱藏位址模式會進行等待;「直接」模式作為最後手段,可在設定的延遲時間過後直接連線。請參閱[路由模式說明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/#ip-modes)。 | 另請參閱:代理伺服器與加密的[連線及安全性](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/), 以及登入後資料擷取的[運作方式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/)。 --- # Telegram · 存取與權限 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/ 針對帳戶和聊天室設定權限範圍、選擇權限、限制連線數與 IP 位址,並撤銷存取權限。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) Translation coverage: this edition includes material from the English original. 針對帳戶和聊天室設定權限範圍、選擇權限、限制連線數與 IP 位址,並撤銷存取權限。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) 可授予審閱者存取單一聊天室的權限、分析師匯出個案的權限,或 操作員對選定帳戶的控制權。每位使用者皆擁有專屬的憑證。主 控制面板的憑證則由管理員持有。 [帳戶設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/) · [連線路徑](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/) · [安全模型](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/) ## 兩個應用範圍,兩種不同的任務 **收集範圍**決定了帳戶的記錄內容:選定的聊天室、Telegram 資料夾或整個帳戶。**存取範圍則**決定其他使用者能查看及使用哪些 已記錄的帳戶與聊天室。授予存取權限並不代表加入 Telegram 聊天室、啟動資料收集,亦不會授予 Telegram 帳戶權限。 某項存取權限可開啟選定的工作區、其中選定的聊天室、所有 工作區,或某個 [帳戶群組](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/#bulk-import-and-account-groups)中的每個帳戶。**所有工作區, 包括日後新增的工作區**,亦涵蓋未來的帳戶。群組存取權限同樣 涵蓋日後新增至該群組的帳戶。若需將案件範圍 限定於特定工作區內,請明確選取該等工作區。 ## 授予某人存取權限 1. 請以主要管理員身分登入,並開啟「**存取權限」頁面**。 2. 在「**授予某人存取權限**」下方,請輸入一個您在日誌中能認出的名稱。 3. 請選擇工作區,並在必要時選擇個別聊天室。 4. 請選擇此人可能採取的行動。選項中始終包含「**檢視**」。 5. 請根據需求設定有效期限、登入/會話限制及允許的地址。 6. 按下「**建立存取權限**」。請立即複製該代碼:此代碼僅顯示一次。 7. 請私下傳送控制台位址和代碼。收件者只需在 標準登入頁面輸入該代碼;無需您的主控制台代碼或 Telegram 會話。 請在另一個瀏覽器視窗中開啟包含已發行代幣的面板,並在移交前檢查 可見的聊天室及允許執行的操作。 Access names remain in encrypted local storage and are resolved by the administrator's panel. Names are omitted from new access and workspace-creation audit records; existing signed records keep their original fields. ## 選擇權限 若需進行純文字的公開展示,請使用**「公開展示」**而非一般的 審閱者存取權限。該功能會顯示明確選定的公開頻道、保留的編輯與 刪除紀錄,以及經簽名的統計資料,其中作者欄位將被遮蔽,且檔案會在 API 邊界處關閉。[建立並驗證展示內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/showcase/)。 | 授權 | 功能說明 | | --- | --- | | `view` | 查閱獲准的聊天紀錄、擷取的訊息、個人檔案、檔案以及經過篩選的日誌記錄。這些內容始終包含在內。 | | `export` | 可匯出獲准的聊天紀錄及檔案。若要匯出整個工作區的證據,則需具備該工作區的存取權限。 | | `sources` | 管理來源、快照及個人檔案擷取。受限於特定聊天室的存取權限僅能針對允許的聊天室進行操作;全帳戶範圍的來源偵測與範圍設定則保持關閉狀態。 | | `collect` | 啟動或停止收集器。由於收集操作會影響該帳號,因此需要整個工作區的存取權限。 | | `interact` | 請在存取範圍內執行受支援的 Telegram 互動。僅限聊天室的存取權限無法使用全帳戶範圍的連結預覽功能。 | | `settings` | 可變更資料收集設定、時間戳記、通知、異地備份及各項參數。需具備整個工作區的存取權限。 | | `account` | 登入或登出 Telegram,並管理連線路徑。需具備整個工作區的存取權限。 | | `board.read` | 僅可在允許的工作區及聊天室內閱讀「案件看板」的筆記。 | | `board.write` | 可新增書籤、標註、片段、註解,以及開啟/檢閱狀態。此外還需 `board.read` 權限。 | | `board.manage` | 管理資料集、團隊最終狀態及其他參與者的卡片。此外還需具備對看板的讀寫權限。 | Only the main administrator can download the off-site replica recovery key. Delegated `settings` or `account` access does not grant that key. 權限與範圍會一併進行檢查。勾選某項權限並不會開啟 其他聊天室,也不會為僅限特定聊天室的存取權限解鎖工作區範圍的操作。 若要進行並行匯出,存取權限必須涵蓋每個已選取 帳戶中的匯出聊天室。已授予的存取權限無法建立新的存取權限、管理他人的 會話,亦無法開啟管理員控制台。 ### 三種實用的設定方式 | 人物 | 範圍 | 權限 | | --- | --- | --- | | 審閱者 | 某個案例的聊天記錄 | `view` | | 分析師正在準備交接事宜 | 待調查與匯出的聊天紀錄 | `view`、`export`;僅當需透過 Telegram 進行操作時,才需新增 `interact` | | 資料擷取操作員 | 精選完整工作區 | `view`、`sources`、`collect`;僅在需要時才添加 `settings` 或 `account` | 「存取表單」的預設設定亦包含「案件看板」:審閱者可讀取、分析師可讀取 與寫入,操作員可進行管理。預設設定仍可編輯,且現有的權限授予不會 自動擴展。有關繼承的聊天範圍及匯出隱私設定,請參閱[「案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)。 ## 限制與會話 | 設定 | 運作原理 | | --- | --- | | 平行會議 | 將同時連線數限制在 1 至 100 之間。達到上限時,將拒絕下一次登入,或終止最舊的連線。 | | 允許登入 | 限制使用該憑證成功建立會話的次數。即使已使用最後一次允許的登入次數,現有會話也不會因此終止。 | | 有效期至 | 存取權限設有絕對有效期限。過期的存取權限將無法登入或繼續發出請求。 | | 無活動的分鐘數 | 會話閒置超時設定,範圍為 5 分鐘至 30 天。成功請求將延長此時間;開啟的面板可透過輪詢機制維持其活躍狀態。 | | 允許的網址 | 接受特定的 IP 位址或 CIDR 子網。若未填寫,則允許任何位址,除非已啟用「首次登入綁定」功能。 | | 綁定至首次登入 | 首次成功登入後,系統將為該次存取設定允許的位址。 | IP 是指應用程式所偵測到的客戶端位址。若位於反向代理伺服器或 隧道之後,請在依賴 IP 規則之前,先檢查「**開放連線」**中顯示的位址: 否則可能會出現多名使用者看似共用同一代理伺服器位址的情況。 ## 變更或撤銷存取權限 在「**已授予存取權限**」下編輯一項條目,以變更其範圍、權限或限制。 範圍與權限的變更將在後續請求中生效,包括 來自已開啟的連線所發出的請求。撤銷存取權限將終止其連線 並使已發出的憑證失效。**透過「開啟的連線」**,管理員亦可 終止個別連線,而無需撤銷整個存取權限。 Saved export copies retain their creator, workspace, chat scope and required permissions. An issued access can list or download its own copies only while those permissions still apply; copies containing Case Board also require `board.read`. The administrator can retrieve all copies. Older copies without this metadata and group bundles are administrator-only. Download tickets and prepared file responses recheck access after preparing the file, before sending its bytes. Each access, including the administrator, can hold ten pending download tickets per workspace; the workspace-wide limit is 1,000. Tickets expire after 120 seconds and are single-use. 撤銷操作無法召回他人已下載的檔案。登出、 鎖定面板或結束會話,均不會停止正在運行的收集器。 ## 管理員可查看的內容 審查員和分析師接收的資料蒐集進度中,不包含代理端點、 彙總診斷資訊、伺服器路徑或原始連線錯誤。連線診斷 需具備整個工作區的 `account` 權限。讀取通知、 異地副本及參數設定則需具備 `settings` 權限。 瀏覽器中的完整 User-Agent 字串不會保留在存取會話中。升級後 亦會將其從可變會話快取中移除。控制面板的處理程序日誌會遮罩 IP 字面值、URL 憑證及標記機密資訊。本地服務日誌與 先前已簽名的日誌記錄不會被重寫。存取規則與已簽名的 登入記錄仍會使用客戶端位址。 ### 更換主金鑰 請使用 **存取 → 我的限制 → 重新發行管理員金鑰**,或在控制面板運行時,從受管安裝環境執行 `tgwitness token rotate`。 所有現有瀏覽器會話將終止,包括使用同事 金鑰開啟的會話。發出請求的瀏覽器將收到新的會話;請在隱藏新管理員 金鑰之前先將其儲存下來。已發行的同事金鑰在未被另行撤銷前仍保持有效。 若安裝環境使用 `TGWITNESS_TOKEN`,則必須變更該環境設定並重新啟動。 ### 請求與代理伺服器邊界 The API admits up to 600 requests per minute per client and credential family: panel, archive/MCP or witness. Authentication cooldowns are separate for these families. Ten rejected authentications within a minute start an exponential cooldown, from one second up to five minutes. A failed attempt after the cooldown increases it; ten minutes without a failed attempt resets escalation. Rejections return HTTP 429 and `Retry-After`. Limits are in memory, shared across workspaces in one panel process; restart clears them. Live streams are limited to four per bearer token and 32 for the panel process. Opening a stream also consumes the API request budget. Request bodies have a 60-second receive deadline, reduced to 10 seconds for login, demo access, archive API and witness-head paths, or 8 seconds for MCP transport. Each application permits four unfinished bodies per client address, with overall limits of 32 and 64 MiB of reserved route allowances. Requests without bodies do not consume these slots. Oversized bodies return 413, timed-out bodies return 408, and exceeded client capacity returns 429 with `Retry-After: 1`. Exhausted overall body capacity returns 503 with `Retry-After`. 轉發的 IP 標頭將被忽略,除非實際的 TCP 對等端屬於 `TGWITNESS_TRUSTED_PROXIES`(以逗號分隔的 IP 或 CIDR)。將 `TGWITNESS_PROXY_HEADER` 設定為 `x-forwarded-for` 或 `cf-connecting-ip`。XFF 會從 最近的代理伺服器朝向第一個不可信的對等端進行遍歷。 格式錯誤或重複的 可信地址元資料將被拒絕,因此無法繼承白名單中的代理 地址。受管理的快速隧道 信任本機的 Cloudflare 連接器;自有網域的設定則信任本機的 Caddy。 直接部署預設不信任任何代理。若您自行啟動 Uvicorn, 請停用其代理標頭處理功能,以便此邊界能接收實際的對等節點。 `TGWITNESS_PANEL_ALLOWED_IPS` 將所有控制面板存取權限(包括管理員) 限制為列出的 IP 或 CIDR 範圍。安裝程式的路由識別探測保持公開狀態, 且不會回傳任何帳戶資料。在啟用白名單之前, 請先包含所需的本地管理路由。受管安裝的 **START-HERE** 指南包含 服務配置與復原說明。 API 中的 `ws` 查詢選擇器必須在請求路徑中識別工作區; 未知、不匹配及重複的選擇器將被拒絕並返回 404 錯誤。 面板腳本與樣式包含 SHA-384 完整性元資料。在支援 import-map 完整性的瀏覽器中,匯入映射亦 涵蓋本地匯入的 JS 模組。 動態生成的語言回應是獨立的。這些檢查可偵測 相對於傳送頁面所發生的資產替換;但無法建立對 已遭入侵伺服器的信任——該伺服器既能替換頁面,也能替換其雜湊值。 **自啟動以來,此日誌會**將程序日誌與每個 工作區的日誌活動整合:登入、拒絕、路由變更及操作員動作。這是一個 針對當前程序的內存控制台,而非每則訊息的永久副本。 頻繁發生的訊息事件會保留在日誌中,而非填滿控制台。 授予、變更及撤銷存取權限,以及啟動或結束會話,亦會產生 經簽名的 `access.*` 日誌記錄。這些記錄中不包含代幣。 已發行的代幣與會話憑證將以雜湊值形式保留於加密保管庫中。 ****主要管理員與信任邊界**** 主面板憑證不受任何限制。透過該憑證進行瀏覽器登入所建立的會話, 將受限於管理員所設定的會話限制。直接傳送 主憑證的腳本將保留完整存取權限,且不被計入瀏覽器會話中。 這是單一安裝環境中的應用層級存取控制。所有工作區皆共用 伺服器程序;這並非與主機管理員隔離。請將主 憑證、Telegram 連線、簽名金鑰及資料目錄保密。見證憑證 是一種獨立的檢查點/狀態憑證,並非面板存取憑證。 --- # Telegram · 連線、代理伺服器與資料保護 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/ 驗證、自動代理伺服器池、IP 模式、備用策略、外部請求及機密資料儲存。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 驗證、自動代理伺服器池、IP 模式、備用策略、外部請求及機密資料儲存。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) 本文檔說明 TgWitness 0.8.0 的運作方式及其限制。驗證、 來源存取、網路連線及擷取完整性均為獨立的狀態。 關於登入步驟、檔案格式及多重帳戶,請先參閱「 [帳戶與會話格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)」;關於事件政策及重新啟動 行為,請參閱[「資料擷取運作方式」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/)。 ## 引導式連線設定 在 **Connection** 中,管理員可選擇 **此帳戶**、**帳戶 群組** 或 **所有帳戶**,然後選取路徑。**檢視選項** 會列出 受影響的帳戶。**準備與檢查** 會測試建議的路徑,同時不變更 已儲存的路徑。**套用已檢查的連線** 會再次檢查,若 必要則暫停監測,儲存路徑並恢復已執行的監測。 它絕不會在先前處於閒置狀態的帳戶中啟動資料蒐集。歷史記錄下載仍會 保持暫停狀態,並可另行恢復。切換前請先暫停正在進行的匯出作業。 群組變更預設會讓帳戶保留其原有路徑。請僅在預覽清單中顯示您預期的變更時, 才取消勾選該選項。 應用程式會分別回報 每個帳戶的結果;這並非橫跨資料庫的「全有或全無」式交易。若 切換失敗,該帳戶將恢復至先前設定。若無法恢復,系統會 明確顯示此狀況。預覽將於十分鐘後過期,且若變更連線 設定或群組成員資格,則需重新檢查。 | 路徑 | TgWitness 所管理的內容 | | --- | --- | | 直接 | 來自主機的連線;未偵測到外部主機的 VPN,亦未強制執行相關設定。 | | VPN | 每個帳戶僅有一個全隧道 WireGuard 設定檔,由本機使用者空間的 SOCKS5 程序執行。不會安裝任何主機介面或驅動程式。 | | 我的代理伺服器 | SOCKS5、HTTP CONNECT 或 MTProxy 憑證。SOCKS5/HTTP 欄位可填入網址。選取多個帳戶時,將共用此處輸入的代理伺服器。 | | 公開版 MTProto | 現有池會分配 Telegram 路由。在進階設定中配置獨立且合適的代理伺服器之前,外部請求將被停用。 | | WARP | 為每個選定的帳戶建立獨立的本地隧道,並將 WARP 註冊資訊及 WireGuard 設定檔儲存於該帳戶的保管庫中。 | 當前路徑檢查使用全新的未經認證的 Telegram 傳輸通道,而非 該帳戶的會話。對於支援 HTTP 的路徑,它還會透過該路徑請求 Cloudflare 的 HTTPS 追蹤,並顯示其回報的出口 IP、國家、WARP 狀態 及檢查時間。 所測得的延遲為Telegram連線建立時間, 而非 ICMP ping 測試。除非追蹤報告顯示 WARP 處於活躍狀態,否則 WARP 準備程序將失敗。 這些檢查旨在驗證連線狀態,而非 擷取訊息的真實性或完整性。僅有本地進程正在執行,並不代表出口檢查成功。 ### 可攜式 WARP 與 WireGuard 這是 **非官方 WARP 整合方案**,使用 [wgcf 2.3.1](https://github.com/ViRb3/wgcf/releases/tag/v2.3.1) 以及 [wireproxy 1.1.3](https://github.com/windtf/wireproxy/releases/tag/v1.1.3)。 管理員須在首次下載或進行 WARP 註冊前,明確同意此設定。 這些設定連線會直接連至 GitHub 和 Cloudflare,並 洩露該裝置的 IP 位址。一般帳戶的流量會維持原有路由,直到 應用程式啟動為止。Cloudflare 會選擇出口位址及國家;不同的隧道 可以共用同一個出口位址。此功能不提供國家選擇、定期 IP 輪替以及全主機範圍的 VPN 殺手開關。 支援的輔助程式下載版本:Linux 和 macOS x86-64/ARM64,以及 Windows x86-64。 會將建構產出與審查來源碼中捆綁的 SHA-256 雜湊值進行比對, 且在啟動前會再次檢查快取中的可執行檔。 任何輔助程式均不會被加入 PATH 環境變數、安裝為系統服務,亦不會配置公開監聽器。所有檔案皆存放 於工作區的 `portable-routes/` 目錄中,並以加密金庫條目形式儲存。 迴路 SOCKS5 監聽器需使用獨立生成的憑證。 私人設定檔和 WARP 帳戶憑證會透過現有的 工作區金庫進行加密。執行期間,輔助程式需要一份僅限擁有者存取的明文設定檔; 在正常停止時,該檔案會被移除。若主機發生當機,此檔案可能會殘留於 僅限擁有者存取的資料資料夾中。此機制不會加密磁碟,亦無法防止 系統管理員存取。 若面板的父管道 消失,監督程式將關閉隧道。失敗的隧道絕不會啟用直接備援。重新啟動面板 將恢復選定的隧道;啟動失敗時,系統會在限定延遲後重新嘗試。**停止 隧道** 亦會暫停監測並維持停止狀態。**啟動隧道** 啟動隧道;準備就緒時請另行恢復監測。 上傳的 WireGuard 設定檔必須包含一個介面(Interface)和一個對等端(Peer)、完整的 IPv4 及 IPv6 路由,且不得包含鉤子(hooks)、包含(includes)、環境變數替換或額外的 監聽器(listeners)。公開端點位址會在啟動前進行解析並固定。 請使用外部 VPN 或 SOCKS5 閘道,以支援 OpenVPN/IPsec 及私有端點。 ## 驗證方法 **API ID 和 API 雜湊值用於識別應用程式;它們並不能取代帳戶登入。** 在 TgWitness 中,這些資訊為選用項目。優先順序如下:首先是表單中輸入的一組值,其次是來自 匯入帳戶 JSON 檔案的一組值,接著是儲存於工作區的一組值,最後是內建的 50 組 公開配對組,當 Telegram 拒絕某組時,系統會以隨機順序嘗試並自動輪替。僅 Telegram Desktop 配對組 (2040) 會隨附相應的 Telegram Desktop 客戶端描述一併傳送。 您可將從 [my.telegram.org](https://my.telegram.org) 的 API 開發工具取得的專屬配對組用於所有帳戶;每個帳戶仍保有各自的授權。 | 方法 | 要求 | TgWitness 支援 | | --- | --- | --- | | 手機號碼、代碼、可選的雙因素驗證 | 帳戶存取;API 配對為選用項目 | 面板登入 | | 授權金鑰 HEX + DC ID | 完整的 512 字元金鑰及 DC 1–5 | 「直接**授權金鑰」**分頁;在儲存授權前,會檢查可選的用戶 ID | | Telethon StringSession | 有效的會話字串 | 面板登入 | | Telethon SQLite `.session` | 封閉式、一致的文案 | 可直接從面板匯入模式 7/8;可選的離線命令列介面 (CLI) | | Pyrogram SQLite `.session` | 已關閉的生產環境使用者會話 | 直接匯入模式 2/3 | | Telegram 桌面版 TData ZIP | 一個現代帳戶;若設有保護,則需輸入本地密碼 | 內存轉換,並包含校驗和/解密檢查 | | 帳戶 JSON | 支援的 API/會話/金鑰欄位 | 僅憑元資料即可填入 API 憑證;仍需透過會話/金鑰或手機/QR 碼進行登入 | | QR 碼登入 | 來自授權 Telegram 應用程式的確認 | 本地 QR 碼生成、過期/重試機制,以及可選用的雙因素驗證 (2FA) | | TDLib / Pyrogram StringSession | 其他特定於資料庫的格式 | 不支援 | | 機器人代幣 | 一個具備獨立存取/更新模型的機器人 | 此資料蒐集者未使用此工具 | Telegram 採用代碼傳送方式;簡訊傳送無法保證成功。API 雜湊值無法修復 已被撤銷的連線,亦無法取代遺忘的雙因素驗證 (2FA) 密碼。TgWitness 不會將 登入代碼或 Telegram 雙因素驗證 (2FA) 密碼儲存至磁碟。 若為私人來源,該帳號必須已具備存取權限。群組使用者名稱 並非必要。透過代理或會話匯入,既不會授予成員資格,也不會授予管理員 權限。目前的成員資格並不能保證能存取加入群組前的歷史紀錄。 ## 匯入 Telethon 會話檔案 Telethon SQLite、Pyrogram SQLite 以及 Telegram Desktop TData 採用不同的格式。 此面板會偵測並轉換受支援的結構;重新命名檔案並不 屬於轉換範疇。請在「**檔案**」選項中選取一個會話及其對應的 JSON 檔案,然後按下**「連線帳戶」**。最多可接受四個符合條件的檔案, 總大小不得超過 8 MiB。 有關 TData/JSON 的詳細資訊,請參閱[格式限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)。 不提供密碼恢復功能。透過手機/雙因素驗證 (2FA) 或 QR 碼登入將建立獨立的授權。 僅限 Telethon 的可選命令列路徑仍可使用: 1. 請停止使用原始連線的客戶端,並建立一份一致的副本。該 轉換器會拒絕處理 WAL/日誌未完成的檔案。請正確關閉原始 客戶端,而非刪除這些檔案以繞過檢查。 2. 在 TgWitness 環境中,執行: ``` python -m tgwitness.sessions account.session --out account.tgwitness-session ``` 1. 在「**新增帳戶」→「檔案**」下,載入結果或 貼上其字串,然後繼續。 2. 請確認顯示的數字帳號 ID,選擇來源並開始監測。 **轉換後的檔案為未加密的帳戶存取密鑰。** 請將其存放在受保護的 儲存空間中,切勿將其提交至版本控制系統或傳送給第三方轉換服務。TgWitness 會將授權會話儲存於其加密金庫中。複製會話並不會 建立獨立的授權:請勿同時執行使用克隆授權金鑰的 客戶端,並假設其能獨立接收更新。 轉換操作僅傳遞授權,而非原始訊息、實體快取或 持久性更新游標。此操作不會解決跨程序重啟時的更新復原問題。 ## MTProto、Telethon 及代理伺服器 MTProto 是 Telegram 的通訊協定。Telethon 是 TgWitness 所使用的 Python 客戶端函式庫。 MTProxy 是一款 Telegram 傳輸代理伺服器;SOCKS5 和 HTTP CONNECT 提供一般性的 隧道。上述方式均無法取代帳戶驗證。 在簽名之前,請先將每個工作區的路徑儲存至 **帳戶 → 設定 → 連線設定 → 變更連線路徑**。 新建立的工作區預設為 **自動 MTProxy · 公開清單**,並搭配 **隱藏網址**。 現有工作區若曾明確使用 Direct 功能,將保留允許該功能的模式。 ## IP 模式 路由方式決定連線方式。控制面板中「帳戶」 區段的 IP 模式與 **IP 保護**功能,將決定伺服器位址何時可能被揭露。這些控制項並不會 安裝 VPN,也不會將所有裝置流量導向特定路徑。 | 模式 | Telegram | 外部請求 | | --- | --- | --- | | 隱藏網址 (`hide`) | 請使用代理伺服器;若均無法連線,請稍候。無直接備用方案。 | 需使用 SOCKS5/HTTP;若未透過適用代理伺服器,將拒絕請求。 | | 僅在萬不得已時才直接使用 (`fallback`) | 自動 MTProxy 可能會在設定的延遲時間過後使用 Direct 連線,隨後再切回正常運作的代理伺服器。 | 建議使用已設定的外部代理伺服器或該帳戶的 SOCKS5/HTTP 路由;否則允許使用「直接連線」。 | | 伺服器需透過隧道或 VPN 連接(`tunnel`) | 允許使用直連路徑,並可立即自動切換至備用池。 | 若未配置任何適用的代理伺服器,則允許直接連線。 | 隧道或 VPN 模式假設您會另行管理該網路。若無可運作的 隧道,目標端將能看到伺服器本身的位址。請根據 您的實際網路環境選擇模式,而非僅依選項名稱來決定。 ### 選擇路徑 | 路徑 | 設定 | 分隔線 | | --- | --- | --- | | 自動 MTProxy | 內建清單或運算子目錄 | 維持一條可運作的 Telegram 路徑;直接備用方案取決於 IP 模式 | | 直接 | 隧道或 VPN 模式 | Telethon 使用主機的網路路由 | | SOCKS5 | 主機、埠號、可選的使用者名稱/密碼 | python-socks,已啟用遠端目標 DNS 功能 | | HTTP CONNECT | 主機、埠號、可選的使用者名稱/密碼 | 僅支援純 HTTP CONNECT;尚未實作與代理伺服器本身的 TLS 連線 | | MTProxy | 主機、埠號、密鑰 | 實驗性 Telethon 傳輸格式;32 位元十六進位數字,或 `dd` + 32 位元十六進位數字 | 偽 TLS `ee` 密鑰將被拒絕。Telethon 1.45 的正規化功能可移除前綴 與網域,但並未實作偽 TLS 功能。請貼上 `tg://proxy?server=…&port=…&secret=…` 或 `https://t.me/proxy?server=…&port=…&secret=…`,並選擇「**從連結填入欄位**」。 此操作會在不建立連線或儲存的情況下驗證並填入欄位;請另行檢視並儲存 路由。手動填寫欄位仍可使用。請參閱 [Telegram 代理連結](https://core.telegram.org/api/links#proxy-links)。 ### 由您的安裝環境提供的公開代理伺服器 內建清單整合了四個來源: [SoliSpirit/mtproto](https://github.com/SoliSpirit/mtproto)、 [zakky8/mtproto-proxy-pro](https://github.com/zakky8/mtproto-proxy-pro)、 [kort0881/telegram-proxy-collector](https://github.com/kort0881/telegram-proxy-collector) 以及 [3yed-61/MTP-Collector](https://github.com/3yed-61/MTP-Collector)。 捆綁的快照包含端點資訊、來源歸屬及下載日期。 供應商名單並不代表該代理伺服器運作正常,亦不保證能傳遞每項 Telegram 更新。 **MTProxy 會自動檢查** Telegram 的傳輸連線狀態,維持一個可運作的代理伺服器, 並在連線失敗時切換至另一個。當有足夠 可運作的代理伺服器時,工作區會優先選用不同的代理伺服器;無法保證會使用唯一的出口位址。 失敗的代理伺服器 會暫停一段時間後再次嘗試。若無任何代理伺服器可用,則由 IP 模式決定 是否必須等待,或可改用直接連線。更換代理伺服器不會變更帳戶 或刪除其日誌。路由選擇與變更皆記錄於簽名日誌中。 當自動路由處於啟用狀態時,清單預設每小時刷新一次,傳輸檢查則 每十分鐘執行一次。這些間隔時間均可自行設定。**更新公開清單** 會觸發刷新;僅瀏覽清單並不會變更已儲存的手動路由。 **Telegram 流量與 HTTPS 請求使用不同的路由。**清單下載會使用 獨立的 HTTPS 連線,並透過提供的外部請求路由進行。 `TGWITNESS_PROXY_FEED_PROXY` 會明確地以 HTTP/SOCKS5 代理伺服器覆寫該路由; 兩種 Compose 版本的收集器皆會轉發該路由。背景池會跟隨主要工作區。 不會將任何 Telegram 會話、API 憑證、控制面板代幣或機器人代幣傳送給資料來源提供者。 提供者名稱、快照日期及下載路徑會顯示於**「清單來源」**欄位下。 MTProxy 僅傳輸 Telegram 流量。工作區的 HTTP 操作(例如時間戳記、 通知、站外副本及來源檢查)在 已設定的情況下會使用獨立的 SOCKS5/HTTP 代理伺服器,之後則使用該帳戶的 SOCKS5/HTTP 路由。若未設定任一項,則「隱藏地址」功能會拒絕 該請求;其他模式則允許「直接」傳輸。外部請求可被停用。明確 設定的資訊流下載代理伺服器仍屬獨立的操作員覆寫選項。 獨立的見證服務則維持其專屬的路徑。 對於由營運商管理的私有服務,現有的伺服器環境設定 `TGWITNESS_ALLOW_PRIVATE_DESTINATIONS=1` 可允許私有目的地,並維持 代理端的主機名稱解析。此設定無法透過控制面板啟用。僅限公開 模式會在查詢公開解析器之前拒絕 `.onion` 目的地;Tor 洋蔥 服務需要明確的私有目的地設定以及合適的代理。 此 DNS 行為適用於外部 HTTP 操作,不適用於 Telegram 的傳輸層。 Cloudflare 已針對 [JSON DNS 端點](https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/)提供相關文件說明。 ****自動池參數**** 在**「參數」→「自動 MTProxy**」中,設定失敗閾值、冷卻時間、 預定輪替、代理伺服器共享及允許的備用延遲。 | 控制 | 預設 | | --- | --- | | 在替換前斷開連線 | 3 項,耗時 10 分鐘 | | 每次連線嘗試所嘗試的代理伺服器數量 | 3 | | 首次 / 失敗後的最大休息時間 | 10 分鐘 / 6 小時 | | 預定輪替 | 已停用;若啟用失敗 | | 每個代理伺服器的帳戶數量 | 0:優先採用獨立條目,必要時合併。設定為 1 則會等待獲得專屬條目。 | | 允許直接回退前的延遲時間 | 10 分鐘;隱藏地址仍拒絕 Direct | | 資料源刷新/傳輸檢查 | 60 / 10 分鐘;主要工作區的數值適用於共享資源池 | 使用不同的代理伺服器並不能保證會產生不同的出口位址。這些設定無法 繞過 Telegram 的限制,亦無法證明匿名性。 若要將公開清單替換為您自己的營運商目錄,請配置以下覆寫設定。 此設定將完全停用外部訂閱功能,即使其 `proxies` 陣列為空時亦然。 將[空目錄](https://github.com/phishdestroy/TgWitness/blob/main/deploy/proxies.config.example) 複製到 `proxy-config/proxies.json` ,並新增您已部署的公開端點: ``` {"format": "tgwitness-proxy-catalog-v1", "proxies": [ {"id": "project-eu", "label": "Project EU", "link": "tg://proxy?server=REPLACE_HOST&port=443&secret=REPLACE_SECRET"} ]} ``` 必須替換範例值。最多可接受 32 筆不同的條目。 經驗證的清單會回傳標籤/主機/埠號,且不包含共享密鑰;選取其中一項 將把其憑證儲存至工作區金庫中。在進行 明確的傳輸測試之前,可用性尚未經過測試。若目錄格式不正確,則可進行手動設定。 原生啟動:將 `TGWITNESS_PROXY_CATALOG` 設定為本機 JSON 路徑。Docker: ``` docker compose -f compose.yaml -f deploy/compose/compose.proxies.yaml up -d --build ``` 該覆蓋層以唯讀模式掛載 `proxy-config`;檔案必須可被容器 UID 10001 讀取。 該目錄不包含在 Git、Docker 建置環境及原始碼存檔中。此 目錄用於配置收集帳戶;[witness 機器人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)使用其自身的 HTTP/SOCKS5 路由,而非 MTProxy。 直接備用方案受上述 IP 模式規範。變更路徑前,請先 暫停監測。儲存設定會斷開舊客戶端連線並取消未完成的登入;新 客戶端將使用已儲存的路徑。該帳戶的日誌/會話綁定關係將維持不變。 設定會取代先前路徑:編輯時請重新輸入代理伺服器憑證。 憑證採用 `network.enc` 加密。API 不會回傳使用者名稱、 密碼或機密金鑰。簽名紀錄包含路由類型及是否包含憑證, 但不包含端點與機密金鑰。操作者可在控制面板中查看端點。 機密欄位會在儲存、鎖定或切換工作區後清空。 「**測試 Telegram 連線**」功能(登入前亦可使用),會透過該路徑開啟並關閉一個臨時 且未經授權的 Telegram 連線。此功能不會聯繫任何 IP 檢查 網站。測試成功僅表示傳輸連線已建立,並不代表群組存取權限、訊息 完整傳送或匿名性。 此代理適用於 Telegram 客戶端的連線,包括 Telegram 數據中心(DC)的媒體 下載。瀏覽器、pip、SSH 以及手動調用的 TSA 工具則有獨立的路由。 代理主機名稱可於本地解析。`rdns` 會影響目標主機名稱; Telegram 通常會提供數據中心的數值 IP 位址。 SOCKS5 和純 HTTP CONNECT 本身並不會加密代理憑證或 客戶端至代理的隧道。MTProto 會另行保護 Telegram 流量。 在不可信的網路環境中,請使用 適當的安全通道連線至代理伺服器。私人群組 屬於雲端聊天;MTProto 並不會將其轉變為端對端加密的「秘密聊天」。 ## 加密與簽名 | 層級 | 已實作 | 操作員責任 | | --- | --- | --- | | Telegram 通訊流量 | Telethon MTProto | 平台可信度、傳輸路徑與可用性 | | 網頁控制面板 | 承載者代幣、迴路預設值、請求限制 | 透過 HTTPS 或 SSH 隧道進行遠端存取 | | 秘密 | Fernet 用於管理 API 憑證、會話、代理伺服器憑證及簽名私鑰 | 保護解密金鑰與運行主機 | | 金庫金鑰 | 新安裝時使用本機金鑰或外部主金鑰 | 獨立的受保護儲存空間與金鑰備份 | | 訊息與附件 | 明文應用程式儲存 | 加密磁碟/磁碟區 | | ZIP/JSONL/CSV/HTML | 完整性檢查,無內容加密 | 保護匯出副本與傳輸內容 | | 來源與時間 | 簽名日誌、流程收據、RFC 3161 工具 | 可信密鑰、獨立檢查點/TSA 及保管程序 | 「帳戶」中的**儲存保護功能**會顯示這些狀態。面板憑證是一種 存取密鑰,而非加密密碼。它授予管理員存取權限; [已發行的憑證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)可限定於特定帳戶和聊天室。工作區共享 主進程,並非獨立的租戶。 BitLocker、LUKS、FileVault 或受管加密卷宗皆可在 各自的威脅模型下保護儲存裝置。 已解鎖且正在運行的機器之管理員 仍可讀取資料。在儲存規劃中,應納入 SQLite WAL/SHM、媒體檔案、臨時匯出檔案、交換檔、備份 以及瀏覽器下載檔案。Docker 卷宗並非僅因 其為卷宗而自動加密。TgWitness 未實作 SQLCipher 或物件加密功能。 ## 外部主金鑰 若要進行新安裝,請將主金鑰放置於資料目錄之外。 此操作不會自動遷移現有的本機金鑰保管庫。請準備一個 僅限服務身分存取的金鑰目錄,然後執行: ``` python -m tgwitness.security create-master-key /private/keys/tgwitness-master.key export TGWITNESS_VAULT_KEY_FILE=/private/keys/tgwitness-master.key python -m tgwitness --data-dir /private/observations/new-case ``` PowerShell,使用已安裝的專案環境: ``` python -m tgwitness.security create-master-key E:\PrivateKeys\tgwitness-master.key $env:TGWITNESS_VAULT_KEY_FILE = 'E:\PrivateKeys\tgwitness-master.key' python -m tgwitness --data-dir E:\PrivateData\new-case ``` 在 Docker 中,請將檔案以唯讀方式掛載至 `/data` 之外的目錄(例如 `/run/secrets/tgwitness-master.key`),並將環境變數設定為該路徑。 該服務的 UID 必須具備讀取權限。請透過 環境變數/設定檔傳遞路徑,而非金鑰位元組。 每個工作區都會獲得一個隨機的公開鹽值,以及透過 HKDF-SHA256 衍生的專屬 Fernet 金鑰。`vault.external.json` 僅儲存衍生元數據,而非主金鑰。 若金鑰遺失或錯誤,系統將無法啟動,且不會在後台自動替換金鑰。請同時保留 鹽值元數據與主金鑰,以備復原之用。 所有工作區均源自同一主金鑰;若主金鑰遭洩露,將影響整個 安裝環境。正在執行的程序可解密機密資料。此工具並非 HSM 或 密碼 KDF。不接受以任意人為設定的密碼取代隨機金鑰。 在刻意規劃的遷移方案 實施並驗證完成之前,請保留現有安裝環境中的現有金鑰。刪除 `vault.key` 或更換主金鑰可能會導致 無法存取會話/簽署金鑰。請將加密備份與金鑰分開存放,並 在隔離的實例中測試還原功能。 --- # Telegram · 部署 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/ 可在 Windows、Linux、macOS 或 Docker 環境中,透過 HTTPS 運行 TgWitness 服務,並具備備份與更新功能。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 可在 Windows、Linux、macOS 或 Docker 環境中,透過 HTTPS 運行 TgWitness 服務,並具備備份與更新功能。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) **英文** · [俄語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ru/DEPLOYMENT.md) · [烏克蘭語](https://github.com/phishdestroy/TgWitness/blob/main/docs/uk/DEPLOYMENT.md) · [西班牙語](https://github.com/phishdestroy/TgWitness/blob/main/docs/es/DEPLOYMENT.md) · [葡萄牙語(巴西)](https://github.com/phishdestroy/TgWitness/blob/main/docs/pt/DEPLOYMENT.md) · [土耳其語](https://github.com/phishdestroy/TgWitness/blob/main/docs/tr/DEPLOYMENT.md) · [阿拉伯語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ar/DEPLOYMENT.md) · [波斯語](https://github.com/phishdestroy/TgWitness/blob/main/docs/fa/DEPLOYMENT.md) · [烏爾都語](https://github.com/phishdestroy/TgWitness/blob/main/docs/ur/DEPLOYMENT.md) · [印地語](https://github.com/phishdestroy/TgWitness/blob/main/docs/hi/DEPLOYMENT.md) · [印尼語](https://github.com/phishdestroy/TgWitness/blob/main/docs/id/DEPLOYMENT.md) · [越南語](https://github.com/phishdestroy/TgWitness/blob/main/docs/vi/DEPLOYMENT.md) · [簡體中文](https://github.com/phishdestroy/TgWitness/blob/main/docs/zh/DEPLOYMENT.md) ## 選擇安裝方式 若要取得可攜式套件,請從 GitHub Releases 解壓縮 `TgWitness--windows-amd64-portable.zip`。若採用其他方法,請下載並解壓縮原始碼 ZIP 檔,或克隆 儲存庫,然後在專案目錄中執行以下指令: | 安裝 | 開始 | 會在背景執行嗎? | | --- | --- | --- | | Windows 便攜版套件 | `TgWitness.cmd` | 不;請保持視窗開啟。 | | 原生 Windows 版本 | `Start.cmd` | 不;請使用可選的登入任務以進行背景運作。 | | 原生支援 Linux/macOS | `sh start.sh` | 不;請使用 systemd/launchd 進行背景執行。 | | 在任何受支援的主機上運行 Docker | `docker compose up -d --build --wait` | 是的,只要 Docker 守護程式正在運行。 | | Windows 版 Docker 輔助工具 | `scripts\Docker.cmd` | 是的;該輔助程式會監控網頁伺服器的運作狀態。 | | 適用於 Linux/macOS 的 Docker 輔助工具 | `sh scripts/docker-start.sh` | 是的;該輔助程式會監控網頁伺服器的運作狀態。 | 若需部署可由第三方驗證的雲端伺服器——該伺服器透過 服務供應商的 API 建立,不使用 SSH,且僅能透過 Cloudflare Tunnel 存取——請參閱 [「高保障部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/)」說明。 原生啟動程序會建立一個私有 `.venv`,並安裝已固定(pinned)的依賴項。 Docker 會在映像檔內建置這些組件,無需主機端的 Python。首次 設定需要網路連線。 若未偵測到 Python 3.11 以上版本,`Start.cmd` 會先徵求確認, 再為當前 Windows 使用者安裝 Python 3.12(若使用 winget,否則在驗證 Python 軟體基金會簽章後, 將使用 python.org 安裝程式);此過程絕不會要求 管理員權限。Docker 及作業系統服務仍為先決條件。 原生及可攜式安裝會在其資料夾內使用 `data/live`。Docker 則使用名為 `tgwitness-data` 的卷 ,位置為 `/data`。在您刻意遷移 完整資料目錄之前,這兩者屬於獨立的安裝。請勿預期新的 Docker 容器會自動偵測到原生 帳戶。 ## 安裝需求 原生安裝需具備 Python 3.11 或更新版本,並包含 `venv` 和 `ensurepip`;首次安裝依賴項時需有網際網路 連線,且需為 `.venv` 準備可寫入的專案目錄。內建的控制面板無需 Node.js 或前端建置。請從 您的一般作業系統帳戶執行啟動程式;TgWitness 無需管理員/root 權限。 - **Windows:**`Start.cmd` 會先檢查 `py -3`,接著檢查 `python`,然後檢查預設的「使用者專用」及 「Program Files」安裝資料夾,並需要 3.11 版或更新版本。若以上皆無法運作,它 會提供上述所述的自動「使用者專用」安裝選項。`py -3 start.py` 亦可運作。 可攜式套件完全不需要 Python。 - **Linux:**`start.sh` 會依序嘗試 `python3.13`、`python3.12`、`python3.11`、`python3` 及 `python`,若均不符合條件,則會輸出適用於 apt、dnf、pacman、zypper、apk 或 Homebrew 的安裝指令。 Debian/Ubuntu 系統的安裝可能需要與所選解釋器相符的 `python3-venv` 套件。 發行版的舊版 預設 Python 必須被 Python 3.11 以上版本取代或補充。 - **macOS:**請安裝最新的 Python 3.11+ 發行版;請勿假設作業系統預設提供的 解釋器符合要求。請使用專案目錄中的 `python3 start.py`。 - **Docker:**請使用搭配 Compose v2.20 或更新版本的 Docker Engine/Desktop。在 Windows 系統上,Docker Desktop 必須使用 Linux 容器。該容器會自行安裝 所需的 Python 依賴項;主機無需另行安裝 Python。 ## 本地電腦 請在 Windows 系統上使用 `Start.cmd`,或在 Linux/macOS 系統上使用 `sh start.sh`。`scripts\Setup.cmd` 或 `sh start.sh --setup-only` 會預先 設定環境。啟動程式在首次使用時會安裝所需依賴項;後續啟動時 則會重複使用該環境。設定及 Telegram 訊息收集過程需要網路連線, 但瀏覽現有記錄及建立匯出檔則可在離線狀態下進行。 設定完成後執行 `python start.py --check`,以檢查本機依賴項、Ed25519、 儲存空間、金鑰設定及監聽位址,此過程不會啟動資料收集器。 若需結構化輸出,請使用 `--json`。傳入預期的 `--data-dir`、`--host` 及 `--port`。此檢查不會安裝套件、建立日誌或連線至 Telegram; 亦非完整性或覆蓋範圍的驗證。啟動時會另行驗證 現有日誌。`python start.py --help` 亦會跳過安裝步驟。 執行 start.py 後,請在 Windows 系統上使用 `.venv\Scripts\python.exe`,或在 Linux/macOS 系統上使用 `.venv/bin/python` 來執行輔助指令,亦可先啟用該環境。 以下 `python -m ...` 範例假設該環境已啟用。 ``` python -m tgwitness --data-dir /path/to/private/data --host 127.0.0.1 --port 8787 ``` 環境變數:TGWITNESS_DATA、TGWITNESS_HOST、TGWITNESS_PORT、TGWITNESS_TOKEN。 TGWITNESS_VAULT_KEY_FILE 用於在新安裝時選取外部金鑰模式;詳見下文。 若提供 TGWITNESS_TOKEN,其長度必須至少為 24 個字元;請使用加密級 隨機值。若未提供,應用程式會於 panel-token.txt 檔案中產生一個 256 位元的隨機憑證。 環境變數的覆寫設定不會重寫該檔案。請重新啟動以輪替憑證。 僅允許一個進程擁有資料目錄。跨平台作業系統檔案鎖定機制可防止 意外的並發寫入。請使用一個 Uvicorn 工作程序。控制面板可管理任意數量的 工作區,額外的工作區目錄位於 profiles// 之下。 若需獨立的服務實例,請使用獨立的目錄與埠號。SQLite WAL 檔案應存放於本機持久性 儲存裝置,而非網路檔案系統。請勿在複本之間共用同一個卷宗。 ## Windows 便攜版套件 每個 GitHub 發行版本均包含 `TgWitness--windows-amd64-portable.zip` 及其 `.sha256`。其中包含來自 python.org 的官方可嵌入式 Python 3.12 執行環境 (校驗和固定於 `tools/build_portable.py` 中)、TgWitness 及其固定依賴項, 以及三個啟動程式: | 檔案 | 目的 | | --- | --- | | `TgWitness.cmd` | 啟動控制面板;額外選項將被直接傳遞,例如:`TgWitness.cmd --port 8790` | | `TgWitness-Demo.cmd` | 在 `data\demo` 啟動合成示範 | | `TgWitness-Check.cmd` | 在不啟動的情況下執行就緒檢查 | 已將釘選的俄語形態學辭典與 PDF 色彩設定檔打包,供 離線使用。打包機制僅允許在依賴項的 `data` 目錄內放置已知的檔案路徑;若該目錄中出現預期之外的檔案,將導致建置失敗。 將整個壓縮檔解壓縮至可寫入的資料夾(例如 `Documents\TgWitness`);請勿 直接從 ZIP 檔案內部或 Program Files 資料夾執行。執行環境採用隔離的模組路徑, 因此其他 Python 安裝程式及 `PYTHONPATH` 皆不會影響其運作。 資料會儲存於 套件的 `data` 資料夾中。若要更新,請先停止 TgWitness,將新版本解壓縮至新的 資料夾,並將 `data` 資料夾複製過去。 請在 64 位元 Windows 系統上使用 Python 3.12 自行建置: ``` python tools/build_portable.py ``` ## 容器 ``` docker compose up -d --build --wait ``` 此操作將為 /data 建立一個命名持久化卷。 網頁埠號已映射至 127.0.0.1:8787。 該程序以 UID 10001 執行,並具備 已撤銷的權限、唯讀的根檔案系統,以及可寫入的 /data 和 /tmp 目錄。 `--wait` 會在返回前檢查網頁伺服器的運作狀態;它不會建立 Telegram 授權或傳送連線。 提供的輔助程式在建置完成後,會採用 180 秒的就緒超時設定; 初始依賴項的下載時間可能比這更長。 兩個基礎 Compose 檔案均使用專案名稱 `tgwitness`,因此將新版本 解壓縮至其他目錄時,系統不會自動選取新的資料卷。請僅保留一個 該專案的部署處於活躍狀態。若為獨立安裝,請使用唯一的 `docker compose -p NAME ...` 以及不同的主機埠,並在更新時保留兩者。 若為使用不同專案名稱的舊版部署,請繼續使用其原始 名稱並搭配 `-p`;`docker compose ls` 會列出現有專案。 將 `deploy/env.example` 複製到 `.env`,並將 `TGWITNESS_PORT` 修改為使用不同的迴路 埠。例如,`TGWITNESS_PORT=8788` 會將控制面板公開於 `http://127.0.0.1:8788`;容器仍會監聽 8787 埠。`.env` 已被 Git 忽略。 取得初始代幣: ``` docker compose exec tgwitness cat /data/panel-token.txt ``` 實用指令: ``` docker compose ps docker compose logs --tail 100 -f docker compose stop docker compose up -d --wait ``` `restart: unless-stopped` 會在發生當機或 Docker 守護程式 重新啟動後,重新啟動資料擷取器。在 Linux 伺服器上,請使用您所使用的發行版的服務 管理程式(通常為 `sudo systemctl enable --now docker`)啟用開機自動啟動 Docker。在 Windows/macOS 上,請啟用 Docker Desktop 的「登入時啟動」設定。當桌面登出、進入睡眠狀態,或 Docker Docker 守護程式都可能中斷資料收集。明確停止的容器將保持 停止狀態,直到您再次啟動它為止。 在範例配置中,/tmp 卷的上限為 512 MiB。匯出機制 改為使用各工作區的 `temporary-exports/` 存於持久化 /data 目錄中。請在該處預留空間 以因應同時進行的匯出作業、日誌/WAL 增長、媒體檔案及備份需求。 啟動程式使用 deploy/constraints.txt 來鎖定符合資格的執行時依賴項版本。 Docker 及高保障等級伺服器會依據 deploy/requirements.lock 和 deploy/build.lock 透過 pip --require-hashes 進行安裝:每個套件檔案必須與提交紀錄中 的 SHA-256 值相符,因此若檔案在 PyPI 或鏡像站點上被替換,系統將拒絕該檔案。 Python 基礎 映像及作業系統套件仍需經過獨立的版本認證。 除非您打算銷毀日誌和金鑰,否則請勿使用 `docker compose down -v` 指令。 容器狀態報告僅顯示網頁伺服器的可用性,而非 Telegram 擷取是否成功。 請檢查控制面板中的收集器狀態、心跳訊號、錯誤及覆蓋事件。 ### 獨立見證者簡介 可選的 `witness` 服務會在獨立的 容器中運行一個[獨立的見證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)實例,該實例在 `witness-data` 卷中擁有專屬的金鑰和日誌,而收集器僅擁有 只讀的見證代幣。請在控制面板的**「見證」**頁面建立該代幣,並將其 連同機器人代幣和頻道一併新增至 `.env`,然後啟動該設定檔: ``` docker compose --profile witness up -d # deploy/compose/compose.image.yaml: same flag docker compose logs witness # witness key fingerprint ``` 此服務可透過 Compose 網路內的收集器存取,網址為 `http://tgwitness:8787` (`TGWITNESS_WITNESS_COLLECTOR` 會覆寫此設定,例如 `/profiles/` 適用於 另一個工作區)。若要使用由他人運作的獨立伺服器上的證據日誌,請在該處使用 `deploy/compose/compose.witness.yaml` ,並將 `TGWITNESS_WITNESS_COLLECTOR` 設定為收集器的 HTTPS 位址;該檔案僅包含證據日誌。 ## 安裝已發佈的映像檔 將 `deploy/env.example` 複製到 `.env`。將 `TGWITNESS_IMAGE` 設定為已發布的版本,並使用 **小寫的**儲存庫路徑,例如: ``` TGWITNESS_IMAGE=ghcr.io/your-owner/your-repository:0.9.1 TGWITNESS_PORT=8787 ``` 請直接執行此檔案,而非執行 ``compose.yaml``: ``` docker compose --project-directory . -f deploy/compose/compose.image.yaml pull docker compose --project-directory . -f deploy/compose/compose.image.yaml up -d --wait docker compose --project-directory . -f deploy/compose/compose.image.yaml exec tgwitness cat /data/panel-token.txt ``` 主機端無需進行原始碼編譯、Python 環境或編譯器。發行工作流程 針對 Linux AMD64 和 ARM64 容器,包括 Docker Desktop 的 Linux 虛擬機器。 請使用版本標籤或工作流程摘要中的「`ghcr.io/owner/repository@sha256:...`」。 未配置動態標籤「`latest`」或無人值守的應用程式升級。當 專案名稱相同時,映像檔與原始碼變體將共用同一個資料卷。 ## 伺服器上的自動 HTTPS 功能 請使用配備 Docker 的伺服器、您所掌控的網域,以及持久的本地儲存空間。 將網域的 A/AAAA 記錄指向該伺服器;僅當 IPv6 可連達該伺服器時,才發布 AAAA 記錄。 允許傳入的 TCP 80 和 443 連接,以及用於憑證簽發的傳出 DNS/HTTPS 連線。 其他服務不得已佔用這些埠號。 將 `deploy/env.example` 複製到 `.env`,並設定主機名稱(不包含方案或路徑): ``` TGWITNESS_DOMAIN=watch.your-domain.org ``` 使用 HTTPS 覆蓋層開始建置原始碼: ``` docker compose -f compose.yaml -f deploy/compose/compose.https.yaml up -d --build --wait docker compose -f compose.yaml -f deploy/compose/compose.https.yaml exec tgwitness cat /data/panel-token.txt ``` ``` docker compose --project-directory . -f deploy/compose/compose.image.yaml -f deploy/compose/compose.https.yaml up -d --wait ``` 若要發布圖片,請改以 `deploy/compose/compose.image.yaml` 作為第一個檔案。請保留 兩個 `-f` 參數,以便日後執行狀態查詢、日誌檢視、更新及停止指令。 Caddy 負責取得並更新憑證、將 HTTP 重定向至 HTTPS,並將 請求轉發至私有 Compose 網路上的收集器。憑證狀態 擁有專屬的持久化儲存區。收集器的直接主機埠僅限於迴路連接。 提供的 Caddy 設定未啟用存取記錄功能。 開啟 `https://watch.your-domain.org` 並輸入面板代碼。準備就緒 並不代表已確認憑證已簽發或外部可連通。若 HTTPS 尚未 就緒,請檢查 DNS、防火牆規則,以及: ``` docker compose -f compose.yaml -f deploy/compose/compose.https.yaml logs --tail 100 caddy ``` 提供的 Caddy 映像檔遵循其 `2-alpine` 標籤。拉取操作會更新該映像檔; 若需固定基礎架構版本,請在您的部署中固定一個已測試的摘要。 ## 更新與備份 在更新過程中,請保留 Compose 專案名稱及資料量。首先停止 收集器,並執行完整備份。針對預設的基於來源的部署: ``` docker compose stop docker compose cp tgwitness:/data ../tgwitness-backup-before-update ``` 每次請使用位於儲存庫之外的新備份目的地,並將其視為 需受帳戶存取權限保護的資料。範例路徑僅供說明;請使用您自己的私人備份 位置。複製整個目錄,包括隱藏檔案、所有工作區、金鑰、 日誌及媒體檔案。若已設定外部金庫主金鑰,請另行備份。 證據 ZIP 檔並非可還原的應用程式備份。若使用 HTTPS,且需保留其憑證/帳戶狀態時, 請一併保留 Caddy 卷宗。 若要進行原始碼部署,請取得最新發行版本的檔案,並執行: ``` docker compose up -d --build --wait ``` 若要進行圖像部署,請將 `TGWITNESS_IMAGE` 改為所需版本,然後執行: ``` docker compose --project-directory . -f deploy/compose/compose.image.yaml pull docker compose --project-directory . -f deploy/compose/compose.image.yaml up -d --wait ``` 請亦使用您安裝環境中的 Compose 檔案來執行前述的停止/複製指令。 請保留 `.env`、自訂設定以及相同的專案名稱。`down` 會保留命名 的資料卷;**`down -v` 則會刪除它們**。請勿在不同作業系統 或 Python 版本之間複製 `.venv`。若要進行原生更新,請先停止 TgWitness,備份其完整的資料 目錄,替換原始檔案,並在啟動前執行 `python start.py --setup-only`。 更新後,請檢查控制面板存取權限、帳戶身分、監測狀態及覆蓋範圍。 重新啟動並不會重建遺漏的 Telegram 更新。若未來版本變更儲存格式, 回滾操作可能需要使用更新前的備份。 ## 遠端伺服器 請將服務限制在迴路連接並使用 SSH 隧道,或讓 HTTPS 連線在 反向代理伺服器處終止。基礎 Compose 檔案僅限本地使用;可選的 `deploy/compose/compose.https.yaml` 覆蓋層會提供 Caddy 以支援已設定的網域。 請勿讓承載者憑證出現在 URL 及代理伺服器日誌中。反向代理伺服器應限制 請求大小與連線頻率。請勿將明文 HTTP 暴露於網際網路。 [deploy/](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md) 目錄中提供了 systemd、Windows 登入任務、macOS 使用者代理程式以及 Caddy 的範例, 請在安裝前檢視並調整其路徑。 這些僅為範本,並非在本地端執行的平台設定。 標準啟動程式不會註冊任何背景服務或任務。 在 Windows 系統上,以無視窗模式啟動 `pythonw.exe` 時,會將啟動/伺服器診斷記錄儲存於 資料目錄下的 `logs/server.log` 中(每檔 5 MiB,包含兩份輪替備份)。 以控制台模式啟動時,則會保留控制台日誌。兩種模式下 皆已停用 HTTP 存取日誌。請透過資料目錄保護日誌,並在分享前進行審閱。 ## 重新啟動與資料缺口 系統會保留上次請求的監測狀態。若監測處於活躍狀態, 啟動時系統會嘗試重新連線並恢復已選定的來源。手動暫停會清除 此設定。重啟失敗的紀錄將被保存並顯示於控制面板中。 StringSession 會保留授權狀態,但不會保留 Telethon 的持久性更新/實體狀態。 對話內容會在啟動時重新載入。Telegram/Telethon 能在運行期間恢復部分傳輸中斷, 但 TgWitness 並不保證在程序重新啟動後仍能進行持久性重播。 每次啟動時,系統會記錄前一期的日誌頭部及離線分界點。 監控程式每 10 秒檢查一次連線狀態,並每分鐘發送一次心跳訊號 (**參數 → 存活記錄間隔**)。 短暫的中斷可能無法被偵測到;連線狀態並不能保證 更新訊息的完整傳遞。快照是明確的當前歷史觀察結果,絕非用來填補資料缺口。 媒體佇列儲存於各工作區的 SQLite 資料庫中。訊息及其對應的處理任務 會以原子性方式一併提交。中斷的執行中任務會在啟動時恢復並重新嘗試。 每次下載設有 120 秒的基本超時,外加以 256 KiB/s 速率計算的檔案大小所需時間,且 每種附件類型設有 1–2,000 MiB 的上限;超時、速度與重試次數皆可在**「參數」**中設定。收集器 會跳過大小未知的檔案。暫停操作時,排隊中的工作會被保留。 重試會使用原始的 已觀察到的檔案描述符,絕不會使用後續編輯訊息的最新版本。 暫時性失敗的重試次數有限;媒體 FloodWait 暫停狀態在重新啟動後仍會保留。 媒體恢復與 Telegram 更新恢復是分開的,且無法重建已消失的檔案。 ## 備份、還原與儲存容量 在複製**整個資料目錄**(包括 vault.key、 signing.enc、credentials.enc、SQLite 資料庫/WAL 檔案、媒體檔案、代幣、檢查點, 以及所有個人設定檔/子目錄)之前,請先停止該程序。 請在 目標服務停止運作時還原 完整的副本。若金庫金鑰遺失或 簽名金鑰不匹配,將導致啟動失敗;請勿重新產生金鑰以強行存取。 請將秘密備份進行加密並實施存取控制。證據 ZIP 檔具有可攜性, 請檢視的是證據檔案,而非應用程式備份或 Telegram 會話備份。 本工具不具備自動保留與刪除功能。請預留足夠的磁碟空間,以存放所有訊息、原始 元資料、媒體檔案、臨時匯出檔及備份。 啟動驗證並匯出串流記錄,而非載入整個日誌。 匯出操作會鎖定已讀取的快照,同時新的 WAL 寫入仍可繼續;長時間執行的匯出 會保留 WAL 頁面,因此磁碟容量仍至關重要。ZIP 檔案的上限為 4 GiB (未壓縮),以符合獨立驗證者的預設值; **「參數」→「最大簽名 ZIP**」 可提高上限,此類檔案將透過 `verify.py --max-gib N` 進行驗證。其他格式則無事件計數上限。 支援的瀏覽器會將回應片段串流至使用者選定的檔案。其他瀏覽器 最多緩衝 128 MiB,並將較大的傳輸導向經認證的 CLI: ``` python -m tgwitness.download --token-file data/live/panel-token.txt --out evidence.zip ``` 若要使用其他工作區,請從「**Exports → Workspace ID**」中選用 `--profile ID`; 若要使用遠端伺服器,請選用 `--format zip|jsonl|csv|html` 或 `--url https://your-server`; 若要變更 5 GiB 的傳輸限制,請選用 `--max-mib`。僅允許在 迴圈連接(loopback)中使用純 HTTP。憑證透過標頭傳輸,拒絕重定向,現有檔案 不會被覆寫,且未完成的下載不會被發布為已完成檔案。 若 TGWITNESS_TOKEN 覆寫了生成的憑證,請使用一個獨立受保護的檔案 來存放該有效值:panel-token.txt 不會因覆寫而被改寫。 該指令的 SHA-256 僅為傳輸校驗和;請獨立驗證已簽名的 ZIP 檔案。 該面板顯示排隊中/失敗的媒體檔案、最舊的待處理媒體檔案、可用磁碟空間、Telegram 請求暫停狀態,以及存取權限未經確認的來源。這些診斷資訊並非 完整的端對端傳輸監控。工作區共用同一個程序;若某個帳戶活動頻繁, 仍可能影響其他帳戶。 獨立的工作程序、資料保留/輪替、持久性更新 恢復以及完整的部署認證仍維持不變。控制面板的範圍式存取權限已記錄於 [「存取與權限」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)文件中;獨立檢查點則由「 [見證指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)」涵蓋。 詳細操作流程:[連線/安全性](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/)及 [運作模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/)。 --- # Phala / Intel TDX · 高可信度部署 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/ 位於 Hetzner 或 Phala Cloud 上的全天候密封伺服器、Gateway DNS,以及第三方可重複驗證的檢查機制。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) Translation coverage: this edition includes material from the English original. 位於 Hetzner 或 Phala Cloud 上的全天候密封伺服器、Gateway DNS,以及第三方可重複驗證的檢查機制。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) 高可信度部署會在 檔案驗證過程中,額外加入對資料蒐集環境的獨立檢查。審查人員會查詢由 雲端服務供應商及 Cloudflare 持有的部署與存取紀錄,而 Intel TDX 部署則會針對 資料蒐集器的環境進行硬體驗證。 一般的本地端及 Docker 使用方式維持不變。除非您使用 `python -m tgwitness.cloud`進行部署,且收集器僅在部署設定為 `TGWITNESS_ASSURANCE`. 流程圖 · 操作員 → 伺服器、未設定進站規則的防火牆 (提供者 API); 操作員 → 隧道與 DNS (Cloudflare API); 伺服器、未設定進站規則的防火牆 → 隧道與 DNS (僅限外發); 伺服器、未設定進站規則的防火牆 → 在伺服器上建立的簽名金鑰; Verifier,唯讀代幣 → 提供者日誌與防火牆; Verifier,唯讀代幣 → 隧道連接器地址與入口; Verifier,唯讀代幣 → 已簽署的 /api/assurance 聲明; Verifier,唯讀代幣 → 證據 ZIP 檔案 · 操作員 · Verifier,唯讀代幣 · 伺服器、未設定進站規則的防火牆 · 提供者日誌與防火牆 · 隧道連接器地址與入口 · 已簽署的 /api/assurance聲明 · 證據 ZIP 檔案 · 隧道與 DNS · 在伺服器上建立的簽名金鑰 · 提供者 API · Cloudflare API · 僅限外發 **圖表轉為文字** 1. 操作員 → 伺服器、未設定進站規則的防火牆 (提供者 API) 2. 操作員 → 隧道與 DNS (Cloudflare API) 3. 伺服器、未設定進站規則的防火牆 → 隧道與 DNS (僅限外發) 4. 伺服器、未設定進站規則的防火牆 → 在伺服器上建立的簽名金鑰 5. Verifier,唯讀代幣 → 提供者日誌與防火牆 6. Verifier,唯讀代幣 → 隧道連接器地址與入口 7. Verifier,唯讀代幣 → 已簽署的 /api/assurance 聲明 8. Verifier,唯讀代幣 → 證據 ZIP 檔案 **本頁內容** - [驗證者可檢查的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#what-a-verifier-can-check) - [提供者](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#providers) - [Phala Cloud 上的機密虛擬機器 (Intel TDX)](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#confidential-vm-on-phala-cloud-intel-tdx) - [開始之前](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#before-you-start) - [來自控制面板](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#from-the-panel) - [無需網域的快速隧道](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#quick-tunnel-without-a-domain) - [部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#deploy) - [除錯部署與鎖定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#debug-deployment-and-lock) - [移除部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#remove-a-deployment) - [任何伺服器(自我認證)](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#any-server-self-attested) - [驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#verify) - [證據移交報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#report-for-evidence-handover) - [Cloudflare 作為外部見證者](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#cloudflare-as-an-outside-witness) - [閱讀部署結果](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#reading-the-deployment-result) ## 驗證者可檢查的內容 | 聲明 | 如何進行驗證 | 維護者: | | --- | --- | --- | | 該伺服器是透過服務供應商的 API,於已知時間點建立的 | 伺服器物件及其在提供者自有日誌中的建立過程 | 提供者 | | 沒有人使用該服務提供者的存取路徑 | 控制台請求、救援、密碼重設、重建、ISO、影像檔及備份的日誌 | 提供者 | | 無法連線至該服務 | 服務提供商的防火牆沒有任何進站規則;SSH 連線自首次開機起即被隱藏 | 提供者(防火牆)、主機(SSH) | | 該面板僅能透過隧道存取 | 隧道入口僅將流量轉發至控制面板;連接器則從伺服器位址運行 | Cloudflare | | 此軟體的實際運作方式如下: | 收集器的簽名原始碼樹雜湊值等同於已部署提交的檢出內容 | Collector,已與 Git 比對 | | 該簽署金鑰是在該伺服器上建立的 | 該金鑰會簽署一份聲明,其中載明服務提供者的伺服器 ID 以及其收到的 cloud-init 檔的雜湊值 | Collector,已與服務提供商進行比對 | | 該日誌屬於該金鑰與伺服器 | 每個在證據 ZIP 中啟動的程序,皆包含該伺服器的主機測量值 | 證據 ZIP | 收集器會將 SSH 狀態、連線、登入歷史紀錄及開機資訊記錄於經簽名的 process-start 及 `host.state` 記錄中。在一般虛擬機器上,這些屬於本機清單 記錄,審查人員會將其與服務供應商的獨立記錄進行比對。下文所述的 Intel TDX 部署方案,則會額外驗證由硬體支援的測量結果。 ## 提供者 | `--provider` | 憑證 | 驗證者的唯讀存取權限 | 驗證者專用的提供者日誌 | 保留用途: | | --- | --- | --- | --- | --- | | `hetzner` | `HCLOUD_TOKEN` | 同一專案的讀取權限 | 伺服器與防火牆操作 | 只要這些資源存在 | | `digitalocean` | `DIGITALOCEAN_TOKEN` | 唯讀個人存取憑證 | Droplet 動作 | 只要 Droplet 存在 | | `linode` | `LINODE_TOKEN` | `linodes`, `firewall`, `events` 唯讀範圍 | 帳戶事件、防火牆規則版本 | 90 天 | | `vultr` | `VULTR_API_KEY` | 具備讀取權限且擁有 `activity_logs` 權限 | 帳戶活動日誌(方法、路徑、執行者) | 30 天,若訂閱稽核日誌則可延長保存期限 | | `aws` | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` | `ec2:DescribeInstances`, `ec2:DescribeSecurityGroups`, `cloudtrail:LookupEvents` | CloudTrail 事件歷史紀錄 | 90 天 | | `phala` | `PHALA_CLOUD_API_KEY` | 同一工作區的 API 金鑰 | 應用程式修訂與 CVM 操作:Docker Compose 配置與環境變更、重新啟動、作業系統升級 | 雖然該應用程式確實存在 | | `generic` | 無 | 無 | 無:**自我驗證** | – | 請為每個案例使用專屬的專案、團隊、帳戶或子帳戶:驗證者的 唯讀存取權限將僅顯示此部署。憑證會從 `--provider-token-file` 或上述變數中讀取,絕不從命令列取得。對於 AWS,該檔案 儲存 `ACCESS_KEY_ID SECRET_ACCESS_KEY [SESSION_TOKEN]`;區域為 `--location`. 每份報告中皆會列出各服務供應商的記錄所無法呈現的內容。 簡而言之:Hetzner 會記錄主控台請求;DigitalOcean 的 Recovery Console、Linode 的 Lish/Glish 以及 Vultr 的網頁 主控台並未以該形式被記錄,因此 root 帳戶在首次開機時即被鎖定,若要登入主控台 則需重設密碼或變更開機方式,而這些操作都會被記錄下來。Vultr 會將主控台 網址回傳給任何能讀取該實例的金鑰;無論是記錄還是報告中均不會儲存此資訊。 ## Phala Cloud 上的機密虛擬機器(Intel TDX) 透過 `--provider phala` 收集器運行於 [Phala Cloud](https://phala.com/) 上的 Intel TDX 機密虛擬機器中, 並由 dstack 管理。主機與 Phala 工作人員均無法讀取其 記憶體,且處理器會針對該機器啟動的狀態簽署一份證明。驗證器不會 僅憑 Phala 的聲明就予以採信: `tgwitness.tdx` 會自行檢查每份證明——直至固定於 Intel SGX 根憑證授權機構(Root CA)層級——並對照 Intel 的撤銷清單及 Intel 簽署的平台資料,同時拒絕 任何可被除錯或遷移的機器。 | 報告條目 | 功能展示 | | --- | --- | | `tdx_binding` | 此證明涵蓋收集者的簽名聲明以及本次請求的隨機值 | | `tdx_quote` | Intel 為此認證背書;唯有當 Intel 評定該平台為最新版本時,才算通過認證 | | `tdx_compose_hash` | RTMR3 從 dstack 事件日誌中重播資料,並測量收集器所回報的應用程式編寫情況 | | `tdx_compose` | 該編譯結果與已部署提交的程式碼完全字節對字節一致:原始碼檔案透過雜湊值固定,兩張圖片則透過摘要值固定,沒有其他程式碼 | | `tdx_identity` | 此證明來自已部署的應用程式與實例,並使用 Phala 的 KMS 所提供的金鑰以及加密磁碟 | | `tdx_os` | MRTD 和 RTMR0-2 的數值等同於驗證器根據 Dstack-TEE 發布的 dstack 作業系統映像所計算的數值,該數值是透過 CVM 回報的作業系統映像雜湊值,以及 QEMU 根據虛擬機型態所建立的 ACPI 表格(包含韌體、核心、initrd、附帶根檔案系統雜湊值的命令列、記憶體、vCPU 及裝置)所推算得出。開發用映像會導致驗證失敗 | The OS image (about 180 MB, of which 21 MB are kept) is downloaded once from [Dstack-TEE/meta-dstack](https://github.com/Dstack-TEE/meta-dstack/releases) into `dstack-images` beside the record; `--tdx-image FOLDER` uses another folder or an unpacked image, `--tdx-image none` skips the comparison. The measurement follows `dstack-mr` and the `qemu-acpi` crate of Dstack-TEE/dstack. Private measurement regressions compare QEMU's own ACPI output and a retained Phala Cloud quote; live qualification also needs the published image. `--tdx-measurements` still compares MRTD and RTMR0-2 given as JSON instead. 日誌中記錄的每次收集器啟動都附有此類證明,因此 `verify --evidence` 會檢查每次啟動及其所啟動的作業系統映像。Phala 的應用程式修訂版本 以及 CVM 的運作狀況即作為供應商日誌:若 Docker Compose 配置在部署後發生變更, 報告將被判定為失敗,且重啟紀錄會被列出以供審查。 在面板中,選擇**「額外功能** 」→「**24/7 伺服器** 」下的**「機密虛擬機器 · Phala Cloud」** ,並貼上 Phala Cloud API 金鑰;快速隧道運作方式與 Hetzner 相同。若透過命令列操作: ``` python -m tgwitness.cloud deploy --provider phala --name case-1 --server-type tdx.small \ --ref v0.8.0 --repository https://github.com/phishdestroy/TgWitness --quick-tunnel \ --provider-token-file phala-key.txt python -m tgwitness.cloud verify --record deployments/case-1/deployment.json \ --provider-token-file phala-key.txt --cloud-init deployments/case-1/docker-compose.yaml \ --source CHECKOUT_OF_COMMIT --fingerprint COLLECTOR_FINGERPRINT --report certificate.md python -m tgwitness.cloud check-report --report certificate.pdf --verifier-fingerprint VERIFIER_KEY ``` `--tdx-collateral` 從檔案中讀取 Intel 的憑證和撤銷清單,而非 從 Intel 下載。此處無法使用 Gateway DNS:Phala 沒有針對 外發流量的服務供應商防火牆。 ### 驗證憑證 對於 Phala 部署,`verify --report certificate.md` 還會寫入憑證:一個 獨立的 `certificate.html` 及一份 A4 規格的 `certificate.pdf`,內容包含驗證結果、從 Intel 根憑證到收集器金鑰的信任鏈、 與普通及高保障級別伺服器的比較、 實際測量值與根據已發布映像計算出的數值的對照、各部分的擔保方、 Intel 憑證鏈、每項檢查、供應商日誌,以及如何重現 驗證流程。 JSON 報告仍是權威性紀錄;這些頁面僅是其呈現形式。 本報告已透過簽名與時間戳記進行數位加封,相關內容存於 `certificate.seal.json` 以及其旁之 `.tsq`/`.tsr` 檔案中: | Seal | 新增功能 | | --- | --- | | 合格電子時間戳記,`http://tsa.belgium.be/connect` | RFC 3161 時間戳記,基於比利時聯邦政府合格信任服務提供者(FPS 政策與支援局,BOSA)所提供的 `certificate.json` 精確位元組資料。 該單位被列為比利時歐盟可信清單中的「合格時間戳記服務」,狀態為「已授予」;截至 2026 年 10 月 20 日發布的清單,其根憑證(比利時根 CA6)及清單中的條目均已固定於 `tgwitness/tsa_roots.py` 中。 根據《歐盟法規》第 910/2014 號第 41 條,此類時間戳記在每個歐盟成員國內,其日期、時間及資料完整性均被推定為準確無誤。 | | RFC 3161 時間戳記,FreeTSA | 第二個獨立的時間戳記 | | 驗證器簽名 | Ed25519 基於一項聲明,該聲明列出報告的 SHA-256 值及所有時間戳記,並使用驗證者自身的金鑰(`--sign-with FOLDER`,預設為 `~/.tgwitness/verifier`);該 PDF 文件附有由同一金鑰簽署的數位簽章 | `--timestamp URL`(可重複)選擇其他授權機構,`--timestamp none` 不選擇任何機構,`--sign-with none` 則不對印章進行簽署。`check-report` 會檢查報告的雜湊值、驗證者簽名、 每個時間戳至可信根憑證及其合格狀態,以及 PDF 文件的簽名。 在歐盟以外地區, 合格時間戳記及報告整體的法律效力,由接收該報告的 法院或主管機關決定;該印章僅顯示報告的生成時間,並證明其內容未被篡改。 一份驗證報告無法排除 Intel TDX 模組或微程式中存在漏洞,亦無法排除對 記憶體匯流排的實體存取。無論誰控制 Phala 帳戶中的應用程式,皆可部署另一份「compose」; 它將以新的修訂版本出現,並附帶新的「compose」雜湊值。主機控制著機器 的時間來源與網路。 部署、透過 `--evidence` 進行驗證、重新啟動、作業系統映像比較、附有簽名與時間戳記的數位密封憑證,以及 銷毀等操作均已在 Phala Cloud 平台上執行;請參閱 [(2026 年 11 月 4 日執行)及](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#live-phala-cloud-deployment--4-november-2026)。 ## 開始之前 1. 一個 Cloudflare 區域、其帳戶 ID,以及具備 **Cloudflare Tunnel 編輯**、 **區域讀取**和 **DNS 編輯權限的** API 憑證,由 `--cloudflare-token-file` 或 `CLOUDFLARE_API_TOKEN`提供。針對驗證者:**Cloudflare Tunnel 讀取**、**DNS 讀取**,以及針對 稽核日誌的**帳戶設定讀取**。若無網域, [快速隧道](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#quick-tunnel-without-a-domain)則無需上述任何項目。 2. 具備專用專案寫入權限的服務提供者憑證; `lock` 同樣採用: - Hetzner:具備讀取與寫入權限的 API 憑證; - DigitalOcean:具備寫入權限的個人存取憑證; - Linode:個人存取憑證,附帶 `linodes`, `firewall` 以及 `events` 讀寫權限; - Vultr:專用帳戶或子帳戶的 API 金鑰; - AWS:允許使用 IAM 憑證 `ec2:DescribeVpcs`, `ec2:DescribeImages`, `ec2:CreateSecurityGroup`, `ec2:AuthorizeSecurityGroupIngress`, `ec2:RunInstances`, `ec2:CreateTags`, `ec2:DescribeInstances`, `ec2:DescribeSecurityGroupRules` 且 `ec2:RevokeSecurityGroupIngress`. 3. 待執行的提交。發布標籤會被解析為其對應的提交,其中 `git ls-remote`; 伺服器僅會接收長度為 40 字元的提交。 ## 來自控制面板 在您的電腦上,**附加說明 → 伺服器 24/7 全天候運作** 會以相同方式 `deploy` 針對 Hetzner 的設定,僅需三個 步驟:選擇歐洲或美國,貼上 Hetzner 憑證(讀寫權限),然後檢視 控制面板根據該憑證所偵測到的伺服器類型、月費、地址及版本。在您確認之前, 系統不會建立任何內容。控制面板會將每個步驟以 `deploy` 報告的狀態,接著顯示 位址、控制面板代幣及簽名金鑰指紋。若未設定網域,伺服器將取得 [快速隧道](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#quick-tunnel-without-a-domain) ;**您的伺服器 → 尋找目前的網址** 會在重新啟動後再次查詢該位址。若要在您自己的網域下設定固定位址,請開啟 **選用 · 您的專屬網域** 並新增 Cloudflare 代幣(預先準備的連結會選取「區域 讀取」、「DNS 編輯」及「Cloudflare 隧道編輯」)。 這些憑證會隨每個請求從瀏覽器分頁傳輸至同一台電腦上的 TgWitness 且不會寫入任何位置;部署記錄、經過遮蔽處理的 cloud-init、面板憑證以及 用於快速隧道的位址金鑰,皆儲存於 `deployments/NAME` 資料目錄內。 控制面板僅透過直接迴路連接向主要管理員提供此功能 (`127.0.0.1`,不允許代理或隧道標頭);若透過網路存取控制面板,則會顯示相關指令 。版本預設為正在運行的控制面板的發行標籤,此資訊透過 GitHub API 解析取得。位置、伺服器類型與價格則來自 Hetzner 的 API: `cpx22` 若該地區有 提供,否則則採用至少 2 GB 記憶體的最低價 x86 類型。 ## 無需網域的快速隧道 `--quick-tunnel` 取代 `--zone`, `--cloudflare-account` 並 `--panel-host`;無需使用 Cloudflare 帳戶或憑證: ``` python -m tgwitness.cloud deploy --provider hetzner --name case-2026-11 --server-type cpx22 \ --ref 0123456789abcdef0123456789abcdef01234567 --quick-tunnel --provider-token-file hetzner.token ``` 在伺服器端,cloudflared 會開啟一條 [快速隧道](https://developers.cloudflare.com/tunnel/get-started/quick-tunnels/) 連接到控制面板:一個隨機 `https://….trycloudflare.com` 位址,該位址會在 cloudflared 或伺服器重新啟動時變更。伺服器上的一個小型服務會將每個位址發佈至隨機的 ntfy.sh 主題,並使用僅部署目錄所持有 的金鑰進行簽名(HMAC-SHA256) (`address-key.txt`),並每三小時重複發布一次,因為 ntfy.sh 會保留貼文長達 12 小時。 `deploy` 和**「查找當前位址**」功能僅接受經簽名的貼文,因此偽造的貼文無法 將您及您的面板憑證導向他人的位址。該主題記錄於 已發布的 cloud-init 中:任何持有這些資訊的人都能讀取當前位址,而該位址仍會要求提供 面板憑證。無論何種情況,伺服器均不保留任何傳入連接埠。 驗證器沒有地址金鑰,任何讀取該主題的人都能向其發佈訊息。因此,收集器 也會發佈該地址本身,並使用其自身的 Ed25519 金鑰進行簽名;而 `verify` 會取用部署記錄中 由收集器金鑰簽名的最新發佈訊息;發佈訊息的排序依據是 ntfy.sh 接收它們的時間,而非它們聲稱的時間。 在此變更之前的收集器不會對任何內容進行簽名,而 `verify` 隨後會取用最新的貼文,並在 `statement` 檢查中表明此點;偽造的貼文 只能導致該檢查失敗,因為該地址仍必須使用收集器的金鑰進行回應。 代價為何:由於沒有 Cloudflare 帳戶會記錄快速隧道,因此 `verify` 會將 隧道、連接器及 DNS 檢查報告為不可用,結果最好也只能達到 `incomplete`(在 Phala Cloud 上,檢查則會通過:連接器在受測的 Docker Compose 配置中運行); 供應商記錄、防火牆、簽名聲明、主機測量及安裝程式比對均 照常檢查。與參考安裝程式的位元組比對需要一個已部署的提交 版本,該版本必須已知 `--quick-tunnel`;從 0.7.0 版本檢出後,會建置網域安裝程式並回報 差異。 Cloudflare 對快速隧道不提供正常運作時間保證,允許 200 個 待處理請求,且不傳輸 Server-Sent Events,因此控制面板的即時更新(0.7.0 之後的版本) 可能無法透過快速隧道傳送,需重新載入頁面;此部分尚未進行測試。若需 確保系統穩定運作,請使用您自己的網域。 ## 部署 請先查看所有即將發送的內容。 `plan` 不會向任何服務供應商或 Cloudflare 發出請求: ``` python -m tgwitness.cloud plan --provider hetzner --name case-2026-11 --server-type cpx22 \ --ref 0123456789abcdef0123456789abcdef01234567 --zone example.org \ --cloudflare-account CLOUDFLARE_ACCOUNT_ID --panel-host case.example.org ``` 接著使用相同的選項和憑證進行部署: ``` python -m tgwitness.cloud deploy --provider hetzner --name case-2026-11 --server-type cpx22 \ --ref 0123456789abcdef0123456789abcdef01234567 --zone example.org \ --cloudflare-account CLOUDFLARE_ACCOUNT_ID --panel-host case.example.org \ --witness-host case-witness.example.org \ --provider-token-file hetzner.token --cloudflare-token-file cloudflare.token ``` 初學者適用的伺服器類型: `cpx22` (Hetzner), `s-1vcpu-2gb` (DigitalOcean), `g6-standard-1` (Linode), `vc2-1c-2gb` (Vultr), `t3.small` (AWS)。 `--location` 以及 `--image` 預設使用各 供應商位於歐洲區域的 Ubuntu 24.04 系統。 `--repository` 從另一個 https Git 儲存庫擷取提交,且 URL 中不包含憑證 (預設 `https://github.com/phishdestroy/TgWitness.git`). `deploy` 亦接受 `--out` 指定其他部署目錄(預設 `deployments/NAME`;若目錄中已存在 部署則會被拒絕)以及 `--wait`,即等待收集器簽署聲明所需的分鐘數: 1 至 240,預設值為 20,或 60 適用於 `generic`. 指令: 1. 建立一個 Cloudflare 隧道,其入站流量會將面板主機名稱轉發至面板, 若已指定,則將見證主機名稱轉發至 `/api/witness/head` 並 `/api/assurance` 且僅限於該主機名; 2. 為這些主機名稱建立代理 CNAME 記錄,並拒絕已存在的主機名稱; 3. 建立一個沒有入站規則的提供者防火牆,並在其後方配置一台伺服器,該伺服器不使用 SSH 金鑰、 不進行備份、無控制台代理程式,且透過 cloud-init 來遮蔽 SSH、鎖定 root 權限,並安裝 `cloudflared`、精確取得該提交、驗證並啟動 TgWitness 作為 經過強化處理的 systemd 服務; 4. 等待收集器傳回的簽名聲明,並驗證該聲明是否指明此伺服器以及 此 cloud-init 的雜湊值。 `deployments/case-2026-11/` 接著包含: | 檔案 | 目錄 | 分享? | | --- | --- | --- | | `deployment.json` | ID、雜湊值、執行的 API 呼叫(方法、路徑、狀態)以及第一條已簽署的陳述 | 是的,搭配驗證器 | | `cloud-init.redacted.yaml` | 將原始的 cloud-init 指令中的兩個機密值替換為 `REDACTED` | 是 | | `panel-token.txt` | 面板代幣 | 否 | 服務提供者的根密碼、隧道代幣及控制面板代幣絕不會寫入 `deployment.json`。請透過您無法獨自控制的頻道(例如見證頻道或發送給收件者的訊息),發布文末列出的收集器指紋。 請透過 `https://case.example.org` 並使用面板代幣登入,操作方式參照 [帳戶指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)。面板操作會記錄在已簽署的日誌中;這些並非 SSH 連線。[見證者](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)可輪詢 `https://case-witness.example.org`. 本工具不支援 SSH:若初始化失敗,收集器將永遠不會回應。請刪除伺服器並 重新部署,或使用除錯部署來找出原因。 ### 使用者資料中的秘密 cloud-init 攜帶兩項機密:控制面板憑證與 Cloudflare 隧道憑證。 簽名金鑰並不包含在內;它是在伺服器上生成的。Hetzner、DigitalOcean 和 Linode 不會透過其 API 回傳使用者資料。Vultr 會將資料回傳給任何能讀取該 執行個體的金鑰,而 EC2 則透過 `DescribeInstanceAttribute`。對於 AWS,僅向驗證者提供表格中的三項 操作,絕不 `ec2:Describe*`。針對 Vultr,假設驗證者的金鑰可讀取兩者 的憑證。隧道憑證允許某人執行第二個連接器: `verify` 這會通報任何 不在伺服器上的連接器,且收集器的陳述無法以此方式偽造,因為每則陳述 都會簽署一個新的挑戰碼。若使用 `--quick-tunnel` 第二個密鑰則是位址金鑰: 任何讀取它的人都能發佈一個虛假位址,而控制面板會接受該位址。 該蒐集器的公開聲明中未提及伺服器位址及登入來源; 這兩項資訊均保留在已簽署的日誌中。 ## 除錯部署與鎖定 `--debug-ssh-key KEY --debug-ssh-from 198.51.100.4` 僅保留來自單一位址 或小型網路(IPv4 至多為 /24,IPv6 至多為 /48)的單一金鑰之 SSH 連線。 `KEY` 已向 服務供應商註冊:Hetzner 專案中的 SSH 金鑰名稱或 ID、DigitalOcean 團隊中的 SSH 金鑰 ID 或指紋、其個人檔案中的 SSH 金鑰已新增至 root 的 Linode 使用者名稱、 Vultr 帳戶中的 SSH 金鑰 ID,或該區域內 EC2 金鑰對的名稱。這些 選項不適用於 `generic`。此類部署將被記錄為 `debug` ,且**絕不會**被報告為 高保障等級。完成後,請執行 `sudo tgwitness-lock` 作為最後一個 SSH 連線的最後一道指令,接著: ``` python -m tgwitness.cloud lock --record deployments/case-2026-11/deployment.json --provider-token-file hetzner.token ``` 防火牆會遺失所有進站規則。報告隨後會顯示何時允許 SSH 連線以及何時 被關閉;該視窗將持續顯示。 ## 移除部署 `destroy` 刪除伺服器及其防火牆(透過部署標籤定位),以便 中途失敗的部署也會一併移除,接著刪除指向其 隧道的 DNS 記錄,以及隧道本身。伺服器的日誌與簽名金鑰將一併刪除:請先 匯出相關證據。紀錄將保留下來,並標記 `removed`,並附有移除操作的 API 呼叫紀錄。 ``` python -m tgwitness.cloud destroy --record deployments/case-2026-11/deployment.json --confirm case-2026-11 \ --provider-token-file hetzner.token --cloudflare-token-file cloudflare.token ``` 針對 Hetzner,已實作透過 API 進行移除的功能。對於其他服務供應商 `destroy` 在刪除任何資料前, 請先在服務商控制台中指定要刪除的標籤名稱。手動安裝的 伺服器(`generic`)僅會遺失其隧道與 DNS 記錄。快速隧道部署無需 Cloudflare 憑證:其隧道僅止於伺服器,且相關貼文將於 12 小時內 從 ntfy.sh 過期。 ## 任何伺服器(自我驗證) `--provider generic` 適用於自行購買或手動安裝的伺服器。 `deploy` 建立隧道 及 DNS,並寫入 `install.sh` (私有)及 `install.redacted.sh` (用於發佈),並進入待機狀態。 將 `install.sh` 至新安裝的 Ubuntu 24.04 伺服器,並在該處執行: ``` sudo bash install.sh ``` 它會記錄主機的原始狀態(登入紀錄、帳戶、 `authorized_keys`、監聽套接字、 服務、排程任務、套件)的原始狀態,安裝該提交版本,啟用主機防火牆,刪除 自身,遮蔽 SSH 並結束連線。此類伺服器的報告頂多只能算是 **「自我證明」**:無論誰執行安裝程式,在執行前都已擁有 root 權限,且驗證者無法取得 任何提供者記錄。但這仍優於來源不明的伺服器:資產清單、 安裝程式雜湊值以及後續每次登入皆經過簽名。 ## 驗證 驗證者需要 `deployment.json`已發布的安裝程式、唯讀憑證,以及 最好是該提交的代碼庫副本和一份證據 ZIP: ``` git clone -c core.autocrlf=false https://github.com/phishdestroy/TgWitness.git checkout git -C checkout checkout 0123456789abcdef0123456789abcdef01234567 python -m tgwitness.cloud verify --record deployment.json \ --provider-token-file read-only.token --cloudflare-token-file cloudflare-read.token \ --fingerprint COLLECTOR_FINGERPRINT --cloud-init cloud-init.redacted.yaml \ --source checkout --evidence tgwitness-evidence.zip --report report.md ``` 驗證者會於當下向每個服務提供者及 Cloudflare 索取相關值;該記錄 僅提供需查詢的 ID。**PASS** 的退出代碼為 0,**失敗** 的退出代碼為 1,而 **檢視**、**未完成** 或 **自我驗證** 的退出代碼則為 2。 `--fingerprint` 應來自獨立的 通道;若無此通道,則僅將金鑰與操作員的記錄進行比對。 `python verify.py` 仍會驗證證據 ZIP 本身,如同 [證據](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) 一樣。 供應商操作分為以下類別:建立及在建立後 30 分鐘內啟動的操作均通過審核; 控制台、救援、密碼重設、重建、ISO、映像檔、快照、備份、系統管理員、 EC2 實例連線及防火牆開啟等操作若失敗;電源操作及任何未預期的 操作則會被標記待審查。未知操作絕不會在未經通知的情況下通過審核。 ## 證據移交報告 `--report report.md` 撰寫 Markdown 報告,並 `report.json` 其旁: 1. 結果、收集器金鑰指紋、部署、提供者、提交、伺服器、防火牆、隧道; 2. 每項檢查及其狀態與來源(供應商 API、Cloudflare API、收集器聲明、 證據日誌); 3. 提供者日誌,其中包含每項操作的評估結果,以及(若提供者有記錄的話)執行者; 4. Cloudflare 端點,用於儲存隧道連線、設定及稽核日誌; 5. 經簽署的收集者聲明; 6. 該報告闡明的事項與未闡明的事項; 7. 用於重現該結果的指令,以及所有輸入檔案的 SHA-256。 提交報告、 `report.json`, `deployment.json`、已發布的安裝程式以及 證據 ZIP。請盡早製作報告:服務供應商的日誌僅會保留有限時間。 ## Cloudflare 作為外部見證者 此處的所有功能皆為選用。即使沒有 Cloudflare 帳戶,伺服器仍可運作,且目前有兩項 功能可正常運作: | 什麼 | 功能展示 | 在 TgWitness | | --- | --- | --- | | 快速隧道或您自己的網域隧道 | 該面板僅能透過隧道存取 | 伺服器精靈,請參閱上文 | | drand 中繼站 `drand.cloudflare.com` | drand 輪次結束後的記錄比這份文件更新:這份日誌是邊進行邊撰寫的 | 證據模式、**更多見證者**、無帳戶([格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#optional-records-in-evidence-mode-drand-and-telegram-devices)) | | 隧道狀態通知 | 當隧道中斷時,透過電子郵件或來自 Cloudflare 的 Webhook 通知 | 請在 Cloudflare 控制台中進行設定 | | Gateway DNS(`--gateway-dns`,或在設定精靈中稱為 **Cloudflare Gateway DNS**) | 伺服器查詢的每個名稱,皆由 Cloudflare 透過 TLS 回應;Hetzner 防火牆不允許 DNS 連通其他任何目標;閘道器 (Gateway) 政策是否能重寫回應內容 | Hetzner,免費的「零信任」方案,無需網域; `verify` 檢查防火牆、位置、日誌記錄、政策、伺服器查詢及稽核日誌;證據模式會將日誌複製到日誌簿中 | | 與 Cloudflare 的閘道:伺服器上僅有一台 Cloudflare One 客戶端,以及一個僅允許 Cloudflare 通行的出站防火牆 | 伺服器建立的每項連線,而不僅是 DNS | 尚未建置 | | 在面板前方存取 | 誰在何時登入該面板 | 尚未建置:需自行準備網域 | | SSH 命令記錄 | 除錯會話中的每個指令 | 尚未建置 | Logpush 會將 Cloudflare 的副本保留在 R2 中,這是一項企業級功能:在免費 方案中,Cloudflare 會回應 `logpush is not enabled for this account`。其閘道器日誌在該處保留 24 小時,因此「證據模式」會將其複製到簽名日誌中(**Cloudflare 閘道器的日誌,記錄 此伺服器的 DNS**查詢,這是一個具備「帳戶分析讀取權限」的唯讀憑證)。 若未實施「零信任」方案,每個帳戶僅有一個 DNS 位置。當 Cloudflare 拒絕其他位置時, 伺服器會共用現有的位置,並透過其位址來區分查詢;該篩選機制 同樣需要「零信任 PII 讀取」權限,且 `destroy` 仍會留下共用位置。單一日誌查詢的範圍 最多為三小時,因此複製並 `verify` 讀取作業將以三小時為單位進行。 Gateway DNS 涵蓋系統解析器。透過 443 埠的 HTTPS DNS 連線至其他解析器,以及 連線至未經任何處查詢的地址(例如 Telegram 的資料中心),均不會 記錄於其日誌中。 Cloudflare 無法窺見 Telegram 的加密內容、該 Telegram 帳戶上的其他裝置 (「證據模式」的裝置清單是從 Telegram 端記錄下來的),亦無法窺見服務供應商的虛擬化平台。 ## 閱讀部署結果 對於一般虛擬機器,服務供應商負責管理主機基礎架構,並會同步核對 本地資源清單與供應商紀錄。針對 Intel TDX,驗證者還會額外檢查 硬體規格、收集器綁定、編組及作業系統測量值。請閱讀各項 結果,以確認哪些檢查通過或無法取得。 歷史防火牆詳情取決於服務供應商;Linode 會保留規則版本。 [驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)記錄列出了已測試的部署及剩餘的即時 檢查,而[驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)則將這些環境 檢查與存檔的取得及完整性連結起來。 --- # Telegram · 面板指南 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/ 面板中的每個畫面:聊天、日誌、來源、匯出、額外功能、保護模式以及程式碼檢查。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 面板中的每個畫面:聊天、日誌、來源、匯出、額外功能、保護模式以及程式碼檢查。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [開始使用](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) ![開始使用](https://phishdestroy.github.io/TgWitness/assets/chapter-start.svg) [首次設定與設定選項](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/) · [帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/) · [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) · [案例報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/) 各畫面功能說明、其寫入簽名日誌的內容,以及詳細 指南的位置。面板每次僅顯示一個工作區:一個 Telegram 帳號及其專屬的 來源、日誌與簽名金鑰。側邊欄頂端的選取器可切換 工作區。網址包含工作區資訊(`?ws=…`);若網址、 選擇器與已載入的帳號不一致,則所有操作將被封鎖。 請使用[「比較」彙整方法](https://github.com/phishdestroy/TgWitness/blob/main/docs/COLLECTION-MODES.md),在即時 觀察、完整歷史紀錄、新帳戶/聊天室匯出檔,以及已儲存紀錄移交之間進行選擇。 「匯出」頁面在下載控制項上方亦包含相同的比較功能。 **本頁內容** - [導覽指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#find-your-way) - [從這裡開始](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#start-here) - [聊天紀錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#chats) - [期刊](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#journal) - [來源](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#sources) - [匯出功能](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#exports) - [設定、帳戶與連線](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#settings-accounts-and-connection) - [附加內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#extras) - [保護模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#protection-modes) - [更多工具](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#more-tools) ## 探索使用方法 「每日」區塊位於側邊欄頂端,**「帳戶」** 位於「**工作區** 」之下, 其餘項目則位於**「更多工具與設定」** 之下。頂部工具列中的**介面層級** 切換按鈕可決定顯示多少個區塊: | 層級 | 側邊欄中的區塊 | | --- | --- | | 簡單 | 首頁、聊天、變更、存檔和設定 | | 標準 | 另見 Case Board、「帳戶」與「存取權限」 | | 專家 | 此外還有「來源」、「附加功能」、「詢問存檔」、「參數」、「帳戶」、「系統日誌」及「整合功能」 | 基本功能包含「從這裡開始」、「日誌」、「匯出**主頁**」、「**變更**」及「**存檔**」。 「層級」僅用於隱藏區段。隱藏的功能仍會持續運作,且伺服器會 自行檢查每項權限。層級、語言、主題和時區會針對 每位操作者及每個工作區分別儲存;詳見[設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/)。 頂部工具列還包含: - **前往特定區段**(Ctrl+K,或在 Mac 上按 ⌘K):透過 `#number`。使用方向鍵移動,按 Enter 鍵開啟,按 Esc 鍵關閉。 - **通知**:根據日誌處理的問題與聊天室變更。 **點選「全數標記為已讀」**可清空計數器,而**「通知規則」**則會開啟相關設定。 傳送至 Telegram、Discord 或電子郵件的設定位於 [「進階」→「通知」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#notifications)。 - 此工作區的連線狀態指示器。頂部工具列下的「**收集器狀態」** 會將其細分為 Telegram 連線、事件接收、來源及附件佇列。 - **鎖定**:關閉此瀏覽器中的面板。Collection 仍會在伺服器上持續運作。 - 版本號旁邊的保護模式;請參閱[保護模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#protection-modes)。 示範工作區包含虛構的訊息,且絕不會連線至 Telegram。 任何可能變更真實工作區的操作,在此均會被拒絕。 ## 從這裡開始 選擇一項任務。**「匯出我的帳號」**會下載該帳號目前可讀取的內容。 **「追蹤調查」**會記錄您所選聊天室中的新訊息、觀察到的編輯內容以及刪除通知。 設定卡片顯示三個步驟:連線帳號、 選擇來源、開始監測。目標問題會一直顯示在此頁面,直到您 回答或跳過它為止。若開啟新的工作區,則會直接進入[首次設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/)流程。 ## 聊天室 已儲存的對話,預設為唯讀模式。 - 可透過名稱或 ID 搜尋清單。**選擇**「新增」或「移除」以管理關注的聊天室。 「**開啟 Telegram 連結」**功能接受使用者名稱或邀請連結,並將預覽儲存至 日誌中。**選擇「加入/開啟並觀察」**會先加入該聊天室,再將其新增至您的來源清單; 開啟機器人則會發送該訊息 `/start`. - 聊天室標題列會統計訊息數量:**已刪除,文字保留**、**在儲存前已刪除** 以及 **重新檢查後未找到**。聊天室清單和通知採用相同的 定義。已刪除的訊息會顯示為紅色,並保留其儲存的文字;經編輯的訊息 則會保留所有儲存的版本。每則刪除紀錄都會顯示已知資訊:何時被查看、 Telegram 不會報告刪除者身分,或是僅收到刪除通知。 - **「載入歷史紀錄」**功能會將最近的 100、250 或 500 則訊息載入至此視圖及 日誌中。若要載入所有已啟用的來源,請使用[「來源」→「完整歷史紀錄」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#sources)。 - **「匯出聊天紀錄」**功能會將整個可見的聊天歷史記錄下載為經簽名的 `chat.json` 且 `chat.html`檔案。多個已連結的帳戶可共同完成此工作:每個帳戶下載其專屬的 訊息編號範圍並對該部分進行簽署,而啟動 匯出的帳戶則對整個檔案進行簽署。請參閱「[匯出單一聊天室](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Chat-Export.md)」。 - **「人員」**清單列出所有在此聊天室中存有訊息的使用者。人員個人資料預設為 關閉狀態,因為這些屬於第三方之個人資料。當某個聊天室的 個人資料功能開啟時,個人資料頁面會顯示姓名與使用者名稱歷史紀錄、Telegram 標記、頭像雜湊值、活動紀錄、 誰回覆了誰、其他被監測的聊天室,以及被提及的錢包、手機號碼、使用者名稱 和連結。 每項事實皆指向其對應的記錄。**匯出個人檔案**會儲存一個經簽名的檔案, 可選擇以密碼保護 ZIP;關閉個人檔案功能將刪除該檔案。請參閱「 [人員個人檔案](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#people-profiles)」。 - **「儲存個人資料」功能現可**記錄聊天室或機器人個人資料的快照:描述、 成員、邀請連結、機器人指令。 ### 唯讀權限、發送權限與機密資訊 訊息上方有兩個開關,用以保護帳戶與閱讀者: - 開啟聊天視窗時,預設為**唯讀模式**。 若要發送訊息或按下機器人 按鈕,請將此功能關閉。每次執行動作時,系統都會詢問**「以 @account 身分發送?」**或**「以 @account 身分按下此機器人按鈕?**」,告知您聊天室成員將看到該動作,且該動作會被記錄在 已簽名的日誌中。**選擇「在此聊天室中 10 分鐘內不再詢問」**可暫時跳過此 提示。在「**案件證據**」目標中,無論是在控制面板或 API 中,發送功能均為關閉狀態。 - **「遮罩機密」**功能可隱藏看似密碼、登入碼、API 金鑰或 雜湊值、機器人代幣、會話字串、私鑰、JWT 或支付卡號 (卡號會透過 Luhn 和校驗)的內容。**點擊「顯示」**將揭露一個值;該揭露紀錄 會被記錄在日誌中。針對此瀏覽器關閉遮罩功能的操作也會被記錄下來。 僅顯示內容會改變:原始記錄及所有匯出檔均保留完整內容。 ## 日誌 工作區所簽署的每筆紀錄,依最新至最舊的順序排列。 - **「概覽」**會統計已觀察到的訊息、記錄的編輯、刪除通知以及 選定的來源。 - **事件時間軸**可依事件類型(全部、編輯、刪除、反應、 成員資格、報導範圍)、文字內容及來源進行篩選。可**載入較早的事件**頁面。 - 開啟記錄即可查看其詳細資訊、雜湊值及有效載荷。**「此記錄的連結**」是一個 可開啟相同記錄的網址。此預覽中可能的機密資訊已遭遮蔽; 匯出檔則保留原始內容。 - 日誌採「僅追加」模式:面板中沒有任何功能可編輯或刪除記錄。請透過 「**匯出」→「驗證日誌」**或 `python -m tgwitness.verify`;請參閱「 [匯出與驗證」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/)。 ## 來源 此工作區會記錄哪些對話,以及從中保留哪些內容。變更 將套用至未來的活動;已儲存的記錄則維持不變。 **「刷新聊天清單」**功能會讀取該帳號的聊天室與資料夾,但不會下載訊息。 ### 範圍 - **此帳戶的記錄內容** :**已選取的聊天室** (僅限您新增的聊天室)、 **Telegram 資料夾** (該帳號的其中一個資料夾,包含日後新增至該資料夾的 聊天室)或 **完整帳戶** (所有聊天室,以及每當出現新的聊天室、群組、私人聊天室或 機器人時皆會記錄)。**調查模式** 適用於專用帳號:它會記錄 該帳號所見的一切內容、其發送的訊息及按鍵操作,並立即儲存每個新 聊天室的檔案及先前可見的訊息。 [專用帳戶指南](https://phishdestroy.github.io/TgWitness/docs/dedicated-account/) 說明了為何絕不能使用您的主帳號。 - **來源類型**將「資料夾」與「整個帳戶」模式的範圍限制於頻道、群組、私人 聊天室及機器人。**自訂動作**則會新增該帳戶自身的訊息、編輯操作及 回覆鍵盤按鍵記錄。 - **當出現新的聊天室或機器人時**:儲存其檔案,並儲存最多達指定數量 的最新可見訊息。 限制:已發布的雲端收集器無法接收「秘密聊天」。獨立的 [「偽秘密」介面及其示範版本,](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/secret-chats/)其文件中已註明 開發狀態與尚未解決的缺陷。 當 TgWitness 未 運行時,系統不會進行任何記錄;重新啟動後,它僅會擷取 Telegram 仍能回傳的資料,而 報告中會顯示此期間的資料缺口。超過聊天清單限制(1,000 個對話,除非在 「參數」中進行變更)的聊天室,將於下次變得活躍時被加入。在 其他應用程式中按下的內嵌機器人按鈕將無法被偵測;但機器人的回覆會被記錄下來。 ### 涵蓋的聊天室 可依狀態(**啟用**、**暫停**、**優先級**、**排除**、**未確認 存取權限**、**忽略**)及類型進行篩選,接著對選取項目執行操作:啟用、暫停、標記或移除 優先級、從範圍中排除或刪除。狀態標籤僅顯示當前狀態;操作 則位於各列的選單中,並附有說明其功能的文字。 暫停和排除操作會要求 確認,批次操作亦同。移除來源時會要求輸入其名稱,並刪除其人員 檔案;其儲存的記錄仍會保留在日誌中。 若某來源未顯示在該帳戶的聊天清單中,表示該來源正在**接收更新,但未出現在聊天 清單中,**同時記錄仍持續傳入;否則則**無法確認存取狀態**。「**可用 聊天室」**會新增透過「**新增選取項目**」或**「新增所有符合條件的項目」**選取的聊天室。 ### 完整歷史紀錄 將每個已啟用來源的可用歷史記錄載入至「聊天」和「日誌」中。 進度會在重新啟動後保留;附件則依照您的媒體設定處理。請參閱 [來源歷史記錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)。 ### 記錄 - **選擇要保留的變更項目**:新訊息、編輯、刪除通知、 可見的反應、加入與離開。預設值會變更表單樣式;「 **儲存記錄設定」**則會套用該設定。重新啟用某個類別並不會恢復 已錯過的事件。 - **在可用的情況下保留媒體**檔案:下載單一檔案大小上限為,可針對 各檔案類型設定 1 至 2,000 MiB,並限制影片長度(以秒為單位;0 表示無限制)。 每次下載嘗試都會記錄結果。 - **重新檢查**:每隔幾分鐘檢查一次優先聊天室,其他聊天室則很少檢查,因此該帳號 能避免觸發 Telegram 的 FloodWait 限制。設定為 0 可關閉該群組。在清單中以星號標記優先聊天室; 每次檢查的聊天室數量以及聊天室之間的暫停時間,皆可在 「參數」中設定。請參閱[收藏集](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/)。 ## 匯出功能 **「下載」**用於準備檔案;「**建置報告」**則用於設定報告的呈現方式。 | 什麼 | 適用於 | 指南 | | --- | --- | --- | | 帳戶匯出 | 該帳號目前可讀取內容的最新快照 | [帳戶匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/) | | 分享副本 | 這是已完成的帳戶匯出功能的精簡衍生版本 | [披露聲明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/#prepare-a-disclosure-for-a-lawyer-or-another-recipient) | | 已簽署 ZIP | 在固定的日誌邊界內,包含日誌、報告、附件及驗證工具 | [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) | | HTML、PDF、JSON 報告 | 一份密封且可讀取的報告 | [案例報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/) | | JSONL、CSV | 附有簽名的原始記錄;一個公式安全的試算表 | [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) | | 交接摘要 | 僅包含收件者所需的聊天室、時間段及聯絡人 | [證據](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#investigation-handoff) | | 聊天記錄匯出 | 一則已簽名的聊天記錄 `chat.json` 以及 `chat.html` | [匯出單一聊天室](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Chat-Export.md) | - **使用密碼加密上述下載檔案**(12 個字元或以上)會儲存一個 AES-256 ZIP,該檔案可透過 7-Zip 或 WinRAR 開啟。其中的簽名檔案內容未經變更。 密碼不會被儲存。 - **「已準備的匯出檔」**會保留最多 20 個檔案(總容量不超過 2 GiB),加上最新的一個檔案,以便 重複下載,每個檔案均包含其 SHA-256。檔案已準備好並不代表已成功傳送。 - 當瀏覽器拒絕顯示儲存對話方塊時,該面板會改為以一般下載方式處理。 - **您的簽署身分**會顯示金鑰指紋。「**儲存檢查點」**與 「下載**已簽署的執行收據」**可讓您取得記錄,以便存放在收集器之外。 「準備**時間戳記請求」**可在不聯繫任何服務的情況下,建立符合 RFC 3161 標準的請求。 ## 設定、帳戶與連線 - **設定**:目標、連線、記錄內容及介面。請參閱 [首次設定與設定說明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/settings/)。 - **帳戶**:每個工作區皆包含其狀態、來源、事件及附件佇列。 可依「**需處理**」、「**正在收集**」、「**離線或暫停**」或「**未 連線**」進行篩選,暫停或恢復選取項目,批次匯入帳戶檔案並管理 群組。詳見[「帳戶」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)。 - **帳戶**:登入及此帳戶的連線路徑。可選直接連線、WireGuard 設定檔、您自己的代理伺服器、公開的 MTProto 池或 WARP;準備並檢查路徑, 然後將其套用至此帳戶、某個群組或所有帳戶。請參閱 [「連線」、「代理伺服器」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/)及「[代理伺服器](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Proxies.md)」。 ## 額外功能 可選:只需一個帳戶和來源即可開始收集。只有您 選擇的選項才會開啟其設定,系統不會自動建立任何連結。頂部的「 **保護等級**」卡片會顯示當前的[保護模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#protection-modes)。 | 卡片 | 新增功能 | 指南 | | --- | --- | --- | | 儲存與磁碟空間 | 備份、將較舊的檔案移至您的雲端儲存空間,以及一份無法刪除的證據副本 | [儲存空間](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/) | | 目標與保護等級 | 針對您的目標及兩個量表的建議設定 | [下方](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#goal-and-protection-level) | | 通知 | 問題、已修改的訊息及每日摘要;您專屬的控制機器人 | [下方](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#notifications) | | 證據與備份 | 時間戳記、更多見證者以及加密的異地備份 | [下方](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#evidence-and-backups) | | 伺服器全年無休運作 | 一個不支援 SSH 的雲端伺服器,可透過控制面板進行建立與刪除 | [高可信度](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#from-the-panel) | | 獨立見證人 | 經簽署的檢查報告將發佈至您的 Telegram 頻道或 Discord | [見證者](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/) | | 程式碼檢查 | 將正在執行的程式與 GitHub 上的公開提交進行比對 | [下方](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#code-check) | ### 目標與保護等級 四個問題: 1. **用途為何?可用於**個人記錄、調查,或作為案件的證據。 2. **您打算監測多少內容?**少數聊天室(最多約 50 個)、大量聊天室(最多約 500 個)或整個帳戶。這將把聊天室清單的上限設定為 1,000、3,000 或 20,000。 3. **照片和檔案?**僅限文字、照片及短媒體(照片 20 MB、影片 100 MB),或全部(影片和文件各不超過 1 GB)。若選擇包含完整 帳戶的所有內容,則會保留 4 GiB 的可用磁碟空間。 4. **它將在何處運行?**這台電腦,或是一台始終處於開機狀態的伺服器。 建議清單列出了獨立時間戳記、drand 以及 Telegram 的裝置清單,每項 均附有一行說明其新增內容。時間戳記會每 60、30 或 10 分鐘觸發一次,適用於個人 紀錄、調查或證據;drand 和裝置清單則需要時間戳記。僅需 **套用**這些變更、附件政策以及上述兩個參數。每項 變更皆為一則日誌紀錄,此外 `setup.applied`。通知、站外副本、 伺服器、閘道 DNS、程式碼檢查及見證人皆作為後續步驟提供,並附有 各自的表單。 兩項指標是根據設定值計算得出,而非根據目標值: | 規模 | 重點 | | --- | --- | | 可信度 | 簽名日誌 1、時間戳記 3、drand 1、裝置清單 1、代碼核對結果為 1、見證者輪詢 1、經認證伺服器 2、閘道器 DNS 日誌 1 | | 可靠性 | 常駐伺服器 3 台、異地備份 3 份、Object Lock 1 個、問題通知 1 則 | **最高**讀取率為 80% 或以上,50% **為高**,25% **為中等**,低於此**則為基礎**。 目前可靠性是根據問題 4 的答案中「始終線上」的伺服器來計算, 且在檢查任何伺服器之前即已納入考量。 ### 通知 通知會透過 Apprise 傳送至 Telegram、Discord、Slack、ntfy、電子郵件、Matrix 以及 100 多種其他服務。選擇一項服務,填寫一至兩個欄位並發送測試訊息,或 直接貼上 Apprise 地址。 - **問題**:磁碟空間幾乎已滿、帳戶已登出,以及收集、複製或時間戳記 相關錯誤。在密封伺服器上,開啟的 SSH 埠或登入行為亦屬問題。 - **變更**:在監測的聊天室中,已刪除、編輯及遺失的訊息,會彙整為 每次檢查一則通知(除非在「參數」中變更,否則每分鐘檢查一次)。 - **已完成的功能**:歷史紀錄、匯出功能及儲存副本。 - **每日摘要**將於您選擇的時段(以伺服器時間為準)發送。 通知會顯示聊天室名稱及訊息數量。訊息摘要預設為關閉狀態;若 開啟此功能,訊息內容將傳送至本機以外的伺服器。 **您的操作員機器人**是由 @BotFather 建立的專屬機器人,負責回應 `/status` 並 `/stats`,並可選擇性地 `/pause`, `/resume` 以及 `/copy`。僅列出的聊天室及 Telegram 用戶 ID 可使用此機器人;對話內容將保留在工作區內。若已有其他應用程式接收其指令,請使用獨立的 機器人。請參閱 [「通知」](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Notifications.md)與[「操作員機器人」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#operator-bot-and-completion-notices)。 ### 證據與備份 - **獨立時間戳記會**每隔 5 至 1,440 分鐘,僅將每個已簽署檢查點的 SHA-256 傳送至 RFC 3161 授權機構及 OpenTimestamps 日曆。**Anchor 目前** 正在執行一次運行。請參閱[時間戳記](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/)。 - **更多見證者**,每個見證者在被選中前均處於停用狀態:最新的 drand 輪次、Telegram 的 已登入裝置清單(不含 IP 位址),以及 Cloudflare Gateway 針對伺服器 DNS 查詢的日誌。請參閱[可選記錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#optional-records-in-evidence-mode-drand-and-telegram-devices)。 - **加密備份會**將日誌、檔案、檢查點及聊天記錄匯出至 S3 相容儲存空間(Wasabi、Amazon S3、Backblaze B2、Cloudflare R2、MinIO)。 所有資料都會先在此機器上進行加密。**請下載加密金鑰**並將其 妥善保管:若無此金鑰,備份副本將無法被讀取。在「治理」或「合規」模式下啟用「物件鎖定」功能, 可防止物件在設定的天數內被刪除。請參閱「[異地備份」](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Off-site-Copy.md)。 ### 程式碼檢查 檢查已安裝的程式是否與已發布的版本相符。 1. 請輸入 GitHub 儲存庫(官方儲存庫已預先填入)以及標籤、分支或提交。 2. **「Check now**」會透過此工作區的外部請求路由,向 GitHub API 查詢 該提交的檔案清單。它會將每個被測程式檔案的 Git blob ID 與該提交進行比對。即使是在 Windows 環境下,即使換行符已轉換,仍能匹配成功。 3. 結果清單會列出已變更、新增及遺漏的檔案(每類最多 50 項),並儲存為 一份 `source.checked` 日誌記錄。 結果僅在執行中的程式檔案未變更時才視為有效: 更新後請重新檢查。無需代幣,且僅支援公開儲存庫; 聊天紀錄與憑證不會被上傳。系統透過比對來識別磁碟上的程式碼。這並非 硬體驗證;若需此功能,請參閱 [Phala Cloud](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#confidential-vm-on-phala-cloud-intel-tdx)。 ## 保護模式 版本號旁的切換器會顯示所選模式,以及 18 層 保護層中有多少層處於啟用狀態,例如 `🟠 Witnessed 9/18`。**若要變更模式**,請前往 **「進階」→「保護等級」**以開啟選項。每種模式皆會描述一個目標,並列出 尚待完成的項目;無論哪種模式,記錄、簽名及儲存的設定均保持一致。 | 模式 | 適用於 | 新增功能 | | --- | --- | --- | | 🟢 簡單 | 監看聊天室並保留副本 | 「Chats」包含日誌與聊天記錄的匯出功能;簽名作業在背景中執行 | | 🟡 已簽署 | 向平台、主機或濫用處理部門提交報告 | 簽名存檔、日誌檢查、檢查點、交接摘要 | | 🟠 已見證 | 可能有人聲稱紀錄遭篡改的情況 | 一個獨立見證者發布經簽署的日誌標題 | | 🔴 符合法庭採用標準 | 供律師、警方或法院使用的證據 | 時間戳記、加密的異地備份、報告中的案件詳情 | | 🟣 GitHub 驗證 | 任何人皆應能驗證其軟體的記錄 | 程式碼檢查與 GitHub Actions 擷取 | | ⚫ 摩薩德 | 針對資金雄厚的對手所進行的高風險案件 | 全天候運作的封閉式伺服器、隱藏的 IP 位址,以及全部 18 層防護 | 各層架構:每筆紀錄皆經簽名並串聯;簽名過的執行收據;以 SHA-256 儲存的附件;簽名檢查點;重新檢查;問題警示;唯讀見證者存取權限; 按排程執行的見證者檢查;RFC 3161 時間戳記;OpenTimestamps 證明;經驗證的 最新時間戳記;加密的異地副本;報告中的案件詳情;代碼 比對檢查; Telegram 絕不會看到這台機器的 IP;外部請求透過代理伺服器進行;副本上的 物件鎖定;一個封存且存有服務供應商紀錄的伺服器。若某個層級處於關閉狀態,會顯示 **「設定」**選項,點擊後將開啟其表單。選擇較低的模式時會要求確認,且 不會刪除任何資料。 ## 更多工具 **Extras → Independent capture**: connect a separate browser or AyuGram recorder, pin its signing key, select capture options, start/pause, take snapshots and download verified signed archives. Each recorder has its own manual login, route, journal and key. Both connections start disabled. See the English [Independent capture guide](https://github.com/phishdestroy/TgWitness/blob/main/docs/OPTIONAL-CAPTURE.md). - **查詢存檔**:搜尋已儲存的觀察記錄、檢視來源,然後決定 是否將其傳送至 AI 模型。請參閱[存檔分析](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/)以及 [本地 OCR 與轉錄功能](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/)。 - **參數**:資料收集的限制與頻率、重新檢查、下載、設定檔、 通知及匯出功能。可依名稱搜尋、顯示 **僅顯示已變更的** 的數值,並透過 **還原預設值…** 將預設值儲存為草稿。**儲存參數** 會從下次使用時起套用這些數值, 且每次變更都會產生一則日誌記錄。 - **存取權限**:審查員、分析師和操作員各有獨立的存取憑證,僅限於指定的 工作區、聊天室及權限範圍。詳見[「存取權限」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)。 - **系統日誌** :此程序自啟動以來所執行的操作(連線、代理伺服器變更、 登入、登入失敗、設定變更),其中 IP 位址已隱藏。**「跟隨新行」** 功能可讓最新的一行始終顯示在畫面中。訊息僅保留在日誌中。 - **整合功能**:AI 服務供應商、[唯讀 MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/) 連線以及 [經簽名的 webhook](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/webhooks/)。 - **Case Board**:位於證據旁,包含團隊的私人筆記、書籤和片段。請參閱 [Case Board](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)。 - **GitHub Actions 擷取功能**在「匯出」中:從您的分支擷取一則聊天記錄。請參閱 [密封擷取](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md)。 --- # Telegram · 資料蒐集原理 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/ 觀察範圍、即時更新、重新核對、附件、使用者操作以及「缺口」的含義,皆以逐筆記錄的方式呈現。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 觀察範圍、即時更新、重新核對、附件、使用者操作以及「缺口」的含義,皆以逐筆記錄的方式呈現。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [收藏集](https://github.com/phishdestroy/TgWitness/blob/main/docs/COLLECTION-MODES.md) ![彙編](https://phishdestroy.github.io/TgWitness/assets/chapter-collect.svg) TgWitness 會記錄已連線的 Telegram 帳號所觀察到的內容。該日誌會保存 這些觀察結果、其時間順序,以及隨附的上下文。它不會 根據缺失的訊息或帳號處於連線狀態,來推斷未被觀察到的行動。 **本頁內容** - [從登入到日誌](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#from-login-to-a-journal) - [觀察範圍:選定的聊天室、某個資料夾或整個帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#observation-scope-chosen-chats-a-folder-or-the-whole-account) - [範圍與事件選取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#scope-and-event-selection) - [自主操作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#own-actions) - [調查模式:加入團隊並與機器人對話](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#investigation-mode-joining-teams-and-talking-to-bots) - [重新檢查分級](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#recheck-tiers) - [訊息歷史紀錄與來源標示](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#message-history-and-attribution) - [歷史快照](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#history-snapshots) - [附件處理](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#attachment-handling) - [暫停、鎖定、斷開連接及重新啟動](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#pause-lock-disconnect-and-restart) - [帳戶隔離與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#account-isolation-and-verification) ## 從登入到日誌 關於自動銷毀的照片和檔案,請參閱[「自動銷毀媒體](https://github.com/phishdestroy/TgWitness/blob/main/docs/EPHEMERAL-MEDIA.md)」。 本文說明優先級工作程序、已儲存與不可用結果,以及 API 收集器中 「已讀回執封鎖」功能的限制。 流程圖 · 授權使用者帳戶 → 選擇可存取的群組與頻道; 選擇可存取的群組與頻道 → 儲存事件與附件設定; 儲存事件與附件設定 → 開始監測; 開始監測 → 透過活躍的客戶端接收更新; 透過活躍的客戶端接收更新 → 適用來源與事件政策; 適用來源與事件政策 → 附加一份經簽署的觀察記錄; 附加一份經簽署的觀察記錄 → 檢視或匯出日誌; 附加一份經簽署的觀察記錄 → 處理任何排程中的附件; 處理任何排程中的附件 → 附上下載結果 · 授權使用者帳戶 · 選擇可存取的群組與頻道 · 儲存事件與附件設定 · 開始監測 · 透過活躍的客戶端接收更新 · 適用來源與事件政策 · 附加一份經簽署的觀察記錄 · 檢視或匯出日誌 · 處理任何排程中的附件 · 附上下載結果 **圖表轉為文字** 1. 授權使用者帳戶 → 選擇可存取的群組與頻道 2. 選擇可存取的群組與頻道 → 儲存事件與附件設定 3. 儲存事件與附件設定 → 開始監測 4. 開始監測 → 透過活躍的客戶端接收更新 5. 透過活躍的客戶端接收更新 → 適用來源與事件政策 6. 適用來源與事件政策 → 附加一份經簽署的觀察記錄 7. 附加一份經簽署的觀察記錄 → 檢視或匯出日誌 8. 附加一份經簽署的觀察記錄 → 處理任何排程中的附件 9. 處理任何排程中的附件 → 附上下載結果 授權、存取來源、運作中的收集器以及完整傳輸是 不同的問題。成功登入並不代表能存取每個群組。 已連線的傳輸通道並不能證明所有相關更新均已送達。 ## 監測範圍:指定聊天室、特定資料夾或整個帳戶 來源 → **監測範圍**決定了工作區將記錄哪些聊天內容。 | 模式 | 記錄 | 新對話 | | --- | --- | --- | | 選定的聊天室(預設) | 僅限您手動新增的聊天紀錄 | 絕不會自動新增 | | Telegram 資料夾 | 某個帳戶資料夾中的對話:包含按名稱列出的對話,加上該資料夾的分類(聯絡人、非聯絡人、群組、頻道、機器人),減去被排除的對話,以及(若資料夾有此設定)已歸檔的對話 | 符合條件的聊天記錄一經啟動即會被加入;您在 Telegram 中加入該資料夾的聊天記錄,將於一小時內被擷取 | | 完整說明 | 該帳號所見的每則聊天紀錄 | 每當有新的聊天室、群組、私人聊天或機器人出現,只要其首次更新一到,便會立即被加入系統 | - **來源類型**(頻道、群組、私人聊天、機器人)會進一步限定「資料夾」及 「整個帳戶」模式的範圍。所選的聊天內容可為任何類型,包括私人聊天和機器人。 - **被排除的聊天室**在任何模式下均不會被記錄。在「資料夾」及「整個帳戶」模式下, 若對來源進行*「排除」*或*「移除」*操作,該來源便會被加入此清單,因此範圍設定不會再次將其納入。 若再次手動選取該聊天室(在「來源」或「聊天室」中),該聊天室即會從清單中移除。此清單 最多可容納 5,000 個聊天室;超過此限時,*「移除」*操作將被拒絕,此時可改為暫停該聊天室。 - **自身操作**(預設為開啟):此帳號發送的訊息、其編輯紀錄以及 回覆鍵盤按鍵的按壓紀錄。若關閉此功能,外發訊息與編輯紀錄將被跳過。 - 切換至特定資料夾或整個帳戶時會要求確認:這些模式會記錄 私人聊天內容及第三方訊息,僅應配置於專用帳戶中。 該確認操作及每次範圍變更皆會產生經`scope.changed`簽名的記錄。 - 透過範圍新增的聊天室會以標記為*「自動」*的來源顯示,並記錄為 `scope.applied` (在開始時及每小時)或 `source.discovered`(監測期間出現的新聊天室)。切換回 已選定的聊天室時,所有自動新增的來源都會暫停。 這些模式無法做到的事: - **秘密聊天**不屬於這些雲端收集模式的範圍。目前正在開發一套獨立的 [秘密聊天實作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/secret-chats/);該實作並未 包含在該文件所述修訂版本所發布的收集器中。 - **當 TgWitness 未運行時,將不會進行任何記錄。**重新啟動後,它會向 Telegram 查詢遺漏的更新並重新檢查聊天記錄,但若發生長時間 中斷,Telegram 並不會回傳所有資料。報告及 `verify.py` 會將此類期間標示為資料缺口(參見[覆蓋範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#coverage-continuity-gaps-and-unobserved-ids))。 - 初始僅列出前 1,000 則對話(上限設定於**「參數」**中);較舊的 對話將於下次變得活躍時被加入。已加入對話的早期歷史紀錄不會被擷取——如有需要,請自行 擷取歷史快照或匯出完整對話紀錄。 - 不會套用那些隨時變動的資料夾條件(如靜音、已讀):此類聊天室 仍會持續被監控。 - 在另一款應用程式中按下的**內嵌(回呼)機器人按鈕**,對第二個 會話而言是不可見的;機器人的回覆或編輯內容會被記錄下來。回覆鍵盤按鍵操作會以發送中的 訊息形式傳送,並標記為 `button_press`。 - 聊天數量越多,發送請求的次數就越多。Telegram 會針對其認為 過量的訊息量限制帳號,這正是使用專用帳號的另一個理由。 ## 範圍與事件篩選 每個工作區都有其專屬的來源。TgWitness 不會加入群組、接受 邀請,也不會自動清點所有成員。來源必須是該帳號 已可存取的。 啟動時,收集器會將選定的來源 與該帳號可見的對話進行比對;除非在「 **參數 → 從帳號清單讀取的對話」**中另有指定,否則將檢查前 1,000 則對話。 若來源缺失,將標記為**「存取未確認**」,而非假設該來源已將您移除。 | 設定 | 收集 | 停用時的效果 | | --- | --- | --- | | 新訊息 | 一般已傳送訊息 | 後續的編輯/刪除操作可能缺乏先前已擷取的文字內容供比對。 | | 編輯 | 提供經編輯的訊息版本 | 中間的變更內容日後不會被重建。 | | 刪除記錄 | 範圍限定之刪除通知與非範圍限定之帳戶層級通知 | 刪除通知不會被加入日誌中。 | | 反應 | 即時反應快照 | 不會另行新增反應更新。 | | 會員 | 已發送會員服務訊息及參與者最新動態 | 上述會員觀察內容並未被納入。 | 設定將套用至工作區中所有已選取的來源。儲存表單以套用 變更;變更內容將連同簽署的「變更前」與「變更後」數值一併記錄。停用某個類別 並不會刪除較早的記錄。重新啟用該類別也不會補回遺漏的更新。 操作記錄及其他群組服務事件與這些 設定開關無關。當會員功能啟用時,會員服務訊息仍會產生訊息記錄, 即使一般的新訊息擷取功能已停用。擷取的 Telegram 物件會保留內嵌的元資料;設定開關並非內容遮蔽規則。 **私人聊天室和一般群組中的刪除記錄會以**訊息 ID 的形式呈現,不附帶聊天室資訊。 這些聊天室共用一套帳戶層級的訊息 ID 序列,因此當帶有該 ID 的訊息 先前已被儲存時,其所屬的聊天室便已知曉:刪除記錄將被記錄在該聊天室中, `chat_resolution` 解釋了具體機制。 從未被儲存的 ID 將被視為**範圍未定的刪除**,其 來源明確標示為未知;收集器不會進行推測。Telegram 從不透露是誰刪除了 訊息;當被刪除的訊息是由該帳號發送時,紀錄會如實標示 (`deleted_message_was_outgoing`),但不會指名刪除者。 ## 自身行動 被監測帳號發送的訊息會標記為 `outgoing`。關於外發 訊息的編輯說明指出:在私人聊天室和群組中,僅發送者本人可進行編輯;而頻道 貼文則可由其他管理員進行編輯。 當發送的訊息重複了該聊天室中 最新儲存的回覆鍵盤上某個按鈕的文字時,該訊息會標示為 `button_press`,並附有 該鍵盤記錄的連結。 「排除自身操作」的原則同樣適用於背景重新檢查及自動新增的聊天記錄。 被跳過的發送訊息會使重新檢查的位置向前推移,以避免阻擋後續收到的 訊息。明確的面板操作以及手動請求的聊天記錄快照仍會被記錄下來。 ## 調查模式:加入群組並與機器人對話 **來源 → 監測範圍 → 調查**模式會為專用 帳戶設定監測範圍,該帳戶將加入群組聊天、啟動聊天機器人並向其發送訊息:涵蓋整個帳戶、所有 來源類型、自身操作,以及每個出現的群組聊天或聊天機器人的檔案及其最新 200 則可見訊息。 檢視表單並按下「**儲存範圍」**;切換至整個 帳戶時,系統會要求進行慣常的確認。 - **按鈕。**訊息下方的按鈕會與該訊息一併保留,並顯示於「**聊天」**中:連結、網頁 應用程式、登入連結、待複製的文字、回呼資料、內嵌查詢,以及要求提供電話 號碼或位置的請求。 連結以文字形式顯示,且絕不會由面板自動開啟。當機器人 僅變更按鈕內容(例如新的付款連結)時,無論是 即時更新或重新檢查,這都將被視為該訊息的新版本。 - **新聊天室與機器人。**在「資料夾模式」及「整個帳戶模式」下,**當新的聊天室或機器人 出現時**,系統會於其出現的瞬間立即儲存: - 其作為 `source.profile` 記錄的檔案:機器人說明與指令、 使用者、群組或頻道的簡介文字、成員名單,以及當 Telegram 提供 時所顯示的關聯聊天室與邀請連結; - 其最新的可見訊息(最多 1,000 則)將作為標記為 `new_chat` 的歷史快照: 剛加入的團隊聊天室中的較早訊息,或是觀察者 注意到該聊天室之前,機器人所發的訊息。已即時儲存的訊息不會重複記錄。 啟用此模式時,清單中已有的聊天室將直接加入,且不包含快照。 若發生 FloodWait 狀況,此作業將暫停並於事後恢復;失敗紀錄將被保存,且 聊天室的即時記錄仍會持續進行。這包含在解析新聊天室 身分期間的等待:待處理的個人檔案/歷史紀錄任務將保留以供重試,而現有的 較長帳戶級等待時間則不會縮短。 - **依需求儲存個人檔案。****在「聊天室」→「個人檔案」→「儲存個人檔案」中,現**可儲存任何來源的 當前個人檔案;最新版本將顯示於訊息上方。 - **聊天室狀態快照(預覽版)。**訊息流外的狀態會在沒有 訊息的情況下發生變化:取消釘選所有訊息不會留下訊息層級的痕跡;管理員失去 權限;禮物被隱藏、轉換、升級或退款。 在監測期間,每個已啟用的 來源都會被定期讀取,並儲存為帶有數位簽名的 `chat.state` 記錄:標題、使用者名稱、 描述、成員及管理員人數、關聯聊天室、慢速模式、置頂訊息 ID (最多 100 筆)、具備權限與頭銜的管理員,以及顯示在頻道和 使用者個人檔案上的禮物(最多 100 筆)。 每筆記錄皆列出與前一快照的差異: 變更的欄位及其變更前後的值、新增或移除的釘選訊息,以及新增、變更或不再列出的管理員與 禮物。Telegram 並未說明在快照之間,究竟是誰進行了變更, 或是何時進行的變更。 - Telegram 拒絕顯示的部分(例如對非管理員的成員而言, 該頻道的管理員清單)會被標記在 `errors` 中;其先前值會被保留並列於 `carried_forward` 中,絕不會被報告為已移除。 - 若某筆記錄的變更僅限於計數,或檢查結果顯示無變更,則該記錄會透過 `state_seq` 及累積的 `state_overrides` 參照 最後的完整狀態。完整狀態至少每七天寫入一次,且只要計數以外的任何內容發生變更,也會寫入。 - `parts_complete` 標記上限清單。新增項目需有完整的先前清單, 移除項目需有完整的當前清單,而明確的空值則記錄清空操作。 - 「**參數 → 聊天狀態」**可設定間隔時間(預設為 12 小時,設定為 0 則會關閉快照功能 )、來源之間的暫停時間、讀取哪些部分,以及是否記錄檢查後未發現 變更的情況。`FLOOD_WAIT` 和 `FLOOD_PREMIUM_WAIT` 會停止剩餘的 快照請求,保留任何更長的帳戶級截止時間,並讓 中斷的聊天在等待結束後仍可再次嘗試。 - **不可見。**在其他 Telegram 應用程式中按下的內嵌(回呼)按鈕、機器人對此類按壓所回應的彈出視窗或 連結,以及在其他應用程式中使用的邀請連結,均不會傳送至 TgWitness。機器人隨後發送或編輯的內容則會被記錄下來。 ### 從面板執行操作 **「聊天」**功能現已包含一個迷你客戶端,該客戶端使用所選工作區的 Telegram 帳戶: - 撰寫純文字訊息,或在已儲存的訊息下方選擇**「回覆」**。即使設定範圍排除外發更新,系統仍會記錄回傳的外發 訊息。 - 按下當前回調按鈕或文字按鈕下方的**「Press」按鈕**。若鍵盤輸入內容與儲存版本不符,伺服器將再次擷取 該訊息並拒絕執行此動作。 回調收據會保留 Telegram 的彈出文字、警示標記及網址;回覆內容亦會顯示 於對話下方。網址仍為可選取的文字,且不會自動開啟。 - 展開「**開啟 Telegram 連結**」,輸入 `@username`、公開的 `https://t.me/name` 連結、 `https://t.me/+invite` / `joinchat/invite`,或帶有 `?start=parameter` 的機器人連結,然後按下 **「儲存預覽」**。在加入前,原始連結與 Telegram 的預覽皆已簽名。 **加入/開啟並觀察**後,系統會加入該群組/頻道或開啟該用戶/機器人,將該 聊天視為已啟用的來源,並將 `/start` 連同其啟動參數一併傳送給機器人。 待管理員批准的加入請求將被記錄為「待處理」,而非「成員資格」。 啟用「**開始監測**」功能,即可即時擷取收到的回覆。當監測暫停時,面板操作仍可進行, 但此時僅能保證其直接回覆內容會被保存。 當監測正在執行時,新增的來源會使用已設定的設定檔/歷史紀錄匯入方式。 當來源處於暫停狀態時,請先在**「來源」**中啟用該來源,再進行傳送或按下其按鈕。 `interaction.preview`、`interaction.requested` 和 `interaction.result` 是證據匯出中包含的普通簽名 日誌事件。請求會標識帳戶、訊息/按鈕 或預覽記錄,並標示監測是否正在運行。回執則區分成功、 拒絕、待核准及未知結果。中斷的請求可能已傳送至 Telegram:在執行新操作前請先檢查聊天記錄。 重複使用請求 ID 可檢索其 已儲存的收據,而無需重複執行該動作,包括重新啟動後亦然。當在當前頁面會話中針對同一動作收到模稜兩可的回應時,控制面板會保留該 ID。 此外,當成功執行動作後刷新視圖失敗時,控制面板也會保留該 ID:收據 仍會保持可見,再次點擊即可檢索該收據。 回呼與加入 RPC 僅有一次 嘗試機會;可重試的讀取操作則會保留其設定的重試政策。立即切換聊天室 會立即清除草稿與回覆對象,並停用傳送功能,直至新對話載入為止。 此迷你客戶端可處理文字及回呼按鈕。網頁應用程式、登入/電話號碼/位置請求、 付款、內嵌查詢及附件仍需透過 Telegram 客戶端處理;其儲存的按鈕 元資料仍可被檢視。新的控制項採用英文文字。 ## 重新檢查等級 重新檢查功能會再次向 Telegram 查詢遺漏的訊息、編輯紀錄以及該平台不再回傳的訊息。 標有星號的來源為**優先**來源,預設每 15 分鐘重新檢查一次; 其餘來源則每 6 小時重新檢查一次。選定的聊天室預設為優先來源,透過 資料夾或整個帳戶新增的聊天室則為一般來源。 每次循環最多重新檢查 30 個來源, 其餘來源則等待下一分鐘;重新連線後,優先來源將優先處理。兩者 的間隔時間皆可於「來源」→「記錄設定」→「重新檢查」中設定(0 表示關閉該層級),並 以「`recheck.changed`」形式記錄。 遺漏的訊息會從上次處理中斷處開始向上擷取,最多擷取「 **參數 → 每次聊天與處理週期中恢復的遺漏訊息**」所設定的數量(預設為 1,000 則)。因此,若長時間中斷後 重新檢查,即使較新且早於該中斷時間區間的即時訊息已被優先儲存, 系統仍會填補整個時間缺口。對於仍在補存中的聊天室,系統會在下一分鐘再次進行重新檢查,而非 等待其層級間隔結束; `recheck.completed` 顯示 `continues_after` ,直到完成為止。 比對項目包含訊息文字、實體、鍵盤輸入(包括刪除紀錄)以及附件 內容/識別資訊。 僅變更檔案存取雜湊值或檔案參照本身並不構成 編輯,Telegram 自動填入的內容亦不構成編輯:例如連結預覽載入、故事瀏覽次數、由該帳號解鎖的付費 媒體,以及發票收據。聊天記錄中的每個儲存版本皆連結至其完整的日誌記錄,包含媒體元資料。 ## 訊息歷史紀錄與來源標示 假設收集器先觀察到「10:00 會議」,隨後看到「11:00 會議」, 接著收到刪除通知。系統會將這三項不同的觀察結果追加至日誌中: 原始文字保留不變,編輯後的內容作為獨立版本,而通知則記錄了 已觀察到刪除操作。 若資料蒐集是在首個版本消失後才開始,則該內容將無法取得。 若在離線期間發生多次編輯,僅能儲存後續觀察到的 版本。刪除通知無法恢復從未被擷取的內容。 訊息發送者不必然等同於編輯者。Telegram 通常不會 提供刪除訊息者的身分或確切刪除時間。身分不明的行為者 仍將保持匿名。反應快照與參與者更新僅包含 Telegram 向該帳號顯示的計數及身分資訊。 序號表示觀察順序。收集器的 UTC 時間戳記即為其 本地時間;若提供 Telegram 來源的時間戳記,則會另行儲存。 兩者均非獨立的可信時間戳記。 ## 歷史快照 快照從已啟用的來源要求最新可見訊息,每次最多 500 則。結果標記為歷史觀察紀錄。手動快照會獨占一個閒置帳號;請先明確暫停監控。重複觀察會保留為獨立紀錄。 快照遵循附件政策,但與即時事件切換機制相互獨立。 它們不會還原已刪除的訊息或遺漏的中間版本。您可以在 暫停狀態下請求快照;任何排入佇列的附件將等待至觀察開始 且下載工作程序執行時才會處理。 **歷史紀錄**是單獨的獨占工作:依序讀取所選來源並下載其佇列中的附件,不啟動監控。暫停會釋放帳號,恢復則繼續已儲存的工作。關於多個閒置帳號上的日期、語言與回覆篩選,請參閱[分散式聊天匯出](https://github.com/phishdestroy/TgWitness/blob/main/docs/DISTRIBUTED-EXPORT.md)。 ## 附件處理 附件下載功能預設為啟用狀態,當可用磁碟空間低於 1 GiB 時會暫停下載。收集器會將 訊息監測與下載任務一併提交。該任務會保留原始媒體 描述符及大小政策,因此後續經編輯的附件不會被悄然替換。 下載作業於訊息擷取後執行。下載完成後將產生一個包含 SHA-256 值與位元組數的 `media.saved` 記錄。被跳過、失敗、重試及中斷的 作業將產生不同的結果。排入佇列的任務並不代表該檔案已成功保存。 完成的檔案還必須與原始觀察到的附件 描述符中的位元組數相符。若回應過短或出乎意料地過長,則不會被記錄為已保存的媒體。 **各類型皆**設有儲存限制:照片、影片、GIF 及動畫、圓形影片訊息、 語音訊息、音樂與音訊、貼圖,以及檔案。 每種類型皆可關閉,並設有 各自的容量限制(範圍為 1 至 2,000 MiB);新工作區預設為:照片 20 MiB、 影片 100 MiB、檔案、音訊及圓形影片 50 MiB、語音與 GIF 20 MiB,以及 貼圖為 5 MiB。新工作區預設會關閉 GIF 和貼圖功能,直至手動開啟。若工作區 在「按類型設定限制」政策實施前已儲存相關設定,則所有類型皆保持啟用狀態,並維持其單一 類型限制。*設定最大檔案大小*將同時套用至所有類型。 停用某種類型會產生 `media.skipped` 記錄;未知大小或超出限額的檔案將不會被下載。大型檔案會 根據其大小及 256 KiB/s 的基準速度獲得額外的下載時間。工作會 在重新啟動後保留,但過期的參考、存取權限遺失或已刪除的檔案仍可能導致無法恢復。 待處理工作會保留其儲存的限制值,因此提高的限制僅適用於新檔案。 停用某種類型或降低其限制值,也會跳過該類型所排除的待處理檔案,每個檔案 都會產生一個`media.skipped`記錄;停用下載功能會暫停佇列,直到再次啟用為止。 ## 暫停、鎖定、斷開連接及重新啟動 | 動作或狀態 | 效果 | | --- | --- | | 切換工作區 | 變更面板檢視;其他收集器將維持其狀態。 | | 鎖定面板或關閉分頁 | 讓伺服器與監測功能持續運作。 | | 暫停觀察 | 停止該收集器並保留排程中的附件處理工作。 | | 停用來源 | 停止未來的範圍內擷取;當此功能停用時,相關的排程媒體處理任務將處於等待狀態。 | | 移除來源 | 系統會將其視為來源並刪除其使用者檔案;已儲存的記錄仍保留在僅可追加的日誌中。尚待處理的附件則會被記錄為失敗(`source_removed`)。在資料夾模式與整個帳戶模式下,該附件亦會被排除在外。 | | 變更連線路徑 | 需暫停運作,關閉舊版客戶端,並取消未完成的登入程序。 | | 停止 Python 程序 | 停止所有工作區;離線期間不會進行任何監測。 | | 主動監測結束後重新啟動 | 嘗試使用已儲存的會話來恢復先前儲存的範圍。若手動暫停,則會清除該意圖。 | 此收集器會記錄偵測到的連線中斷、重試、錯誤、啟動/停止,以及 心跳訊號。短暫的中斷可能因週期性的連線檢查而未被偵測到。 重新啟動後,系統會從儲存的更新位置請求遺漏的更新,並 定期重新檢查已監控的聊天室;詳見[證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#durable-collection-and-process-receipts-02)。快照僅提供背景資訊; 並不能證明資料缺口已修復。 ## 帳戶隔離與驗證 每個工作區皆擁有專屬的日誌、授權、簽署金鑰、政策及佇列。 僅其活躍的客戶端可貢獻即時觀察記錄。遭拒絕、待處理、 已被取代以及進行連線測試的客戶端,均無法將即時更新寫入其日誌。 不同帳戶可觀察同一群組,但其日誌仍保持獨立。 每個事件皆包含前一個雜湊值及 Ed25519 簽名。匯出內容涵蓋 整個工作區日誌,並透過固定序列號進行標記。面板篩選器不會過濾 匯出內容;在匯出檔案準備期間,資料蒐集可能持續進行至其邊界之外。 **「驗證日誌」**會透過顯示的 邊界檢查事件鏈與簽名。當工作區變更時,其結果將被清除,而面板會標示 檢查後新增的記錄。ZIP 匯出功能亦會驗證所收集的媒體檔案。 請分別保留指紋與檢查點。請參閱各模式下的「 [驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)」以了解資料擷取檢查, 以及「[日常運作」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/)以了解例行資料蒐集。 --- # Telegram · 秘密聊天:實作與示範 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/secret-chats/ 請理解「秘密聊天」的獨立實作方式,試用虛構的介面,並檢視尚未解決的缺陷。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 請理解「秘密聊天」的獨立實作方式,試用虛構的介面,並檢視尚未解決的缺陷。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) **2026年11月6日狀態確認:**目前正開發一套獨立的「秘密聊天」實作 ,該實作尚未合併至已發布的 `main` 分支(版本 `3d23e52b647b`)。 一般收集器與 Takeout 匯出功能不會收集「秘密聊天」內容。 互動式網站示範使用虛構資料展示介面; 該示範無法啟用 Telegram 通訊功能。 ## 實作位置 提交 `0e60f88e` 在本地開發分支 `fix/panel-routes-sessions` 中新增了「**來源 → 偽密鑰」**。已驗證的快照為 `bb8788fb685c`。 其實作包含 `tgwitness/secret_chats.py`、應用程式路由、 `tgwitness/static/views/secret-chats.js` 以及專用測試。 該分支中的可選 `secret-chats` 附加元件使用 [KiaroSama/Telethon-Secret-Chat](https://github.com/KiaroSama/Telethon-Secret-Chat), 並固定於 `d87bf037b90060383c7b704d8a06ebb98c621c6f`。該函式庫在帳戶現有的 Telethon 授權基礎上, 實作 Telegram 的端對端聊天協定。 僅安裝該函式庫並不會為 `main` 補足缺失的整合功能。 ## 開發介面的功能說明 | 操作說明 | 記錄的行為 | | --- | --- | | 透過使用者名稱或使用者 ID 建立聊天 | 發送請求;另一位參與者必須接受該請求。 | | 接受傳入的請求 | TgWitness 將成為該聊天室的接收端點。自動接受為一項獨立設定,預設為關閉狀態。 | | 傳送或接收訊息 | 新增一則發送或接收的 `secret_chat.message` 記錄,並在對話串中顯示該記錄。 | | 接收附件 | 請對其進行解密,並依 SHA-256 儲存其位元組,同時記錄 `secret_chat.file`。 | | 接收計時器或刪除通知 | 記錄該通知並保留先前擷取的內容。 | | 檢視對話內容 | 顯示訊息、檔案、通知及金鑰視覺化圖表。開啟的分頁每四秒自動重新整理一次。 | 在包含此整合功能的開發版本中,操作員會針對 選定的帳號啟用該模組並進行連線。開始、接受及傳送操作均需 具備互動權限,且該帳號的唯讀保護必須關閉。另一位 參與者必須接受新的外發聊天。在上述版本的 已發布應用程式中,並未包含這些控制機制。 本文件僅涵蓋由此 TgWitness 會話所建立或接受的聊天室。手機上現有的 「秘密聊天室」仍保留於該裝置中。匯入會話並不會提供 其獨立的加密金鑰。「秘密聊天室」的金鑰資料與計數器儲存 於工作區金庫中;已保留的訊息與解密檔案則遵循一般 工作區儲存保護機制。 ## 網站示範 該網站的「**嘗試秘密聊天**」情境展示了一段虛構的對話。它讓 讀者能夠發起請求、模擬其接受過程、發送範例訊息、接收 預設的回覆與檔案,並檢視計時器與刪除通知。收到的 請求亦可被接受。控制項會明確標示模擬的對等方動作。 此情境在瀏覽器記憶體中執行。重置或重新載入將清除其內容。它不會登入、 聯繫 Telegram、建立真實的加密金鑰,也不會變更已簽名的範例下載檔案。 其顯示的訊息並非經簽名的證據。此情境僅用於展示預期的 互動方式;並不代表開發實作已準備就緒。 ## 檢查項目與待解決缺陷 現有的五項測試涵蓋加密金鑰的持久性、生命週期與訊息 記錄、傳入訊息接受政策、唯讀傳送及附件匯出。 這些測試在 11 月 6 日的審查中,針對固定版本的函式庫均通過測試。另外三項 合成檢查在同一快照中重現了缺陷: | 發現 | 後果 | | --- | --- | | 關閉時會繞過 `read_only` | 當應阻擋互動時,「關閉路徑」可執行遠端操作。 | | 重複檢測僅搜尋最近的 500 筆記錄 | 較舊的重播在重新啟動後可能會產生重複項目。 | | 附件下載失敗會移除其待處理項目 | 暫時性故障會導致重試工作失效。 | 這些是已知缺陷,亦記錄於 [已發布的審計](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/REPORT.md)報告中。五項通過的測試並未 涵蓋這些失敗情況。本次審查使用了合成工作區並模擬了 Telegram 的操作;並未重現實際的握手過程,亦未驗證生產環境的部署情況。 --- # Telegram · 載入來源歷史紀錄 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/ 從已啟用的來源載入過往訊息、暫停與恢復操作,並驗證經簽署的進度報告。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 從已啟用的來源載入過往訊息、暫停與恢復操作,並驗證經簽署的進度報告。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [收藏集](https://github.com/phishdestroy/TgWitness/blob/main/docs/COLLECTION-MODES.md) ![彙編](https://phishdestroy.github.io/TgWitness/assets/chapter-collect.svg) 在「**來源**」中,檢視已啟用的聊天室、暫停觀察、選擇「標準 API」或 「Takeout 匯出」,然後選擇**「載入完整歷史紀錄**」。此執行程序會固定該來源清單,並將其可用的過往訊息 讀入「聊天室」及簽名觀察日誌中。媒體檔案會使用現有的附件 設定及持久性下載佇列。此功能與每則聊天室的簽名 JSON/HTML 匯出功能是分開的。 若要進行全帳戶範圍的資料收集,請選擇「**整個帳戶**」,開始監測以載入其 來源清單,並在開始歷史記錄前檢視該清單。對話清單的限制仍 適用(預設為 1,000 筆,可在「參數」中調整)。成功執行並不代表 每個帳戶對話都已列入清單。事後發現或啟用的聊天室需再次執行。 在開始歷史記錄前請暫停監測;每次僅能由一個擷取程序處理一個帳戶。 選擇一至五個附件處理器,並決定是否保留可用的「最近操作」 以及比較先前儲存的版本。提取操作可能需要在 Telegram 中獲得批准,並需 經過伺服器指定的等待時間。這些選項在恢復運作時將保持不變。請參閱[「回填行為」及 「證據合約」](https://github.com/phishdestroy/TgWitness/blob/main/docs/BACKFILL.md),以了解傳輸、重試與信任的詳細資訊。 ## 暫停、重新開始與部分結果 - **「暫停」歷史紀錄**將停止讀取。**「繼續」歷史紀錄**則會從每個來源中最後一則已提交的 訊息開始恢復;重新啟動應用程式時,執行程序亦會保持暫停狀態,直至手動恢復為止。 恢復執行需使用相同的閒置 Telegram 帳號。 - 訊息監測、附件處理及游標提交均於單一交易中完成。 恢復執行的任務不會重複已提交的監測結果。即時擷取或 另一項明確啟動的獨立執行任務,可獨立監測同一則訊息。 - 每個來源(Takeout 中的每個 Telegram 分割範圍)會在首次讀取時設定一個最高訊息 ID。較新的訊息屬於 即時觀察,而非該來源剩餘的歷史頁面。 - 無法存取的來源,以及在擷取過程中被停用的來源,仍會顯示為 「失敗」或「跳過」。其餘來源則會繼續運作;整體結果將不完整。 - FloodWait 的延遲設定會遵循已儲存的帳戶退避策略。對於暫時性失敗,系統將重試最多 五次;若重試次數用盡或磁碟空間不足,系統將暫停操作,同時保留游標位置。 - **「結束此歷史執行」**會保留已儲存的觀察結果。此操作不會移除這些觀察結果,亦不會 取消標準 API 的附件處理任務。結束「Takeout」會將其剩餘的 Takeout 檔案標記為已跳過;暫停則會保留其可恢復狀態。新的執行會重新讀取已啟用的來源。 歷史記錄完成僅指歷史記錄的讀取操作。附件可能仍處於待處理狀態、 失敗,或因設定的政策而被排除。請檢查日誌中的媒體回執 及附件佇列;僅當回執已完成且位元組內容完整保留時, 才構成已儲存的附件。歷史記錄操作屬於明確的快照請求, 與用於篩選未來即時事件類別的開關設定相互獨立。 ## 傳輸與驗證 儲存**已簽署的進度報告**後,請使用**「匯出證據」**功能下載 日誌及已儲存的附件。後續的證據匯出可能包含額外記錄; 該報告會將其計數器與日誌建立當下的前綴綁定。 請從此版本的可信賴版本中執行驗證器: ``` python tgwitness/verify.py tgwitness-history-report.json --evidence evidence.zip --fingerprint TRUSTED_FINGERPRINT ``` 請將預期的簽名金鑰指紋獨立保留。驗證器會檢查 報告簽名、證據存檔、報告檢查點、來源計畫、帳戶 以及已儲存/不可用訊息的計數。新的執行程序也會將來源進度與 選項綁定至已簽名的游標事件。若未使用 `--evidence` 參數,則僅檢查 已簽名的報告及其內部一致性。舊版進度欄位與附件 摘要仍屬已簽名的收集器陳述。證據驗證器會檢查已存檔的媒體位元組。 無論是簽署或完成現有歷史紀錄,均無法證明其源自 Telegram、為原子 快照,或具備歷史完整性。訊息在閱讀過程中可能發生變更;已刪除的 訊息、超出「近期操作」範圍的中間編輯內容,以及「秘密聊天」中的 內容,均無法恢復。掌控簽署金鑰的 操作者可在外部承諾成立之前偽造日誌。 請使用另行保留的檢查點或獨立見證者,以驗證文件中記載的 篡改偵測特性。 擷取游標代表本地工作區的狀態。僅還原證據 ZIP 檔案並 不會還原待處理的擷取工作或 Telegram 會話。若需繼續執行原始工作, 請保留工作區備份。 --- # Telegram · 工作流程與操作 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/ 控制面板的日常操作:運作模式、監控類別、參數、通知、匯出、備份及容量。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 控制面板的日常操作:運作模式、監控類別、參數、通知、匯出、備份及容量。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) 首次連線時,請[使用帳戶與連線格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)。 關於儲存版本、事件政策及資料缺口等說明,請參閱 [「資料蒐集運作方式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/)」。本指南涵蓋日常操作與資料復原。 受管安裝包含 **、START-HERE.html、** 及 **START-HERE.txt、**,以及 其啟動程式,其中儲存庫連結與指令已針對其安裝路徑 進行客製化。透過 SSH 執行 `tgwitness guide --print`,或執行 `tgwitness paths` 以定位 實際資料目錄。root 權限的 systemd 安裝會將私有狀態儲存於 `/var/lib/tgwitness-…`;`/opt/tgwitness` 則存放程式本体。 對於受管理的臨時 Cloudflare 隧道,`tgwitness tunnel off` 會關閉公開 存取,同時本地控制面板和資料收集功能仍會繼續運作。`tgwitness tunnel on` 會啟用公開存取;`tgwitness tunnel restart` 會建立新的隧道連線。使用 `tgwitness open` 可查看其當前位址。明確的關閉設定會保留至 服務重新啟動後。`tgwitness stop` 會同時停止控制面板和資料收集功能。 **本頁內容** - [操作員工作流程](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#operator-workflow) - [在不分享主金鑰的情況下分享工作成果](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#share-work-without-sharing-the-main-key) - [執行模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#runtime-modes) - [監測類別](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#monitoring-categories) - [通知](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#notifications) - [面板佈局](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#panel-layout) - [部署環境](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#deployment-environments) - [啟動檢查與匯出](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#startup-checks-and-exports) - [備份、還原與中斷](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#backup-restore-and-interruptions) - [容量與保留期限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/#capacity-and-retention) ## 操作員工作流程 流程圖 · 選擇儲存方式與金鑰保護機制 → 使用其憑證開啟控制面板; 使用其憑證開啟控制面板 → 選擇工作區; 選擇工作區 → 設定直接連線或代理伺服器路徑; 設定直接連線或代理伺服器路徑 → 輸入電話號碼或選擇檔案/QR 碼; 輸入電話號碼或選擇檔案/QR 碼 → 驗證帳號身分並選擇可加入的群組; 驗證帳號身分並選擇可加入的群組 → 儲存事件與附件政策,然後開始監測; 儲存事件與附件政策,然後開始監測 → 監控錯誤、存取、佇列及磁碟狀況; 監控錯誤、存取、佇列及磁碟狀況 → 保留獨立檢查點; 保留獨立檢查點 → 匯出與驗證資料 · 選擇儲存方式與金鑰保護機制 · 使用其憑證開啟控制面板 · 選擇工作區 · 設定直接連線或代理伺服器路徑 · 輸入電話號碼或選擇檔案/QR 碼 · 驗證帳號身分並選擇可加入的群組 · 儲存事件與附件政策,然後開始監測 · 監控錯誤、存取、佇列及磁碟狀況 · 保留獨立檢查點 · 匯出與驗證資料 **圖表轉為文字** 1. 選擇儲存方式與金鑰保護機制 → 使用其憑證開啟控制面板 2. 使用其憑證開啟控制面板 → 選擇工作區 3. 選擇工作區 → 設定直接連線或代理伺服器路徑 4. 設定直接連線或代理伺服器路徑 → 輸入電話號碼或選擇檔案/QR 碼 5. 輸入電話號碼或選擇檔案/QR 碼 → 驗證帳號身分並選擇可加入的群組 6. 驗證帳號身分並選擇可加入的群組 → 儲存事件與附件政策,然後開始監測 7. 儲存事件與附件政策,然後開始監測 → 監控錯誤、存取、佇列及磁碟狀況 8. 監控錯誤、存取、佇列及磁碟狀況 → 保留獨立檢查點 9. 保留獨立檢查點 → 匯出與驗證資料 授權、傳輸連線狀態、群組存取權限以及傳送完整性 是不同的屬性。連線狀態顯示為綠色,並不表示所有 事件均已被擷取。 ## 在不分享主金鑰的情況下分享工作成果 開放**存取**功能可讓審閱者或分析師擁有專屬的存取憑證。選擇 他們可開啟的帳戶與聊天室,並授予檢視、匯出或執行操作的權限。 負責啟動/停止資料蒐集的操作員需具備整個工作區的存取權限;審閱者 則可限制為僅能存取單一聊天室。會話限制、有效期限及 IP 規則與 Telegram 帳戶授權相互獨立。請參閱[存取權限與授權設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)。 使用**「開啟的會話」**來終止連線,或撤銷存取權限以終止所有 相關會話。管理員控制台會整合各工作區中 當前進程的活動。關閉會話後,資料蒐集仍會繼續運行。 ## 執行模式 | 模式 | 操作說明 | 行為 | | --- | --- | --- | | 示範 | scripts\Demo.cmd 或 `--demo` | 合成數據;已停用真實帳戶連結功能 | | 觀察 | 開始監測 | 記錄所選來源的已發佈更新 | | 歷史快照 | 來源 → 歷史快照 | 最多可儲存 500 則當前訊息;不會重建所有過往變更紀錄 | | 暫停 | 暫停觀察 | 在保留資料與排程任務的同時停止資料蒐集 | | 審閱/交接 | 匯出功能 | ZIP、JSONL/CSV/HTML、檢查點、處理收據及時間戳記請求 | | 多個帳戶 | 工作區或頂部的 **+** 按鈕 | 單一進程中可建立任意數量的獨立工作區 | 本地示範版本會自動開啟,無需手動輸入憑證。其採用 僅限於直接迴路存取隔離式 模擬示範環境的「程序生命週期」權限;主控制面板的憑證不會被揭露。實際工作區以及遠端 或透過代理伺服器存取的示範環境,仍需透過憑證進行驗證。進入示範環境並不授予任何 Telegram 授權。 ## 監控類別 ![支援按帳戶設定監控選項,並提供合成來源資料](https://phishdestroy.github.io/TgWitness/assets/sources.png) 在**「來源」→「記錄」→「選擇要保留的變更**」中,可分別選取新訊息、編輯、 刪除通知、反應更新及成員事件。預設 會保留所有類別。**「訊息、編輯與刪除」**會保留原始上下文, 同時停用獨立的反應/成員更新。「**所有可見活動」**則會還原 全部五項。預設值會變更表單;按下**「儲存記錄設定」**即可套用。 儲存的政策適用於該工作區內所有選定的來源。其他 工作區則保留其自身的設定。每次實際變更都會記錄經簽署的「變更前」與「變更後」 數值;當前的政策也會包含在處理收據和觀察 開始記錄中。停用某個類別並不會刪除先前的觀察記錄。重新啟用 也不會找回遺漏的變更。 此版本中不提供按群組類別的覆寫功能。 當先前內容至關重要時,請保持「新訊息」功能啟用:刪除通知無法 恢復從未被擷取過的文字。運作/覆蓋記錄及其他群組 服務事件將始終予以保留。 明確的歷史快照與 即時類別選取功能相互獨立,且可能包含服務訊息。這些設定不會 遮蔽嵌入於已擷取 Telegram 物件中的反應/成員元資料。 歷史快照在暫停期間可能會將附件加入佇列。請啟動監測以處理 這些附件。「已加入佇列」並不代表已下載。若原始檔案不可用,系統不會以 較新的編輯版本取代;相關結果將分別記錄。 **點擊「鎖定」**按鈕會清除瀏覽器存取權限及隱私欄位,但仍會讓資料收集持續運作。 關閉分頁同樣會讓程序持續運作。停止 Python 程序或服務 將停止資料收集,無論瀏覽器狀態為何。 刪除額外的工作區將停止其收集器並移除其本地資料。若因 檔案被鎖定或檔案系統錯誤而中斷移除程序,控制面板將回報失敗,並 將該工作區維持為「不可用」(`DeletionPending`)狀態。請關閉持有該 檔案的程式,並重新嘗試**「刪除」**。 重新啟動 TgWitness 會使該工作區保持停止狀態,且 不會重建其部分已刪除的日誌或金鑰。只有在目錄被移除後, 才會記錄成功的刪除操作;另行匯出或備份的副本仍 受其自身的保留政策規範。 ## 通知 開啟**「附加功能」→「通知」→「設定」**。TgWitness 使用 Apprise 將通知傳送至 Matrix、Telegram、Discord、Slack、ntfy、電子郵件及其他 受支援的服務。您可以在一個工作區中新增多個通知目的地。 1. 請每行輸入一個 Apprise 目標網址。請根據您的服務,使用對應的 [服務目錄及網址格式](https://appriseit.com/services/)。 2. 開啟「**傳送通知**」功能,然後選擇問題警示、監測中 的聊天室變動以及每日摘要。摘要所顯示的時間以伺服器時間為準。 3. 若希望在警示中包含已刪除及已編輯訊息的保存內容,請啟用「**包含簡短摘錄」**選項。 訊息。 4. 請按下「**儲存通知」**,然後點選「**發送測試訊息」**以檢查訊息是否送達。 若要使用您自己的接收端,請採用 Apprise 的 [JSON Webhook](https://appriseit.com/services/json/)。 例如,`jsons://notify.example.org/tgwitness` 會透過 HTTPS 將 JSON 傳送至該 端點。此為虛構範例;請將其替換為您自己的目的地。 目的地與設定均屬於所選的工作區。變更通知 涵蓋其監測的來源,包括新加入的聊天室。頂部工具列中的鈴鐺圖示 亦會列出近期問題及聊天室變更。 在示範版本中,通知控制項雖可見,但發送功能已停用。請在真實的工作區中設定 傳送方式。通知將使用該工作區的 Direct、SOCKS5 或 HTTP 路由;MTProxy 無法傳輸這些通知。非 HTTP 目的地(例如 SMTP)則需要 直接路由。 ## 面板佈局 ![使用合成資料建立連接工作區](https://phishdestroy.github.io/TgWitness/assets/connection.png) **日誌**顯示觀察結果、搜尋功能及篩選條件。編輯操作會開啟已擷取的版本; 刪除操作則會開啟先前內容(如有)。來源不明之內容將明確標示。 統計數據可在「**概覽**」中查閱;資料擷取詳情則收錄於本地指南中。 開啟已編輯的訊息,即可使用**文字內差異**或**並排比較**來比對不同版本;**原始資料**則會顯示已儲存的欄位。隱藏連結與機器人按鈕的變更會分開顯示。開啟附件預覽即可檢查已儲存的圖片、音訊或影片;下載按鈕可讓您隨時取得所保留的原始檔案。 **Live** 會在記錄送達時即時更新日誌與對話。您可以在檢閱時將其暫停,或於準備好時使用新事件按鈕;資料收集仍會在背景持續運作。按 **Ctrl/Cmd+K** 可尋找面板操作並搜尋日誌。 **「來源」**部分包含監測範圍(選定的聊天室、Telegram 資料夾或整個 帳戶)、各類可存取的聊天室、標有優先星號的選定來源、附件 及重新檢查設定,以及歷史快照。私人來源是透過對話/ID 選取的,不包含公開連結。「存取狀態」描述的是最近一次檢查結果,而非永久權限。 篩選來源並勾選其核取方塊,即可一併啟用、暫停或標記為優先項目。在可用對話清單中,**加入所選項目**會套用您的選取項目;**加入所有符合項目**則會套用目前的搜尋條件與類型篩選器。 **「聊天室」→「人員」**列出所有已儲存訊息的使用者;若該聊天室已啟用 使用者個人檔案功能,點擊即可開啟該使用者的個人檔案,其中包含連結至日誌記錄的連結。 **Witness** 會建立唯讀的「見證代幣」,顯示每個見證者最後一次檢查的時間, 並提供執行單一([獨立見證者](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/))所需的指令與選項。 **「參數」**頁面收錄了所有未列於其他頁面的工作區限制與節奏設定: 已讀對話數、聊天清單重新讀取頻率、心跳訊號與檢查點 間隔、啟動緩衝區、重新檢查請求的分散方式(首次延遲、每次 ),聊天間的暫停時間、已恢復與重新請求的訊息數量),磁碟預留空間、下載的超時與 重試設定,使用者個人檔案的搜尋條件(包含您自訂的正規表達式), 通知的大小與頻率,快照、ZIP 及瀏覽器下載限制,以及 Telegram 客戶端的超時與重試設定。 每個欄位皆顯示其範圍與預設值;已變更的欄位會 被標記,並可逐一或全部還原。每項變更皆會以 「`parameters.changed`」的形式記錄,並附上變更前後的數值,而觀察起始記錄則會標明 當時生效的數值。 設定值將自下次使用時生效;客戶端超時與重試則自 下次連線時生效。重新檢查間隔、附件類型與大小、證據及站外副本 間隔仍保留在各自的頁面中,且可設定為其範圍內的任何值,而不僅限於預設值。 頂部工具列中的鈴鐺圖示會列出受監控聊天室中的近期問題與變更;未讀項目 會持續計數,直至被標記為已讀。變更會按聊天室和小時分組顯示(「12 則刪除、 1 則編輯、0 則未找到」),而諸如登出或磁碟空間已滿等問題,無論聊天室 有多繁忙,都會持續保留在清單中。 **帳戶**設定從「電話號碼」欄位開始。**繼續操作**將直接進入 驗證碼輸入頁面,僅在缺少 API 憑證時才會要求輸入。QR 碼與檔案匯入為 替代選項標籤頁。已儲存的 API 憑證僅限於其所屬的工作區內重複使用。 登入畫面不包含側邊欄、統計資料或設定說明段落。 點擊「**設定**」 圖示可開啟 API、代理伺服器、儲存空間及額外帳戶的控制選項。新安裝 程序由此開始;已連線但未選取來源的帳戶則從「**選擇聊天室**」開始。 變更監測路徑需暫停監測,並會取消未完成的登入程序。現有的 日誌無法在未經通知的情況下重新綁定至其他 Telegram 帳戶。 **匯出功能會**檢查日誌的完整性,並產生可攜式檔案。其工作區 ID 可傳遞至下載命令列介面 (CLI)。每次匯出都會鎖定完整的日誌前綴;後續 事件將納入下一次匯出。搜尋篩選條件不會改變封裝範圍。 詳細的簽名與涵蓋範圍資訊請參閱**「驗證與限制」**部分。 在「收集器狀態」面板中,會顯示收集器狀態、排隊中/失敗的媒體、最舊的待處理媒體、可用 磁碟空間、請求暫停,以及存取狀態未確認的來源。 **這些詳細**資訊預設為收合狀態,並在「帳戶」頁面中隱藏。設定 卡片會顯示下一步驟:連結帳戶、選擇來源,或開始監測。 帳戶清單為載入時的快照; 所選工作區會定期刷新。此非多進程 SLA 監控工具。 使用者介面採用本地資源及文字渲染技術來呈現原始內容。已針對桌面版及窄版 Chromium 版面配置進行測試。此並非完整的無障礙認證; 螢幕閱讀器及人機互動可用性評估仍屬獨立工作項目。 ## 部署環境 | 環境 | 安裝 | 驗證狀態 | | --- | --- | --- | | Windows 個人電腦/伺服器 | Python 3.11 以上版本,腳本位於 Setup.cmd/Start.cmd,私人資料目錄 | 已於 Windows/Python 3.12 環境下進行本地測試 | | Linux 伺服器/VPS | Python venv、專用服務使用者、HTTPS/SSH | 提供程式碼、持續整合(CI)及 systemd 範例;未在此主機上執行 | | macOS | Python venv、前台程序或使用者代理程式 | 提供 launchd 範例;需另行進行安裝檢查 | | Docker/Compose | 持續性儲存容量,單一工作節點 | 提供定義及 CI 執行時檢查;本地端無法使用 Docker | | 手機瀏覽器 | 連線至正在運行的伺服器上的受保護控制面板 | 已針對 Chromium 瀏覽器進行狹幅版面配置測試;此資料擷取工具無法在 iOS/Android 系統上運行 | 可移植性意味著無需強制使用雲端服務或前端建置。每個目標系統仍 需要相容的 Python/加密套件、本地磁碟及網路存取權限。請參閱 [DEPLOYMENT.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) 及[服務範本](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md)。 工作區會共用 CPU、記憶體及事件迴圈。若需進行程序隔離,請使用不同的 執行個體、連接埠、資料目錄及帳戶授權。不同執行個體之間並無統一的 控制面板。切勿讓多個工作執行個體指向同一個資料庫。 ## 啟動檢查與匯出功能 在啟動預備環境之前,請先執行 `python start.py --check`。若需進行機器可讀的檢查,請新增 `--json` ,或傳入預期的 `--data-dir`、`--host` 及 `--port`。 此指令會檢查先決條件,無需登入 Telegram 或建立日誌。 它不會驗證日誌,亦不證明已準備好進行擷取;日誌驗證會在 應用程式啟動時執行。若發現端口已被佔用,可能僅表示該端口已有現有實例。 支援「檔案系統存取 API」的瀏覽器會透過可寫入的 串流儲存匯出資料。其他瀏覽器最多僅能緩衝 128 MiB。若需匯出較大 的資料量,或使用不支援檔案串流的瀏覽器,請使用串流命令列介面 (CLI): ``` python -m tgwitness.download --token-file data/live/panel-token.txt --out evidence.zip ``` 從「Exports」中新增 `--profile ID` 以建立子工作區。使用 `--url https://server` 進行遠端存取。僅接受用於迴路目的地之純 HTTP 連線。該憑證 會從檔案中讀取並透過標頭傳送,不會被輸出或放入 URL 中。不接受 重定向。現有目的地不會被覆寫。 傳輸失敗時,其 臨時部分檔案將被移除。報告的 SHA-256 為傳輸校驗和;請使用可信的指紋/檢查點, 另行驗證已簽名的 ZIP 檔案。 ## 備份、還原與中斷 1. 暫停監控並乾淨俐落地終止該程序。 2. 複製整個資料目錄:資料庫、若存在則包含 WAL/SHM、媒體檔案、 `credentials.enc`、`signing.enc`、`network.enc`、金庫金鑰/元資料、憑證、 檢查點以及每個 `profiles/` 目錄。 3. 對於外部金鑰模式,請將主金鑰與每個 `vault.external.json` 分開保存。生成新金鑰無法恢復舊的機密資訊。 4. 在目標端停止運作時進行還原;在恢復運作前,請設定原始金鑰、限制 存取權限,並驗證資料完整性。 5. 記錄系統停機時間及驗證結果。歷史快照無法證明 在中斷期間未曾發生刪除行為。 證據 ZIP 檔案不包含會話資料/私密金鑰,且並非完整服務備份。 以下四項內容的保護方式有所不同: | 什麼 | 保護 | | --- | --- | | 無需密碼即可匯出檔案(預設設定) | 未經加密。由於經過簽名,因此可偵測到任何變更,但任何持有該檔案的人皆可閱讀其內容 | | 以密碼保護的檔案進行匯出 | 若您設定了密碼,導出的檔案將以未經修改的狀態封裝成 WinZip AES-256 ZIP 檔案,該檔案可透過 7-Zip 和 WinRAR 開啟;密碼不會被儲存([以符合證據處理規範](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/)) | | 記錄本資料庫及儲存於磁碟上的附件 | TgWitness 本身不提供加密功能;請使用加密磁碟或磁碟區 | | Telegram 會話與簽名金鑰 | 資料目錄中以加密形式儲存(`credentials.enc`、`signing.enc`、`network.enc`) | 所謂的「完整服務備份」是指上述所述的已暫停資料目錄,而非匯出檔案。 兩者皆應使用受保護的儲存空間及經過周詳設計的傳輸機制。臨時伺服器匯出檔案存放於各工作區的 `temporary-exports/` 中;已完成的回應會被清理,而中斷的匯出 檔案則會在下次啟動時,於該工作區的實例鎖定期間被移除。 連線恢復事件並不保證能恢復期間的變更。 持久性媒體處理任務及 Telegram 更新狀態在重新啟動後仍會保留;詳見 [證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#durable-collection-and-process-receipts-02)說明。 ## 儲存容量與保留期限 預設限制,皆可於**「參數」**中調整:前 1,000 個對話串、每張快照 500 則訊息 、4 GiB 未壓縮的簽名 ZIP 內容(較大的壓縮檔需使用 `verify.py --max-gib N`)以及 128 MiB 的瀏覽器備用空間。 附件在「**來源 → 附件**」下,每種 類型佔用 1–2,000 MiB。下載命令列介面預設傳輸量為 5 GiB。可用磁碟空間可能為 下限。請預留空間供日誌、媒體、WAL、臨時匯出及備份使用。 匯出操作採用資料卷而非 Compose 的 512 MiB `/tmp`。 應以每秒事件數、佇列存留時間、媒體資料位元組數及磁碟延遲為衡量標準,而非僅統計 群組數量。合成式本地基準測試無法保證 Telegram 訊息的送達成功率。 本工具不具備自動保留與刪除功能。移除日誌尾端將使其 與已保留檢查點的關聯性失效。 現已具備優先重新檢查機制:標記為星號的來源預設每 15 分鐘重新檢查一次, 其餘來源則每 6 小時重新檢查一次(參見[重新檢查層級](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#recheck-tiers))。如上所述, 提供受密碼保護的匯出功能。 Telegram/代理伺服器的即時接收、持久性重播、 管理員日誌與反應汲取、隔離式工作節點、由 TgWitness 自身執行 的本地日誌與媒體加密,以及獨立審查,目前仍屬獨立開發項目。範圍式存取權限 詳見「[存取與權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)」文件。 請參閱 [READINESS.md](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/READINESS.md)、[LIVE_ACCEPTANCE.md](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/LIVE_ACCEPTANCE.md) 及 [VERIFICATION.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)。 --- # Telegram · 調查模式 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/ 涵蓋頻道、群組、私人聊天及機器人的完整帳戶調查,從調查範圍到經核實的案件檔案包。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 涵蓋頻道、群組、私人聊天及機器人的完整帳戶調查,從調查範圍到經核實的案件檔案包。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) 可跨頻道、群組、私人聊天室及機器人追蹤案件,從最初的 資料擷取,到帶有引用時間軸及可驗證的交接流程。互動式網站 版本位於 `/docs/cases/`;[預覽說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/PUBLISHING.md#preview-the-website-locally)。 **本頁內容** - [實例:目標地址在四段對話中發生變化](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#worked-case-a-destination-changes-across-four-conversations) - [1. 界定案例並彙整完整敘述](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#1-define-the-case-and-collect-the-whole-account) - [2. 清點所有來源並蒐集歷史背景](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#2-inventory-every-source-and-acquire-historical-context) - [3. 保留不斷演變的案例與刻意互動](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#3-preserve-the-evolving-case-and-deliberate-interactions) - [4. 串聯不同聊天室中的觀察結果](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#4-connect-observations-across-chats) - [5. 建立跨聊天室的時間軸](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#5-build-the-cross-chat-timeline) - [6. 新增帳戶視角,同時保留其來源](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#6-add-account-perspectives-without-losing-their-origin) - [7. 彙整並驗證案件移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#7-assemble-and-verify-the-case-handoff) - [調整調查內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/#adapt-the-investigation) ## 案例分析:四段對話中目的地資訊的變更 一則公告指向一個聊天機器人。一個行動小組討論新的付款 目的地,而該聊天機器人的鍵盤上顯示了該目的地。該公告經過編輯, 一則私訊跟進時重複了該目的地,而一則群組訊息則消失了。 問題包括:變更前後觀察到什麼情況、哪些 Telegram 帳號發布了各項內容、目的地出現在何處、哪些附件位元組 被保留下來,以及哪些時間間隔仍屬未知? 本範例中的所有名稱、ID、時間及日誌參考資料均為虛構。該 工作流程採用現行功能;案例地圖僅為示意圖,並非由應用程式自動 生成的圖表。 流程圖 · 頻道 → 工作區日誌; 群組 → 工作區日誌; 私人聊天室 → 工作區日誌; 機器人 → 工作區日誌; 工作區日誌 → 搜尋所有來源; 工作區日誌 → 附有記錄參考資料的人物檔案; 工作區日誌 → 已儲存版本與附件收據; 搜尋所有來源 → 分析師時間軸與來源登記簿; 附有記錄參考資料的人物檔案 → 分析師時間軸與來源登記簿; 已儲存版本與附件收據 → 分析師時間軸與來源登記簿; 工作區日誌 → 經簽署的證據 ZIP 檔案; 分析師時間軸與來源登記簿 → 附有經獨立驗證之證據資料的案件移交; 經簽署的證據 ZIP 檔案 → 附有經獨立驗證之證據資料的案件移交 · 頻道 · 群組 · 私人聊天室 · 機器人 · 工作區日誌 · 搜尋所有來源 · 附有記錄參考資料的人物檔案 · 已儲存版本與附件收據 · 經簽署的證據 ZIP 檔案 · 分析師時間軸與來源登記簿 · 附有經獨立驗證之證據資料的案件移交 **圖表轉為文字** 1. 頻道 → 工作區日誌 2. 群組 → 工作區日誌 3. 私人聊天室 → 工作區日誌 4. 機器人 → 工作區日誌 5. 工作區日誌 → 搜尋所有來源 6. 工作區日誌 → 附有記錄參考資料的人物檔案 7. 工作區日誌 → 已儲存版本與附件收據 8. 搜尋所有來源 → 分析師時間軸與來源登記簿 9. 附有記錄參考資料的人物檔案 → 分析師時間軸與來源登記簿 10. 已儲存版本與附件收據 → 分析師時間軸與來源登記簿 11. 工作區日誌 → 經簽署的證據 ZIP 檔案 12. 分析師時間軸與來源登記簿 → 附有經獨立驗證之證據資料的案件移交 13. 經簽署的證據 ZIP 檔案 → 附有經獨立驗證之證據資料的案件移交 ## 1. 界定案件並完整記錄事件經過 1. 請在專屬的工作區中連結資料蒐集帳戶。在「[案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/) 或您的案件登記簿中,記錄案件參考編號、帳戶 ID、工作區及 觀察起始時間。請獨立保留可信簽名金鑰的指紋。 2. 若要建立專用的蒐集帳戶,請開啟**「來源」→「觀察範圍」→「調查模式」**。此預設選項會選取「 **整個帳戶**」、頻道/群組/私人聊天/機器人、自身操作、來源 檔案,以及新發現來源的最新 200 則可見訊息。 檢視設定後,按下**「儲存範圍」**,並完成範圍確認。 主要帳戶可使用選定的聊天室或資料夾;全帳戶收集功能 僅限標記為「調查中」的帳戶使用。 3. **載入聊天記錄**,並將來源與該帳號的對話清單進行比對。 檢查 排除項目。**參數 → 從帳號清單中讀取的聊天室數量**預設為 1,000 則,最多可達 20,000。超出清單限制的來源會在 其變得活躍時被加入。記錄實際枚舉的內容。 4. 在「**記錄設定**」中,選取「**所有可見活動**」,並儲存 監控設定。請檢視附件類型/限制及可用磁碟空間。 5. 開始監測。驗證一則受控的新訊息、編輯及刪除操作,接著 保留測試參考資料及任何失敗紀錄。 「整個帳戶」範圍會根據儲存的設定,記錄該帳戶可見的所有活動。 本工具不會存取秘密聊天,也不會自動加入所有連結的群組。此外, 也不會回溯補錄所有現有的對話紀錄。請參閱[「資料蒐集範圍」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#observation-scope-chosen-chats-a-folder-or-the-whole-account)。 ## 2. 清點所有來源並蒐集歷史背景資訊 建立來源登記簿,每則聊天記錄佔一行: | 領域 | 記錄 | | --- | --- | | 品牌定位 | 工作區、帳號 ID、數值聊天室 ID、標題及類型 | | 能見度 | 會員身分/角色、存取權限已確認或未確認、排除項目 | | 即時擷取 | 開始時間、選定的事件類型及後續政策變更 | | 日誌歷史 | 快照請求/完成狀況、限制、時間及記錄參考資訊 | | 完整歷史紀錄 | 經簽署的每則聊天室匯出檔案名稱、邊界及完成/失敗狀態 | | 附件 | 已完成的媒體收據、雜湊值、大小以及跳過/失敗的結果 | | 涵蓋範圍 | 服務中斷、資料擷取不完整、FloodWait、無法取得訊息及其他資料缺口 | 針對每個來源,請選用適當的擷取方式: - 「在**來源**中**載入完整歷史紀錄」**會將已啟用的來源中可用的過往 訊息載入至工作區日誌。此功能支援暫停/恢復 ,並提供經簽名的進度報告。請參閱[歷史紀錄擷取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)。 - **歷史快照**會將近期可見的訊息儲存至觀察日誌中。 預設上限為 500 則;透過「**參數 → 最大歷史快照」**可將 此上限提高至 10,000 則。這些是當前的歷史觀察記錄,而非重建的編輯紀錄。 - **「完整聊天記錄匯出」→「匯出完整聊天記錄**」,或「**聊天」→「匯出聊天記錄**」,會將 某個聊天室當前可見的歷史紀錄匯出至獨立的、經簽名的 `chat.json` / `chat.html` 封裝檔中。請針對案件中的各來源重複此步驟,並保留每個結果。 - **當出現新的聊天室或機器人時,**可儲存其檔案及多達 1,000 則近期 訊息;若啟用「調查模式」,則僅選取 200 則。當啟用該模式時,現有聊天室不會 追溯性地接收這些資料。 - **下載可見附件**時,會根據設定的政策保留對應的位元組數。 必須具備包含 SHA-256 雜湊值及位元組數的完整 `media.saved` 收據。排入佇列的 工作、縮圖或檔案名稱均不屬於被保留的附件。 完整聊天記錄匯出並不會將所有 訊息填入日誌或人員檔案中。若需在 TgWitness 內分析特定歷史紀錄,請使用**「載入完整歷史紀錄」**或「有限範圍的日誌快照」。在開始 執行歷史紀錄處理前,請先檢視已啟用的來源清單。無論採用何種方式,均無法恢復 Telegram 已不再回傳的內容。 ## 3. 保存不斷演變的案件及有預謀的互動 將活躍案件的聊天室標記為優先來源。檢視重新檢查間隔、持續 的補錄進度及媒體結果。使用該帳號時,請保持收集器處於監測狀態。 請使用**「聊天室」→「個人檔案」→「立即儲存個人檔案」**,以保留來源元資料,例如 描述和機器人指令。此功能與從已儲存訊息衍生出的 人員個人檔案是分開的。 當案件涉及追蹤消息來源或與機器人互動時: 1. **開啟 Telegram 連結 → 儲存預覽:此功能**會在執行操作前,將提供的連結及其 預覽內容記錄下來。 2. **「加入/開啟並觀察」**會執行加入/開啟操作,並在提供時傳送機器人的 start 參數。待審核的加入請求將被記錄為「待處理」。 3. 面板發出的文字回覆及受支援的按鈕點擊操作將保留 `interaction.requested` 和 `interaction.result`。回調收據可保留 返回的彈出視窗文字、警示狀態及 URL。 這些是真實的帳戶操作。在另一款 Telegram 應用程式中按下的回調按鈕, 收集器無法偵測到,儘管由此產生的訊息或編輯操作可能會被記錄。 此迷你客戶端不執行網頁應用程式、支付、電話或位置相關的工作流程。 有關確切的運作行為,請參閱[面板互動說明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/#act-from-the-panel)。 ## 4. 串聯不同聊天室中的觀察結果 在「**日誌**」中,選取「**所有來源」**並搜尋已記錄的內容。開啟符合條件的 記錄,並保留工作區、聊天室、訊息 ID、序列號及記錄雜湊值。 在相關聊天室中,開啟「**人員」→「開啟個人檔案」**,並檢視某位使用者: - 隨時間推移所觀察到的名稱/使用者名稱,以及 Telegram 的數值 ID。 - 回覆內容需包含原始記錄的引用資訊。 - **另見……**此工作區日誌中該 ID 曾發言的其他聊天室。 - 活動紀錄、編輯/刪除紀錄,以及被提及的錢包、手機、使用者名稱和連結。 - 已儲存的頭像元資料及類似的快取頭像,並標示其各自的來源。 在調查結果中使用衍生個人檔案前,請先開啟所引用的紀錄。個人檔案涵蓋 擁有儲存訊息的對象,而非群組中的每位成員。**「參數」→「每項事實引用的紀錄數」** 僅會限制參考清單的範圍,而非底層活動的計數。 提及內容與頭像相似度僅為線索;它們並不能確立所有權或身分。 在示例中: | 連結 | 記錄 | 受支援的觀察項目 | | --- | --- | --- | | 同一發送者帳號 | 群組 #146 及後續私訊 #205 | 兩者均提供 Telegram 發送者 ID 71001 | | 相同目標 | #146、機器人鍵盤 #173、頻道編輯 #188、私訊 #205 | 所有內容均包含`pay.example.invalid/new`;所有權/控制權尚未確立 | | 相同的儲存檔案 | 已完成媒體收據 #151 和 #209 | 所保存位元的完整 SHA-256 值完全一致 | | 頻道來源標示 | #101 和 #188 | 若未標明發送者,請勿將頻道貼文歸因於使用者 71001 | 請比對附件雜湊值及其相關的訊息參考,並將 時間軸依這些記錄中提供的 Telegram ID 進行分組。 請將團隊的工作筆記保留在[「案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)上:將您依賴的紀錄 (例如 #146、#188 和 #205)加入書籤,標示出確切的目標字串,並 儲存兩個紀錄之間或特定時間範圍內每項記錄動作的片段。 筆記 與狀態會將團隊的審閱內容保留在其各自的簽名歷史紀錄中,可與 原始觀察結果分開識別。 ## 5. 建立跨聊天室的時間軸 請使用**「聊天室」**中的儲存版本及其「**日誌記錄 #…」**連結。在 **「日誌**」中,將**所有來源**與**編輯**、**刪除及涵蓋範圍**合併。 若已提供,請同時保留 `source_at` 與 `observed_at`。 | 示意性觀察時間 | 參考資料 | 觀察 | | --- | --- | --- | | 09:00 | 頻道 #101 | 原始目的地已記錄 | | 09:12 | 群組 #146;媒體 #151 | 已發布新目標;檔案下載完成 | | 09:16 | 機器人 #173 | 鍵盤指向新的目的地 | | 09:20 | 頻道 #188 | 公告已編輯;兩個儲存版本均保留 | | 09:24 | 私密 #205; 媒體 #209 | 同一發送者 ID 的收件者重複;原始檔案位元組內容完整保留 | | 09:28 | 群組 #231 | 已收到刪除通知;刪除者及確切刪除時間不詳 | 其他記錄可能出現在這些範例參考資料之間。序列號用於排序 觀察結果;歷史快照可能包含較早的來源日期,且傳送時間可能晚於 即時事件。請區分快照、已恢復訊息、刪除通知以及 重新檢查時發現缺失的結果。 請將覆蓋範圍的缺口標記為「未知區間」。後續 取得的历史資料,並不能追溯性地確立觀察過程的連續性。 ## 6. 新增帳戶視角,同時保留其原始來源 針對每個獨立帳戶使用獨立的工作區,並重複執行其清點程序。 每次比對時,請保留帳戶 ID、角色、簽名金鑰指紋及來源參考資訊。 訊息編號並非適用於所有聊天室/帳戶的通用識別碼。 「案件看板」會在每個工作區內保存與來源連結的筆記和彙整資料。 群組畫面可共同檢視帳戶狀態,並能整合來自不同工作區的 匯出檔案。您可在案件筆記或分析工具中將這些來源相互關聯;每個日誌 皆保留其原始來源與簽署金鑰。系統不會產生全域搜尋或合併跨工作區 的時間軸。 單一頻道/超級群組的多帳戶匯出 會透過符合資格的帳戶取得該聊天室的歷史紀錄。 針對較長期的作業,應透過[獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)維持界線。 使用受控傳送檢查來驗證 每個帳戶的擷取路徑與可見性。 ## 7. 彙整並驗證案件移交 請將以下資料彙整於由分析師編製的案件檔案夾中: | 資料 | 目的 | | --- | --- | | 案件筆記與來源登記簿 | 問題、資料蒐集政策、存取權限/角色、調查結果、替代解釋及資料缺口 | | 時間軸 | 每則記錄均包含時間資訊,以及工作區/聊天室/訊息/序列的相關參考資料 | | Case Board 若已使用,則包含匯出與片段 | 與來源連結的書籤、引文、團隊筆記、彙整集、修訂歷史紀錄,以及經與證據 ZIP 檔案比對後選定的紀錄 | | 每個工作區的簽名證據 ZIP 檔案 | 完整的記錄日誌、清單及所包含的保存媒體;面板篩選器不會縮小日誌的匯出範圍 | | 獨立簽署的用戶檔案 | 已將衍生參考資料與對應的工作區證據進行比對核實 | | 經簽署的完整聊天記錄匯出檔 | 當前可見歷史紀錄的擷取功能,與觀察日誌分開處理 | | 可信指紋與早期檢查點 | 關鍵身分識別與保留日誌的範圍界定 | | 若已進行設定,則會產生 Witness 證據檔案 | 獨立日誌、經簽署的貼文及證據指紋 | | 驗證結果與傳送檔案的雜湊值 | 已核實的內容、傳輸的位元組以及傳輸對象 | 來自可信賴的安裝來源,包含檔案名稱及各工作區的實際指紋: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.json python -m tgwitness.verify profiles-operations.json --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --evidence evidence.zip python -m tgwitness.verify history-channel.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 python -m tgwitness.verify board-slice.json --evidence evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 ``` 請保留實際的驗證結果及原始證據資料。將「案件看板」中的工作區 筆記與引用的來源資料一併匯出。將跨工作區 的調查結果彙整至頂層案件目錄中;每個 TgWitness 證據資料皆擁有專屬的 簽章及驗證程序。 ## 調整調查方式 | 案例 | 追蹤 | 交付 | | --- | --- | --- | | 由機器人驅動的訂單/付款爭議 | 條目公告 → 已儲存連結預覽 → 機器人啟動參數 → 訊息與鍵盤版本 → 面板回呼收據 → 私人/群組後續追蹤 | 已觀察到的提議/回應時間軸及經核實的來源;僅憑付款連結並不能證明已付款 | | 事件發生後被刪除的訊息 | 所有受影響的聊天室 → 已儲存的原始內容/編輯紀錄 → 刪除或重新檢查時內容缺失的結果 → 已保存的媒體檔案 → 事件涵蓋範圍及其他帳戶視角 | 保留原始版本並明確標示未知時間區間;不假設任何虛構的刪除行為者 | | 某位參與者在不同聊天室中使用不同的名稱 | 數值發送者 ID → 姓名/使用者名稱歷史紀錄 → 回覆 → 其他被觀察到的聊天紀錄 → 被引用的目的地/檔案 | Telegram 帳號的活動時間軸,附有其來源記錄的連結 | [資料彙編參考](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/) · [個人資料驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#people-profiles) · [證據移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#investigation-handoff) · [驗證已完成](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/) --- # Telegram · 功能與限制 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/ TgWitness 的現行蒐集模型、多帳號工作流程、匯出功能及操作範圍。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) TgWitness 的現行蒐集模型、多帳號工作流程、匯出功能及操作範圍。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [專案參考資料](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![專案參考](https://phishdestroy.github.io/TgWitness/assets/chapter-project.svg) TgWitness 可保存連線帳戶可存取的 Telegram 對話內容, 記錄觀察到的變更,並準備可驗證的匯出檔案。本參考文件說明 資料蒐集模型、現行工作流程及其範圍。 **本頁內容** - [獨立應用程式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#standalone-application) - [共享調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#shared-investigations) - [歸檔工具](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#archive-tools) - [可選附加內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#optional-extras) - [協定與私有來源](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#protocol-and-private-sources) - [多個帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#multiple-accounts) - [擷取與來源標示](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#capture-and-attribution) - [容量與 Telegram 限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#capacity-and-telegram-limits) - [可靠性與恢復](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#reliability-and-recovery) - [證據模型](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#evidence-model) - [匯出、部署與移交](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#export-deployment-and-handoff) - [穩定版發布標準](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/features/#stable-release-criteria) ## 獨立應用程式 TgWitness 擁有專屬的安裝程序、資料目錄及發行週期。內建的 網頁介面負責設定與檢視;匯出的記錄可獨立使用。 操作者可連結其帳戶、選擇彼此可見的來源,並取得 一份儲存的觀察日誌。控制面板會顯示內容、已儲存的變更、觀察 來源及已知缺漏。其他調查人員可驗證匯出的資料。 該面板區分帳戶授權、來源存取權限、收集器 活動及記錄範圍。在評估 訊息較少或出現連線問題的區間時,請一併檢視這些狀態。 ## 共享調查 管理員可發行範圍限於工作區及 個別聊天室的[存取憑證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/),並可設定每項操作的權限、IP 限制、有效期限、登入次數限制 及會話控制。唯讀審查員無需取得 Telegram 授權或主面板金鑰,即可檢視案件。 僅限聊天室的存取權限 與全帳戶設定及完整日誌匯出功能相互獨立。 自動 MTProxy 會從四個公開來源或 營運商目錄中維護可運作的 Telegram 路由。[IP 模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/#ip-modes)決定 當發生故障時,系統是否必須等待另一個代理伺服器,或是可使用明確允許的直接路由。 外部 HTTP 請求擁有獨立的路由及關閉開關。 ## 歸檔工具 0.7.1 包含[歷史紀錄擷取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)、[檔案庫搜尋與分析](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/)、[唯讀 MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/)、[本地 OCR/轉錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/)以及[外發 webhook](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/webhooks/)功能。分析報告與辨識出的文字將與 擷取的事件分開儲存。 [「案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)可在工作區內新增與來源連結的書籤、引文、筆記及 彙整集。[報告建構器](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/)可選取 素材、章節,並從八種設計中選擇一種,以支援 HTML/PDF 匯出。 ## 可選附加功能 日常設定流程為:帳戶 → 來源 → 監測。**額外功能**為獨立的目標選項, 包含 Telegram 證據記錄機器人及 GitHub 擷取預覽。各選項會在顯示 設定前,先說明其可用性與需求。點選卡片會開啟操作說明;此動作不會進行註冊或啟動服務。 機器人設定包含三個步驟:建立唯讀存取權限、選擇發佈設定,以及 在 Witness 主機上啟動。網路與發佈選項、現有連線及 驗證指令將依需求顯示。 下載的配置檔與 正在運行的 Witness 實體不同。切換附加功能時會保留草稿;帳戶變更及鎖定 操作則會清除臨時憑證與表單。內建指南包含啟動說明。 [GitHub Actions 會](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md)從您的 分支啟動一個固定收集器,擷取一個聊天記錄,並產生包含工作流程來源資訊的加密交接檔。 ## 協議與私有來源 **MTProto 是 Telegram 的通訊協定;Telethon 則是 TgWitness 用於 與 MTProto 通訊的 Python 函式庫。**這兩者並非替代性的連線方式。「收集」功能使用 MTProto; 而可選的「見證者」則透過 Bot API 發佈經簽名的檢查紀錄。 每個工作區皆擁有專屬的授權客戶端及帳戶更新串流。TgWitness 會從已設定的來源中篩選觀察結果,並針對歷史紀錄快照與媒體下載等功能, 分別發出明確的請求。 私人消息來源無需公開使用者名稱。Telegram 的對等節點類型與數值 ID 才是 識別標識;標題與使用者名稱皆可能變更。存取權限取決於現有的 會員資格與權限設定。TgWitness 不會自動加入消息來源,也不會繞過 加入審核。來自其他帳戶的存取雜湊值並非通用存取憑證。 資料蒐集模型必須涵蓋加入群組前的隱藏歷史紀錄、參與者/管理員 角色、會話撤銷、權限移除或變更、群組轉為超級群組 的遷移、主題/論壇、關聯討論、頻道身分以及無法存取的 附件。並非所有組合皆已通過實際運作驗證。 來源可見性會在收集器啟動時進行檢查。若在限定範圍內的 對話結果中缺少某個來源,表示**該來源的存取狀態未經確認**,而非已證實遭刪除。即使有一個 來源不可用,也不會影響對其他可存取來源的監測。切勿將邀請 連結或真實會話內容放入公開的測試資料中。 ## 多個帳戶 該面板支援任意數量**的工作區**,每個工作區皆具備: - 授權機制、加密儲存庫及連線路徑。 - SQLite 日誌及 Ed25519 簽名憑證。 - 精選來源、媒體佇列及擷取設定。 - 監測狀態、錯誤、檢查點及匯出功能。 切換顯示的工作區並不會停止其他資料擷取器的運作。跨工作區的重複帳戶 授權將被拒絕。已綁定至某個 Telegram 帳戶的日誌無法重新指派給其他帳戶;但允許重新連線至同一帳戶。 此舉可確保帳戶身分及相關訊息 ID 範圍的完整性。 本應用程式未設定固定的工作區數量。每個工作區皆在 共享的 Python 程序與事件迴圈中,執行其專屬的收集器 任務,包括連線監控、媒體下載、重新檢查及新聊天室匯入。處理量取決於工作負載。為 實現程序隔離,請使用獨立的安裝、連接埠及資料目錄。 為每個帳戶指派其可存取的來源。不同帳戶可能觀察同一個 群組,但其觀察記錄仍保持獨立,並保留原始來源。同一台由操作員控制的機器上的兩個帳戶 並不構成兩個獨立的證人。**匯出群組時,** 會將分別簽署的工作區 ZIP 檔與一份簽署的檔案清單打包,該清單包含其 工作區 ID、雜湊值及簽署金鑰指紋。 每個日誌皆保留其自身的 邊界。可在案件筆記或分析工具中建立跨工作區的綜合時間軸, 並保留這些來源參考資訊。 ## 擷取與來源標示 「來源」功能提供針對各帳戶的新訊息、編輯、刪除、反應 及成員資格的切換選項。預設設定可選擇保留所有類別,或僅保留訊息/編輯/刪除記錄。 此政策適用於工作區中選定的群組,重啟後仍會保留,並會 以變更前/後的狀態進行簽署。預設設定為保留所有類別。 關閉某個類別 不會移除舊記錄;重新開啟該類別也不會重建遺漏的事件。 操作記錄、其他群組服務事件以及明確的歷史快照均屬 獨立項目。擷取的 Telegram 物件可能會保留內嵌的元資料,無論 「獨立更新」開關的設定為何。目前尚無針對各群組的類別覆寫功能。 | 資料 | 立即擷取 | 分隔線 | | --- | --- | --- | | 訊息 | 文字內容、同儕/訊息 ID、發送者元資料、回覆內容及原始更新封套 | 以「由收集者簽署、帳戶可見的觀察記錄」形式保存 | | 編輯 | 新觀察到的版本以及任何先前儲存的版本 | 系統停機期間的中間編輯內容可能會遺失;發送者未必就是編輯者 | | 刪除 | 通知及先前擷取的內容(如有) | 通常不包含刪除者或確切的操作時間 | | 帳戶層級刪除通知 | 原始通知;已解決的紀錄包含儲存的聊天內容及關聯分析方法 | 範圍內必須精確包含一個先前已儲存的「私人聊天」或「一般群組」配對;其他 ID 將保留為「`deletion.unscoped`」。頻道和超級群組的 ID 不包含在此關聯範圍內 | | 反應 | 已交付的計數器及可見的近期身分資訊 | 完整的可用反應器清單需另行查詢;頻道可能會隱藏身分 | | 會員 | 服務訊息及已送達的參與者更新 | 可見性取決於角色與聊天類型;事件缺失並不代表該事件不存在 | | 管理員操作 | 相關已交付更新及管理員日誌快照,皆包含於頻道/超級群組聊天記錄的匯出檔案中 | 匯出功能會在匯出管理員帳戶可存取時讀取日誌;持續輪詢管理員日誌的功能不屬於此流程範圍 | | 附件 | 原始版本描述、下載位元組數/SHA-256 及嘗試結果 | 已消失的檔案可能無法恢復;最新版本不會被替換 | | 歷史沿革 | 當前可見訊息的明確快照 | 不會還原所有編輯或刪除的內容 | | 收集程序 | 啟動/停止、心跳訊號、錯誤、設定、範圍及簽名執行收據 | 本地清單;GitHub 與 TDX 新增[獨立環境檢查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope) | 介面會標示來源事件中提供的帳號,並保留觀察到的 名稱與使用者名稱。當事件未標示行為者時,報告會將該欄位留空。 ## 儲存容量與 Telegram 限制 目前尚無能保證監控品質的通用聊天室數量標準。 監控容量取決於每秒的峰值事件數量、附件數量與大小、額外的 RPC 請求、活躍帳戶數量、磁碟延遲/可用空間、網路狀況、Telegram 的限制、 可接受的延遲以及佇列深度。 Telegram 將「被動傳送」與「主動短輪詢」區分開來。其更新 文件中說明,針對公開 頻道/超級群組會產生額外的 `updates.getChannelDifference` 呼叫,並建議**同時進行短輪詢的 來源**最多為十個。這並非指僅能選取十個群組,亦非完整性保證。 | 模式 | 目的 | 狀態 | | --- | --- | --- | | 標準觀察 | 記錄來自選定來源的已發佈更新 | 已實作 | | 優先級複核 | 已標記的來源採用其自身可配置的間隔,並在每次限定範圍的重新檢查循環中具有優先權 | 已實作歷史紀錄與訊息查詢功能 | 優先級星號用於控制這些重新檢查。額外的 ``updates.getChannelDifference` ` 短間隔輪詢功能不會作為獨立的使用者模式對外公開。 任意的高頻率輪詢、忽略 FloodWait 設定,或假設額外帳戶具備線性處理能力, 均非有效的規模估算模型。預設限制為 前 1,000 個列出的對話,每個歷史快照最多 500 則訊息, 每種類型的收集檔案為 1–2,000 MiB,以及 4 GiB 未壓縮的簽名 ZIP 內容;各項 限制皆可於**「參數」**中針對各工作區進行調整。匯出資料無固定事件數上限。 瀏覽器備用模式預設上限為 128 MiB;串流 CLI 具有可配置的 傳輸限制,預設為 5 GiB。 ## 可靠性與資料復原 已實作的功能包括 SQLite WAL/同步交易;原子性訊息 與媒體處理任務寫入;持久化任務與重試延遲;原始版本描述符; 有限重試;媒體 FloodWait 的持久化;在文字事件的 網路等待之外進行媒體下載;在後續寫入持續進行時進行穩定前綴匯出;原子設定與 稽核記錄;在替換登入失敗後保留有效授權; 受損附加工作區的隔離;顯式重新連線嘗試;明確的 授權喪失通報;以及使用單調時鐘進行的實時時鐘變更偵測。 帳戶與頻道的 pts/qts/seq 值會在重新啟動後保留並恢復,且受監控的聊天室 會定期重新檢查;詳見[證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#durable-collection-and-process-receipts-02)。定期儲存位置 並非對日誌接受的原子性、無損確認。 每次流程啟動時,都會記錄前一個頭部位置與離線邊界。當前的歷史紀錄 不被視為缺口修復。Telegram 的差異保留容量是有限的; `differenceTooLong` 無法重建所有已消失的內容。即使後續的歷史快照成功,不可恢復的缺口仍須 明確標示。 ## 證據模型 每項事件皆記錄事件序列、當地 UTC 觀察時間、來源時間(若提供)、 事件類型、來源、行為者(若提供)、原始載荷、前次雜湊值及簽名。 訊息觀察記錄亦會保留收集者帳戶/執行上下文。 該簽署的處理收據包含隨機生成的執行 ID;TgWitness/Python/OS/依賴項 版本;原始檔的 SHA-256 值與彙總指紋;初始帳戶、 範圍及設定;UTC/單調讀數;以及前一則日誌的開頭。 設定變更、啟動/停止及錯誤訊息均會記錄於同一日誌中。檢查點會 於啟動時、監測期間每五分鐘(可調整)以及正常停止時保留。 保留的本地檢查點可偵測是否回滾至較早的日誌前綴。 | 運作機制 | 其功能說明 | | --- | --- | | 檔案 SHA-256 | 位元組與已知摘要相符 | | 事件雜湊鏈 | 記錄相對於已知邊界的排序/關聯性 | | Ed25519 | 特定金鑰下的簽名 | | 獨立保留的檢查點 | 後續內容與保留的範圍一致 | | 程式檔案大小測量 | 關於已測量檔案的收集器自我報告 | | 有效的獨立 TSA 回應 | 在明確的信任假設下,特定時戳(TSA)時間點下特定位元組的存在性 | 已實作 RFC 3161 請求準備及 OpenSSL 回應驗證功能。 「證據模式」亦會將檢查點雜湊值提交至已設定的時間戳記服務。 請保留並驗證主管機關的回應,以建立獨立的時間錨點。 請參閱 [TIMESTAMP.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/)。 獨立保留檢查點、控制簽署金鑰的存取權限、保存傳輸 紀錄,並使用可信賴的軟體驗證匯出檔案。[驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope) 說明了這些檢查如何相互補充,以及適用哪些信任假設。 ## 匯出、部署與移交 經簽名的 ZIP 檔案包含原始的 JSONL、CSV、HTML 檔案、保留的附件、雜湊值、一份 經簽名的清單以及一個便捷驗證工具。其涵蓋一個工作區及一個固定的完整 日誌前綴。面板搜尋篩選器不會在未經提示的情況下移除記錄。 密鑰、 憑證及 Telegram 會話均不包含在內;原始記錄仍可能包含 個人資訊及 Telegram 元資料。 請將 ZIP 摘要、可信指紋、檢查點、處理收據及交接 記錄分別保存。應使用來自可信安裝來源的驗證器,而非僅因可執行 程式碼出現在被檢查的 ZIP 檔案中,就直接信任該程式碼。 瀏覽器介面可本地部署,無需 Node.js、CDN 或外部字型。一個 操作員憑證即可控制整個安裝過程。遠端存取需透過 HTTPS 或 SSH 隧道進行。 提供原生 Python 程式碼及容器定義,部署範例位於 [deploy/](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md) 目錄下;已執行的平台檢查項目則另行列出。 預設工作區使用資料根目錄;額外的工作區則使用 `profiles//`。 備份需先停止程序,並備妥完整的資料/金鑰組。證據 ZIP 檔 並非應用程式備份。機密資料可使用外部主金鑰來建立新的資料 目錄;日誌/媒體加密則由操作者的磁碟/磁碟區提供。 請參閱 [CONNECTION-SECURITY.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/) 及 [OPERATIONS.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/operations/)。 ## 穩定版本發布標準 在穩定版發布前,請補充說明: 1. 真實的私人群組、超級群組、論壇及頻道,包含成員/管理員角色,以及 隱藏/可見的歷史紀錄,涵蓋登入/雙因素驗證、權限撤銷及存取權限喪失等資訊。 2. 針對已知行為,對編輯、刪除、反應、成員資格及媒體內容進行監控。 3. 流程/主機當機、磁碟故障/磁碟空間已滿、檔案參照過期、FloodWait、 網路中斷、檔案損毀及資料庫回滾。 4. 支援持續的多帳號使用,並可控制延遲、佇列、記憶體及磁碟資源,包含 同時處理靜態與動態資料來源。 5. MTProto 狀態推進與日誌接受之間的間斷。 6. 在目標作業系統/容器組合上進行乾淨安裝,並驗證備份與還原功能。 7. 針對安全性、簽名以及來源歸屬/證據主張的獨立審查。 「[存取與權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/)」章節中說明了分域式面板存取權限。0.6 版支援 [《ACCOUNTS.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)》中所述的「有限單一帳戶 TData」及「帳戶檔案匯入」功能。 發佈前請詳閱 Telegram API 條款。相關研究參考資料及平台 調查結果請參閱[《RESEARCH.md](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/RESEARCH.md)》。 --- # Telegram · 「案件看板」參考說明 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/ 書籤、精確標註、操作片段、討論、範圍限定存取,以及「案件看板」所使用的簽名註解歷史紀錄。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 書籤、精確標註、操作片段、討論、範圍限定存取,以及「案件看板」所使用的簽名註解歷史紀錄。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) 「案件看板」為調查團隊提供一個可共享的儲存資料工作視圖。您可以將 觀察結果加入書籤、標示特定段落、儲存一系列操作,並與同事進行討論。 卡片會保留其來源參考資訊及經簽署的修訂歷史紀錄。團隊註解會保留在 工作區中,並可與原始的 Telegram 觀察結果明確區分。 [證據模型](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) · [存取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/) · [報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/) ![綜合調查資訊流](https://phishdestroy.github.io/TgWitness/assets/case-board.png) **本頁內容** - [處理個案](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/#work-with-a-case) - [權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/#permissions) - [儲存的合約](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/#stored-contracts) - [API 與匯出功能](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/#api-and-exports) - [運作限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/#operating-limits) ## 處理案件 開啟「**調查」→「案件看板」**,並選擇「標準」或「專家」模式。介面語言將隨選定的模式而定。 在日誌記錄或已儲存的聊天訊息旁點擊**「加入案板」**,或將其設為焦點後按下 **B** 鍵。 點擊一次即可將書籤新增至「收件匣」。編輯其標題、標籤和備註,或將其移至 收藏集。修改後的卡片會附加經簽名的修訂版本;刪除時將保留歷史紀錄。 針對首個案件,請選擇一個蒐集集,並加入能回答某個問題的紀錄。使用「註解」 功能檢視詮釋內容,接著使用「**簡報**」功能逐步瀏覽卡片及來源背景。 在「[報告工作室](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/)」中準備 交付成果時,請另行選擇「案件看板」的素材。儲存切片並不會自動設定報告的資料篩選條件。 在已儲存的聊天訊息中選取文字,即可顯示**「標示 → 看板**」選項。選擇顏色並 新增註解。伺服器會核對精確的引文及儲存版本,包括表情符號、從右至左(RTL)文字及 組合符號。介面不會將選取範圍映射至經過遮罩或轉換的文字上。 在單一聊天中按住 Shift 鍵點擊兩筆記錄,即可執行**「切片」功能**;亦可使用**「按時間切片」**,或儲存 日誌中當前的聊天、時間段及事件類型篩選條件。已儲存的切片具有其專屬的 權威性條件:在日誌中開啟該切片時,亦會套用多重聊天、訊息數量限制及參與者 篩選條件。 **「顯示自書籤新增的記錄」**功能可隔離後續新增的內容。變更 Journal 篩選條件將退出該切片。在「人員」中,使用**「切片此人的操作」**會採用記錄中的行為者 ID; 該功能不會假設訊息作者曾編輯、刪除或對訊息做出反應。 「切片」對話方塊會在允許建立前預覽計數。「`all`」涵蓋所有已記錄的類型, 包括快照、編輯、刪除、反應、成員資格/服務更新、自身操作、 按鈕、媒體結果、已恢復訊息及未來事件類型。此選項描述 已儲存的觀察結果。 「未知聊天室」刪除通知屬於獨立的上下文, 僅限擁有整個工作區存取權限的使用者查看,絕不會歸因於所選的任何聊天室。 各「集合」皆有明定之聊天室範圍。若範圍為空,則代表整個工作區。一個集合 不得包含其範圍外的卡片;受聊天室限制的參與者無法閱讀範圍更廣的 集合。「收件匣」是存放未指派卡片的虛擬集合。 搜尋與篩選功能僅涵蓋可見 的卡片;討論串和提及會繼承父卡片的存取權限。已刪除的留言會在 討論區中留下「墓碑」標記。系統不會記錄瀏覽歷史紀錄。 **「簡報」**模式會開啟所選收藏集中的所有卡片,並提供「卡片」、「來源背景」及「團隊 評論」檢視畫面,以及鍵盤上的「上一則/下一則」控制鍵。此模式不提供任何編輯控制功能。一般 動態消息採用分頁顯示;「簡報」模式會以頁面為單位載入清單,並每次僅擷取一張卡片的詳細資訊。 ## 權限 所有操作均需具備 `view`、工作區/聊天範圍及 `board.read` 權限。`board.write` 可新增卡片、 留言、移動以及開啟/審查狀態。`board.manage` 允許進行資料集管理、 確認/駁回狀態,以及修改/移除他人卡片。狀態是團隊 的決策,而非加密驗證結果。 存取表單預設值:審閱者 = 讀取;分析師 = 讀取/寫入;操作員 = 讀取/寫入/管理, 此外還包含其現有權限。現有授權不會自動取得新權限。 主要管理員擁有所有權限,並以「**主要管理員」**身分發佈內容。請使用命名授權 進行權限歸屬。提及清單僅列出目前能夠閱讀完整父卡片內容的存取者。 針對聊天室 A 的授權,即使透過猜測其 ID 或提供 錯誤的 `target.chat_id`,亦無法取得 A+B 的卡片或片段。目標元資料是根據伺服器上的簽名事件雜湊值解析而來。 在回覆前,會先過濾收集項目、討論次數、相關卡片及即時通知。 匯出操作需同時具備 `export` 及 `board.read` 權限;若現有匯出者無看板存取權限,則僅能 取得不含團隊筆記的普通證據檔案。SSE 會在每次批次處理前重新檢查當前的授權狀態。 ## 儲存的合約 與觀察記錄類似,註解會以事務性方式寫入工作區中一個僅支援追加的 SQLite 資料表。 `annotations.jsonl` 即是從與 `events.jsonl` 相同的讀取快照所產生的精確標準化匯出檔。 不存在第二個相互競爭的註解儲存庫,亦無 `board.activity` 日誌事件。 每行內容必須精確包含: ``` { "seq": 1, "at": "2026-11-02T14:00:00.000+00:00", "access_id": "admin", "access_label": "Main administrator", "kind": "board.bookmark", "payload": {"id": "32 lowercase hex digits", "target": {"event_hash": "64 lowercase hex digits"}}, "previous_hash": "64 zeroes for the first record", "hash": "SHA-256 described below", "signature": "base64 Ed25519 signature" } ``` 上述簡化範例展示的是封套結構;實際載荷包含其模型 預設值及由伺服器解析的目標欄位。API 請求架構位於 [`tgwitness/schemas`](https://github.com/phishdestroy/TgWitness/blob/main/tgwitness/schemas/board-bookmark.json) 目錄下,由 `python tools/build_board_schemas.py` 透過運行時 Pydantic 模型生成。額外的請求欄位將被拒絕。若未提供 ID,則由 伺服器端自動生成。 呼叫方無法提供 作者、時間、快照及簽名。命名授權 ID 遵循 Access 現有的 16 位元組十六進位格式;卡片 ID 則為 32 位元組十六進位。 規範 JSON 格式為 UTF-8,物件鍵值依序排序,標記之間無空白,Unicode 未經轉義, 且不含 NaN 或無窮大值。註解雜湊值為包含 `format: "tgwitness-annotations-v1"` 以及所有七個信封欄位(至 `previous_hash` 為止)之規範物件的 SHA-256 雜湊值。 此格式標籤將其雜湊域與觀察結果區隔開來。 簽名採用 Ed25519 演算法,基於 32 位元組的原始雜湊值。序列從 1 開始。修訂版本保留卡片 ID,並在 ``supersedes`` 欄位中標明前一版 註解雜湊值;其無法變更聊天範圍。移動、狀態變更及刪除均為 獨立的記錄。SQLite 資料表不接受 UPDATE 和 DELETE 指令。 `case-board.json` 包含 `{statement, signature}`。規範陳述由 工作區金鑰簽署,並包含 `format: "tgwitness-case-board-v1"`、`public_key`、`created_at`、 `journal_head`、`meaning` 及 `state`。狀態為確定性重播:`annotations_head`、一個 有序的 `items` 陣列(包含集合、卡片、註解及墳碑),以及 `status_history`。 各項目在各修訂版本間均保留其最後一次註解雜湊值、序列號、作者與時間,以及原始 建立者與建立時間。重播機制會檢查修訂版本、 父項目、集合參照及重複的操作 ID。`manifest.json` 與新的檢查點 亦會綁定 `annotations_head`。應獨立保留檢查點,以偵測資料遭截斷或 使用複製的簽名金鑰進行改寫的情況。 ### 文字版本 `range.start` 為以零為起點的 Unicode 碼點偏移量,`length` 為正數的碼點計數, 而 `quote` 必須與目標事件中 `payload.text` 或 `payload.caption` 的精確子字串完全相符。 不套用 NFC/NFKC、大小寫轉換或字元規範化。 Python 字串切片與 JavaScript 的 ``Array.from(text)`` 實作相同的索引機制。標記與 ZWJ 表情符號的組合可能 佔用多個碼點。``range.version`` 是指目標事件的雜湊值,而非當前訊息 版本或 Telegram 的 UTF-16 實體偏移量。後續編輯絕不會自動重新定位標示範圍。 ### 切片識別碼與時間 `query` 函式僅接受一個 `chat_id` 或非空的 `chat_ids` 參數,可選的包含起始點 `from`/`to`、 包含訊息 ID 範圍(僅限單一聊天室)、`kinds: "all"` 或精確/前綴通配符類別、 明確的 `actors`、`search`、`hide_system` 及 `include_unscoped`。日誌類別群組將展開為 其確切的謂詞。 搜尋使用日誌的 NFC/不區分大小寫的載荷搜尋,且不會變更 已簽名的來源文字。日期需指定時區,並歸一化為 UTC。 日期會過濾 **observed_at**。Telegram 的 `source_at` 會另行顯示。若刪除操作未 包含來源時間戳記,則不會生成虛構的刪除時間。在時間區間外觀察到的遲發記錄 不會被納入該區間;針對特定訊息 ID 的訊息 ID 區段,可能包含這些訊息 ID 的較晚刪除記錄。 快照(`snapshot`)會鎖定建立時間、日誌序列/雜湊邊界、匹配計數、首/末 序列以及 `result_hash`。後者是按字典順序排序的匹配 事件雜湊值所構成的 UTF-8 規範 JSON 陣列之 SHA-256 雜湊值,若切片為空則包含 `[]`。 它還包含確切的 類型計數,以及一個 24 區間的觀察時間微型資料。一個切片儲存的是查詢,而非重複的來源 記錄。在匯出時,`board/slices/.json` 會列出當前的雜湊值以及新增/移除的序列。 驗證器會先在建立邊界處重建原始結果,然後重建當前結果。 新增的記錄會以變更事實的形式報告。移除原始事件會中斷不可變的 證據鏈;此操作不會被默默接受為從切片中進行的普通移除。 反應快照中的近期參與者清單不完整。探索器會比較同一則聊天/訊息的相鄰快照 (包括切片範圍外的先前快照),並報告**各觀察結果之間的** 總計數差異。若近期參與者缺失,並不表示該反應已被移除。 第一個快照沒有推斷出的較早狀態。參與者的觀察結果仍歸屬於 其被提供的快照,而非某個虛構的動作時間。 ## API 與匯出功能 `GET /api/board` 接受 collection/chat/author/label/state/from/to/q/kind/comments、offset/limit 以及 newest/oldest 排序參數。`GET /api/board/card/{id}` 會傳回卡片、來源預覽、對話串、 狀態歷史紀錄及相關卡片。參與者子路徑會傳回符合條件的提及選項。 `POST /api/board/{bookmark|highlight|slice|collection|comment|status|move|remove}` 會追加一筆記錄。 `POST /api/board/slice-preview` 會計算查詢結果。切片記錄會透過 `GET /api/board/slice/{id}/records` 進行分頁;重新計算時始終使用當前的穩定讀取快照。 即時 `/api/stream` 會發送不含有效載荷的 `board` 通知,此功能與日誌游標獨立運作。 `GET /api/board/export` 會傳回一份經簽署的文件。受聊天室限制的存取權限將收到一份標示清晰的 經簽署的**披露文件**,絕不會包含其他聊天室的註解或完整對話鏈。完整的證據 ZIP 檔案 包含 `annotations.jsonl`、經簽署的 `case-board.json` 以及切片 JSON 附錄。 HTML/PDF/JSON 報告 設定可選擇「無看板」、「不含討論的書籤/片段」,或「附有評論的卡片」。該 區段會明確區分團隊意見與觀察結果。報告資料篩選器亦會限制 可讀取的筆記內容;證據 ZIP 檔中的完整簽名來源檔案則保持完整。 `GET /api/board/slice/{id}/export` 會產生一個經過簽名的 `tgwitness-board-selection-v1` JSON 摘錄; `?format=csv` 會產生一個方便使用的表格,但不包含獨立的簽名。請保留 JSON 和 ZIP 檔案: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_KEY_SHA256 --board python -m tgwitness.verify board-slice.json --evidence evidence.zip --fingerprint TRUSTED_KEY_SHA256 python -m tgwitness.verify case-board.json --evidence evidence.zip --fingerprint TRUSTED_KEY_SHA256 ``` 選取檢查會驗證簽名陳述、精確的來源記錄,以及 其在指定邊界處查詢的完整性。證據 ZIP 檔可能較新,但必須包含該 前綴。若目標懸空,系統會明確報告。若原始切片快照不同、註解 遭變更、重播狀態不匹配或來源變更,則檢查將失敗。 未附註解的舊存檔 將保留其現有的驗證行為。 移交預設為**「不包含**」。 明確包含設定會透過已 簡化的記錄顯示專案卡片,省略無法存取/被省略的目標,隱藏來源文字 已被簡化的重點標記,並依照相同的提及/聯絡規則清理團隊文字,同時可選擇性地將 元資料及筆記中已知出現的調查員標籤替換為 R01、R02…等標記。 不會披露原始的 `annotations.jsonl` 檔案。經簽名的 `tgwitness-case-board-handover-v1` 附檔與報告 均包含相同的最小化內容。切片計數僅描述已披露的記錄,原始 快照/查詢行為者詳情則不予披露。 對於最小化處理程式未知的自由文字名稱,仍需 進行審查,此與一般移交程序相同。此衍生版本並不聲稱在遮蔽處理後能保留原始 註解簽名。 ## 操作限制 參數包含 10,000 張卡片與 50,000 則留言的軟性限制、最多 5,000 筆記錄的切片頁面,以及媒體預覽控制。達到軟性限制時會發出警告,但不會刪除歷史紀錄。 動態消息頁面 最多顯示 200 張卡片。獨立 JSON 片段摘錄上限為 64 MiB;若需處理較大資料,請縮小查詢範圍或使用 簽名 ZIP 檔案。獨立驗證器將註解重播上限設定為 256 MiB。 Case Board 未啟用亦未實作任何外部評論通知功能。 此功能的自動化驗收流程會使用虛構資料及模擬的 Telegram 傳輸管道來 檢查儲存、存取、渲染及匯出功能。有關證據檢查的範圍,請參閱[驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope) 。 --- # Telegram · 檔案分析 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/ 搜尋已儲存的訊息、檢視 AI 輸入內容,並保存附有來源參考的分析報告。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 搜尋已儲存的訊息、檢視 AI 輸入內容,並保存附有來源參考的分析報告。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) [工作流程指南](https://phishdestroy.github.io/TgWitness/docs/archive/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) 使用**「日誌」**進行不依賴 AI 的本地搜尋;[全文搜尋](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/)(預覽) 可匹配詞形、短語、網域及 @用戶名。若要使用「**詢問存檔」**功能,請先在「**整合**」中啟用 並設定提供者。工作區選擇器用於選擇 帳戶;表單則用於選擇聊天室及觀察期間。 檢索作業 在本地執行。精確短語或網域可縮小檢索範圍;輸入訊息 ID 可查詢已儲存的 版本。檢視摘錄內容,並開啟其日誌記錄或上下文。 本工具不包含向量資料庫,亦不執行自動 Telegram 操作。 ## 服務提供者與同意聲明 AI 功能在每個工作區中預設為停用狀態。僅有主要管理員可設定 模型、端點、加密 API 金鑰、上下文/輸出限制、超時設定及每日 請求配額。金鑰絕不會傳回瀏覽器。若要保留現行金鑰,請將金鑰欄位 留空;若要移除金鑰,則需明確刪除。 Ollama 使用其已記錄的 [`/api/chat` 端點](https://docs.ollama.com/api/chat) 並以非串流式的 JSON 格式輸出。其預設位址為 TgWitness 伺服器上的 `http://127.0.0.1:11434`。操作者可透過 `TGWITNESS_AI_LOCAL_ENDPOINT` 變更此位址;此並非由模型控制的位址。請自行安裝 所選的模型。TgWitness 不會自動下載該模型。 相容的服務提供者需具備以 `/v1` 結尾的基礎網址,並支援 「[聊天內容補全」協定](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create): `messages`、JSON 回應模式、`max_completion_tokens` 及 `choices[0].message.content`。缺乏這些欄位的服務將不被支援。 連線測試會傳送合成文字,並計入請求配額。 每個請求均使用工作區所設定的外部路由。若遇封鎖的路由或 僅限 Telegram 的 MTProxy,則會產生錯誤;此情況不會直接重試。若刻意 設定本地 Ollama 位址,則允許使用私有目的地。 迴路 AI 終端點需要工作區的「Direct」外部路由;代理路由會在 傳輸前被拒絕。對於其他私有服務,則適用現有的伺服器層級私有 目的地選擇加入機制。預覽畫面會顯示終端點和外部路由, 包括適用的代理主機。若要變更該路由,則需建立新的預覽。 生成前,**傳送至模型的資料**會顯示該請求:問題、 已勾選的摘錄、事件類型、觀察時間及覆蓋標記。Telegram 對話、原始欄位、供應商金鑰、附件位元組以及完整的日誌 均不屬於該上下文範圍。請取消勾選不需要的來源,然後明確批准 處理。 外部供應商可能會依據其自身的 政策保留已提交的內容。本地執行意指端點位於本地端;這並不保證 獨立配置的服務會遵循特定行為。 全球範圍內最多同時存在兩項服務供應商請求,且每個 工作區僅限一項。預覽將於十分鐘後過期,且僅能產生一個回覆。 系統會顯示服務提供者回報的代幣數量;成本估算僅在 輸入與輸出費率皆已設定時才會顯示。失敗的嘗試也會 消耗每日請求預算。自動重試不會消耗額外預算。 ## 來源與限制 當[全文索引](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#ask-the-archive-and-mcp)建置完成時,檢索功能將 利用該[索引](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#ask-the-archive-and-mcp):在選定的聊天室中,根據詞形提供最佳匹配結果。關於 近期變更或單則訊息版本的查詢,以及在索引 建置期間的搜尋,則會對最新記錄進行有限詞彙搜尋。預覽功能會標示 該方法名稱。檢索結果最多返回 24 個來源;長篇文字會以匹配內容為基準進行截取。 截斷的摘錄與不完整的結果集均會標示。該 時間段僅指**觀察期間**,並非聲稱 Telegram 歷史紀錄 完整無缺。工作區範圍內的事件不會包含在聊天室範圍的存取權限中。 缺失的資料將被描述為「在可用存檔中未找到」。 該模型不接收任何工具。其來源 ID 會與選定的 記錄進行比對,雜湊值會重新核對,且引用的字串必須出現在這些記錄中。 若出現未知 ID、引文內容變更或未經引用的主張,則會駁回該答案。本應用程式 會產生連結;模型生成的 URL 不得用作引用來源。這些檢查 旨在確認來源的存在與引文的準確性,而非推論的真實性。 在依賴推論結果之前,請務必根據原始紀錄進行核對。 ## 報告 將經審核的回覆儲存為獨立的分析報告。該報告包含模型 摘要、觀察到的時間軸、提取的連結與識別碼、編輯/刪除記錄、 覆蓋範圍限制,以及來源事件雜湊值。報告中同時附有提供者、模型、端點、時間及 提示詞模板版本。系統不會自動合併任何身分資訊。 分析師的修訂與註記會與模型摘要分開儲存。報告 存放在加密的衍生檔案中,其索引位於簽名事件流之外; 原始事件與媒體內容不會被變更。僅有擁有者或管理員才能 開啟報告,且會再次驗證來源存取權限。 下載亦需取得匯出 權限。第 1 版不會對報告進行簽名,亦不暗示模型結論即為 經驗證的證據。限制:每個工作區 100 份報告,每份報告 100 次分析師修訂 。 有關手動 OCR 及文字轉錄,請參閱「[媒體處理」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/)。 有關客戶端存取,請參閱 [MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/)。 --- # Telegram · 全文搜尋 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/ 可透過詞形、精確短語、網域及 @用戶名 搜尋已儲存的訊息,結果依最符合的順序排列,且索引與簽名日誌綁定。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 可透過詞形、精確短語、網域及 @用戶名 搜尋已儲存的訊息,結果依最符合的順序排列,且索引與簽名日誌綁定。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) [檔案分析](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/analysis/) · [本地 OCR 與文字轉錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) **預覽。**在「**日誌**」中,於搜尋欄旁選擇「**最佳匹配 · 詞形變體**」。 搜尋結果依 BM25 演算法排序,並會匹配同一詞彙的其他詞形: *搜尋「перевод」*會找到*「переводом」*和*「переводы」*,搜尋*「transfer」*會找到*「transfers」*,而中文 短語則會以不帶空格的形式被檢索。選擇**「最新優先 · 精確文字」**可維持先前 針對整個記錄進行的子字串搜尋。 索引屬衍生資料。它由簽名日誌重建而成,本身從未經過簽名, 也絕不會被導出。原始記錄不會被更改。 **本頁內容** - [搜尋語法](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#search-syntax) - [語言](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#languages) - [索引的位置](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#where-the-index-lives) - [結果與已簽署的日誌](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#results-and-the-signed-journal) - [已識別的文字](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#recognized-text) - [存取](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#access) - [請諮詢檔案庫與 MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#ask-the-archive-and-mcp) - [依賴項](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#dependencies) - [基準測試](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#benchmark) ## 搜尋語法 | 撰寫 | 搜尋結果 | | --- | --- | | `перевод карта` | 同時包含這兩個詞彙的記錄,形式不限 | | `"переводом на карту"` | 請按此順序保留確切的詞句 | | `бонус OR подарок` | 任一詞彙 | | `перевод -казино` | 不含排除詞的記錄 | | `example.com` | 該網域及其子網域,包括隱藏連結和按鈕網址在內 | | `@username`, `t.me/username` | 該帳號的提及與連結,以及其發送的訊息 | | `#tag` | 主題標籤 | | `+79991234567`、一個錢包地址、一個電子郵件地址 | 以文字或連結形式呈現相同內容 | | `from:@username`, `from:123456` | 來自該發送者的訊息 | | `chat:-1001234567890` | 一個聊天室;它只能限制您自身的存取權限 | | `id:42` | 訊息 42 的儲存版本 | | `since:2026-01-01 until:2026-01-31` | 觀察期間;未標示時間的日期代表整日 | | `kind:edited` | 僅限編輯 (`new`, `snapshot`, `edited`, `recovered`) | | `source:ocr`, `source:transcription`, `source:all` | 以識別出的文字取代訊息,或與訊息並存 | 當存在其他單字時,介詞及其他功能詞將被忽略。 混入單字中的相似字母(例如西文字母「*a」*出現在西里爾字母單字中)、全寬 及裝飾性 Unicode 字母,以及不可見字元,均會被標準化。 ## 語言 系統會根據每筆記錄中的腳本和字母來偵測語言: | 腳本 | 匹配 | | --- | --- | | 西里爾字母 | 使用 [pymorphy3](https://github.com/no-plagiarism/pymorphy3) 處理俄語與烏克蘭語詞幹。若未啟用可選的烏克蘭語詞典,則會使用輕量級的烏克蘭語詞幹分析器 | | 拉丁文 | 英文 Snowball 詞幹提取器;忽略音標符號 | | 中文、日文、韓文、泰文、老撾文、高棉文、緬甸文 | 重疊字元對:搜尋時不包含空格。中文查詢會使用 jieba 進行分詞 | | 其他腳本 | 精確詞句 | 烏克蘭語辭典 (`pymorphy3-dicts-uk`) 依據 GPL-3.0 授權發佈,因此 預設不會安裝。請使用 `pip install "tgwitness[uk-dictionary]"`; 索引模組會偵測到新的分析器並自動重新建構。 ## 索引的存放位置 | 模式 | 儲存 | 使用說明 | | --- | --- | --- | | 儲存於磁碟(預設) | `search/fulltext.sqlite3` 位於工作區目錄中 | 大型存檔;重啟後仍能保留資料 | | 僅限記憶體中 | 磁碟上不留任何資料;每次啟動時皆重新建置 | 磁碟上不會存有訊息內容的任何衍生副本 | | 關閉 | 無索引;**最新內容優先 ·** 保留**原始文字** | 最低安裝需求 | 主要管理員可於「**日誌」→「篩選器」→「搜尋索引」**中 為每個工作區選擇模式。 `TGWITNESS_FULLTEXT=disk|memory|off` 並為 未自行設定的空間設定預設值。切換至「記憶體」或「關閉」將刪除該檔案。 索引檔案與日誌享有相同的保護措施:它存放於私有資料 目錄中。該檔案未經加密,且不包含在備份或異地副本之中。 新記錄會在數秒內於後台完成索引;搜尋時也會優先索引 短暫的歷史記錄,因此剛儲存的記錄也能被找到。現有的日誌會在 更新後完成索引,且不會阻塞控制面板;在此之前,搜尋結果涵蓋 已索引的記錄,而日誌會顯示進度。**重建索引時**會從 第一筆記錄開始重新進行。 ``` python -m tgwitness index status --data-dir data/live python -m tgwitness index rebuild --data-dir data/live --json ``` `rebuild` 需停止該面板(否則退場代碼為 3)。若使用 `--json`, 標準輸出僅顯示結果;進度訊息則輸出至標準錯誤。 ## 結果與簽名日誌 索引會儲存其所涵蓋之最後一筆日誌記錄的序號與雜湊值, 並在開啟日誌時將其與日誌內容進行比對。若日誌遭替換、還原或編輯, 則會觸發索引重建。每次回應都會回報此位置,而每次查詢結果皆 透過其序號從簽名日誌中讀取:索引僅決定 應顯示哪些記錄及顯示順序,絕不涉及記錄內容。聊天室存取權限僅適用於 日誌本身的聊天室欄位,不適用於索引內容。 ## 已識別的文字 OCR 結果與轉錄內容仍保留於其加密的原始檔中。其索引僅存在於 記憶體中,並會在辨識任務完成時重新建置。當出現匹配結果時,該結果會顯示於其 `media.saved` 記錄上會顯示一個匹配結果,標記為「機器識別」,並附有引擎、模型及 摘錄內容;該內容絕不會以 Telegram 傳送的文字形式呈現。同一索引亦供 **「搜尋已識別文字**」功能使用,該功能同時仍可匹配純文字子字串。 ## 存取 「聊天室範圍」存取僅會搜尋來自該聊天室的記錄,包括其附件中 被識別的文字。 `chat:` 以及其他篩選條件僅能進一步縮小該資料集範圍。顯示給範圍內存取的索引狀態 會省略日誌總數。僅有主要管理員才能變更 模式或重建索引。 ## 請諮詢檔案庫與 MCP 當索引建立完成後,**查詢功能**將從此索引擷取來源: 選定聊天室中的最佳匹配結果,且每則已儲存的文字僅計入一次。最多會傳送 24 個來源;長篇文字會以匹配內容為界截斷,並標記為「截斷」。 關於近期變更、單則訊息的儲存版本,以及在 索引仍在建立期間的搜尋,均使用先前的按時間順序檢索方式。預覽 畫面會顯示所使用的檢索方法。 MCP 客戶端可呼叫 `search_messages` 透過 `ranked=true` ,並透過 `next_offset`。範圍限定連線僅會接收其對應的聊天內容。 排序分頁最多涵蓋前 1,000 筆結果,無論頁面大小為何。請縮小查詢範圍、聊天室或時間範圍,以檢視更多匹配結果。按「最新優先」搜尋時,系統會在選取各頁面之前,先將訊息、OCR 及轉錄結果依此順序排列。 ## 依賴項 | 套件 | 授權條款 | 原因 | | --- | --- | --- | | pymorphy3、pymorphy3-dicts-ru、DAWG2-Python | MIT | 俄語與烏克蘭語詞幹;詞典於本地載入 | | snowballstemmer | BSD-3 條款 | 英文詞幹,純 Python | | jieba | MIT | 中文查詢分詞,純 Python 實作(僅提供原始碼發行版) | | pymorphy3-dicts-uk(可選) | GPL-3.0 | 完整的烏克蘭語詞典 | SQLite FTS5 需搭配 `unicode61` 分詞器;此功能已包含於 當前 Python 建置版本的 SQLite 中。若未啟用,最佳匹配搜尋將回報該功能不可用。 ## 基準測試 `python tools/bench_fulltext.py --messages 1000000 --work `建立一個包含俄語、烏克蘭語、英語、 中文及日語訊息的確定性簽名日誌,內容涵蓋 200 個聊天室中的連結與識別碼,並建立索引 以及測量典型搜尋所需時間(50 筆結果,7 次執行中的中位數)。 測試環境:Windows 11、Intel Core i9-13900K、128 GB 記憶體、Python 3.12.10、SQLite 3.49.1,資料儲存於 exFAT 磁碟機,分析器 `fulltext-v1+pymorphy3-ru+light-uk+snowball-en`: | 度量 | 結果 | | --- | --- | | 簽名日誌 | 1,000,000 則訊息,1.50 GiB,於 19 分鐘內寫入 | | 從日誌建立索引 | 71 秒,約每秒 14,141 則訊息 | | 索引檔案 | 58 MiB,佔日誌的 3.8% | | 在新記錄生成後立即進行搜尋 | 中位數 8 毫秒,第 95 百分位數 9 毫秒 | | 先前子字串搜尋,同一日誌 | `перевод` 3.2 秒, `银行转账` 2.6 秒, `verify-account.example` 2.6 秒 | | 搜尋 | 匹配的記錄 | 最佳匹配、中位數 | p95 | 最新優先,中位數排序 | | --- | --- | --- | --- | --- | | 常見詞彙及其詞形: `перевод` | 134,403 | 82 毫秒 | 85 毫秒 | 7 毫秒 | | 兩個字: `оплата карта` | 28,996 | 43 毫秒 | 43 毫秒 | 14 毫秒 | | 生僻詞: `розыгрыш подарок` | 28,881 | 42 毫秒 | 47 毫秒 | 13 毫秒 | | 精確短語: `"переказ коштів на картку"` | 不計入 | 35 毫秒 | 36 毫秒 | 6 毫秒 | | 網域及其子網域: `verify-account.example` | 12,435 | 17 毫秒 | 17 毫秒 | 3 毫秒 | | @使用者名稱: `@support_desk_bot` | 10,331 | 15 毫秒 | 16 毫秒 | 3 毫秒 | | 中文(無空格): `银行转账` | 17,691 | 23 毫秒 | 24 毫秒 | 3 毫秒 | | 日文: `リンク` | 16,603 | 23 毫秒 | 25 毫秒 | 3 毫秒 | | 英文詞幹: `withdrawal` | 27,775 | 26 毫秒 | 26 毫秒 | 2 毫秒 | | 或與排除: `бонус OR подарок -казино` | 268,034 | 190 毫秒 | 193 毫秒 | 19 毫秒 | | 聊天過濾器: `chat:-1000000000007 перевод` | 652 | 9 毫秒 | 9 毫秒 | 6 毫秒 | | 時間範圍篩選器: `since:2026-01-01 until:2026-01-31 выплата` | 115,732 | 155 毫秒 | 156 毫秒 | 81 毫秒 | 系統會依排名順序,逐一對候選結果進行字面比對,直到頁面 填滿為止,因此其總數不計入統計。搜尋時間會隨匹配記錄的數量增加而增長; 縮小聊天室範圍或時間區間,可加快廣泛搜尋的速度。合成語料庫重複 使用少量詞彙,因此常見詞彙所匹配的記錄數量遠多於真實聊天記錄。 --- # Telegram · 唯讀 MCP Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/ 將 MCP 客戶端連接到選定的工作區和聊天室,並賦予其具有有效期限且可撤銷的存取權限。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 將 MCP 客戶端連接到選定的工作區和聊天室,並賦予其具有有效期限且可撤銷的存取權限。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [檔案庫整合](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/) ![檔案庫整合](https://phishdestroy.github.io/TgWitness/assets/chapter-integrations.svg) 將分析師客戶端連接到選定的工作區和聊天室。TgWitness **在面板進程的 `/mcp` 端點**提供 **可串流的 HTTP**服務。每個連線皆擁有專屬的 憑證、有效期限及允許使用的工具。MCP 無法發送 Telegram 訊息、變更 設定或修改簽名日誌。這些連線亦可透過 [命令列](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/)操作。 [工作流程指南](https://phishdestroy.github.io/TgWitness/docs/archive/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) **本頁內容** - [安裝與檢查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/#install-and-check) - [建立連線](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/#issue-a-connection) - [連接您的客戶端](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/#connect-your-client) - [Cloudflare Tunnel](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/#cloudflare-tunnel) - [工具與限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/#tools-and-boundaries) ## 安裝與檢查 請使用執行面板的 Python 環境。從原始碼檢出目錄執行: ``` # Windows PowerShell & .\.venv\Scripts\python.exe -m pip install -c deploy/constraints-mcp.txt -e '.[mcp]' & .\.venv\Scripts\python.exe start.py --check ``` ``` # Linux / macOS .venv/bin/python -m pip install -c deploy/constraints-mcp.txt -e '.[mcp]' .venv/bin/python start.py --check ``` 安裝完成後,請使用慣用的資料目錄與啟動引數重新啟動面板。就緒狀態應包含 `[PASS] mcp: streamable-http available`。 **Integrations → MCP** 會顯示執行階段狀態,以及使用該伺服器實際 Python 執行檔的安裝指令。**Re-check** 會在不重新載入頁面的情況下重新整理此狀態;它不會安裝套件或重新啟動伺服器。 此 MCP 擴充套件使用官方的[MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)。`deploy/constraints-mcp.txt` 固定了經過測試的 SDK 及其依賴項。 ## 核發連線 1. 輸入標籤,並選擇允許用戶端讀取的工作區與聊天室。 2. 逐一選擇工具或使用預設組合。系統僅提供已實作的工具。 3. 選擇 1、7、30 或 90 天,或設定介於 1 分鐘至 90 天之間的自訂到期時間。 4. 按下 **Create connection**。權杖會在用戶端設定旁顯示一次。 5. 複製權杖與設定,接著執行 **Check connection**。這會初始化 MCP 並列出授權的工具;**不會讀取任何訊息**。結果會顯示通訊協定版本、工具名稱、數量與耗時。 6. 儲存憑證後按下 **Done**。輪詢期間會保留表單與僅顯示一次的卡片。鎖定面板會清除畫面上顯示的機密資訊。 清單會顯示近期使用情況、最後使用的工具、位址以及過去一分鐘內的請求數。 **Revoke** 會終止存取權限。**Rotate token** 會撤銷舊憑證,並核發具有相同範圍、工具與到期時間的替代權杖;請單次複製該替代權杖。 面板登入權杖與 Telegram 憑證無法作為 MCP 權杖使用。 ## 連接您的用戶端 在面板中選擇用戶端並複製產生的設定。設定檔會使用機密參照或明確的預留位置;權杖需另外複製。 | 用戶端 | 設定 | 連結 | | --- | --- | --- | | Claude 程式碼 | `.mcp.json` | HTTP、`type: "http"`、Bearer 標頭 | | Claude Desktop | `claude_desktop_config.json` | 本機 stdio 橋接器 | | Cursor | `.cursor/mcp.json` | 使用環境變數標頭的 HTTP | | VS Code 本地版 | `.vscode/mcp.json` | 使用密碼 `promptString` 輸入的 HTTP | | Windsurf | `mcp_config.json` | 使用 Bearer 標頭預留位置的 HTTP | | 其他用戶端 | URL 與 Authorization 標頭 | 可串流的 HTTP | TgWitness 使用 Bearer 權杖,不支援 OAuth 自動探索。若用戶端的遠端連接器要求使用 OAuth,請改用本機 stdio 橋接器。針對 VS Code,輸入變數僅適用於 **Local** 執行環境,不會轉發至 Copilot 工作階段。 設定參考文件:[Claude Code](https://code.claude.com/docs/en/mcp)、[Cursor](https://prod.cursor.com/docs/mcp)、[VS Code](https://code.visualstudio.com/docs/agents/reference/mcp-configuration)。 本機橋接器的標準進入點為: ``` python -m tgwitness.mcp_server --url https://your-panel.example/mcp ``` 請使用用戶端本機已安裝 MCP 擴充套件的 Python 環境。在其受保護的環境中設定 `TGWITNESS_MCP_TOKEN`。請勿將憑證寫入指令引數與 URL 中。`tgwitness-mcp` 是相同的進入點。舊的 `tgwitness.mcp_bridge` 模組與 `TGWITNESS_ARCHIVE_TOKEN` 名稱仍作為相容性路徑保留並會發出警告;新的設定請使用 `mcp_server` 與 `TGWITNESS_MCP_TOKEN`。 ## Cloudflare Tunnel 轉發面板的 `/mcp` 路由並保留 Bearer 標頭。以管理員身分開啟 MCP 設定時,會為當次執行註冊面板目前的來源位址(Origin)。 若要在重新啟動後立即擁有穩定的可用位址,請在啟動面板前,將面板的 HTTPS 來源位址設定至 `TGWITNESS_PUBLIC_URL`。 任意的 Host 與轉發標頭不會註冊為受信任的位址。 Host 與 Origin 檢查會拒絕不相關的瀏覽器來源。回應會使用 `Cache-Control: no-store`;授權值絕不會被記錄至日誌中。 `*.trycloudflare.com` 位址是暫時性的。當通道重新啟動並變更主機名稱時,請更新已設定的公開 URL 以及各個用戶端的 MCP URL。針對需要儲存的用戶端設定,請使用穩定的主機名稱。 ## 工具與權限邊界 | 工具 | 讀取內容 | | --- | --- | | `list_workspaces` | 已授權的工作區 | | `list_chats` | 已授權的聊天室 | | `search_messages` | 選定期間內儲存的訊息內容; `ranked=true` 支援[全文搜尋](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/)(包含詞形變化、最佳匹配優先、 `next_offset` 分頁) | | `get_message_versions` | 已擷取的版本與刪除觀測記錄 | | `get_message_context` | 鄰近的已擷取訊息 ID | | `get_journal_event` | 單筆經過清理的記錄及其來源參照 | | `get_capture_status` | 收集狀態、允許的覆蓋記錄以及 `gap_summary`:從未觀察到的訊息編號,按頻道或超級群組以及全帳戶序列分別列出([詳情](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#missing-message-numbers-gap_summary));選擇一個聊天室以查看其列出的缺口 | | `get_activity_stats` | 依 UTC 小時與星期幾分類的訊息、高峰日、編輯與刪除比例、發送者、網域以及 `@handles`,並包含涵蓋範圍([詳情](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/#activity-statistics)) | | `get_messages_by_date` | 在指定 IANA 時區內(`Europe/Kyiv`, `UTC`),依據 Telegram 回報的時間; `from_utc` 並 `until_utc` 並標示計算出的日期(包含夏令時) | | `get_pinned_messages` | 在最新聊天狀態快照中釘選的訊息及其儲存版本,以及即時觀察到的釘選與取消釘選通知 | | `get_chat_stats` | 提供單一聊天室或範圍內所有聊天室中已儲存記錄的簡易計數、首則與末則觀察記錄,以及 `gap_summary`;請在進行大規模讀取前使用此功能 | | `get_topics` | 來自「已儲存主題服務」訊息的論壇主題:標題歷史紀錄、已關閉或已隱藏的主題、已儲存訊息數量 | | `get_media` | 已保存的影像將以縮放後的 JPEG 預覽圖形式呈現(最大 36 KB),並與其 SHA-256 值及 `media.saved` 記錄一併傳回;系統會先將該檔案與其記錄的雜湊值進行比對,其他檔案則僅回傳元資料 | | `export_messages` | 僅限命令列,預設未選取:將觀察記錄以 JSON Lines 格式儲存([詳情](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/#export));不透過 MCP 提供 | 每個工具皆為唯讀模式(`readOnlyHint`) 並宣告輸出架構;超出宣告範圍的欄位將原樣回傳。 `tools/list` 僅返回該連線獲授權的工具。對其他 工具的呼叫將被拒絕。本版本不提供群組情境、事件、術語及回覆鏈相關工具; 因其專屬的情境包後端未包含在內。 每次讀取都會檢查權杖、工具以及工作區/聊天室範圍,包含在資料庫作業完成之後的檢查。限制為每分鐘 60 次請求、每頁 50 筆記錄、每筆結果 64 KiB,以及 8 秒的封存查詢時限。逾時的 MCP 呼叫會回傳工具錯誤,要求縮小時間範圍或降低筆數上限。 訊息結果包含 `untrusted_content: true`、工作區/聊天室/訊息 ID、事件序號、已儲存的雜湊值以及面板連結。原始 Telegram 物件、存取雜湊(access hashes)、工作階段與金鑰均會被省略。文字截斷處會加以標記。編輯、刪除通知與 `missing_on_recheck` 為各自獨立的觀測結果。缺少記錄並不能證明某個事件從未發生。 請將擷取訊息內的指示視為證據,切勿將其作為用戶端指令執行。唯讀存取權限可防止封存內容遭竄改;但用戶端仍可保留其獲准讀取的內容。雜湊值用於識別已儲存的記錄並支援完整性檢查;它們無法證明 Telegram 的作者身分或擷取內容的完整性。 --- # Telegram · 命令列 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/ 可透過腳本和代理程式進行搜尋、讀取上下文、統計活動次數,並匯出已儲存的訊息,具備 --json 輸出格式、穩定的退出代碼,以及範圍限定的唯讀憑證。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 可透過腳本和代理程式進行搜尋、讀取上下文、統計活動次數,並匯出已儲存的訊息,具備 --json 輸出格式、穩定的退出代碼,以及範圍限定的唯讀憑證。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![檔案庫整合](https://phishdestroy.github.io/TgWitness/assets/chapter-integrations.svg) [唯讀 MCP](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/mcp/) · [全文搜尋](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) **預覽。** `tgwitness search`, `context`, `messages`, `stats` 以及 `export` 讀取 已儲存的觀察記錄,供腳本及 AI 代理程式使用。該工具無法向 Telegram 發送任何內容、變更設定或修改簽名日誌。 當 `--json`,標準輸出(stdout)會傳輸精確一個 JSON 文件(`export` 寫入 JSON Lines)。 進度、提示與錯誤訊息將輸出至 stderr。退出代碼保持不變: | 程式碼 | 含義 | | --- | --- | | `0` | 成功,包括空結果 | | `1` | 失敗:無法存取面板、資料無法讀取、匯出中斷 | | `2` | 使用錯誤或無效請求:日期格式錯誤、未知選項、搜尋索引未啟用 | | `3` | 目前無法使用:工作區已在運行的面板中開啟,或面板要求稍後重試(速率限制、超時) | | `4` | 存取遭拒:代幣遺失、過期或遭撤銷、聊天室超出權限範圍,或該工具不允許執行此操作 | ## 兩種閱讀方式 **透過控制面板(`--url`)。**此指令使用與 MCP 相同的範圍限定存檔 API。請在**「整合」→「MCP」**中建立連線:選擇工作區與聊天室、 工具及有效期限,然後複製一次權杖。此連線為唯讀模式,僅限 於所選的聊天室,每分鐘請求次數上限為 60 次,且可隨時撤銷或 輪替。控制面板的登入權杖及 Telegram 憑證在此處無法使用。 ``` export TGWITNESS_URL=https://panel.example.org # default http://127.0.0.1:8787 export TGWITNESS_MCP_TOKEN=tgw_mcp_... # or --token-file path tgwitness search 'перевод карта' --json ``` 遠端控制面板需使用 HTTPS;僅在以下情況下接受明文 HTTP: `127.0.0.1`, `localhost` 和 `::1`。代理伺服器環境變數將被忽略,且不接受 重定向,因此令牌僅會傳送至您指定的地址。 **直接從已停止的工作區(`--data-dir`)**讀取**。**以 完全本地存取權限讀取資料目錄,無需憑證。請在資料目錄的副本上使用,或於 資料收集停止時使用。簽名記錄絕不會被更改;如同控制面板,開啟 工作區可能會將其衍生的索引更新至最新狀態。當控制面板已開啟該工作區時,此指令會以 代碼 `3`;請改透過面板進行讀取。若未指定 `--data-dir`, `TGWITNESS_DATA`, `./data/live` ,則會使用執行該指令之安裝環境的資料目錄。 `--workspace ID` 選取工作區(預設 `default`). `tgwitness messages --workspaces` 列出您有權限閱讀的工作區。 ## 指令 | 指令 | 結果 | | --- | --- | | `tgwitness search QUERY [--chat ID] [--since] [--until] [--any] [--limit N] [--offset N]` | 優先顯示最符合的結果,包含詞形變化、加引號的完整短語、網域及 `@username` ([語法](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#search-syntax)) | | `tgwitness search QUERY --exact [--before SEQ]` | 精確文字,最新內容優先,不包含索引 | | `tgwitness context CHAT_ID MESSAGE_ID` | 前後各十則訊息 ID 範圍內的已儲存訊息 | | `tgwitness messages` | 可供閱讀的聊天紀錄 | | `tgwitness messages CHAT_ID [--since] [--until] [--before SEQ]` | 聊天室中已儲存的訊息,最新訊息排在最前 | | `tgwitness messages CHAT_ID --message ID` | 每則訊息的所有儲存版本及刪除紀錄 | | `tgwitness stats [--chat ID] [--sender ID] [--since] [--until] [--top N]` | 活動統計資料如下 | | `tgwitness export [--chat ID] [--since] [--until] [--output FILE]` | 將觀察記錄以 JSON Lines 格式依日誌順序儲存 | 日期格式為 `2026-10-01` (UTC 午夜)或附有時區的 ISO 時間格式, `2026-10-01T09:00+03:00`。關於 `search`, `messages` 及 `export` ,它們代表 觀察時間。每個頁面最多可容納 50 筆記錄:請遵循 `next_offset` (`--offset`) 進行 排序搜尋,並 `next_before` (`--before`) 其他功能。 排序搜尋結果上限為 1,000 筆。最後一頁的結果數量可能少於 `--limit`;若存在更多符合條件的觀察結果,請縮小查詢範圍、聊天室或時間範圍。 每則訊息結果皆包含 `untrusted_content: true`工作區、聊天室及 訊息 ID、日誌序號、儲存紀錄的雜湊值,以及一個面板連結。編輯、 刪除通知與 `missing_on_recheck` 均為獨立的記錄。若某項記錄缺失 ,並不代表該事件從未發生。 ### 活動統計 `stats` 統計特定聊天室、特定發送者或範圍內所有聊天室中已儲存的觀察記錄數量: - 按 UTC 小時及星期幾(以星期一為起點)分類的訊息;最繁忙的小時與日子; - 已編輯、刪除及 `missing_on_recheck` 分享; - 發訊者及其訊息數量,以及第一則與最後一則訊息的時間; - 最常出現的網域以及 `@handles`,在所有 儲存的版本中,每則訊息僅計數一次; - 涵蓋範圍: `coverage.gap` 記錄,以及(若要存取整個工作區) 未接收到收集器心跳訊號的期間(`collector_liveness`). 該時間段選取自**Telegram 回報的訊息時間**。小時數與星期數可 協助估算發訊者的時區;但無法據此確定時區。相關數據是根據 請求從日誌中計算得出,並不會儲存。若您的存取範圍涵蓋整個工作區,每個結果會標示其 所涵蓋的日誌起始點。透過 控制面板瀏覽五秒後,或 `--timeout` 本地(預設 30 秒)後,讀取即停止;此時 `complete` 的值為 false,且 `partial` 會標示出第一筆尚未讀取的記錄。在此情況下,僅會 計算最新記錄的數量。 ### 匯出 `export` 每筆儲存的觀察記錄(新訊息、快照、 編輯、復原訊息、刪除通知、 `missing_on_recheck` 及已儲存的媒體 記錄),並依日誌順序排列。每行皆包含與其他結果相同的欄位,並附有 完整內容。若 `--output`,檔案將以 `.partial` 名稱下寫入, 並僅在面板完成記錄後才重新命名;若匯出過程中被中斷,則不會產生 檔案,並以代碼 `1`. `--output` 絕不會覆寫現有檔案。若使用 `--output` 和 `--json`,標準輸出將顯示摘要:記錄數、最後的日誌 序列,以及(若為整個工作區存取)日誌頭。 透過控制面板進行匯出時,需具備允許**「匯出訊息」 (僅限命令列)**的連線;此選項預設為未勾選狀態。此檔案僅為工作副本,並非證據:若需可驗證的 移交,請使用「**匯出」**區段中的簽名匯出檔,該檔 `python -m tgwitness.verify`會進行驗證。 該面板在輸出每筆記錄(包括完成 記錄)之前,會重新檢查存取權限。若存取權限已被撤銷或過期,將導致匯出不完整。延遲頁面讀取 會與其他查詢共享存檔工作程序的限制,且設有等待時間上限。 ## 代理技能 [`.agents/skills/tgwitness-cli/SKILL.md`](https://github.com/phishdestroy/TgWitness/blob/main/.agents/skills/tgwitness-cli/SKILL.md) 說明代理程式如何使用這些指令、如何引用記錄,以及如何處理 擷取的文字。讀取 `.agents/skills` 需從儲存庫 的檢出版本中載入該檔案。若使用 Claude Code,請複製 `tgwitness-cli` 資料夾複製到 `.claude/skills/` 您的專案中,或 `~/.claude/skills/`. ## MCP 與命令列介面 兩者均採用相同的連線方式、範圍檢查及限制。MCP 的結果限制為 一個 64 KiB 的頁面,因此 MCP 不提供批量匯出功能;其透過命令列進行串流輸出。 `get_activity_stats` 兩者皆可使用此功能。 --- # Telegram · 本地 OCR 與文字轉錄 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/media-analysis/ 透過本地工作程序識別擷取的圖像與音訊;並將衍生的文字與其原始檔案保持關聯。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 透過本地工作程序識別擷取的圖像與音訊;並將衍生的文字與其原始檔案保持關聯。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) [工作流程指南](https://phishdestroy.github.io/TgWitness/docs/archive/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) 開啟一份 `media.saved` 日誌記錄,選擇「**識別附件**」,然後在「**查詢存檔」**下選取 OCR 或轉錄。處理過程為手動且在本地進行。 本工具不提供雲端媒體模式或自動上傳功能。原始附件位元組與 `media_sha256` 均保持不變;辨識出的文字會明確標示為機器 辨識結果,並與來源雜湊值、引擎/模型版本、 語言、參數及完成時間分開儲存。轉錄內容會保留原始的時間戳記。 請使用**「搜尋已識別文字」**功能及 OCR/文字轉錄 篩選器來搜尋這些結果,或選擇已識別文字作為「**日誌**最佳匹配搜尋」的來源。 這兩種方式皆透過[記憶體中的索引](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#recognized-text)來匹配詞形。這 是一種獨立的衍生資料搜尋;它不會在未經提示的情況下將機器識別結果 轉換為原始 Telegram 文字,也不會將其新增至已簽署的事件中。 ## 設定可選的工作程序 第 1 版需要配備本地 Docker 守護程式的 Linux 主機。Windows 系統 可於具備獨立本地守護程式的 Linux 虛擬機器/WSL 環境中運行 TgWitness。 該面板絕不會自行解碼任何未經信任的附件。 ``` docker build -f deploy/media-worker/Dockerfile -t tgwitness-media:local . export TGWITNESS_MEDIA_IMAGE=tgwitness-media:local ``` 請在 TgWitness 服務環境中設定這些變數,並重新啟動服務。 守護程序套接字預設為 `/var/run/docker.sock`;無 root 權限的部署可設定為 `TGWITNESS_DOCKER_SOCKET`。工作程序會明確使用該 Unix 套接字, 而非遠端 Docker 環境。請勿向控制面板使用者公開 Docker API,亦請勿將 其套接字掛載至識別容器內。 若需進行文字轉錄,請另行安裝與 CTranslate2 相容的 Whisper 模型, 然後將 `TGWITNESS_WHISPER_MODEL_DIR` 設定為該模型的目錄。工作節點會透過 `local_files_only=True` 載入該模型;所選模型與輸入資料將以唯讀方式掛載。 請參閱引擎的[模型載入文件](https://github.com/SYSTRAN/faster-whisper)。 隨附的 OCR 映像檔包含英文和俄文的訓練資料。如有需要,可將其他 語言整合至您的映像檔中;語言代碼遵循 [Tesseract 的命令列介面規範](https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html)。 處理過程中不會載入任何模型。建置/下載設定程序可能會使用網路; 每個實際的辨識容器均已停用網路連線。請在啟用網路前安裝映像檔; 執行時使用 `--pull=never`。 ## 限制與資料復原 該容器以無特權使用者身分運行,具備唯讀 root 權限、已降級 的權能、`no-new-privileges` 模式、1 個 CPU、2 GiB 記憶體、PID 限制以及受限的 臨時檔案系統。僅掛載所選檔案的驗證副本及可選的 模型目錄。 收集器的資料庫、儲存庫及工作階段 均未掛載。[Docker 執行時參數會](https://docs.docker.com/reference/cli/docker/container/run/) 強制執行這些限制;此仍屬容器邊界,而非硬體隔區。 檔案大小上限為 50 MiB,圖片上限為 2,000 萬像素,音訊上限為 30 分鐘( 且須為已知時長),處理時間上限為 5 分鐘。每次僅能執行一個工作程序, 每個工作區最多可排隊或執行 20 個工作,並保留 100 個工作。 「取消」會停止容器;「重試」會建立一個與先前嘗試相關聯的新工作。 中斷的工作在重新啟動後會被標記。當模型 無法符合設定的限制時,處理可能會失敗;若未進行隔離,系統不會在無提示的情況下繼續執行。 --- # Telegram · 外發 Webhook Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/webhooks/ 將特定範圍的事件傳送至 HTTPS 接收端,並附帶 HMAC 簽名、重試機制及傳送狀態。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 將特定範圍的事件傳送至 HTTPS 接收端,並附帶 HMAC 簽名、重試機制及傳送狀態。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [檔案庫整合](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/) ![檔案庫整合](https://phishdestroy.github.io/TgWitness/assets/chapter-integrations.svg) [工作流程指南](https://phishdestroy.github.io/TgWitness/docs/archive/) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Archive-and-Integrations.md) 在所選工作區中,開啟「**整合」→「外發 webhook」**。 新增一個 HTTPS 接收器,選擇「收集器/媒體/匯出」事件,並可選擇針對 新訊息及變更的聊天室。預設情況下不包含訊息內容。啟用摘要功能 將在訊息變更事件中最多新增 1,000 個字元;Telegram 的原始欄位及 憑證絕不會被傳送。 將 HMAC 密鑰複製一次至接收端的受保護設定中。該密鑰 已加密儲存於 TgWitness 的金庫中,且無法透過控制面板檢索。移除 並重新建立目標位置以進行輪替。**向合成**測試佇列**發送**一則 不含聊天內容的測試訊息;刷新傳送狀態以查看結果。 此傳送機制在 Apprise 的基礎上擴展現有的通知迴路。它採用 工作區的外部路由及現有的私有目的地限制。此機制 不提供直接的備用方案或後續重定向。URL 不得包含憑證、 查詢字串或片段;私有地址需啟用伺服器層級的網路 選入機制,而非面板使用者可繞過的設定。 ## 有效載荷與簽名 結構:[`tgwitness.webhook/1`](https://github.com/phishdestroy/TgWitness/blob/main/integrations/webhook.schema.json)。每個有效載荷 均包含 `event_id`、`timestamp`、`workspace`、`type`、`synthetic` 以及計數器。 基於日誌的事件包含其序列號與雜湊值。完整匯出完成及 合成測試屬於傳輸事件,不包含虛構的簽名日誌參考。 Telegram 刪除通知與 `missing_on_recheck` 仍屬不同類型。 `X-TgWitness-Signature` 標頭應為 `t=UNIX_SECONDS,v1=HEX_HMAC_SHA256`。 針對精確的位元組序列 `timestamp + "." + raw_request_body` 計算 HMAC, 並將顯示的密鑰視為 UTF-8 位元組。在解析或處理 訊息正文之前,以恆定時間比對簽名。若時間戳記與 您的系統時間相差超過五分鐘,則予以拒絕。每次傳送嘗試時, 時間戳記都會重新更新。 請將 `event_id` 作為幺半抗變換鍵儲存於持久性儲存裝置中,並在產生副作用前設定原子性唯一 約束。僅憑有效的簽名並不能防止 最近的請求被重播。請至少保留已處理的 ID 至整個 重試時段結束為止;若接收端可重新處理儲存的事件,則應保留更長時間。 ## 重試 傳送作業會在 HTTP 請求前被持久化排入佇列。其採用「至少一次」 的語義:若確認回執遺失或系統重啟,可能會再次傳送具有 相同 ID 的事件。系統會進行八次嘗試,並採用指數退避機制,起始間隔為 15 秒,上限為一小時。成功傳送需獲得 2xx 狀態碼回應。 已耗盡的任務 會留下可見的錯誤訊息;重試結束後,無法保證能成功傳送。 佇列可容納 1,000 筆傳送任務。當佇列已滿時,日誌事件的掃描作業將暫停,並 在釋放出空間後恢復。 無法排入佇列的完整匯出任務 會觸發可見的佇列錯誤。每次通知傳送 最多嘗試五次,並保留最近 100 筆嘗試記錄。移除目的地 也會一併移除其待處理的傳送任務。 ## n8n 範例 匯入[範例工作流程](https://github.com/phishdestroy/TgWitness/blob/main/integrations/n8n-tgwitness.json)。該工作流程目前處於非活躍狀態, 且不包含任何機密資訊或下游動作。 請在 n8n 工作環境中設定 `TGWITNESS_WEBHOOK_SECRET`,允許該環境存取,並為 Code 節點啟用 `crypto` 內建功能。此範例使用 Webhook 節點的 raw-body 選項, 檢查簽名與新鮮度,並確認已驗證的事件。這與 該節點的[文件中所述實作](https://github.com/n8n-io/n8n/blob/master/packages/nodes-base/nodes/Webhook/Webhook.node.ts)方式相符。 在新增 SIEM 寫入或通知之前,請先建立以 `event_id` 作為鍵值的持久性冪等儲存空間。 請根據您選擇傳送的資料,限制 n8n 工作流程的編輯及執行日誌的保留期限。 TgWitness 不會新增任何傳入指令。 --- # Telegram · 公開展示 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/showcase/ 透過會過期且可撤銷的連結,發佈所選公開頻道的已儲存訊息及經簽名的快照。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 透過會過期且可撤銷的連結,發佈所選公開頻道的已儲存訊息及經簽名的快照。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) **「存取 → 公開展示」**會利用現有的 存取憑證系統,建立一個獨立的唯讀頁面。該頁面會讀取安裝程式中儲存的觀察記錄,但不會 為訪客啟動資料收集器、登入 Telegram 或取得頻道。 ## 發佈頁面 1. 請為您想顯示的每個公開頻道儲存一個來源設定檔。該頻道必須 在其最新儲存的設定檔中擁有公開使用者名稱;群組和私人聊天室 則不符合資格。 2. 開放**存取 → 公開展示區**(或 `/showcase-manage.html`)以管理員身分存取。 3. 從最多 16 個工作區中選取頻道,輸入公開頁面的標題,並 選擇連結有效期為 1 天、7 天或 30 天。工作區內的標籤不會 對外公開。最多可包含 64 個頻道。 4. 檢視選取頻道的文字內容以確認是否適合發布,然後點擊**「預覽選取的 記錄**」。此預覽功能採用與訪客頁面相同的伺服器端投影。 5. 點擊**「建立展示連結**」。在連結顯示期間將其複製。請在 另一個瀏覽器中開啟該連結,於分享前預覽收件者的頁面。 該連結的 URL 片段中包含一個存取憑證。頁面在發出 API 請求前會移除該 片段,並將其換成瀏覽器會話。 任何持有該連結的人士皆可開啟所選內容,直至連結過期或被撤銷為止。 新連結允許 100 個同時連線,每個連線最長持續一小時。現有的 存取控制亦可透過 授權 API 實施網址限制與登入次數限制。一般審閱者的存取權限屬於不同模式,仍包含 原始允許的訊息與檔案。 ## 訪客所見內容 | 可見 | 設為私有 | | --- | --- | | 精選的公開頻道名稱、使用者名稱及個人檔案觀察日期 | 帳戶身分、內部工作區標籤及未選中的來源 | | 擷取的文字及每次儲存的編輯內容 | 結構化的發送者 ID、姓名、使用者名稱、電話號碼及個人資料值 | | 刪除記錄(如有)將附帶先前儲存的文字內容 | 附件、頭像、縮圖、檔案名稱及原始資料內容 | | 標示作者/個人檔案或附件已被記錄的標記 | 轉發與回覆的元資料、網路路徑、IP 位址及憑證 | | 選定頻道的事件計數、當前收集開關、心跳訊號與檢查點間隔 | 資料集控制功能與標準證據匯出 API | | 簽名指紋、日誌檢查點與一致性證明 | 簽名金鑰與 Telegram 連線 | **公開訊息的文字內容不會自動匿名化。**訊息中寫入的姓名、提及、電話 號碼或連結仍會保留在該文字內容中。 `Redacted`此規則適用於結構化的作者/個人資料欄位。發布前請檢視實際選取的內容, 包括保留的編輯與刪除部分。 「符合資格」反映的是**最新儲存的來源設定檔**,而非即時查詢 Telegram 的結果。 若後續的設定檔中已無該公開頻道的使用者名稱,新的請求 將排除該頻道。當公開可見性發生變更時,請重新整理來源設定檔。 讀者可能已經儲存了先前收到的內容。 原始的簽名記錄保持不變。顯示的投影會 另行簽名,並包含指向原始記錄的雜湊值。投影 簽名用於驗證顯示的內容;它並非原始事件 對經刪節字節所做的簽名。 ## 檢查簽名與連續性 展開**「指紋與簽名檢查點」**,並下載快照。頁面 重新整理後,下載內容將包含先前的瀏覽器快照,以及兩者日誌邊界之間的一份 Merkle 一致性證明。當頁面可見且顯示其第一頁觀察記錄時,系統會每 分鐘自動重新整理一次。 安裝 TgWitness 後,請在離線狀態下驗證下載的檔案: ``` python -m tgwitness.showcase_verify showcase.json --fingerprint TRUSTED_COLLECTOR_SHA256 ``` 指紋必須來自一個獨立的可信參考來源。若要與 您自行保留的快照進行比對,請使用 `--previous earlier.json`;此操作將覆寫 下載檔案中內嵌的先前快照。當前的證明必須從 該保留的邊界開始。經認證的客戶端可透過 `GET /api/showcase/{workspace_id}?challenge=<32-hex-random>&from_count=`。 若日誌較短,系統將返回 HTTP 409 狀態碼,而非靜默重設邊界。 已簽名的檢查點會提交至**整個收集器**日誌,包括其 記錄數量與不透明的頭部雜湊值。顯示的訊息數量僅適用於 選定的公開頻道。該頁面絕不會列出其他日誌的內容。 這些是事件數量,而非唯一訊息數量。設定描述的是 當前配置,而非每個較早的記錄區間。 簽名與一致性驗證可偵測相對於保留 邊界所發生的變更。它不會獨立重新計算已簽名的計數器、認證 Telegram 來源、證明擷取過程未中斷,亦不會取代獨立見證人。 若需進行此類審查,請使用[證據驗證器](https://github.com/phishdestroy/TgWitness/blob/main/docs/TRUST.md)、 [獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)及[經規模測試的記錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)。 模擬安裝會明確標示為「模擬」。 ## 撤銷或託管該頁面 請在展示管理員中使用**「撤銷」**功能,或透過現有的「**存取權限」**區段來關閉 該連結並終止所有相關連線。當系統偵測到存取已結束時, 訪客將清除已顯示的記錄。每次 請求時都會檢查有效期限與權限。展示權限無法直接轉換為一般面板存取權; 請建立新的權限以變更模式。 透過安裝環境現有的 HTTPS 網址提供此頁面。發佈 連結不會開啟新埠、建立隧道或變更 DNS。HTML 及 API 仍保留在用戶的安裝環境中。展示網站的訪客無法透過此存取權限使用一般的 訊息、個人檔案、媒體、匯出或管理 API。 --- # Telegram · 證據的運作方式 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/ 文中以驗證者實際使用的精確公式,詳盡闡述了雜湊鏈、簽名、檢查點及見證者的運作原理。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 文中以驗證者實際使用的精確公式,詳盡闡述了雜湊鏈、簽名、檢查點及見證者的運作原理。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [證據與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) TgWitness 會保存收集帳戶所觀察到的內容,將這些觀察結果 串聯成一份經簽署的日誌,並允許其他人透過可信 金鑰及先前保留的檢查點,對匯出內容進行驗證。 [本地文件網站](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/PUBLISHING.md#preview-the-website-locally)新增了 位於 `/docs/concepts/` 的互動式範例、位於 `/docs/witness/` 的檢查點決策探索工具,以及關於「[案件看板](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)」、「 [報告設計](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/)」與「[移交摘錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#handover-extract)」的操作指南。 所有範例訊息、 計數值及延遲時間均為虛構。鏈式沙盒中的雜湊值是透過 瀏覽器中的 SHA-256 演算法計算得出。任何資料均不會傳送至 Telegram。 **本頁內容** - [訊息會隨時間變化;觀察結果則會累積](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#a-message-changes-observations-accumulate) - [哈希值的涵蓋範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#what-a-hash-covers) - [早期檢查點新增的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#what-an-earlier-checkpoint-adds) - [見證的歸屬位置](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#where-a-witness-belongs) - [針對已知操作進行傳遞測試](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#test-delivery-against-known-actions) - [選擇工作流程](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/#pick-a-workflow) ## 訊息隨之改變;觀察結果不斷累積 序列圖 · Telegram → 收集器: 新訊息:10:00 見面; 收集器 → 經簽署的日誌: 追加訊息.new; Telegram → 收集器: 編輯:11:00 見面; 收集器 → 經簽署的日誌: 追加訊息.已編輯; Telegram → 收集器: 刪除通知; 收集器 → 經簽署的日誌: 追加訊息.已刪除; 關於 經簽署的日誌 的說明: 原始訊息、編輯紀錄及刪除紀錄均予以保留 · Telegram · 收集器 · 經簽署的日誌 · 新訊息:10:00 見面 · 追加訊息.new · 編輯:11:00 見面 · 追加訊息.已編輯 · 刪除通知 · 追加訊息.已刪除 · 原始訊息、編輯紀錄及刪除紀錄均予以保留 **圖表轉為文字** 1. Telegram → 收集器: 新訊息:10:00 見面 2. 收集器 → 經簽署的日誌: 追加訊息.new 3. Telegram → 收集器: 編輯:11:00 見面 4. 收集器 → 經簽署的日誌: 追加訊息.已編輯 5. Telegram → 收集器: 刪除通知 6. 收集器 → 經簽署的日誌: 追加訊息.已刪除 7. 關於 經簽署的日誌 的說明: 原始訊息、編輯紀錄及刪除紀錄均予以保留 此簡化流程假設 Telegram 已成功傳送每則更新,且選定的 帳戶能夠看到該更新。操作事件也會記錄在日誌中。刪除通知 不會提供刪除者身分或確切的刪除時間。重複傳送的訊息 會被視為獨立的觀察記錄;日誌中不會進行全域性的重複資料抑制。 ## 哈希值涵蓋的範圍 ![觀察、編碼、雜湊與簽名:每個新事件皆包含前一個事件的雜湊值。](https://phishdestroy.github.io/TgWitness/assets/evidence-chain-animated.svg) 從內到外解讀此公式:**C** 將九個欄位轉換為精確的位元組; **SHA-256** 產生其摘要;**hex** 則是儲存該摘要的方式。前一個 雜湊值已包含在事件中。**unhex** 將儲存的雜湊值還原為 32 位元組,供 Ed25519 進行簽名。 [靜態鏈圖](https://github.com/phishdestroy/TgWitness/blob/main/docs/assets/presentation/evidence-chain-static.svg) 設 C(ei) 為九個事件欄位的標準 UTF-8 JSON 格式。第一個 `previous_hash` 由 64 個零字元組成。每個後續記錄皆包含前一個 記錄的十六進位雜湊值: hi = hex(SHA256(C(ei))) σi = Ed25519.Sign(sk,unhex(hi)) 該簽名涵蓋 32 位元組的原始摘要。雜湊輸入內容精確包含 `seq`、`observed_at`、`source_at`、`kind`、`chat_id`、`message_id`、`actor_id`、 `payload` 及 `previous_hash`。物件金鑰已排序;省略空白字元與 ASCII 轉義字元;NaN 與無窮大值將被排除。請參閱 [確切的編碼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#event-canonicalization)方式。 流程圖 · 64 個零字元 → 記錄 1 / 雜湊值 h1; 記錄 1 / 雜湊值 h1 → 記錄 2 包含 h1 / hash h2; 記錄 2 包含 h1 / hash h2 → 記錄 3 包含 h2 / 雜湊 h3; 記錄 3 包含 h2 / 雜湊 h3 → 簽名檢查點:計數 3,標題 h3 (保留於其他位置) · 64 個零字元 · 記錄 1 / 雜湊值 h1 · 記錄 2 包含 h1 / hashh2 · 記錄 3 包含 h2 / 雜湊h3 · 簽名檢查點:計數3,標題 h3 · 保留於其他位置 **圖表轉為文字** 1. 64 個零字元 → 記錄 1 / 雜湊值 h1 2. 記錄 1 / 雜湊值 h1 → 記錄 2 包含 h1 / hash h2 3. 記錄 2 包含 h1 / hash h2 → 記錄 3 包含 h2 / 雜湊 h3 4. 記錄 3 包含 h2 / 雜湊 h3 → 簽名檢查點:計數 3,標題 h3 (保留於其他位置) | 改為提供的日誌 | 偵測依據 | | --- | --- | | 修改記錄 2 同時保留其已儲存的雜湊值 | 重新計算的事件雜湊值有所不同;其簽名已不再涵蓋該變更後的事件 | | 重建經竄改的記錄及其後續所有雜湊值 | 原始簽名驗證失敗;位於受影響邊界的保留檢查點結果亦不一致 | | 移除結尾部分,但保留剩餘的前綴不變 | 在所提供的前綴之後,一個較早保留的檢查點顯示,匯出內容過短 | | 使用另一把金鑰重新簽署替換日誌 | 透過獨立受信的金鑰指紋,可駁斥身分替換行為 | ![修改已儲存的欄位會改變其摘要;重新計算雜湊值並不會恢復原始的簽名。](https://phishdestroy.github.io/TgWitness/assets/evidence-tamper-animated.svg) **請試著對第 2 筆記錄進行驗證:**將已儲存事件中的 `Meet at 11:00` 改為 `Meet at 12:00`。 其重新計算後的雜湊值將不再匹配。重新計算後續鏈 雖可修復其連結,但無法讓原始簽名涵蓋新的摘要。 相較之下,經觀察到的 Telegram 編輯操作,則會成為新的日誌記錄。 [靜態變更圖](https://github.com/phishdestroy/TgWitness/blob/main/docs/assets/presentation/evidence-tamper-static.svg) 僅憑哈希連結並無法防止他人重新計算替代鏈。 信任源自於透過獨立可信的金鑰驗證簽名, 並與儲存於收集器外部的參考資料進行比對。 ## 先前檢查點新增的內容 ![保留計數 3 及 h3 標題;後續匯出的 4 筆記錄將在第 3 個位置進行核對。](https://phishdestroy.github.io/TgWitness/assets/evidence-checkpoint-animated.svg) **當日誌持續增長時,參考點保持不變。**若檢查點顯示 「3 筆記錄,頭部 h3」,則包含四筆記錄的匯出檔可透過匹配第 3 位置的 h3 而通過驗證。 其最新頭部為 h4,預期會有所不同。僅包含兩筆記錄的匯出檔將驗證失敗。 [靜態檢查點圖示](https://github.com/phishdestroy/TgWitness/blob/main/docs/assets/presentation/evidence-checkpoint-static.svg) 在驗證檢查點簽名後,需執行以下操作: Nexport ≥ Ncheckpoint and hexport[Ncheckpoint] = Hcheckpoint 匯出資料可能跨越檢查點。其內容必須在保留的邊界處保持一致。 真正的驗證者還會檢查每個事件的順序、前一個連結、雜湊值及 簽名。若僅比較最終儲存的頭部資料,將無法察覺內部 記錄遭篡改的情況,因為其儲存的雜湊值並未隨之更新。 ## 證人的歸屬之地 流程圖 · 收集器 / 帳戶會話 / 金鑰 A → 唯讀檢查點端點; Witness / 固定收集器金鑰 / 自有金鑰 B → 獨立的簽名證據日誌; Witness / 固定收集器金鑰 / 自有金鑰 B → 唯讀檢查點端點 (申請審核); 唯讀檢查點端點 → Witness / 固定收集器金鑰 / 自有金鑰 B (經簽署的回答); Witness / 固定收集器金鑰 / 自有金鑰 B → 包含經簽署的 TGW1 貼文的頻道 (Bot API / 專屬代幣) · 主機 A · 主機 B · 收集器 / 帳戶會話 / 金鑰 A · 唯讀檢查點端點 · Witness / 固定收集器金鑰 /自有金鑰 B · 獨立的簽名證據日誌 · 包含經簽署的 TGW1貼文的頻道 · 申請審核 · 經簽署的回答 · Bot API / 專屬代幣 **圖表轉為文字** 1. 收集器 / 帳戶會話 / 金鑰 A → 唯讀檢查點端點 2. Witness / 固定收集器金鑰 / 自有金鑰 B → 獨立的簽名證據日誌 3. Witness / 固定收集器金鑰 / 自有金鑰 B → 唯讀檢查點端點 (申請審核) 4. 唯讀檢查點端點 → Witness / 固定收集器金鑰 / 自有金鑰 B (經簽署的回答) 5. Witness / 固定收集器金鑰 / 自有金鑰 B → 包含經簽署的 TGW1 貼文的頻道 (Bot API / 專屬代幣) 該見證系統會記錄回滾、相同計數下的不同頭部、變更的金鑰、 無效答案及缺失的回應。僅憑計數增加,並不能證明 所有較早的記錄均未被修改;請將匯出內容與保留的 檢查點進行比對。將見證系統部署於另一台主機,可避免受收集器主機中斷的影響; 由獨立的操作員負責,則能提供額外的獨立性。 「見證者」會對收集器回報的日誌狀態進行驗證。請使用受控 傳送測試來測量哪些 Telegram 操作已送達至收集帳戶。 請參閱[見證者設定](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)。 ## 針對已知操作進行測試 請使用受控群組、獨立的收集帳號以及新的標記。有目的地發送、 編輯及刪除訊息,並在各階段之間檢查擷取狀況。在檢視結果前,請先定義預期 的操作行為及截止條件。 R = |observed∩expected| / |expected| Δ t = treceipt - taction 僅計入與預期動作相符的項目;重複的收據不會增加 分子。分母必須不為零。若缺少收據,則無法測量 延遲。請記錄時間不確定性;請使用您自行控制的刪除動作時間, 因為 Telegram 並未提供確切的刪除時間。 例如 5/6 (83.3%) 這樣的結果描述的是測試動作,而非所有 Telegram 流量的完整性。 ## 選擇工作流程 [完整的調查流程指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/)將以某起事件為例, 涵蓋頻道、群組、機器人及私人聊天室等情境: 1. 在專用的蒐集帳號上,啟用「整個帳號」調查模式,並 清點可存取的聊天室。針對主帳號,可選用特定聊天室或資料夾。 2. 可取得日誌快照、各聊天室的完整歷史紀錄以及已保存的附件。 3. 將即時變更及任何有意的面板互動連同其交易憑證一併保留。 4. 透過引用的記錄及用戶檔案,追蹤數值發送者 ID、回覆關係、重複收件者及檔案 雜湊值。 5. 在「案件看板」中新增與來源連結的註解及彙整項目。重建跨聊天室 的時間軸,其中須包含時間戳記及明確的空白區段。 6. 在保持原始來源與金鑰獨立的前提下,比較其他帳戶的工作區。 7. 彙整並驗證經簽署的日誌、使用者檔案及歷史記錄匯出檔,並附上案件筆記。 網站的 `/docs/cases/` 指南包含互動式案件地圖,並針對 聊天機器人爭議、已刪除訊息及參與者更名等情況提供不同處理方式。Case Board 將筆記與資料集存放在工作區內。群組匯出功能會分別彙整 各工作區的資料包;跨工作區的關聯分析與整合時間軸仍屬 分析人員的工作範疇。 [已完成驗證與待完成工作](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/) · [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#investigation-handoff) · [從一個帳戶開始](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/quickstart/) --- # Telegram · 報告配置與驗證 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/ 報告篩選器、八種設計範本、內容預設值、已儲存的變更歷史紀錄,以及簽署後匯出檔案中所包含的評估結果。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 報告篩選器、八種設計範本、內容預設值、已儲存的變更歷史紀錄,以及簽署後匯出檔案中所包含的評估結果。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [調查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ![調查](https://phishdestroy.github.io/TgWitness/assets/chapter-investigate.svg) 將選定的觀察結果轉化為敘述案件的易讀報告:包含案件問題、 範圍、已儲存的變更、圖表、調查結果及來源參考。每份報告皆提供 收件者一種方式,用以核對所交付的資料,並檢視其蒐集 範圍。 「**信任基礎與限制**」章節會出現在日誌、移交、聊天、 帳戶及分享報告中。日誌與移交的 PDF 檔案採用與 其簽署過的 ``report.json`` 相同的評估結果。ZIP 清單在簽署過的 清單中包含 ``case_assessment``。此評估結果會隨同匯出的資料一併傳遞。原始 觀察結果則保留其現有的簽名。 ## 文件格式與閱讀順序 ### 報告工作室 開啟**「匯出」→「設定」並預覽**。依序操作**「資料」→「設計與內容」→「預覽**」: 1. 可使用整個工作區,或選擇聊天室、發送者,並包含 UTC 觀察 日期及事件類型。載入目錄以搜尋聊天室和發送者,或直接輸入 其 Telegram ID。發送者篩選器會比對已記錄的發送者 ID;若刪除 通知未標示發送者,則不會與發送者篩選器匹配。 2. 選擇一個頁面設計,接著選取圖表、參與者標籤、對話紀錄以及 您撰寫的調查結果。變更設計時,這些選項將予以保留。 3. 建立預覽畫面。該畫面會顯示實際計數、活動狀況、參與者、範例 紀錄、已儲存的變更以及缺失的訊息編號範圍。若變更選項 ,預覽畫面將標示為過時。請在下載 HTML、簽名 PDF、 簽名 JSON 或證據 ZIP 檔案前先儲存。 資料預覽所統計的是完整的穩定日誌前綴,而非初始樣本。 僅顯示的樣本列與長清單會被截斷;其省略的計數會 一併顯示。後續匯出將擷取新的穩定快照,因此持續的蒐集作業可能會 增加相關數字。範圍、計數及來源身分均包含於 經簽署的報告中。開啟或預覽表單並不會將其儲存。 **司法管轄權指引。** 在「文件詳情」下,開啟「**司法管轄權指引 · 可選」** 以選擇司法管轄區及民事/商業或刑事程序。附錄包含 法律依據、來源連結、準備說明及研究進度。 以當地語言 撰寫的資料蒐集保障措施摘要與說明屬可選項目。預設情況下未 選取任何司法管轄區。這些選項屬於工作區範疇,且不包含在 儲存的版面配置及隱含的分享與複製預設設定中。請參閱 [預設設定、支援的報告類型及研究限制](https://github.com/phishdestroy/TgWitness/blob/main/docs/JURISDICTION_GUIDANCE.md) 。 **請選擇收件者的副本。** 圖表和對話紀錄均採用所選的紀錄。 完整性、保管與涵蓋範圍描述了完整的原始日誌。證據 ZIP 檔案 包含其原始紀錄及附件。當收件者僅需接收經選取且獲准的資料時,請採用[精簡版移交流程](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#handover-extract) 。 ### 讀取編輯、刪除及缺失的 ID 編輯操作會顯示儲存前的**「**原始**」**與**「修改後」**文字,並標示出變更的 詞彙。刪除操作則會顯示通知出現前最後儲存的版本。若未擷取較早的 內容,報告中會明確註明。當您僅篩選編輯或刪除操作時, 先前版本仍會作為明確標示的上下文,在 篩選器之外保留供查閱。 無關的訊息不會被加入這些歷史紀錄中。 **未觀察到的訊息 ID** 是指在選定的聊天室中已知編號與 根據日期衍生的 ID 範圍之間存在的空缺。在將某個 編號宣告為未觀察到之前,必須先檢查所有已知的來源記錄:篩除另一位發送者、事件類型或日期, 均不會造成虛假的空缺。 相鄰的已儲存訊息會被標記為「上下文」。缺少 一個數字並不能證明該訊息曾經存在或已被刪除;刪除通知 與重新檢查失敗仍屬不同的事件類型。 ### 選擇設計 提供八種頁面設計,適用於日誌、單一聊天記錄的 HTML 及簽名 PDF 報告。這些設計使用相同的記錄資料與計算結果,僅在封面、 排版、章節標題、表格及行距方面有所不同。 | 設計 | 行文風格 | | --- | --- | | 經典版 | 一份採用深色封面且各章節編有編號的傳統檔案夾。 | | 編輯說明 | 採用帶框的襯線體標題頁、寬邊距及窄版章節欄。 | | 簡報 | 採用簡潔的封面設計,書脊為海軍藍色,標題簡短,表格排列緊湊。 | | 分析 | 採用問卷式封面、模組化圖表版面及等寬字體的圖表。 | | 技術 | 包含橫線登記表、編號參考欄及精確的比對表格。 | | 概述 | 全景式封面、寬敞的版面間距以及醒目的摘要圖表。 | | 閱讀系列 | 內容架構包含側邊欄,並將「調查結果」、「範圍」、「變更」及「觀察日誌」等章節分組呈現。 | | 帳本與保證金 | 章節應採用編號形式並留有寬邊距,圖表須精確呈現,且訊息紀錄應獨立成篇。 | 設計會依工作區分別儲存,並記錄於已簽署的匯出清單中。 HTML 支援離線使用、淺色與深色主題,並能適應窄螢幕 及由右至左的語言。原生 PDF 採用內建字型;編輯版面設計 包含 Noto Serif 字型,並受其內建的 SIL 開放字型授權條款規範。閱讀系列以及 「帳本與邊距」功能亦適用於帳戶概覽、帳戶聊天室及分享副本。 若需處理中文、日文及韓文的 PDF 檔案,伺服器上需安裝合適的字型, 例如 Noto Sans CJK,該字型需安裝於系統全域,或放置於 `TGWITNESS_FONT_DIR` 目錄中。 若無法取得該字型,ZIP 檔案將保留 HTML 及 JSON 格式的報告。 這兩種設計包含無需 JavaScript 即可閱讀的日誌。針對大型 匯出檔案,此檢視畫面在 8 MiB 的輸入配額內最多可顯示 500 筆完整紀錄; 報告會標示此限制,並提供連結至完整檢視器及原始紀錄。 帳戶目錄與關係索引描述的是同一份閱讀樣本, 而非所有參與者。完整日誌圖表則維持其獨立標明的範圍。 ### 選擇內容 | 目錄預設 | 預設包含 | | --- | --- | | 案件檔案 | 活動、觀察時間、參與者、聊天內容及對話紀錄。 | | 簡報 | 活動概覽,不含參與者排名或對話紀錄。 | | 活動審查 | 活動、觀察時間、參與者、聊天內容及其組成,並附上來源參考及確切數字。 | | 自訂報告 | 請自行組合圖表、對話紀錄與預覽內容。 | 變更預設值時,您的設計、案件詳情及書面分析將予以保留。完整性 檢查、涵蓋範圍、限制事項及驗證說明將保留於每個設計中。 當圖表或文字記錄被隱藏時,ZIP 檔案中的原始記錄將保持不變。 可選的「**檢查筆記**」包含報告作者撰寫的提問、方法、發現結果及 結論。在發現結果中須引用原始檔案及記錄編號。 簽名機制將這些作者陳述與報告一併保存;原始觀察結果及作者的詮釋仍可被識別。 簡化版交接文件會省略這些私人筆記及完整的病歷圖表。圖表與 檢查選項同樣適用於病歷報告。 可篩選特定時間段的活動、UTC 工作日/小時熱力圖、參與者排名、聊天 排名及記錄組成。選擇 5 至 30 個排名組別,以及中立的參與者 別名或帳號 ID。未知發送者與其餘參與者將顯示於 獨立的行中。別名僅影響圖表顯示;原始記錄仍包含其真實身分。 設計預覽會根據未儲存的草稿進行更新,並採用正式版封面、檢視及 圖表元件,僅限於前 50,000 筆來源記錄中的匹配項目。下方的資料預覽 則會計算完整的選取範圍。此預覽明確 標示為「未簽署」,且不會保留編輯內容。「封面」與「圖表」按鈕可切換其區段。 這並非完整的 PDF 預覽。**「儲存報告設定」**會將選項套用至 未來的匯出;現有的已簽署檔案則不可變更。PDF 會使用所選的封面、 排版、章節佈局,以及與 HTML 和已簽署 JSON 相同的彙總項目。 信任評估、涵蓋範圍限制及驗證說明仍須保留。 隱藏圖表或可讀文字記錄並不會從 ZIP 檔案中移除權威來源資料行; 已停用的圖表系列將從分析用 JSON 檔案中省略;請使用 「最小化匯出」功能以限制來源記錄的揭露範圍。 資料篩選濾鏡適用於日誌報告;帳號與分享內容的匯出檔將保留 其自身的蒐集與揭露範圍。 共享的設計/圖表偏好設定將被鎖定於新的聊天室/帳戶匯出檔及帳戶 共享預覽中。帳戶/共享的語言與隱私設定仍保持獨立; 私人案件及審查筆記不會被複製至這些匯出檔中。帳戶與 共享報告仍以 HTML 格式儲存,並透過其簽名存檔清單受到保護。 日誌、 精簡版日誌移交及單一聊天套件亦提供經簽署的 PDF 檔案。 ### 圖表所呈現的內容 日誌活動與熱力圖會根據收集器的觀察時間(UTC)統計新訊息、歷史訊息、已復原訊息、已編輯訊息、已刪除訊息以及 重新檢查時缺失的**觀察記錄**。心跳訊號 與附件收據不包含在內。 參與者排名僅統計新、歷史 及恢復的訊息觀察記錄:發送者不會被標記為編輯者或 刪除者。重複的觀察記錄可能描述同一則 Telegram 訊息。 日誌分析功能會保留各類別的計數、首/末筆記錄參考,以及來源檔案 `events.jsonl` 的 SHA-256 值。圖表中的數值在 HTML 和 PDF 格式中均為精確數值。每日區間 在記錄超過 366 天後會切換為按月區間;圖表會將這些區間合併為最多 36 個等寬區間。 若存在超過 100,000 個不同識別碼或 1,200 個月的標記, 相關圖表將無法顯示,但確切的總計數值仍可查閱。 快照與帳戶共享圖表僅計入所包含的非服務訊息列, 並採用其記錄的訊息時間。共享彙總值是在遮蔽 與篩選後計算得出。這些圖表最多使用 90 個等寬的 UTC 日期區間,並保留 最多 10,000 個分組值;超出數值會明確標示並進行核對。 最後一個區間可能較短。未知或原始日期不會納入時間圖表中。 若區間為空,表示未包含任何觀察記錄;如有缺口,請參閱覆蓋範圍。這些 圖表描述已儲存的活動。未知發送者仍歸類為獨立類別,且 每項檢查均會單獨報告。 若包含 `analytics.json` 檔案,該檔案將受存檔的簽名檔案雜湊值保護。 日誌 `report.json` 嵌入相同的選取彙總值。簽名驗證 可偵測字節變更。若要核對數值,請使用 `report_analytics.Analytics` 和 `selected` 重新計算日誌彙總值,或 使用 `snapshot_analytics.collect` 和 `project` 重新計算快照彙總值。 ### 異常指標 **預覽。**證據報告會新增一個「**異常指標」**區段,該區段由 已註冊的處理器(`tgwitness/metrics/`,每個指標對應一個檔案)計算得出。報告會列出每個 曾運行的處理器及其版本,並在其表格下方顯示其計算方法,因此 可透過 `events.jsonl` 搭配 `tgwitness.metrics.run` 重現該計算結果。 | 處理器 | 功能展示 | | --- | --- | | `first_time_posters_over_time` v1 | 首次發文者人數及每日(UTC)訊息量。一則警示需至少五名首次發文者,且其人數須達中位數的三倍,而訊息量則不得超過中位數的1.5倍。基準值採用經過七天預熱期後,於過去14個日曆日內至少七天的觀察數據。 | | `service_vs_message_ratio` v1 | 每則聊天室的已儲存訊息編號各不相同,且服務訊息會佔用部分配額。此處僅說明編號規則,並未解釋特定編號缺失的原因。 | | `join_leave_per_month` v1 | 每月的新加入、離開、移除或封禁次數,以每人、每個聊天室、每次變更及每日為單位,各計一次。 | | `pinned_per_month` v1 | 每月固定顯示的服務訊息、取消固定的通知,以及在聊天狀態快照之間新增或移除的已固定訊息。 | **「參數 → 報告指標」**可選取處理器及顯示的列數, 包括在篩選後的報告中。每日與每月表格顯示最近的資料列,服務佔比 表格則根據儲存訊息的數量對聊天室進行排序。總計涵蓋每一列。 請從原始碼檢出點開始,根據同一份虛構期刊,建置上述列出的全部八種設計: ``` python tools/build_report_styles.py --output test-results/report-styles ``` 開啟生成的 `index.html` 檔案,以比對完整的 HTML 報告、已簽名的 PDF 檔案及 ZIP 檔案。每個設計皆採用相同的原始日誌。每次執行時請使用新的輸出目錄, 以便保留先前已簽名的範例。 ![虛構的 HTML 檔案](https://phishdestroy.github.io/TgWitness/assets/dossier-en.png) HTML 頁面以案件封面及關鍵數據開頭。編號的證據地圖連結 至各項調查結果、其支持事實、限制條件及獨立審查報告。可搜尋的 紀錄與穩定的紀錄參考資訊,在離線檢視器中仍可使用。 此設計可適應窄螢幕,並相容於各種主題及無需 JavaScript 的瀏覽器。 已簽署的 PDF 文件包含專用的 A4 封面、報告參考編號與 QR 碼、執行 摘要、證據地圖、編號調查結果及文件書籤。其頁 首與頁尾標示了報告資訊。QR 碼用於識別資料來源;它並非 獨立的驗證結果。瀏覽器列印輸出與此 經加密簽署的 PDF 文件是分開的。 觀察時間軸將記錄的觀察期間與中斷 置於同一條 UTC 軸上。空白處不代表推斷出的覆蓋範圍;詳細表格 保留了確切的時間間隔。ZIP 檔案包含可讀取的報告、已簽名的 JSON、 來源記錄及驗證說明。 請生成一份全新的虛構英文/俄文/德文檔案,並假設已安裝開發 環境: ``` python tools/build_dossier_example.py --output test-results/my-new-dossier ``` 每個語言目錄均包含 `report.html`、`report.pdf`、`report.json` 及 `dossier.zip`。現有的範例目錄絕不會被覆寫。建立這些檔案時,不會使用任何 Telegram 帳戶、外部時間戳記服務或網路連線。 ![虛構簽名 PDF 文件的前三頁](https://phishdestroy.github.io/TgWitness/assets/dossier-pdf.png) ## 閱讀具體案例 以包含 1,200 筆記錄的日誌為例,其中第 1,000 筆記錄具有經驗證的時間戳記, 報告指出有 200 筆較晚的記錄超出該時間戳記的範圍。 這僅是 檢查點存在的上界,並非每則訊息發送 時間的證明。若另有三個時間戳記檔案驗證失敗或無法驗證, 則會另行計數,且無法作為肯定結論的依據。 一個可用的時間戳記必須通過所有以下檢查:其印記與 檢查點相符;其簽名鏈在加蓋時間戳時可追溯至可信的 TSA 根;且 檢查點的簽名、金鑰、計數與頭部與日誌前綴完全吻合。 僅解析時間戳記或持有 OTS 收據並不足夠。讀取者 必須獨立選擇可信的 TSA 根憑證,並重複驗證。OTS 需要 其專屬的比特幣確認檢查。 | 報告狀態 | 含義 | | --- | --- | | 已於匯出時進行檢查 | 匯出工具已執行所述檢查;仍需進行獨立重複驗證。 | | 已記錄;需進行審閱 | 所記錄的是基礎觀察結果或操作員陳述;這並非獨立確認。 | | 本譯文未包含以下內容 | 該內容並未提供支持此主張的佐證。文中亦未提及其他地方不存在此類佐證。 | | 未經獨立核對 | 本報告不提供獨立的驗證結果。 | | 不完整或無法取得 | 某些資料或必要的檢查項目缺失、不完整或未能通過。 | 請針對每項檢查項目分別進行審閱,並參照已記錄的蒐集範圍。 ## 強效配置必須保留的內容 1. 在依賴資料蒐集功能之前,請透過 獨立的可信通道保留蒐集器的金鑰指紋。將該參考值與匯出檔案的簽名金鑰進行比對。 2. 請保留獨立標記時間戳記的檢查點,以及(若已使用)位於收集器管理控制範圍之外的 證人日誌。將其與 匯出的日誌進行比對,以核對其較早的邊界範圍。 3. 記錄資料擷取範圍、缺漏、篩選條件、限制及擷取過程中的變更。 針對與實際申訴相關的缺漏期間進行說明,並將未被觀察到的 訊息 ID、刪除通知及重新檢查失敗的情況明確區分。 4. 請保留原始 ZIP 檔案及其雜湊值。記錄每位持有者、轉移情況、日期 及目的。並將附有來源標示的操作員陳述與案件筆記一併保留。 5. 針對機密虛擬機器,請保留並獨立驗證引述、挑戰、 Intel 憑證鏈、測量結果、確切來源及金鑰處理條件。 請將驗證結果與已審查的證據一併保存。 請參閱「[驗證範圍」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)部分,了解各模式下針對資料擷取、 檔案完整性、時間及蒐集範圍的檢查項目。 ## 收件人審閱 請使用可信賴的 TgWitness 安裝版本,並搭配獨立取得的指紋: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --tsa-ca tsa-root.pem python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --witness witness.zip --witness-fingerprint WITNESS_SHA256 --require-witness python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --check-drand ``` 證據 ZIP 檔案必須來自獨立且可信的來源;其金鑰 及來源資訊亦須完整保留。請保留指令、工具版本、輸出結果、已審核的輸入 雜湊值以及未解決的問題。信標驗證是一項獨立的線上檢查; 報告渲染器絕不會僅為了顯示報告而聯繫任何服務。 針對特定訊息的爭議,請引用存檔參考編號、權威 檔案及紀錄參考編號,接著說明相關的時間範圍、涵蓋範圍缺口、 選取標準及佐證資料。若為共享副本,亦需檢視記錄中的 轉換過程及其對原始存檔的引用。私密篩選器與身分 映射不納入公開評估範圍。 對簽名 PDF 進行驗證可偵測受保護位元組的變更。請將原始 數位檔案與驗證結果,連同任何螢幕截圖或列印的閱讀副本一併保存。 --- # Telegram · 帳戶匯出 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/ 匯出該帳號當前可讀取的內容:範圍、可恢復的任務、經簽名的存檔,以及已最小化的共享副本。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 匯出該帳號當前可讀取的內容:範圍、可恢復的任務、經簽名的存檔,以及已最小化的共享副本。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [證據與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) 帳號匯出會獨占該帳號。啟動或恢復前,請明確暫停監控或其他蒐集工作;應用程式絕不會自動停止它們。 身為安裝管理員,請選擇「**從這裡開始」→「匯出我的帳號**」,或「**匯出」→「Telegram 帳號」→「設定帳號匯出**」。 如有需要請先登入,檢視權限範圍,並明確啟動匯出程序。無需持續監控。**已儲存的觀察記錄**是對現有日誌的獨立匯出;其 ZIP 包含所有來源,不受日誌篩選器限制。每個工作區皆擁有專屬的任務、簽署身分及儲存空間。已授予的面板存取權限(包含無限制的普通匯出授權)無法開啟這些帳戶層級的路徑。 「**依發送者或訊息內容篩選**」下可展開發送者與文字篩選器。「**帳戶資料與連線方式」**包含可選的帳戶類別以及「Takeout/一般會話」選項;其摘要區塊即使在關閉時,仍會顯示當前的選項。關閉這些區段後,其設定將予以保留。在切換檢視模式時,「匯出」與「報告草稿」會保留在當前面板會話中;但重新載入瀏覽器後,這些內容將不會被保存。無論選擇哪種匯出方式,皆可存取現有的工作項目。 此工作流程會匯出目前連線帳戶可存取的資料。預設使用 [Telegram Takeout](https://core.telegram.org/api/takeout) 功能;這並非針對無法存取或已刪除的 Telegram 資料所做的備份。秘密聊天、無法存取的歷史紀錄及較早的編輯內容均無法恢復。Telegram 可能會在 Takeout 開始前設定一段等待時間。控制面板會顯示該等待時間;系統不會在未提示的情況下切換傳輸方式。明確選用的「標準 API」選項涵蓋範圍不同,並會記錄不支援的類別。 Takeout 是官方匯出 API,Telegram Desktop 亦採用此 API。TgWitness 可直接從其自身的擷取資料中寫入 與 Desktop 相容的 JSON 格式;無需匯入他人的 存檔。無論透過何種傳輸方式,皆可取得聊天室與訊息 ID。 公開聊天室或具備轉發權限,並不能保證匯出速度更快,亦無法消除 Takeout 的審核延遲。在比較速度之前,請先測量相同的範圍與媒體設定。 對於最多20個明確選定的聊天 ID,標準 API 匯出功能會在考量該帳號完整的對話清單之前, 直接解析這些對等節點。因此,即使該公開頻道未出現在對話清單中, 仍可將其匯出,無需加入該頻道。 未緩存的對等方將回退至普通對話清單。 歸檔篩選器仍會生效:若 Telegram 未返回對話,且已歸檔 的聊天室被排除在外,則未知歸檔狀態將被記錄為遺漏。 Takeout 維持其分段範圍清單處理程序。兩種路徑均不會加入聊天室或 變更轉發權限。 在與桌面版相容的 JSON 格式中,Telegram 標記為 `left` 的頻道會出現在 `left_chats` 下,包括該帳號尚未加入的可讀取公開頻道。 `FLOOD_WAIT` 與 `FLOOD_PREMIUM_WAIT` 都會在伺服器要求的完整 時段內暫停請求。該帳戶的截止期限會於重新連線與重新啟動後持續保留;之後設定的 較短等待時間無法縮短此期限。重試次數設有上限,取消操作會保留已封存的頁面, 且 API 憑證不會因規避速率限制而輪替。不會進行任何 Premium 購買。 ## 選擇要收集的內容 | 設定 | 含義 | | --- | --- | | 目的 | 請記錄此次收購的必要性。請勿在此處列出不必要的姓名或敏感的案件細節。 | | 報告語言 | 選擇可讀報告中標籤的語言。原始訊息內容保持不變;未翻譯的範本標籤將使用英文。語言設定將透過已簽署的工作選項固定。 | | 聊天類型 / 聊天 ID | 可選取所有類型,或僅選取列出的聊天室;「已儲存訊息」屬於私人聊天室。歸檔的聊天室可單獨選取。 | | 日期 | UTC。面板中的「起始」與「結束」日曆日期均包含在內。API 使用包含 `from_utc` 與不包含 `to_utc`;面板會將「至」之後的次日作為起始日。若邊界為空,則該側不受限制。 | | 發送者 ID | 僅顯示清單中發送者的訊息;若清單為空,則包含所有發送者的訊息。 | | 文字內容包含 | 不區分大小寫的字面短語,以「或 (OR)」進行匹配。發送者/日期/自有訊息等條件則以「且 (AND)」進行組合。 | | 自己的訊息 | 僅保留外發訊息。 | | 媒體類型 | 請選擇附件類別,或清除所有選項以避免下載訊息檔案。 | | 檔案/媒體總量限制 | 每檔檔案的 MiB 及已下載媒體的總量(以 GiB 為單位)。文字、收據、可讀報告以及 ZIP 的開銷會佔用額外的磁碟空間。 | | 帳戶類別 | 個人檔案、聯絡人、個人頭像、動態、連線元資料及其他 Takeout 資料均設有獨立的控制選項。 | 「**最小化」**收集預設會停用檔案及帳戶元資料。發送者/內容過濾器會在保留訊息頁面及媒體下載之前生效。Telegram 仍會傳輸包含評估這些過濾器所需訊息的 API 歷史紀錄頁面:過濾功能並不能保證未被選中的訊息絕不會進入處理記憶體。工作區中其他持續進行的監測,則有其獨立的範圍與保留設定。 個人檔案照片歷史紀錄與限時動態預設不會被選中。若案件僅需訊息內容,請一併停用個人檔案與聯絡人功能。若附件或元資料非必要,在擷取過程中將其排除,可避免在本次匯出中保留另一份私人副本。 照片載荷採用其元資料與雜湊清單中識別出的靜態影像變體,包含帶有動畫頭像變體的照片。該動畫不會取代所選的靜態影像。若載荷長度短於或長於觀察到的尺寸,將被記錄為附件失敗;若在檔案參照更新期間表示形式發生變更,則會被拒絕。這些失敗情況會導致檔案庫不完整,但仍會保留訊息記錄。 獨立驗證機制亦會拒絕那些簽名長度與實際大小或表示形式不符的已儲存附件,包括存於較舊歸檔中的附件。 ## 簡介、涵蓋範圍與驗證 每個工作任務都會凍結其選項與帳戶身分。清單與擷取的頁面均經過簽名;頁面收據會記錄雜湊值、游標位置、時間、附件結果及其前一筆收據。僅已提交的頁面才會推進進度。重新啟動/恢復時,系統會在繼續執行前檢查這些記錄。若帳戶變更、已簽名頁面變更或收據鏈不一致,則會被拒絕。在擷取過程中無法編輯選項:若需處理其他範圍的內容,請啟動另一個工作任務。 「暫停」會中止正在執行的帳戶操作。重新啟動應用程式後,未完成的工作仍會保留,可供使用者明確地繼續執行。過期的 Takeout 會話需要明確地繼續執行;變更 Telegram 分割範圍可能需要重新進行擷取。繼續執行會保留先前的觀察結果,因此長時間執行的匯出並非單一原子快照。在擷取期間,其他變更帳戶的操作以及衝突的匯出作業都會被阻擋。請等待封裝完成後再刪除工作區。 「恢復」功能會在繼續執行前驗證已擷取的內容。若大型存檔儲存於速度較慢的儲存裝置上,可能會超過「**參數 → 面板操作超時**」的設定值(預設為 120 秒)。請在重新嘗試前提高該設定值;若操作被取消或儲存中斷,任務將處於暫停狀態;若完整性檢查失敗,則任務會顯示失敗並附帶說明。驗證必須完成或安全停止,其檔案才能關閉。目前尚未有合成測試驗證過任何關於大型帳戶吞吐量的聲稱。 該面板可區分已完成的選定範圍與部分存檔,並記錄遺漏及讀取失敗的情況。刻意排除的檔案與讀取失敗或不可用的檔案有所不同。即使完整性驗證成功,仍應檢查覆蓋範圍。沒有任何本地讀取器能證明 Telegram 已回傳所有曾經存在過的訊息。 已完成的 ZIP 仍可供重複下載及透過 HTTP 範圍下載。一個帳戶存檔包含 `manifest.json`, `manifest.sig`、經簽署的 `job.json`, `inventory.json`, `receipts/`、權威性 `data/*.jsonl`、已選取 `media/`、可讀取的 HTML 以及驗證器。透過獨立通道固定收集器的指紋,然後使用可信的安裝環境進行驗證: ``` python -m tgwitness.verify account-export.zip --fingerprint TRUSTED_SHA256 ``` 對於展開後內容超過 4 GiB 的存檔,請明確設定適當的 `--max-gib`。該面板會根據已宣告的展開大小及已發布的 ZIP 摘要,驗證其已驗證且完整的本地存檔;外部 CLI 則維持其獨立的大小限制。請在開啟可讀取的 HTML 之前進行驗證。存檔內建的驗證器雖方便,但使用獨立取得的驗證器可避免信任隨證據一併傳遞的可執行程式碼。 Ed25519 簽名與 SHA-256 雜湊值可偵測收集器提交相關位元組後所發生的變更。它們並不能 **不** 證明 Telegram 確實簽署了那些訊息、收集器操作者誠實無欺、該帳戶的歷史紀錄完整,或法院會接受該材料。擷取時間以收集器的時鐘為準。獨立的時間戳記與獨立的擷取來源必須分別進行評估。 ## 為律師或其他收件人準備一份資訊披露文件 下載完成的匯出檔後,請保留原始的 ZIP,並從 `index.html` 從解壓縮後的副本中開啟。該報告說明其範圍、可用的涵蓋內容及 限制。其記錄參考結合了存檔參考、文件路徑和 記錄編號,因此收件者可在 HTML 或列印本中找到相同的條目。 如需實際範例,請參閱 [開啟虛構報告](https://phishdestroy.github.io/TgWitness/demo/report/)。 從已完成的帳戶匯出檔案中,選擇**「準備分享副本**」。此操作將建立一個獨立的簽名衍生檔。原始檔 ZIP 保持不變且為私有;除非收件者獲授權接收完整內容,否則請勿將其與已精簡的衍生檔一併傳送。請另行選擇報告語言。若要變更語言或任何選取設定,必須在建立前再次預覽。 1. 輸入披露目的,並選擇日期、發送者 ID 及文字內容篩選條件。 2. 您可以選擇保留真實身分、僅顯示列出的參與者,或對所有人進行假名化處理。在任何假名化模式下,聊天 ID/標題和訊息 ID 也會被替換。假名在單一披露範圍內保持不變,但在獨立準備的披露之間會發生變化。 3. 可保留訊息內容、完全省略,或新增具體名稱/短語以進行遮蔽。在私密模式下,本工具還會遮蔽已知的隱藏發訊者名稱與替代使用者名稱、完整代碼的發訊者 ID、私訊名稱、連結、電子郵件地址及類似電話號碼的字串。已知名稱比對功能會處理 Unicode 大小寫轉換,包括 `Straße`/`STRASSE`。通用群組/頻道名稱不會自動從訊息文字中移除。若已知身分遮蔽限制被超過,請縮小來源匯出範圍或省略文字;本工具不會在未提示的情況下跳過後續的名稱。這些規則僅為盡力而為,並非普遍性的匿名化處理。 4. 除非收件者需要,否則請勿包含檔案。所包含的原始檔案會保留其像素、音訊、文字及元資料。本工具**不會**對其進行匿名化處理。 5. 預覽計數、警告及轉換後的訊息範例後,請明確確認建立。每個範例限 12 則訊息,且每則訊息的文字長度不得超過 2,000 個字元。此為範例,並非對結果的完整檢視。變更設定需再次進行預覽。預覽將於 15 分鐘後失效,且綁定於該管理員會話及原始的 ZIP;建立後無法重複使用。建立新的預覽將使同一工作與會話中的先前預覽失效。 6. 檢視完整的結果 `index.html` 並 `messages.jsonl` 檔案。若發現其中包含不必要的資訊,請建立新的披露文件並設定更嚴格的排除條件。請勿直接編輯已簽名的 ZIP。 ### 篩選後未包含的訊息 **預覽。**若揭露內容尚未完整,則顯示為不完整狀態。在每個至少包含一則已揭露訊息的聊天室中,選取範圍未涵蓋的訊息會以標記形式顯示, `[withheld by selection — rule: sender]` (或 `text`, `period`)。選擇**「選取範圍中未包含的訊息**」:每組連續未包含的訊息顯示一個標記(預設),或每則訊息顯示一個標記。標記僅包含規則與計數,絕不包含文字、發送者、日期或檔案。未包含任何已揭露內容的聊天室將被完全排除,因此本套件不會揭露其存在。 已披露的回覆會說明其回應的對象:是本副本中包含的訊息、被選取範圍排除的訊息,或是原始匯出檔中不存在的訊息(可能是在匯出前已被刪除,或從未被匯出;匯出檔無法區分兩者)。 若已公開的回覆所回應的是一則被隱藏的訊息,該訊息將始終擁有專屬標記,因此該回覆會指向一則說明其為何為空的記錄。這三種狀態有別於刪除與資料收集缺口,後兩者屬於原始匯出資料的範疇。 在 `messages.jsonl` (格式 `tgwitness-account-disclosure-v2`)中,每則訊息皆包含 `state`: `disclosed`,或 `withheld` 搭配 `rules` 以及 `count`。一則已公開的回覆包含 `reply_to` 與目標 `id` 以及 `state` (`disclosed`, `withheld`, `not_in_source`)。該清單會統計已公開的訊息、聊天紀錄、媒體檔案及 `withheld` 訊息。 `verify.py` 會拒絕攜帶內容的標記,以及指向封包中缺失記錄的回覆;版本 1 的封包驗證方式與先前相同。 精簡格式省略了結構化的帳號個人資料、聯絡人、頭像、會話、動態、原始 Telegram 物件、轉發標頭、回覆引文、聯絡人卡片及位置元資料。它不包含原始的 JSONL 檔案、私人篩選設定、化名金鑰及身分映射。選取的文字、明確保留的身分資訊及包含的檔案仍可能包含與該篩選器中相同的名稱、ID 或短語;這些內容需要另行審查。 隱私政策與化名金鑰會以加密形式保留於該任務的本地金庫中;刪除任務將清除其相關的隱私披露記錄。公開政策記錄的是篩選次數,而非篩選值。聲明之目的在清單與 HTML 中屬公開資訊:明確的隱私標準,以及在化名模式下已知的隱藏身分,均會在此處被遮蔽,即使訊息文字被省略亦然。請確保目的陳述中不包含不必要的個人細節;未知的身分識別背景則可保留。 其清單檔案會將衍生檔案、公開政策以及原始 ZIP 的雜湊值綁定在一起。透過驗證可確認資料的完整性,若來源檔案為本地提供,亦可驗證來源連結是否匹配: ``` python -m tgwitness.verify minimized-disclosure.zip --fingerprint TRUSTED_SHA256 python -m tgwitness.verify minimized-disclosure.zip --fingerprint TRUSTED_SHA256 --evidence account-export.zip ``` 來源連結本身並不能獨立證明該轉換過程已選取所有必要項目,或已移除所有可識別的細節。原始明文並未作為證明嵌入其中。要做出此判斷,仍需進行新的審查。 ## 分享與託管擷取 請選取收件者所需的訊息與檔案,檢視完整的分享副本,並將原始檔另行保留。記錄已傳送 ZIP 檔案的雜湊值,以便收件者能識別並驗證該精確副本。選定的識別碼將經過假名化處理;所包含的文字及原始檔案仍屬檢視範圍。 GitHub Actions 支援透過 Takeout 或標準 API 匯出整個帳戶或選定聊天室的內容,並提供單一聊天室的事件日誌。[託管擷取指南](https://phishdestroy.github.io/TgWitness/docs/capture/)說明了設定驗證及 120 分鐘的限制。若要驗證源自託管擷取的共享副本,請將其來源雜湊值與原始存檔進行比對,並透過[特定模式的檢查](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)來驗證該存檔的認證。 [證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) · [案例報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-reports/) --- # Telegram · 證據格式 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/ 簽名 ZIP 檔案的內容、記錄類型、處理回執、使用者檔案、異地備份及離線驗證。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) Translation coverage: this edition includes material from the English original. 簽名 ZIP 檔案的內容、記錄類型、處理回執、使用者檔案、異地備份及離線驗證。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) TgWitness 會將 Telegram 帳戶可見的觀察記錄保存於經簽署的日誌中。 收件者可透過可信賴的 收集器金鑰,驗證已保存的記錄、附件及報告,並將日誌與獨立保留的檢查點進行比對。 本頁說明格式、驗證程序以及移交時應保留的資料。 Windows 使用者可透過 **VERIFY.cmd** 開始操作:該程式會要求提供原始 ZIP 檔案及獨立取得的金鑰指紋,顯示附有說明的結果, 並另行儲存驗證紀錄。有關設定與信任限制,請參閱[驗證啟動程式及 可攜式執行環境](https://github.com/phishdestroy/TgWitness/blob/main/docs/VERIFICATION_LAUNCHER.md)。 **本頁內容** - [什麼是已簽署的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#what-is-signed) - [比較聊天記錄匯出檔](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#comparing-chat-exports) - [調查交接](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#investigation-handoff) - [交接摘要](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#handover-extract) - [易讀的報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#readable-reports) - [事件規範化](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#event-canonicalization) - [行為者語義](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#actor-semantics) - [涵蓋範圍:連續性、缺口及未被觀察到的 ID](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#coverage-continuity-gaps-and-unobserved-ids) - [製作人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#producer) - [人物簡介](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#people-profiles) - [獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#independent-witness) - [清單與檢查點](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#manifest-and-checkpoints) - [驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope) - [附件](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#attachments) - [持久的收據收集與處理 (0.2)](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#durable-collection-and-process-receipts-02) - [RFC 3161 準備與回應驗證 (0.2)](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#rfc-3161-preparation-and-response-verification-02) - [證據模式中的可選記錄:drand 及 Telegram 裝置](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#optional-records-in-evidence-mode-drand-and-telegram-devices) ## 何謂「簽名」 | 資料 | 保護 | 應保留的內容 | | --- | --- | --- | | 每則日誌記錄,包括操作事件 | 每個事件皆包含 SHA-256 鏈及 Ed25519 簽名 | 原始 `events.jsonl`(可信金鑰指紋)及保留的檢查點 | | 證據 ZIP 檔案內容 | `manifest.sig` 對規範性清單進行簽名,該清單列出了內容檔案的雜湊值 | 完整的 ZIP 檔案,包含其清單檔與簽名檔 | | 保留的附件 | 簽名過的 `media.saved` 事件中包含 SHA-256 值與位元組計數;簽名過的 ZIP 清單中包含檔案雜湊值 | 經驗證 ZIP 檔案內的原始位元組 | | 檢查點 | 針對日誌長度、開頭雜湊值、公鑰及建立時間進行 Ed25519 簽名 | 在爭議性變更發生前保留的獨立副本 | | 執行收據 | 包含收集器版本、原始檔雜湊值及啟動設定的簽名記錄,亦收錄於 `process.started` 中 | 所選驗證模式的收據、相關日誌及環境證據 | | 易讀的報告:`report.html` 及其各部分,`report.json`、`report.pdf`、`chat.pdf` | 每個檔案均附有針對其內容的 Ed25519 封印;PDF 亦附帶標準的 PDF 簽名(參見 [可讀性報告](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#readable-reports)) | 收到的檔案及其可信金鑰指紋;該檔案所對應的 ZIP 檔案 | | 獨立版 CSV | 不包含獨立的加密簽名;僅憑事件雜湊值並不足夠 | 請使用經驗證 ZIP 檔案中的原始內容進行完整性檢查 | | 由瀏覽器產生的螢幕截圖、列印文件或 PDF 檔案 | 衍生作品上不得出現 TgWitness 簽名 | 請保留原始的已驗證套件,並記錄衍生版本的製作過程 | 收集器會在生成每種匯出格式之前,先驗證日誌簽名。 易於閱讀的 HTML 和 PDF 報告各自附有專屬印章;獨立的 CSV 檔案則作為 已簽署 ZIP 檔案的一部分進行驗證。請保留 ZIP 檔案以維持附件位元組與清單, 並另設檢查點,用以將日誌與較早的邊界進行比對。 ## 比較聊天記錄匯出檔 驗證並比較兩個已簽名的聊天記錄匯出 ZIP 檔案,並使用獨立保存的簽署者 指紋進行比對: ``` python -m tgwitness.verify first.zip --compare second.zip \ --fingerprint FIRST_TRUSTED_KEY_SHA256 --compare-fingerprint SECOND_TRUSTED_KEY_SHA256 ``` 當兩個存檔皆記錄相同的數值帳號與聊天 ID 時,紀錄將依據 訊息 ID 進行配對。**「未變更」**意指完整的儲存 JSON 紀錄完全相等: 包含全文、發送者、日期、回覆對象、嵌套元資料及未知欄位等 所有內容。JSON 物件的鍵順序無關緊要;但缺失的欄位、null 值、值類型 以及陣列順序則會影響比對結果。300 字元的預覽僅供顯示之用。 已變更的條目 會將差異標示於頂層的 `changed_fields` 中,包含預覽中無法顯示的變更。 在比對過程中,若出現重複的訊息 ID,系統會拒絕該條目,而非互相覆寫。 差異可能包括顯示名稱、瀏覽次數、收藏註解的變更,或 其他觀察元資料。此差異本身並不能證明 Telegram 內容曾被編輯、 識別出誰進行了變更,亦無法證明哪個相互矛盾的存檔是準確的。 未解析的記錄仍保留在比較結果中;其儲存表示形式的相等性 並不意味著其 Telegram 有效載荷已被解碼。 針對不同或缺失的帳號/聊天室識別資訊,本工具僅會根據發送者、完整文字、檔案雜湊值、媒體類型以及五秒的 時間容差,找出可能的 對應關係。系統會回報**「已匹配」(Matched)**,而非**「未變更」(Unchanged)**。這些候選項目並不能 確立訊息的同一性,亦無法證明所有元資料完全一致。未解析的記錄將維持 未匹配狀態。 成對記錄中的差異仍會列於 `changed` 中,包括在 內容模式下;這些差異並不能證明同一則訊息曾被編輯。使用 `--json` 時,`matched` 會統計成對記錄,而 `unchanged` 則統計那些完整儲存 記錄完全相等的成對記錄。在內容模式下,這兩種統計結果均無法證明訊息的同一性。現有的 `changed_fields` 與整數型 `unchanged` 輸出仍與 先前的比較結果相容。存檔格式與簽名驗證均維持不變。 ## 調查交接 1. 請在案件筆記中記錄案件編號、操作人員、Telegram 帳戶的數字 ID、已選取的 來源、蒐集政策及蒐集期間。TgWitness 會保存觀察記錄,並支援在 [「案件看板」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/case-board/)中建立與來源連結的筆記及蒐集資料。請將轉移與保管記錄與您的案件 資料一併保存。 透過 [即時驗收程序](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/LIVE_ACCEPTANCE.md),核對預期的蒐集設定是否正確。 2. 在依賴 其匯出內容之前,請先獨立保留工作區的公鑰指紋。在收集過程中,請將簽名檢查點儲存於收集器之外。 記錄中斷情況以及該帳戶可見性的限制。 3. 匯出**經簽名的 ZIP** 檔案並保留經簽名的執行收據。請在 匯出日誌邊界處或之前設定檢查點。若檢查點設定在較後位置,系統將能正確地拒絕 較早的匯出檔案,因其長度不足。匯出內容包含完整的工作區日誌, 無論面板篩選條件為何;請在分享前審閱相關資料。 4. 請收件者使用可信的驗證器副本,並搭配 獨立提供的指紋/檢查點,來驗證 ZIP 檔案。請從一個可信的檢查點開始,並確保 其 Python 環境已啟動: ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_PUBLIC_KEY_SHA256 --checkpoint retained-checkpoint.json ``` 當兩個輸入皆已提供且被接受時,成功產出的報告將顯示 `key_pinned: true` 和 `checkpoint_checked: true` 。請保留驗證結果。 ``` For a handover requiring the final exported record to be witnessed, use `--witness witness.zip --witness-fingerprint TRUSTED_WITNESS_SHA256 --require-witness`. This refuses an export with an unwitnessed tail. See the [witness handover procedure](WITNESS.md#require-a-witnessed-export-boundary). ``` 1. Record the archive's SHA-256, export boundary, transfer date, sender, and recipient in your custody record. Keep the original package intact and work from copies. Share evidence files rather than the application's private data directory, which also contains account sessions and signing secrets. For transfer, choose a password-protected AES-256 ZIP or the stronger `.tgwpw` container. ZIP uses WinZip's low-cost password derivation; use a long random passphrase. `.tgwpw` uses scrypt and AES-256-GCM and opens with the standalone verifier's `unseal-password` command. The password is not stored and only protects confidentiality; the recipient decrypts the archive and verifies the signed export inside, which is unchanged. 2. 若需獨立的時間錨定,請遵循 [RFC 3161](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/)程序,並保留請求、檢查點、可信 CA 資訊以及經驗證的授權機構回應。僅準備請求 並無法取得時間戳記。 For `.tgwpw`, use an independently obtained verifier and choose a new output file with the original extension: `python verify.py unseal-password export.tgwpw --out evidence.zip`. The command prompts for the password; `--password-stdin` reads one line for automation. It never overwrites an existing file and publishes plaintext only after all records authenticate. Run normal signature verification on the decrypted file afterwards. The container uses scrypt (`N=131072`, `r=8`, `p=1`, 16-byte salt; about 128 MiB RAM) and AES-256-GCM with 1 MiB records and an authenticated final record. An encrypted metadata record stores the inner filename, so downloaded containers can be renamed. 驗證成功即表示相對於可信收集器 金鑰及保留邊界,資料完整性已獲確立。請參閱[驗證範圍](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope),了解 信任假設以及所執行檢查的[驗證結果](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)。 ## 交接摘要 一個已簽名的 ZIP 檔案包含整個工作區日誌。當法院、律師或濫用通報部門僅需 部分聊天記錄、特定時間段或特定人員時,可透過「**匯出 → 移交摘錄**」功能,依據選定的揭露規則生成精簡版 副本(`tgwitness-handover-v1`)。 操作員需說明目的,並選擇對話內容、可選的時間範圍(UTC)、 摘錄所涉及的人物,以及其他人員的處理方式(顯示、替換為化名 P01、 P02… 或 省略),哪些訊息內容保留,哪些附件及個人資料照片納入,以及 訊息中的電話號碼和電子郵件地址是否需被遮蔽。 該目的及相關規則將載於 經簽署的清單及報告中;日誌會記錄「`handover.exported`」,並標註 生成該日誌的存取者以及檔案的 SHA-256 值,而非內容本身。 `verify.py` 透過兩種方式檢查提取檔。若記錄顯示未經變更,則會進行完整驗證:其 內容將與其雜湊值、Ed25519 數位簽名以及與所包含前一版本的連結進行比對。 一則 經簡化的記錄會保留原始雜湊值與簽名,因此簽名仍可通過驗證,但 被隱藏的欄位無法據此重新計算;該記錄會列出被隱藏的內容,而報告 也會標示出來。清單會列出日誌長度與開頭,並附上收集者對該 開頭的簽名,同時統計被省略的記錄數量; `coverage.json`描述所選的聊天紀錄。檔案 名稱中的姓名不會被偵測到。分享前請審閱最終檔案:自由文字、檔案名稱及選定的 附件仍可能揭露個人身分。請保留完整的簽名 ZIP 檔案:解壓縮後的檔案屬於資訊揭露,並非替代品。 ## 易讀的報告 已簽署的證據、移交檔案及聊天 ZIP 檔均包含可讀取的 HTML 和 JSON 報告,此外 若所需字型可用,還會提供以選定報告語言產生的 PDF 檔案。每份 報告均以工作區的 Ed25519 金鑰加密封存,並可單獨驗證: `python -m tgwitness.verify FILE --fingerprint KEY [--evidence ZIP]`。 - `report.html` / `chat.html`:封存陳述式(`tgwitness-report-seal-v1`)會關閉檔案,並 對其前面的每個位元組的 SHA-256 進行簽名。長篇日誌和聊天記錄會分割為 可配置大小的部分(報告設定,500 至 100,000 筆記錄;預設為 5,000 筆): `records/records-0001.html` 或 `messages/messages-0001.html`,每個皆以其編號、範圍 及總數進行封存,並連同其 SHA-256 一併列於已簽署的清單中。收集器心跳訊號的連續記錄 將顯示為一行,除非「報告設定」中指定逐一列出。 - `report.json`(`tgwitness-report-json-v1`、金鑰 `format`、`report`、`seal`):該憑證對 `report` 的規範 JSON 中的 SHA-256 進行簽署,因此案件系統與腳本可讀取相關事實 並能據此進行資料保護的篩選,同時保持簽署檔案的完整性。 - `report.pdf` / `chat.pdf`:一份供列印及歸檔之正式文件,針對相同 位元組進行兩次簽署,範圍涵蓋除簽名值(`/ByteRange`)以外的整個檔案。標準的 PDF 簽名 (`adbe.pkcs7.detached`、CMS 搭配 SHA-256 及 ECDSA P-256)使用一份自行簽發的文件簽署 憑證,該憑證儲存於工作區金庫中;其主體序號即為 Ed25519 金鑰 指紋。Ed25519 印章以未簽署屬性 `2.25.240684792623320047764573196045913242332` 的形式 封存於 CMS 之中,並以 `"content": "pdf-byte-range"` 標示憑證的 SHA-256, 因此 Ed25519 金鑰即為該憑證提供擔保。 PDF 讀取器會顯示 檔案在簽署後是否曾被修改,並在憑證被 視為可信之前,將簽署者標示為「未知」;請改為比對 Ed25519 指紋。中文、日文及韓文的 PDF 檔案需要在伺服器上 (或於 `TGWITNESS_FONT_DIR` 中)具備對應字型;若無此字型,ZIP 檔案僅會包含 HTML 和 JSON 報告 。 在頻道或超級群組中,Telegram 會依序為訊息編號 1、2、3…。聊天記錄匯出檔會列出 起始與結束編號、現有訊息數量,以及所有缺失編號的區段(如 `message-ids.json` )、清單檔與 `chat.json` 標頭,並標記每個缺口在 對話紀錄中的位置。 `verify.py` 會從 `chat.json` 開始重新編號。缺失的編號是指 Telegram 未傳回的訊息(在匯出前已被刪除,或該帳號無法看見);在私人聊天室和 基本群組中,編號由該帳號的所有聊天室共用,且不會計入缺口。 讀取歷史紀錄後,匯出程序會根據號碼逐一重新向 Telegram 查詢每個缺失的號碼 (`channels.getMessages`,最多 10,000 個號碼)。結果將存於 `message-ids.json` 及報告中。 若收到空回應,則記錄該號碼在重新檢查時對此帳號不可用; 但不會說明具體原因。重新檢查時收到的訊息將被加入匯出內容中 並標記為 `found_on_recheck`。 每份報告均以 **開頭。簡而言之**:先有一段文字,接著說明資料顯示的內容以及未顯示的內容 (帳戶背後的人物、傳輸的完整性、監測前的刪除行為、未附時間戳記的 時間)。 當瀏覽器驗證完印章的 簽名(而非頁面本身)後,該頁面的印章標記會轉為琥珀色:瀏覽器不會為頁面提供其自身的位元組。 只有當 讀者將檔案拖曳至頁面底部的驗證區,且每個位元組均完全吻合,同時 顯示的頁面正是該檔案時,印章才會轉為綠色;否則將轉為紅色。 每份報告均精確標明程式名稱:當收集器從檢出版本執行時對應的 git 提交,或 安裝程式設定的 `TGWITNESS_COMMIT`,以及其原始檔案的 SHA-256(`source_tree_sha256`、 路徑的規範 JSON → SHA-256,適用於每個 `.py`、`.js`、`.css`、`.html` 和 `.svg` 檔案在 套件中),只要檔案未被修改,檢出該提交即可重現上述內容。 Telegram 客戶端的命名包含其函式庫、API 層及資料中心。當監測開始,以及當聊天 匯出開始與結束時,收集器會向 Telegram 查詢其時間(`updates.getState`,以 整秒為單位),並記錄 Telegram 的時間減去收集器的時鐘時間,其中包含因 往返傳輸產生的不確定性;報告會在「保管鏈」欄位中顯示這些測量值。 除了訊息的日期外,聊天記錄匯出還會記錄 讀取歷史紀錄的時間點。 ### 離線報告檢視器與歸檔指南 在開啟 `chat.html` 或 `report.html` 之前,請先解壓縮完整的 ZIP 檔案。此檢視器提供搜尋、 篩選、參與者、指標、記錄詳細資訊,以及無需伺服器即可進行的 JSON/CSV 選取功能。請將 `viewer/` 和 `media/` 置於報告旁。選取項目屬衍生內容:請使用 `verify.py SELECTION.json --evidence ARCHIVE.zip` 將其與簽名存檔進行比對。 驗證器會檢查報告 ID、簽署金鑰、存檔邊界以及每個選取項目;經編輯、 遺漏或重複的項目將被判定為失敗。選取註記與建立時間仍屬未簽署的元資料。 訊息編號的間隙僅會出現在完整、未經篩選且按升序排列的聊天記錄中。隱藏某個 類別或無法載入某個資料區塊,絕不能將省略的行視為缺少 訊息的證據。搜尋標示功能會針對HTML轉義前的純文字進行操作,並保留字面標記。 瀏覽器會檢查清單簽名、報告 ID 與金鑰,以及所有列出的檔案雜湊值。它 會拒絕模稜兩可或格式錯誤的 ZIP 結構、重複名稱及不安全的路徑,並將檔案 大小限制在 256 MiB 內,且宣告的總內容大小不得超過 4 GiB。若需處理更大的壓縮檔,請使用獨立驗證器。 此瀏覽器檢查功能可補充驗證器對日誌鏈及資料語義的檢查。 `README.txt` 包含一份入門指南、對齊後的檔案清單、驗證說明及資料 格式說明(均以報告語言撰寫),其後附有完整的英文指南。 `SHA256SUMS` 涵蓋 其中列出的檔案,但不包括該檔案本身、`manifest.json` 及 `manifest.sig`;經簽名的清單 亦涵蓋 `SHA256SUMS`。請保持原始 ZIP 檔案不變,並將工作檔案儲存於 解壓縮資料夾之外。PDF 報告包含章節書籤,且後續頁面載有案件/報告識別資訊。 ### 匯出時的聊天內容 聊天室匯出檔案會記錄在匯出開始時,Telegram 針對該聊天室所做的說明:Telegram 自身的 標籤(`scam`、`fake`、`restricted` 及其理由、`verified`)、使用者名稱、描述、成員 及管理員人數、關聯的討論串、內容保護設定、新成員是否能查看較早的 訊息,以及該帳號從哪則訊息開始能查看歷史紀錄(`available_min_id`), 若該聊天室為新建立,則為第一則訊息的 日期,以及聊天室照片的 SHA-256(儲存於 `media/`)。 它會記錄匯出帳號在聊天室中的地位:角色、加入日期、邀請者,以及若為 管理員,其權限。若 Telegram 拒絕某項請求,則會列出該請求的名稱。 當匯出帳戶為管理員時,匯出過程會將該聊天室的管理員日誌(Telegram 約保留 48 小時)讀取至 `admin-log.json`:其中包含刪除與編輯的紀錄,以及相關內容與執行該操作的帳戶。這 是唯一一份能明確指出刪除者身分之刪除紀錄。 ### 指標 報告清單及存檔中以 `indicators.csv` 、`indicators.stix.json` (STIX 2.1 ) 以及 `indicators.misp.json` (MISP 事件)標示,濫用處理部門可據此針對記錄訊息中的以下內容採取行動: 連結與網域(包括隱藏於文字後、按鈕內及連結預覽中的內容)、加密貨幣 地址、Telegram 使用者名稱與邀請連結、電話號碼、電子郵件地址及儲存的圖片。 比特幣、萊特幣、狗狗幣和波場(TRON)地址僅在 Base58 校驗和通過時才會列出, SegWit 地址則需其 Bech32 或 Bech32m 校驗和通過,而 TON 地址則需其 CRC 校驗和通過;EVM 和 Solana 地址則標記為「未經檢查」。 圖片包含 SHA-256 以及一個感知 雜湊(dHash,64 位元),即使經過重新壓縮或調整大小的副本,該雜湊值仍幾乎保持不變。報告會寫入 標記,以防止意外開啟(`hxxps[://]example[.]com` );檔案則保留 原始的數值。 每個指標均標記為「未知」且不適用於自動偵測(STIX 、 `indicator_types: unknown` 、MISP 、`to_ids: false` ,分發至自身組織):被 列出僅表示訊息中包含該指標,並不代表其具有惡意。若連結的顯示文字與實際開啟的 地址不符,該連結將在報告中被標記。 PDF 報告末尾包含一份需由審查員親筆簽署的聲明、供公證人或 法院專家使用的核對清單,以及一個 QR 碼(亦位於首頁),其中包含報告 ID、金鑰指紋及 權威資料的 SHA-256,以便列印本能追溯至其存檔。 ## 事件規範化 雜湊輸入必須精確包含以下這些欄位: ``` seq, observed_at, source_at, kind, chat_id, message_id, actor_id, payload, previous_hash ``` 請使用與 Python 相容的 JSON 格式進行序列化,採用 UTF-8 編碼、物件鍵值排序,不進行 ASCII 轉義,不包含無意義的空白字元,且不包含 NaN 或無窮大: ``` json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":"), allow_nan=False).encode("utf-8") ``` 這些位元的 SHA-256 值即為事件雜湊。簽名採用 Ed25519 演算法對 32 位元原始雜湊位元進行運算,隨後進行 Base64 編碼。第一個 previous_hash 為 64 個零。 序號從 1 開始,並以 1 為單位遞增。所有事件(包括運作 事件)共用同一條鏈。本系統不進行重複傳送抑制:重複 的觀察結果僅代表不同的收據,而非聲稱存在不同的 Telegram 操作。 Telegram 的原始日期為 ISO 字串;二進位欄位則轉為包含 bytes_base64 的物件。訊息內容、實體、媒體描述符、回覆元資料、反應, 以及服務動作,若已提供,皆會保留於原始訊息元資料中。 observed_at 為收集器的 UTC 牆鐘時間。source_at 為提供的 Telegram 日期 (如有)。刪除通知不會提供確切的刪除時間,因此 source_at 將保持為 null。傳輸接收順序未必等同於來源事件 的順序。歷史快照會使用較早的來源日期,但採用當前的觀察時間。 ## 行為者語義 message.new 中的 actor_id 代表訊息發送者。message.edited 並未推斷出 編輯者;payload.sender_id 則記錄所觀察訊息的發送者。 刪除 actor_id 仍為 null。成員服務訊息會保留發送者與動作 類型,不會將每次移除都視為自願退出。原始參與者 更新會保留所提供的 actor_id。反應快照不會虛構變更行為者。 私人聊天室和一般群組的刪除通知僅包含訊息 ID。 這些聊天室共用一套適用於整個帳戶的 ID 序列,因此一個 ID 代表該 帳戶中的一則訊息。 當具有該 ID 的訊息先前已儲存於此日誌中時, 刪除操作將在該聊天室中以 message.deleted 形式記錄,並使用 payload.chat_resolution 作為方法名稱。從未被儲存過的 ID 則以 deletion.unscoped 形式保存,且不包含 chat_id;系統絕不會進行任何推測。 頻道和超級群組會針對每個聊天室分別編號訊息,且 絕不會以此方式進行配對。當被刪除的訊息是由被監測帳戶發送時, payload.deleted_message_was_outgoing 為 true;但仍未提供刪除者資訊。 未指定範圍的通知並不能證明訊息從未被儲存:相符的 聊天紀錄可能不在當前觀察範圍內,或可能無法找到 唯一的匹配項目。在報告計數、篩選器及標籤中,「重新檢查未發現」仍與「刪除 通知」屬於不同的觀察結果。後續的復原會清除 當前的「缺失」狀態,同時在 簽名歷史紀錄中保留先前的檢查失敗紀錄;這兩種觀察結果均不構成刪除通知。 來自同一則通知中,多個解析為同一則聊天室的 ID 將被歸類為 `deletion.batch`,無論其數量為何。該通知並未證實整個聊天紀錄是否已被 清除、由誰執行刪除,或是否適用於所有參與者。 已儲存的發送訊息不會改變這些限制。較舊的日誌可能包含由十個或更多 ID 批次推斷出的 `history.cleared` 事件,其說明 文字會將刪除行為歸因於另一位參與者。這些推斷並未 獲得本次更新的支援。請保留這些原始的簽名記錄,但將其 視為分組刪除通知;當前介面會據此進行標示。 ## 涵蓋範圍:連續性、缺口及未被偵測的 ID 每個簽名 ZIP 檔案均包含 `coverage.json`,HTML 報告開頭會顯示相同的摘要,而 `verify.py` 會根據 `events.jsonl` 重新計算該摘要,而非直接信任該檔案: - **從 X 到 Y 持續進行監測。**一個週期始於 `observation.started`,並 終止於暫停、停止、Telegram 連線中斷、登出、未經 正常關機的程序啟動,或監測期間超過三分鐘無任何記錄 (每分鐘會寫入一次心跳訊號,因此靜默表示程序已停止、凍結或 電腦進入休眠狀態)。當在**「參數」**中變更心跳間隔時,每次心跳 都會記錄此變更,且允許的靜默時間將調整為三個間隔,絕不低於三分鐘。 - **「缺口」**欄位列出各期間之間的時間間隔及其原因。若最後 一筆記錄處仍有未填補的缺口,則標記為 `not_resumed_by_last_record`。 - **未偵測到的訊息 ID。**對於會針對每個 對話進行訊息編號的頻道和超級群組,偵測到的 ID 之間缺失的 ID 會以範圍形式列出。這些 ID 會被報告為 「*未偵測到*」—— 可能是已被刪除、從未送達,或超出已儲存的歷史紀錄範圍 —— 絕不會直接標示為 「已刪除」。私人對話和一般群組共用全帳戶範圍的序列號,因此單一 對話內的缺口並無特殊意義,亦不會在該處列出。 - 聊天層級的資料缺口通知(例如 Telegram 在某個 頻道中要求恢復差異)將被計為備註;此類通知不會中斷整體涵蓋範圍。 ### 缺失的訊息編號(`gap_summary`) **預覽。** `coverage.json` → `gap_summary` 用於統計 Telegram 所分配但此 收集器從未偵測到的訊息編號。Telegram 會針對每個頻道或超級群組編號一次,並針對每個 帳號在私人聊天、機器人及一般群組中各編號一次。兩個已偵測 訊息之間的編號,要麼已被偵測到,要麼缺失;若為連續範圍,則表示 該範圍內所有編號的訊息均已被偵測到。若出現編號缺口,則不指明任何行為者或原因。 | 領域 | 含義 | | --- | --- | | `status` | `on`,或 `off` 當在「**參數」→「差距分析」**中關閉時 | | `parameters` | 產生該結果的參數,以便能夠重現該結果 | | `chats[]` | 每個頻道或超級群組各佔一筆記錄,每筆記錄均獨立編號 | | `account` | 整個帳戶範圍內的私人聊天、機器人及一般群組的序列 | | `status` (依序列而定) | `applicable`,或 `not_applicable` 使用 `reason` | | `observed_from`, `observed_to`, `span` | 首次與最後一次觀察到的號碼,以及該範圍的大小 | | `observed`, `observed_without_content` | 觀察到的數字;僅能透過刪除或重新檢查記錄得知的數字 | | `missing`, `density`, `gap_ranges`, `largest_gap` | 從未觀察到的數字、其在範圍中所佔的比例、運行次數、最長運行時間 | | `clusters[]` | 列出的缺漏: `low`, `high`, `missing`,以及相鄰的觀察號碼 `after` / `before` 及其觀察時間 | | `service_estimate` | 僅在啟用時顯示:根據其觀察到的佔比,有多少個缺失的號碼屬於服務訊息。從未從中扣除 `missing` | 有效性源自日誌,絕不預設: - **頻道與超級群組的**統計是按每則聊天進行計算,在選定聊天的匯出檔案中亦同。 由發送者選定的記錄將作為統計依據 `not_applicable`. - **全帳戶序列**僅從 在「全帳戶收集」功能啟用期間收到的第一則至最後一則訊息開始計算,並包含私人聊天、機器人、一般 群組以及該帳戶自身的訊息,且不排除任何此類聊天(`scope.changed`)。 以 `deletion.unscoped` 計數的數字均視為已觀察到的訊息,但不包含內容。若僅對選定的聊天室進行匯出或 移交,則無法測量此數值。若「全帳戶收集」功能曾被 關閉後又重新開啟,系統會註明在此期間使用的數字將顯示為空缺。 - 服務訊息是具有獨立編號的日誌記錄,因此會自行填補空缺; 可選的預估時間僅供上下文參考。 `verify.py` 重新計算 `gap_summary` 根據 `events.jsonl` 使用簽名 `coverage.json` 成員中的參數(針對較舊的存檔採用預設值),並 在覆蓋範圍摘要中列印該帳戶範圍內的行。該存檔的 `get_capture_status`(MCP 與命令列)針對某次存取可能讀取的聊天室,會返回相同的測量結果; 而帳戶層級的序列僅適用於涵蓋整個工作區的存取。 對同一則服務訊息的重複觀察僅計為一次,且帳戶服務估算 僅使用測量範圍內的數字。在啟用全帳戶測量之前,所套用的範圍必須明確保留 該帳戶自身的訊息;較舊的記錄 若缺乏此資訊,則無法滿足此條件。停止觀察不會 延長測量範圍,且恢復觀察時會予以註記。即時存檔查詢設有時間 預算(包含其資料庫掃描),並將未完成的測量標記為「部分完成」。 Telegram 會記錄[各自獨立的訊息 ID 序列](https://core.telegram.org/api/updates#message-id-sequences)。 這些數字僅描述觀察結果;它們既無法識別刪除行為者,也無法闡明 為何某個數字會缺失。 當 Telegram 停止接受該帳戶時,結束監測的 `coverage.gap` 記錄 會攜帶 `cause`(`account_banned`、`account_frozen`、`account_deleted`、`session_duplicated`、 `session_revoked`、`session_expired`、`session_ended` 或 `not_authorized`)以及 Telegram 錯誤;`verify.py` 則標示該週期結束的原因。 涵蓋範圍包含記錄的觀察期間、中斷情況及訊息結果。 請配合所選的聊天室、期間及附件政策一併評估;僅憑 持續運作並不能證明 Telegram 更新已完整送達。 ## 製作人 證據 ZIP 檔案、聊天記錄匯出檔、Witness 日誌以及 人員檔案的聲明中所包含的簽名清單中,皆載有 `producer` :軟體名稱、版本、專案(PhishDestroy)、 官方網站及原始碼儲存庫。HTML 報告中亦顯示相同內容,而 `verify.py` 會將其列為已驗證項目之一。 在此欄位建立之前所製作的檔案,其驗證結果與 先前相同,且報告中會標示為未指明產生者。 每個 `observation.started` 記錄亦會標明進行監測的 Telegram 客戶端:其 `api_id` (絕非雜湊值),無論該客戶端是內建的公開鍵對還是營運商自有的應用程式, Telegram 連線請求中傳送的客戶端描述,以及連線 路徑的類型與 IP 模式(不含代理伺服器地址或密鑰)。 該報告與`custody.json`列出了每個 不同的客戶端及路由,並標註其記錄時間,以及未列出的代理未回應的時間點, 以及Telegram偵測到伺服器位址的時間。此前記錄的日誌皆有載明。 ## 人物簡介 系統會應要求,根據日誌中已有的 單一聊天記錄,建立一個個人檔案檔案(`tgwitness-dossier-v1`,JSON);不會從 Telegram 擷取任何資料,且個人檔案內容絕不會 寫入日誌(啟用或停用個人檔案的動作會以 `dossier.changed` 形式記錄)。 針對每位擁有已儲存訊息的使用者,系統會列出其姓名與使用者名稱歷史紀錄、Telegram 標記 (機器人、詐騙、假帳號、付費帳號、已驗證、受限、已刪除)——以儲存當下的狀態為準——以及個人資料 照片 ID、來自本地頭像快取中與該頭像相似的頭像之 SHA-256 及感知雜湊(pHash,相容於 `imagehash.phash`), 活動紀錄(第一則與最後一則訊息、 數量、已編輯及已刪除的分享、按 UTC 小時劃分的訊息)、誰回覆了誰、該人物曾發文的 中該人曾發文的對話,以及被提及的錢包(BTC、EVM、TRON、TON、LTC、 DOGE、XMR、SOL;Base58Check 地址已通過校驗和驗證)、電話號碼、使用者名稱及 連結,包括隱藏於文字後面的連結。 每個事實都會列出其來源的日誌記錄(`seq`),而 `record_hashes` 則包含 每個被引用的記錄的雜湊值。該陳述已使用工作區金鑰進行簽署: ``` python verify.py tgwitness-dossier-CHAT.json --fingerprint TRUSTED_SHA256 --evidence tgwitness-evidence.zip ``` 會檢查簽名、驗證證據匯出檔本身(包含簽名、雜湊鏈及檔案), 並確認每個被引用的記錄在同一工作區的該匯出檔中均完整無缺且未經修改。頭像雜湊值會標示為來自本地快取 (而非日誌記錄)。提及內容屬模式匹配——僅為待查證的線索,而非經核實的事實。 各聊天室皆可個別啟用個人檔案功能,可匯出為帶有密碼的 AES-256 加密 ZIP 檔案,且 當個人檔案功能關閉,或該聊天室從來源中移除時,相關資料即會被刪除。 ## 獨立見證人 會將「證人日誌」(`tgwitness-witness-v1`)及其頻道貼文,與 透過 `verify.py --witness … --channel …` 匯出的證據進行比對;請參閱「[獨立證人」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/)。 ## 清單與檢查點 manifest.json 包含格式、匯出時間、公鑰、指紋、日誌 長度、首部雜湊、範圍、產生者、限制,以及除 `manifest.json` 和 `manifest.sig` 本身以外 每個內容成員的 SHA-256 雜湊值。 manifest.sig 是對規範化 manifest JSON 進行 Base64 編碼的 Ed25519 簽名。 驗證器會拒絕處理意外出現或缺失的成員、名稱重複、檔案損毀、 序列/鏈路中斷、簽名無效,以及與提供的檢查點不匹配的情況。 它絕不會提取存檔路徑。它將聲明總未壓縮大小限制為 4 GiB; 若提高 **Parameters** 限制,`--max-gib N` 允許建立更大的存檔。 請從您已安裝的 TgWitness 版本或經審核的代碼檢出版本執行驗證。 壓縮檔中包含的副本支援可攜式使用;在執行該副本之前,請先將其與您的 可信安裝版本進行比對。 檢查點會對一則包含公開金鑰、日誌長度、頭部 雜湊值及建立時間的陳述進行簽署。驗證者可檢查後續的存檔是否包含 相同的前綴。請將檢查點保留在收集器之外,以便後續驗證時能將 存檔與獨立存放的參考資料進行比對。 ## 驗證範圍 驗證程序會檢查檔案及其生成所使用的收集模式。請選擇 其信任邊界與該情況相符的模式,並保留其驗證輸入。 | 收集模式 | 驗證者檢查的內容 | 驗證輸入與信任邊界 | | --- | --- | --- | | 本地工作區 | 記錄簽名、雜湊鏈、清單及附件位元組 | 獨立保留的收集器指紋;主機管理員控制本機簽署金鑰 | | 具備獨立見證者的本機工作區 | 檔案校驗,以及與見證者所保留的早期日誌前綴是否一致 | 獨立受信的見證金鑰與記錄;檢查點將已觀察到的前綴進行綁定 | | [GitHub Actions 擷取](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md) | GitHub 對存檔摘要、經核准的工作流程與收集器提交、託管執行器、最新會話/金鑰來源以及內部存檔完整性的驗證 | 可信驗證者政策、呼叫者儲存庫及 GitHub 證明套件;資料蒐集作業在固定工作流程下執行 | | [雲端部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/) | 服務供應商的生命週期與存取紀錄、防火牆及 Cloudflare 狀態,以及收集器的簽名執行紀錄 | 對服務供應商及 Cloudflare 進行唯讀查詢;各項檢查的可用性取決於服務供應商 | | [Intel TDX 機密虛擬機器](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#confidential-vm-on-phala-cloud-intel-tdx) | 引用簽名與平台狀態,並與收集器聲明、組件及作業系統測量值進行關聯 | Intel 信任鏈及預期部署指標;保留每項必備 TDX 檢查的結果 | 在「密封擷取」模式下,經核准的擷取者會透過經身份驗證的 Telegram 連線,在已驗證的環境內接收資料。證明機制將檔案與 該次執行綁定,因此驗證範圍涵蓋擷取過程以及後續的檔案完整性。 此機制仰賴上述的核准程式碼與平台信任鏈。 GitHub 擷取驗證要求在執行程序內建立會話,並會拒絕 使用「匯入會話」方式進行的擷取。 執行收據會記錄收集器的版本、檔案雜湊值及啟動設定。GitHub 來源追蹤與 TDX 測量結果提供環境檢查; [驗證記錄](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)則標示已測試的配置。 TgWitness 會對其收集的觀察結果進行簽名;Telegram 及訊息作者並不會發出 這些簽名。在本地工作區中,於第一個獨立 檢查點之前所建立的內容,仍取決於收集器及其金鑰持有者。覆蓋範圍記錄描述 所選範圍與收集結果,而經驗證的外部時間戳則將 已提交的存檔或日誌邊界錨定於特定時間點。 ## 附件 檔案在 media/ 目錄下以 SHA-256 雜湊值作為位址。media.saved 事件會將雜湊值與 位元組長度連結至特定的訊息事件。原始檔案名稱屬於元資料,絕非 本機路徑。 媒體資料的位元組會以非同步方式下載,因此若訊息被立即刪除,可能會導致 無法擷取。系統會顯示以下結果:收集功能已停用、檔案過大/大小未知、下載失敗, 以及下載中斷。若程序發生當機,可能會留下 未被引用的部分檔案;這些檔案不會包含在匯出檔案中。 ZIP 匯出工具會根據檔案名稱驗證儲存的媒體檔案。JSONL、CSV 和 HTML 匯出格式會驗證事件簽名,但不包含媒體位元組。衍生報告 僅供方便使用;events.jsonl 才是具有權威性的事件表示形式。 完整聊天記錄匯出會將工作區附件設定中的附件儲存至 media/ 目錄,並以 SHA-256 作為檔案名稱。 chat.json 中的每則訊息記錄會標示其檔案名稱(`file`、 `file_sha256`)或缺失原因(`file_status`),並一併記錄讀者所見的 文字周邊內容:文字後方的連結、轉發來源、機器人按鈕、簽名、瀏覽次數以及 自動刪除計時器。`verify.py` 會檢查每個被標示的檔案是否存在於該雜湊值對應的 簽名清單中。 ## 持久的蒐集與處理收據 (0.2) 媒體任務及其訊息事件提交將整合於單一交易中。 該任務儲存 原始 TL 訊息描述符;經簽名的觀察記錄會綁定其 SHA-256 值、帳號 及大小政策。還原功能會在下載前驗證該綁定關係。系統絕不會擷取 當前訊息,也不會默默替換為較新的附件。中斷的任務 會重新嘗試執行,而永久失敗則仍為明確的結果。 每個工作區皆擁有專屬的日誌與簽署身分。process.started 事件包含 執行 ID、本地時鐘、依賴項版本、原始碼檔案雜湊值、初始帳戶/範圍, 以及擷取設定。心跳訊息包含執行 ID、單調時間及佇列狀態。 執行收據亦可下載為一份獨立簽署的聲明。若要驗證 執行環境,請將其與「[驗證範圍」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)中所述的 GitHub 證明或 TDX 檢查 搭配使用。 系統會在啟動時、觀察期間每五分鐘(**參見「參數 → 每隔」**),以及正常停止時,於本地端保留自動檢查點。啟動驗證與匯出過程會將日誌 與最新保留的本地檢查點進行比對。當檢查點仍存在時,此機制可偵測到資料庫回滾 的情況。獨立保留機制確保該參考資料可在工作區 之外使用;經驗證的外部時間戳記則進一步將其錨定於特定時間點。 重新啟動後,系統將恢復已儲存的 Telegram 更新位置(`catch_up_from` 位於 `observation.started`),並請求補取遺漏的更新。定期重新檢查會記錄 `message.recovered` 以追蹤遺漏的訊息,並在 Telegram 不再 返回已儲存訊息時記錄 `message.missing_on_recheck`;後者並非刪除通知,亦未指明刪除者或時間。 ### 站外備份與還原 (S3) 離線副本(「匯出」,預設為關閉)會將日誌片段、保留檔案、檢查點 及其時間戳記,以及完成的聊天記錄匯出上傳至 S3 相容儲存空間,並在 AES-256-GCM 加密,並使用儲存於工作區金庫中的金鑰;若儲存桶支援,則會套用 Object Lock 保留機制。若未下載金鑰,則無法讀取該副本。請使用 `python -m tgwitness.replica restore --key-file KEY.json --out DIR` 進行還原與驗證。 還原功能需要一個空的普通資料夾。下載的檔案及解密後的物件會暫存於私有 臨時儲存空間中,直至整個日誌及每個保留的檢查點均通過驗證為止。不安全的物件 路徑、不一致的區段範圍,以及長度短於檢查點的日誌均會被拒絕;驗證失敗時 將不會發布任何還原檔案。 保留檢查會將回傳的「物件鎖定」 模式與日期,與上傳時傳送的截止時間進行比對(容許一秒的四捨五入誤差)。已過期、 無效或縮短的截止時間均不視為已驗證。狀態會回報該次上傳過程中 讀取到保留狀態的抽樣物件。 若本地媒體檔案遺失或損毀,系統會將其標記為當次處理的錯誤,並將媒體游標停留在 該處之前,以便在下一次處理時重新嘗試讀取該檔案;其後面的檔案、檢查點及匯出內容仍會 照常複製。還原過程會 將所有已保存媒體的參照與解密後的雜湊值及記錄的大小進行比對。 來自中斷上傳的 相同重疊日誌區段將被去重;衝突的重疊區段則會被拒絕。 上傳過程中建立的檢查點會被延遲,直到其所涵蓋的日誌記錄已被 複製為止,因此完成的處理階段不會在日誌之前發布檢查點。 ### 串流匯出快照 串流匯出採用穩定的 SQLite 讀取快照。當下載完成時,其起始點可能比 當前的即時日誌更早。在此快照之後建立的檢查點 可能會正確地顯示該存檔較短;請與位於匯出前綴處或之前的檢查點 進行比較,而非任意的較晚檢查點。 ## RFC 3161 準備與回應驗證 (0.2) 「證據模式」(預設為關閉)僅會透過工作區路徑(絕不經由 MTProxy),將每個簽名檢查點的 SHA-256 雜湊值傳送至列出的 RFC 3161 權威機構及 OpenTimestamps 日曆。 回覆內容將以 `checkpoints/anchors/` 格式保存、匯出,並由 `verify.py` 進行驗證(`--tsa-ca` 負責 驗證 TSA 簽名;使用 `ots upgrade` 和 `ots verify` 確認 OpenTimestamps 證明)。 該面板會準備一個請求存檔,其中包含標準的 checkpoint.json 位元組、 SHA-256 訊息指紋以及 timestamp.tsq 中的隨機非ce值、校驗和與操作說明。 此過程不會發出任何網路請求。此準備程序並非可信時間戳記。 `python -m tgwitness.anchor verify` 會對 OpenSSL 進行兩次 ts 驗證:一次針對檢查點 位元組,一次針對原始請求。必須明確指定可信賴的 CA 檔案; 內建憑證不會自動被視為可信。在命令列介面(CLI)中, 請求檢查為可選功能,因此請保留並提供 --request 參數以檢查非ce值。結果會顯示 是否已進行檢查。收集器的檢查點簽名與日誌仍須 透過可信的收集器指紋分別進行驗證。 驗證程序會檢查回應簽名、檢查點位元組,以及(若已提供) 在指定 CA 信任框架下的原始請求。憑證撤銷檢查以及憑證過期後的 長期歸檔驗證,不在本驗證器的處理範圍內。 請參[閱](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/)相關程序與驗證[結果](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/)。 ## 證據模式下的可選記錄:drand 及 Telegram 裝置 另有兩項記錄功能可與時間戳記在同一輪處理中執行。這兩項功能預設皆為關閉狀態, 且僅在「證據模式」開啟時才會生效:[進階] → [證據與備份] → [**更多見證者] · 可選**, 或 `"drand": true` 以及 `"devices": true` 在 `POST /api/evidence`中。其中一項功能發生錯誤並不會阻礙 另一項功能或時間戳記的運作;面板會在表單下方顯示各項功能的最新結果。 **drand** (`beacon.drand` )。每次處理都會將最新一輪的 drand quicknet(即「熵聯盟」的公開 隨機數,每 3 秒一輪)寫入日誌:`chain` 、 `round` 、`randomness` 、`signature` 、`round_time` 以及回應的 `relay` 。一個經過驗證的 不可預測的輪次,為後續透過雜湊連結的材料提供較早的時間參考點。 後續檢查點上的經驗證時間戳記則提供時間上限參考。這些檢查 界定了鏈結資料的範圍;資料收集的覆蓋範圍則另行評估。收集器會先查詢 `drand.cloudflare.com` ,接著透過工作區路徑查詢 Protocol Labs 的中繼站,每輪執行一次請求。 `verify.py` 會檢查每個隨機數是否為其簽名的 SHA-256 ,並確認 輪次時間是否正確,同時回報輪次數、最長未產生隨機數的區間,以及 收集器時鐘相對於 drand 的滯後程度。 它不會檢查 BLS 簽名。`--check-drand` 會將輪次與 Cloudflare 中繼站、Protocol Labs 中繼站,或是長日誌中所有中繼站, 或隨機抽取的 100 個樣本進行比對;若有任何一輪次不符,驗證即告失敗。 **、Telegram 裝置、**(`account.devices`)。每次掃描都會讀取該帳戶與 `account.getAuthorizations` 的會話,以及「設定」→「裝置」中顯示的 Telegram 清單,並完整記錄: 若自上次處理後有所變更,則完整記錄該清單,並包含`added`與`removed`的 會話雜湊值;否則僅記錄其數量及SHA-256。裝置型號、平台、應用程式及版本、 建立時間與最後活動時間、國家及地區均予以保留;IP 位址則不予保留,因為 證據匯出後便不再由您掌控。 收集器自身的會話始終處於活躍狀態,因此 僅有其他會話的活動才被視為變更。`verify.py` 會回報清單 被記錄的頻率,以及每個新建立與結束的會話。它僅在觀察程序執行期間讀取該清單。 他們未展示的內容:drand 僅能證明記錄相對於公開時間的順序, 而裝置清單是 Telegram 透過收集器發出的聲明,並由收集器簽署, 如同其他所有記錄一樣。 **Cloudflare Gateway 日誌** (`cloudflare.gateway_dns`)。 對於透過 Cloudflare Gateway([Gateway DNS](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#cloudflare-as-an-outside-witness))進行解析的伺服器,每次 複製都會擷取自上次複製以來 Gateway 所記錄的內容:每個時間窗(最長三 小時)對應一筆記錄,包含 `from`、`until`、`location_id`、伺服器的 `address`(若已設定),以及 `queries`(當其值為 `[at, name, type, rcode, decision, colo]` 時,即使該欄位為空亦然)。 請在 **下設定 Cloudflare Gateway 日誌**:帳戶、位置、可選地址以及一個唯讀代幣(帳戶 分析讀取權限;零信任 PII 讀取權限,用於保留共享位置中的一個地址)。控制面板會在儲存前透過單一請求驗證 這些資訊;憑證始終保持加密狀態,且絕不會進入日誌。 `verify.py` 列出時間窗、查詢最頻繁的名稱,以及任何未被副本涵蓋的時間點;若某筆記錄 的計數與其查詢不符,則會失敗。 若某個時間窗在單一秒內包含超過一頁的 查詢,則保留該頁並標示其餘部分遺失。該副本是 Cloudflare 透過收集器傳回的回應,並由收集器簽署;在 24 小時內,任何持有 唯讀憑證者皆可將其與 Cloudflare 進行比對。 --- # Telegram · 獨立見證人 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/ 請使用具備專屬金鑰與機器人的「Witness」執行程序,將簽署過的檢查點發佈至頻道,並據此核對匯出資料。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 請使用具備專屬金鑰與機器人的「Witness」執行程序,將簽署過的檢查點發佈至頻道,並據此核對匯出資料。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [證據與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) [匯出與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) · [高可信度](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/) · [面板指南](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/#extras) 見證者會將已簽名的檢查點與收集器分開保存。它會檢查 收集器的簽名與日誌連續性,使用自身的金鑰對結果進行簽名,並 將其發佈至 Telegram 頻道。請在具備對 收集器見證端點唯讀存取權限的獨立伺服器上執行此工具。 流程圖 · 收集器 → 見證者 (簽名檢查點:記錄數 + 頭部雜湊值); 見證者 → Witness 日誌,自有金鑰; 見證者 → Telegram 頻道 (透過其自有機器人發布的簽名貼文); 證據 ZIP 檔案 → verify.py; Witness 日誌,自有金鑰 → verify.py; Telegram 頻道 → verify.py (Telegram 桌面版匯出功能或 t.me/s 頁面) · 收集器 · 見證者 · Witness 日誌,自有金鑰 · Telegram 頻道 · 證據 ZIP 檔案 · verify.py · 簽名檢查點:記錄數 + · 頭部雜湊值 · 透過其自有機器人發布的簽名貼 · 文 · Telegram 桌面版匯出功能或 · t.me/s 頁面 **圖表轉為文字** 1. 收集器 → 見證者 (簽名檢查點:記錄數 + 頭部雜湊值) 2. 見證者 → Witness 日誌,自有金鑰 3. 見證者 → Telegram 頻道 (透過其自有機器人發布的簽名貼文) 4. 證據 ZIP 檔案 → verify.py 5. Witness 日誌,自有金鑰 → verify.py 6. Telegram 頻道 → verify.py (Telegram 桌面版匯出功能或 t.me/s 頁面) **本頁內容** - [見證者能取得什麼,以及無法取得什麼](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#what-the-witness-gets-and-what-it-does-not) - [其檢查與記錄的內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#what-it-checks-and-records) - [執行見證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#run-a-witness) - [多個工作區的公開證明頁面](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#public-proof-page-for-several-workspaces) - [驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/#verify) ## TgWitness 能提供什麼,以及它無法提供什麼 | 該證據日誌具備 | 該證人從未 | | --- | --- | | 適用於單一工作區的唯讀**見證代幣** | 資料收集者的 Telegram 會話或 API 憑證 | | 其專屬的 Ed25519 金鑰與日誌 | 收集器的儲存庫、簽名金鑰或面板憑證 | | 專屬的 Telegram 機器人代幣 | 訊息內容:開頭為記錄數量及雜湊值 | 該憑證是在**「Extras」→「Independent witness」**中建立的,僅顯示一次,且僅以 SHA-256 的形式儲存。它會開啟一個且僅一個端點, `GET /api/witness/head`,該端點會回傳一個剛 簽署的檢查點,以及經簽署的無內容集合計數器和運作狀態。 它無法開啟面板、讀取訊息內容或變更設定,且 該處不接受面板代幣。請在同一頁面撤銷代幣。收集器會記錄 新見證金鑰開始檢查的時間(`witness.seen`) 並顯示每個令牌的最後一次檢查時間; 若見證者在 2.5 個間隔內未進行檢查,則會被標記為逾期。 新見證者會在 每次投票時發送一個隨機挑戰;擷取陳述會於收集器簽名下方重複該挑戰。計數器 與確切的檢查點綁定,並包含在簽名的見證貼文中。舊版見證者 仍可被獨立見證者接受。僅日誌的增長絕不會被計為新訊息。 ## 其檢查與記錄的內容 每隔一段時間(預設為 10 分鐘),Witness 會: 1. 自行擷取頭部資料(收集器無法推送或跳過該部分); 2. 驗證收集器的簽名、固定收集器金鑰(`--collector-fingerprint`, 或首個偵測到的金鑰)、一個非遞減的計數,以及在未變更計數下未變更的頭節點。 Merkle 包含性與一致性證明可驗證,日益增長的日誌是否延伸至 保留的檢查點。一旦使用過連續性證明,便會拒絕移除該證明; 3. 將一份經簽署的記錄附加至其自身的日誌中:`witness.anchor`,狀態為 `ok`、 `key_changed`、`rollback`(記錄數量少於先前)、`fork`(長度相同,但 標頭不同)或 `invalid`(回應未能通過驗證),或當 收集器未回應時為 `witness.no_response`; 4. 將結果發佈至頻道,並附有簽名,包含「無回應」的情況,只要 TgWitness 正在運行且能連線至 Bot API。發佈 ID 已記錄(`witness.posted`), 發佈失敗的情況亦同(`witness.post_failed`)。 一則貼文的樣貌如下;最後一行載有經簽署的聲明: ``` TgWitness witness #42 · journal head Collector 3fa9c2d1e0b4a7f6: 18234 records Head 9b1f…c07e 2026-10-28T19:40:00.123+00:00 TGW1.eyJhdCI6…. ``` ## 執行 TgWitness 您需要一個 Telegram 機器人(可透過 @BotFather 建立),一個由該機器人擔任 管理員的頻道,以及一個可從證人端存取的收集器位址——需透過 HTTPS 連線,且位於 私有網路之外(請參閱[部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/)章節中的 HTTPS 設定檔)。 在面板中開啟**「附加功能」→「獨立見證人」→「設定」**。三個步驟涵蓋 唯讀存取權限、您的頻道與間隔時間,接著啟動見證人。發佈 政策、可選用的 HTTP/SOCKS5 代理伺服器以及自訂 Bot API 位址皆位於**「進階設定」**中。此表單 會下載 `witness.json` 時,會預先填入此工作區的收集器金鑰。請透過「**將存取檔案儲存**為」功能下載新 建立的唯讀憑證 `witness-token.txt`」下載新建立的唯讀憑證;將其與 `bot-token.txt`在見證主機上建立的檔案,一併放置於該 JSON 檔案旁。收集器絕不會接收機器人憑證。 下載過程不會啟動任何服務,也不會發佈任何訊息。任何託管專案的見證者均不會 被隱含地註冊。 ``` python -m tgwitness.witness run --config witness.json --check-config python -m tgwitness.witness run --config witness.json python -m tgwitness.witness fingerprint --config witness.json ``` 第一個指令會檢查配置檔和密鑰檔案,過程中不會發出網路請求或建立金鑰。 JSON 中的路徑是以該檔案為基準的相對路徑;CLI/環境路徑則是以 工作目錄為基準的相對路徑。 將見證者的指紋保留在其主機之外。收集器的 「最後輪詢」指標僅用於確認請求;發布狀況則由 Proof 回報,或可透過 見證者日誌及頻道進行查核。 若控制面板位於 SSH 隧道後方,請參照此[Caddy 範例](https://github.com/phishdestroy/TgWitness/blob/main/deploy/Caddyfile.witness.example),僅在 獨立的 HTTPS 主機名稱上公開範圍限定的 Witness 端點。 預設工作區將使用 `https://witness.example.org`,其他工作區則使用 `https://witness.example.org/profiles/ID`。仍需提供存取憑證;該虛擬主機不會轉發控制面板及其 其他 API 路由。 選擇 `all` 以獲取定期發布的檢查點。五分鐘的間隔意味著每個工作區每天約有 288 則貼文。`changes`/`problems` 會刻意不發布部分檢查點。 MTProxy 適用於資料收集者的 Telegram 客戶端。Witness 的 HTTP 輪詢與 Telegram 的 HTTPS Bot API 會使用各自的直接連線/HTTP/SOCKS5 路由([Bot API](https://core.telegram.org/bots/api))。 **在收集器旁邊,使用 Docker**(同一主機——獨立的程序和金鑰,但 由同一位操作員管理):將數值填入 `.env` 並啟動該設定檔。 ``` TGWITNESS_WITNESS_TOKEN=tgww_... TGWITNESS_WITNESS_BOT_TOKEN=123456:ABC... TGWITNESS_WITNESS_CHANNEL=@your_witness_channel # another workspace: TGWITNESS_WITNESS_COLLECTOR=http://tgwitness:8787/profiles/ docker compose --profile witness up -d docker compose logs witness # prints the witness key fingerprint ``` 若使用已發布的圖片,請標註 `docker compose --project-directory . -f deploy/compose/compose.image.yaml --profile witness up -d`。 **若部署於他人伺服器**(真正的獨立見證者):將儲存庫複製至該處,將 `TGWITNESS_WITNESS_COLLECTOR=https://your-collector.example.org` 以及上述三個數值 設定至 `.env`,然後 ``` docker compose --project-directory . -f deploy/compose/compose.witness.yaml up -d ``` 或不使用 Docker: ``` python -m tgwitness.witness run --collector https://your-collector.example.org \ --token-file witness-token.txt --bot-token-file bot-token.txt --channel @your_witness_channel ``` ### 發佈至 Discord 見證者可選擇在 Discord 頻道而非 Telegram 上發文。在 Discord 中,開啟 **「編輯頻道」→「整合」→「Webhook」**,建立一個 Webhook 並複製其網址。在 設定面板中,於步驟 2 選擇**「Discord Webhook · 您的頻道」**。在見證者主機上, 將該網址儲存為 `discord-webhook.txt` 旁 `witness.json`;該連結絕不會傳送至 收集器。 ``` python -m tgwitness.witness run --collector https://your-collector.example.org \ --token-file witness-token.txt --discord-webhook-file discord-webhook.txt ``` 每位見證者僅有一位發布者:Telegram 頻道或 Discord Webhook,不可同時具備兩者。貼文 均包含相同的簽名聲明,且無法標記任何人。若貼文長度超過 Discord 的 2,000 個字元,則會被一行簡短文字取代,並附上完整的檢查碼作為 `witness-check.txt`。每則貼文的 ID 會以 `witness.posted`. `verify.py --channel`僅讀取 Telegram 頻道的匯出資料,因此針對 Discord 請保留見證日誌:其中包含 每筆檢查紀錄。 ### 選項 | 選項 | 環境 | 預設 | 含義 | | --- | --- | --- | --- | | `--interval` | `TGWITNESS_WITNESS_INTERVAL` | 10 | 檢查間隔時間,1–1440 | | `--timeout` | `_TIMEOUT` | 30 | 等待資料收集器與 Bot API 的時間為 5 至 600 秒 | | `--post` | `_POST` | `all` | `all`:每項檢查;`changes`:新進展或新問題;`problems`:盡是問題與未解之謎 | | `--title` | `_TITLE` | `TgWitness witness` | 每個頻道貼文的開頭字句 | | `--collector-fingerprint` | `_COLLECTOR_FINGERPRINT` | – | 請將收集器金鑰固定,而非直接採信第一個答案 | | `--proxy` | `_PROXY` | 直接 | `socks5://host:port` 或 `http://host:port` | | `--bot-api` | `_BOT_API` | `https://api.telegram.org` | Bot API 位址,例如本地的 Bot API 伺服器 | | `--data-dir` | `_DATA` | `witness-data` | Witness 金鑰與日誌 | | `--config` | `_CONFIG` | – | 包含上述任一選項的 JSON 檔案 | 收集器的地址、代幣及頻道來自 `--collector`, `--token` 或 `--token-file`, `--bot-token` 或 `--bot-token-file`, `--discord-webhook-file` 以及 `--channel`, 或 `_COLLECTOR`, `_TOKEN`, `_TOKEN_FILE`, `_BOT_TOKEN`, `_BOT_TOKEN_FILE`, `_DISCORD_WEBHOOK_FILE` 以及 `_CHANNEL`,這能防止機密項目出現在程序清單中。 配置檔採用帶有底線的選項名稱,並加上`texts`,該代碼會替換頻道貼文中的 文字: ``` {"collector": "https://your-collector.example.org", "token_file": "witness-token.txt", "bot_token_file": "bot-token.txt", "channel": "@your_witness_channel", "interval": 5, "timeout": 30, "post": "changes", "title": "Partner witness", "texts": {"ok": "journal head", "no_response": "no answer from the collector", "records": "records"}} ``` `texts` 金鑰:`ok`、`key_changed`、`rollback`、`fork`、`invalid`、`no_response`、`collector`、 `records`、`head`。命令列優先於環境變數,環境變數優先於檔案。 未知選項或文字金鑰會觸發警告訊息並中止記錄,而非被忽略。 文字表述絕不影響驗證:verify.py 會在每次 發文結束時檢查簽名代幣。 在 `--post changes` 或 `problems` 中,未發布的檢查仍會保留在 見證日誌中,而 `verify.py` 會將其標示為「從未發布」;起始記錄會標明 相關政策。每項檢查仍會出現在日誌中,因此發布次數減少僅意味著獨立的 Telegram 傳送次數減少,而非檢查數量減少。 即使沒有頻道,Witness 仍會持續維護其日誌。請將 Witness 金鑰指紋 (`python -m tgwitness.witness fingerprint`) 存放在其他地方。 ## 多個工作區的公開驗證頁面 `python -m tgwitness.proof` TgWitness 最多可同時監控 32 個工作區,並提供一個唯讀 頁面,顯示每個工作區最新的簽名檢查結果。每個工作區在 data 資料夾下都有專屬的見證金鑰和 日誌,以及一個固定收藏金鑰;是否發佈至 Telegram 頻道 則可針對每個工作區自行選擇。請從 [proof.config.example](https://github.com/phishdestroy/TgWitness/blob/main/deploy/proof.config.example) 開始: | 領域 | 含義 | | --- | --- | | `title` | 頁面標題,1–100 個字元 | | `data_dir` | 與檔案相關的 Witness 金鑰和日誌;預設值 `proof-data` | | `interval`, `timeout` | 檢查間隔(分鐘,範圍 1–1440,預設值 5);等待時間(秒,範圍 5–600,預設值 20) | | `workspaces[].id`, `label` | 簡短的小寫別名與顯示名稱 | | `workspaces[].collector` | 收集器地址;其他工作區的結尾為 `/profiles/` | | `workspaces[].collector_fingerprint` | 必備項目,每個工作區各不相同 | | `workspaces[].token_file` | 包含該工作區唯讀見證代幣的檔案 | | `workspaces[].channel`, `bot_token_file` | 可選功能:將每次檢查結果發佈至頻道 | | `workspaces[].proxy`, `bot_api` | 可選的路徑與 Bot API 位址 | ``` python -m tgwitness.proof --config proof.json --check-config python -m tgwitness.proof --config proof.json --host 127.0.0.1 --port 8790 ``` 第一個指令會在不建立連線的情況下,驗證檔案及代幣檔案。 該頁面僅回應 GET 和 HEAD 請求: - `/` 顯示所有工作區;若某個工作區在 2.5 個間隔內未被檢查,則會被標記為過期。 - `/api/proof` 回傳的結果與 JSON 相同。 - `/api/proof/` 下載最新的簽署聲明(`tgwitness-public-proof-v1`): 見證記錄編號與雜湊值、狀態、固定收藏器金鑰、檢查點、收集 計數器,以及頻道發文是否成功,並由該工作區的見證金鑰簽署。 - `/healthz` 當工作區的監控程式停止運作時,會回傳 503 錯誤。 請為該頁面設定專屬的主機名稱,例如 [Caddyfile.proof.example](https://github.com/phishdestroy/TgWitness/blob/main/deploy/Caddyfile.proof.example)。為進行驗證,請使用 以下說明中的方法匯出 工作區的見證日誌, `python -m tgwitness.witness export --data-dir proof-data/ --out witness.zip` ,並依照 以下說明使用該日誌。 ## 驗證 在「witness」端,匯出其日誌: ``` python -m tgwitness.witness export --out witness.zip # Docker (add -f deploy/compose/compose.witness.yaml on a witness server): docker compose exec witness python -m tgwitness.witness export --out /witness/witness.zip docker compose cp witness:/witness/witness.zip . ``` 接著,無論身在何處,只要擁有收集器產生的簽名 ZIP 檔案,以及從 Telegram Desktop 匯出的頻道(*「匯出聊天記錄* 」→「JSON」會產生 `result.json` )或其公開的 `https://t.me/s/…` 頁面: ``` python verify.py tgwitness-evidence.zip --fingerprint COLLECTOR_SHA256 \ --witness witness.zip --witness-fingerprint WITNESS_SHA256 --channel result.json ``` `verify.py` 會檢查證人日誌(鏈與簽名),接著確認**證人 所見的每個頭部皆屬於匯出日誌的一部分**:該計數處的記錄必須擁有精確 對應的雜湊值。若頭部不匹配,則驗證失敗——表示日誌在 證人查看後遭到篡改。 它還會報告匯出後所見的頭部記錄、見證人 記錄的異常情況、驗證失敗的回應、其匹配檢查點存在於此 匯出檔中的時間段(「見證範圍從 X 至 Y」),以及缺口。後續的檢查點不會延長這些時間段。 結果包含最後一個匹配的記錄編號,以及後續 未找到匹配檢查點的記錄數量。僅計入由該匯出檔自身金鑰簽署的回答:若匯出檔 由見證者從未見過的金鑰簽署,則會被報告為「未見證」;若未採用`--fingerprint`,其 簽署者將保持未錨定狀態。 採用 `--channel` 時,每個簽署的貼文都必須與見證日誌 逐筆匹配:已變更的貼文將驗證失敗,缺失的貼文則會被列出。在 提供的 Telegram JSON 匯出檔中,日期屬於可編輯的元資料,不屬於簽署的見證代幣範圍。 代幣匹配並不能驗證發布日期;結果會明確 報告未執行發布時間的驗證。 ### 需設定經見證的匯出範圍 若需進行必須包含經見證之最終紀錄的交接,請加入 `--require-witness`: ``` python verify.py tgwitness-evidence.zip --fingerprint COLLECTOR_SHA256 \ --witness witness.zip --witness-fingerprint WITNESS_SHA256 --require-witness ``` 這需要獨立保留的「見證者指紋」以及與此匯出檔案 精確末尾相符的檢查點。僅涵蓋較早前前綴的檢查點 是不夠的。請暫停收集,讓見證者觀察最終狀態,並在 進一步寫入日誌之前進行匯出;若日誌發生變更,請保留另一個檢查點並 匯出該狀態。 僅憑後續的檢查點無法驗證較短匯出檔的最終雜湊值。 當同時提供 `--channel` 時,若聲稱的貼文缺失或匹配集為空,將導致此 嚴格檢查失敗。若未啟用此標誌,一般完整性檢查仍會報告未經見證的 記錄,但不會因此拒絕一個在其他方面完整的存檔。 請將見證日誌及其固定金鑰分開存放。線上檢查用於驗證各檢查點之間的連續性; 離線驗證則會將每個保留的檢查點與 匯出檔進行比對。缺乏連續性證明之舊版見證節點仍會保留離線比對結果,並 在未進行線上連續性驗證的情況下提交報告。報告會按時間區間列出見證節點的停機時間及 發布失敗的紀錄。 ### 每日印章與不可用的時間戳日曆 見證人會對前一天(UTC)的日誌邊界進行封存,並將 該簽名封印的雜湊值提交至 OpenTimestamps。日曆提交屬於待確認的證據; 僅經獨立核查的比特幣承諾才會獲得驗證器的確認。 若所有日曆皆失敗,簽名印章與未成功的嘗試仍會保留在 日誌中。每小時的維護循環會重新嘗試處理該原始記錄,包括 在重新啟動或變更日期之後。它最多會掃描 32 個印章,最多 提交兩項缺失的提交,且每次循環在重試上最多耗時 60 秒。一個 持久游標會輪流處理較舊的印章。保留的提交將遵循 現有的證明升級路徑。 重試不會重寫封印、更改其原始日期,也不會聲稱 日曆系統較早收到該封印。較晚的比特幣承諾仍屬較晚的外部 確認。缺失的證明仍為 `none`;待處理的證明則維持 `pending` 狀態,直至 驗證者獨立檢查為止。 --- # Telegram · 時間戳記 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/timestamp/ 簽名檢查點的 RFC 3161 時間戳記:傳送至授權機構的內容,以及如何驗證回應。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 簽名檢查點的 RFC 3161 時間戳記:傳送至授權機構的內容,以及如何驗證回應。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [證據與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) TgWitness 會準備 RFC 3161 請求,並驗證時間戳記授權機構(TSA)的回應。 此手動程序既不會選擇 TSA,也不會提交資料;而「證據模式」則會依照 預定時程([證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#rfc-3161-preparation-and-response-verification-02))同時執行這兩項操作。已準備好的請求 **尚不**構成 **時間戳記證明**。 ## 證據的約束力 流程圖 · 帳戶觀察 → SHA-256 鏈與 Ed25519 簽名; SHA-256 鏈與 Ed25519 簽名 → 簽名檢查點; 簽名檢查點 → 精確至位元的雜湊值與隨機非ce值; 精確至位元的雜湊值與隨機非ce值 → RFC 3161 請求; RFC 3161 請求 → 獨立 TSA; 獨立 TSA → 經簽署的 TSA 回應; 簽名檢查點 → 驗證資料、隨機數及明確的憑證授權機構(CA)信任關係; 經簽署的 TSA 回應 → 驗證資料、隨機數及明確的憑證授權機構(CA)信任關係 · 帳戶觀察 · SHA-256 鏈與 Ed25519簽名 · 簽名檢查點 · 精確至位元的雜湊值與隨機非ce值 · RFC 3161 請求 · 獨立 TSA · 經簽署的 TSA 回應 · 驗證資料、隨機數及明確的憑證授權機構(CA)信任關係 **圖表轉為文字** 1. 帳戶觀察 → SHA-256 鏈與 Ed25519 簽名 2. SHA-256 鏈與 Ed25519 簽名 → 簽名檢查點 3. 簽名檢查點 → 精確至位元的雜湊值與隨機非ce值 4. 精確至位元的雜湊值與隨機非ce值 → RFC 3161 請求 5. RFC 3161 請求 → 獨立 TSA 6. 獨立 TSA → 經簽署的 TSA 回應 7. 簽名檢查點 → 驗證資料、隨機數及明確的憑證授權機構(CA)信任關係 8. 經簽署的 TSA 回應 → 驗證資料、隨機數及明確的憑證授權機構(CA)信任關係 收集器的簽名將記錄與其金鑰綁定。可信的 TSA 回應可 證明某個特定檢查點在 TSA 所聲明的時間點確實存在。該 檢查點隨後可將日誌前綴與之綁定。此舉並不能證明 每項 Telegram 操作的時間,亦無法證明擷取內容的真實性。 ## 操作流程 1. 請透過獨立的可信通道保留收集器的金鑰指紋。僅憑 受檢 ZIP 檔案所提供的金鑰,不足以識別該收集器。 2. 在**「匯出」→「準備時間戳記請求**」中,下載所選工作區的 請求 ZIP 檔案。解壓縮 `checkpoint.json`、`timestamp.tsq`、`SHA256SUMS` 及 `README.txt`。請勿變更檢查點位元組。 3. 選擇適合該調查的 TSA。透過其 文件中記載的方法提交 `timestamp.tsq`,並使用 `application/timestamp-query` 進行 HTTP 服務。 將原始二進位回應儲存為 `timestamp.tsr`,並記錄端點、擷取時間 及請求結果。該請求包含雜湊值與隨機數,而非訊息內容; 網路元資料仍會揭露該請求。 4. 請獨立於回覆之外取得受信任的根憑證,以及任何 所需的中間憑證。回覆中的憑證不會僅因 被包含在其中而自動成為受信任憑證。 5. 透過可信賴的 TgWitness 安裝環境,驗證: ``` python -m tgwitness.anchor verify --checkpoint checkpoint.json --request timestamp.tsq --response timestamp.tsr --ca trusted-tsa-root.pem ``` 如有需要,請新增 `--intermediates tsa-intermediates.pem` 或 `--openssl /path/to/openssl`。 OpenSSL 必須支援 `ts`。在 Windows 系統上,驗證器也會搜尋標準的 Git 安裝目錄。OpenSSL 3.5.9 已透過合成 CA/TSA 進行本地測試。 1. 在檢查點之後匯出經簽署的日誌 ZIP 檔案,使其包含該前綴。 請使用獨立已知的指紋進行驗證: ``` python tgwitness/verify.py evidence.zip --fingerprint TRUSTED_SHA256 --checkpoint checkpoint.json ``` 1. 將 ZIP 檔案、檢查點、請求、回覆、憑證鏈、驗證 結果以及交接記錄保留於收集器之外。於接收時重複進行驗證。 若要從已儲存的檢查點準備請求: ``` python -m tgwitness.anchor prepare checkpoint.json --out timestamp-request.zip ``` 此準備程序會將 JSON 標準化,並將對應的檢查點納入存檔中。 請使用**該存檔中的檢查點位元組**進行 TSA 驗證,即使 輸入檔案的空白字元格式有所不同。 ## 驗證範圍 | 檢查 | 當前運作方式 | | --- | --- | | 資料 | 檢查點字節的精確 SHA-256 值必須與回應結果相符 | | 請求 | 透過 `--request`,原始查詢與隨機數皆會經過驗證 | | TSA 簽名 | OpenSSL 會驗證簽名及其通往指定憑證授權機構 (CA) 的憑證鏈 | | 收集器簽名 | 由日誌驗證器透過固定金鑰進行獨立驗證 | | 撤銷 | 不支援自動擷取 OCSP/CRL | | 長期有效性 | 憑證過期後將不再進行存檔驗證 | | 排程提交 | 證據模式,預設為關閉 | `--request` 在技術上雖屬可選,但若省略此參數,將導致無法驗證 原始隨機數。若要執行此完整程序,結果中的 `request_checked` 必須為真。 憑證驗證遵循已安裝 OpenSSL 的規則及驗證時間。 長期保存需另行制定憑證/撤銷證據政策。 有效的加密簽名並不自動等同於合格的時間戳記,亦不構成 法律上的可採納性判定。若操作員在 加註時間戳記前捏造了觀察結果,TSA 僅會將這些位元組錨定;並不能證明其真實性。 ## 交接紀錄 記錄案件識別碼、發送者與收件者、UTC 傳輸時間及其來源、 目的、檔案名稱/SHA-256 值、收集器指紋、序列範圍、已知 缺口、驗證器版本及驗證結果。 請透過貴組織的流程對此 記錄進行簽署並獨立保存。TgWitness 並未 實作多使用者保管記錄系統。 開發過程中未聯繫任何獨立的即時 TSA。本地測試會建立一個 合成 CA/TSA,以檢查相容性,並驗證系統是否會拒絕已變更的資料、隨機數或 CA。 --- # Telegram · 儲存與還原 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/ 備份功能、將舊檔案移至您的雲端儲存空間、在 Object Lock 下的副本,以及在新裝置上的資料恢復。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 備份功能、將舊檔案移至您的雲端儲存空間、在 Object Lock 下的副本,以及在新裝置上的資料恢復。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) 該面板將任務分為三類: | 任務 | 功能說明 | | --- | --- | | 保留備份 | 將已簽名的日誌、檢查點、備份檔案及排程中的匯出項目複製到已設定的 S3 儲存位置。 | | 免費的本地儲存空間 | 將選定的舊附件複製到 S3 或 rclone 雲端遠端儲存空間,完整讀回內容,驗證加密位元組,然後刪除已驗證的本地副本。 | | 保留一份證據副本 | 設定 S3 Object Lock 並檢查回傳的保留狀態。該服務必須確認所請求的模式與日期。 | 釋放儲存空間時,絕不會刪除或覆寫已簽名的日誌。每個附件均保留 其原始 SHA-256 以及一份恢復憑證。可選的 gzip 壓縮會在 經過驗證的加密之前進行。雲端檔案名稱不包含 Telegram 名稱、 聊天 ID 或原始附件名稱。單一附件最大可達 32 GiB。 僅憑上傳回應並不能作為刪除檔案的授權。TgWitness 會下載 完整的加密物件並驗證其大小,SHA-256 則會儲存收據, 並在刪除前立即再次檢查本機的位元組數。若發生上傳失敗、 讀回結果不符或傳輸被取消的情況,本機檔案將保留原狀。若 已啟用的證據備份尚未複製該檔案,刪除操作亦會等待備份完成。 **本頁內容** - [當磁碟空間即將用盡時](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#when-the-disk-is-filling-up) - [連接目標位置](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#connect-a-destination) - [保留還原檔案](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#keep-the-recovery-file) - [安裝資料遺失後的恢復步驟](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#recover-after-losing-the-installation) - [操作員機器人與完成通知](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/storage/#operator-bot-and-completion-notices) ## 磁碟空間即將耗盡時 當可用空間低於**參數 → 附件 → 可用磁碟空間**中的門檻(預設 1 GiB)時,附件下載會暫停並保留佇列。文字觀察繼續進行。這不受通知設定影響:關閉通知不會關閉下載預留空間或儲存保護措施。 若要提早介入,請啟用**自動執行**,選擇**刪除本機檔案以釋放空間**,並啟用**磁碟空間不足時額外執行一次轉存**。此選用規則預設在可用空間低於 5120 MiB 時啟動,分批處理直到可用空間達到 10240 MiB。兩個門檻皆可設定。它與手動執行使用相同的目的地、檔案最短存放時間、批次上限、完整回讀驗證及證據備份前提條件,不會自行啟用目的地。每 30 秒檢查一次;發生錯誤或沒有進展時,下次嘗試延後五分鐘。規則狀態及重試時間在重新啟動後保留。規則未啟動時,排程工作仍依正常間隔執行。 面板顯示可用空間、封裝預留空間、空間不足規則是否就緒,以及因暫存空間不足而略過的檔案。封裝和還原在開始前檢查暫存空間的峰值需求,並在寫入期間檢查可用空間。預留量使用下載設定,但儲存操作至少保留 64 MiB。這些檢查不是檔案系統配額;其他程序仍可能在兩次檢查之間耗用空間。 Gzip 對遠端物件進行無損壓縮,不會縮小使用中的日誌,也不會建立本機封存檔。JPEG、影片及 ZIP 可能幾乎不縮小,甚至略微增大。啟用壓縮時,目前封裝流程可能暫時需要約兩倍附件大小的空間,再加上預留量。請為最大的檔案選擇足夠早的啟動門檻。無法封裝的過大檔案會保留並回報;較小檔案及已驗證的遠端副本仍可釋放空間。已有驗證通過的副本時,不必再建立本機封裝檔即可移除本機檔案。還原也需要暫存空間,空間不足時可能遭拒。 沒有符合條件的可移動檔案或未設定目的地時,TgWitness 無法自動回收空間。儲存管理絕不會裁剪或重寫簽署過的日誌。新的文字觀察仍需要磁碟空間。 ## 連接目標位置 在**「附加功能」→「儲存空間與磁碟空間」→「管理儲存空間**」中,選擇任務與目標位置, 儲存後,再選取「**測試上傳與下載**」。此測試會上傳一個隨機的小型探測資料,並將其 讀回。此過程不會使用 Telegram 的內容。 若使用 S3,請採用服務供應商的實際端點、區域及儲存桶。Wasabi、Backblaze、 Cloudflare R2 及其他相容服務均採用相同的 S3 設定。僅具備相容 API 並不代表支援 Object Lock。在「治理模式」下, 經授權的管理員可能繞過保留設定;而「合規模式」則有不同的 限制。在依賴保留設定之前,請先查閱回傳的 Object Lock 狀態。 若要設定 rclone 目標位置,請透過 rclone 的提供者設定建立一個遠端,並 將該遠端的 `[name]` 區段貼入面板中。已安裝的輔助程式支援 MEGA、Google Drive、OneDrive、Dropbox、Box、pCloud 以及 選取器中顯示的其他服務提供者。憑證會儲存於此工作區的加密保管庫中。OAuth 授權更新資訊會儲存回保管庫。憑證不會新增至日誌 事件,也不會包含在還原下載檔案中。 此輔助程式安裝於工作區內,並附有固定版本及 SHA-256。 它不會被加入系統 PATH。設定檔和工作檔是 該工作區內的暫存檔。基於命令列及本機檔案的遠端連線將被 拒絕。rclone 目前要求針對 外部請求明確選取**「Direct」**路由。若工作區採用 SOCKS5 或 HTTP 路由,請使用原生 S3 儲存空間; rclone 不會在路由不可用時靜默繞過。 ## 請保留還原檔案 請選擇「複製檔案後**儲存還原檔案**」,並將其存放於 安裝目錄以外的位置。該檔案包含解密金鑰及已簽署的物件 收據,因此請將其視為私鑰備份。請同時將原始的遠端設定 及目標憑證分開存放。在後續複製操作之前所建立的 還原檔案,將不包含該後續檔案的收據。 簽名金鑰的指紋應已獨立記錄在案。若僅 依據同一檔案內提供的金鑰來驗證簽名,並無法確定該 還原檔案的歸屬。 若要修復現有工作區中遺失的儲存收據,請開啟**「從已儲存的還原檔案還原檔案**」, 並選取該檔案。該面板會驗證簽名,並要求使用相同的工作區 簽署金鑰。若儲存金鑰不同,系統將拒絕進行替換。接著選擇**「還原 所有檔案**」。還原過程會暫停自動儲存規則,以確保下一次排定的 處理不會立即再次刪除已還原的檔案。當 本地副本處理完畢後,請重新啟用該規則。 還原功能會驗證密文、驗證解密過程、在 必要時進行解壓縮,並檢查原始明文 SHA-256,然後將檔案放置於 `media/`。 損壞的遠端物件絕不會取代本機檔案。若現有本機檔案的 位元組內容不同,系統會保留該檔案供審查,而非直接覆寫。 ## 安裝資料遺失後的恢復方法 在另一台機器上安裝 TgWitness。使用私人還原檔案、另行 記錄的指紋,以及原始目的地的憑證: ``` python -m tgwitness.storage recover \ --recovery storage-recovery.json \ --fingerprint TRUSTED_WORKSPACE_SHA256 \ --credentials original-rclone.conf \ --output recovered-attachments ``` 對於 S3, `--credentials` 指向一個包含 `access_key` ,並 `secret_key`;經簽名的恢復檔案則提供目標設定。 此指令會使用直接外部連線,並在 rclone 遠端需要時下載已釘選的輔助程式 。若輸出目錄已存在,則會拒絕建立。 復原的原始位元組將寫入 `recovered-attachments/media/`,其名稱取自 其SHA-256。 `recovery-log.jsonl` 是一個未簽名的復原操作記錄。 此指令不會重建已遺失的簽名日誌或其簽名金鑰。請為這些資料保留 完整的工作區備份。儲存復原檔案並非完整的工作區 備份。 ## 操作員機器人與完成通知 此 Telegram 機器人歸營運者所有。請透過 BotFather 建立該機器人,並在控制面板中設定其 代幣、目標聊天室以及明確允許的 Telegram 使用者 ID。發送者與聊天室 兩者必須完全吻合。轉發的訊息以及來自其他 機器人的指令將被忽略。 `/status` 且 `/stats` 在預設的「僅狀態」模式下皆可使用。可選的 控制模式則新增 `/pause`, `/resume` 和 `/copy`. `/copy` 並觸發已設定的 儲存任務;這並不表示遠端上傳已然完成。指令 無法傳入任意的 URL、檔案或 shell 程式。 請分別使用「警示」與「任務完成」的獨立通知設定。完成 通知會區分「存在缺漏的帳戶匯出」與「完整的匯出」,並顯示 歷史紀錄及儲存次數。除非在通知設定中另行 啟用,否則訊息摘錄不會包含在內。服務選擇器是根據實際 安裝的 Apprise 目錄所產生,而非一組固定的提供者範例。 --- # Telegram · 安全性與資料處理 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/ 威脅模型、存取模型、靜態機密資料、網路暴露風險、會話匯入,以及如何回報漏洞。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 威脅模型、存取模型、靜態機密資料、網路暴露風險、會話匯入,以及如何回報漏洞。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [部署與復原](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/deployment/) ![部署與復原](https://phishdestroy.github.io/TgWitness/assets/chapter-operate.svg) 本頁說明在本地或伺服器工作區中的存取、儲存及網路保護機制。 若要在 GitHub Runner 或 Intel TDX 機密虛擬機器中進行資料蒐集,請參閱 [驗證模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope),該模式會額外對蒐集環境進行檢查。 帳戶連線、通知、時間戳記、異地副本及見證者各有其專屬的路由設定。 | 領域 | 簡而言之 | | --- | --- | | 存取 | 管理員金鑰加上對帳戶/聊天室的範圍式存取權限、七項權限設定及可撤銷的連線;預設為 localhost | | 靜態資料的隱私 | 會話、API 配對、簽名金鑰及代理伺服器設定均採用 Fernet 進行加密 | | 訊息與媒體 | 資料以未加密形式儲存:請啟用磁碟加密並設定嚴格的存取權限 | | 完整性 | 每筆記錄均附有 SHA-256 雜湊鏈及 Ed25519 數位簽名 | | 本地信任邊界 | 主機管理員負責管理工作區及其簽署金鑰;獨立檢查點則保留較早的日誌邊界 | 有關漏洞通報,請參閱[安全政策](https://github.com/phishdestroy/TgWitness/blob/main/.github/SECURITY.md)。 **本頁內容** - [存取模型](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#access-model) - [面板內容與匯出功能](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#panel-content-and-exports) - [靜態機密](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#secrets-at-rest) - [代理伺服器與網路路徑](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#proxies-and-network-routes) - [登入與會話匯入](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#sign-in-and-session-imports) - [日誌與傳輸](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#logs-and-transport) - [完整性限制](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#integrity-limits) - [若您懷疑有問題](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/security/#if-you-suspect-a-problem) ## 存取模式 主控制面板憑證賦予完全控制權。其他使用者可獲得其專屬的 [範圍限定存取權限](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/access/):包含指定的工作區與聊天室、權限設定、有效期限、 IP 限制、登入次數限制以及可撤銷的連線。若存取權限僅限於特定聊天室, 即使已勾選相關權限,亦無法執行整個工作區的操作。 工作區共用同一個執行程序,且資料不會與主機管理員隔離。 該面板預設在 localhost 上監聽。透過瀏覽器登入時,系統會將存取 令牌兌換為會話憑證;瀏覽器會將其作為承載者令牌傳送。該令牌儲存於 sessionStorage 中,而非認證 Cookie。鎖定/登出會清除 瀏覽器會話。關閉瀏覽器或結束會話並不會停止資料收集。 已發行的憑證與會話憑據會以雜湊值形式儲存於加密保管庫中。 撤銷憑證將終止相關會話;權限變更則會影響後續 請求。已下載的檔案無法被收回。管理員亦可限制 自身的瀏覽器會話,但直接使用主控制面板憑證的腳本仍可 保留完整存取權限,並繞過這些瀏覽器會話限制。 驗證失敗會根據客戶端位址進行速率限制。IP 限制採用 應用程式所偵測到的位址;在依賴此機制前,請先確認 反向代理伺服器的運作行為。Witness 憑證仍為獨立的唯讀檢查點/狀態憑證。 ### 試用存取 `/api/demo-access` 是一個刻意未經身份驗證的引導程式,專用於明確 啟動且隔離的合成示範環境。它會發出一個獨立於進程生命週期的權限, 絕不會發出真實的面板代幣或 TGWITNESS_TOKEN 覆寫代幣。 其發行與使用需具備 迴路對等節點及主機,不得包含轉發標頭,亦不得進行跨來源請求。若存在 其他工作區或已授權的會話,則此路徑將被停用。活躍工作區絕不會 發行此權能。此示範無法連結帳戶或變更資料蒐集設定。 ## 面板內容與匯出功能 本頁面未使用任何外部字型、分析工具、CDN 資源或嵌入式遠端媒體。 來自 Telegram 的文字以純文字形式插入,而非 HTML。下載的附件 以二進位附件形式提供。JSONL 匯出檔保留原始字串;HTML 則會對其進行 轉義;可能成為公式的 CSV 儲存格會加上單引號作為前綴。 匯出檔案不包含驗證與簽署密鑰,但會刻意保留 所收集的來源元資料、識別碼,以及可能包含的個人或敏感內容。 原始來源元資料中可能包含 Telegram 存取雜湊值與檔案參照。 ## 靜態資料的隱私 Telegram API 憑證、會話金鑰及簽名金鑰均採用 Fernet 進行加密。 針對本機訊息與媒體檔案,其加密由主機的磁碟或磁碟區負責; 工作區則儲存一般檔案。匯出檔案可採用密碼保護的 AES-256 ZIP 格式, 而異地備份則採用 AES-256-GCM 加密。 金庫金鑰預設位於受保護的資料目錄中。請使用下方的外部主金鑰檔案 將其分開儲存。在 Unix 系統上,新的私密金鑰檔案使用權限模式 0600,新的資料 目錄則使用 0700;在 Windows 系統上,請為服務帳戶及 授權管理員設定目錄存取控制清單 (ACL)。現有的目錄權限將予以保留。 ### 外部主金鑰 對於新的資料目錄,TGWITNESS_VAULT_KEY_FILE 可提供外部隨機 主金鑰。系統會透過 HKDF-SHA256 及獨立的隨機鹽值,為每個工作區 衍生出不同的 Fernet 金鑰。為確保資料復原,必須保留 vault.external.json 檔案。若主金鑰遺失或 錯誤,系統將無法正常運作。現有的本機金庫不會被自動遷移。 此面板會顯示所選的金鑰儲存模式。無論採用何種模式,磁碟加密皆會保護本機的 訊息與媒體檔案;有關設定詳情,請參閱「 [連線與資料保護」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/)。 ## 代理伺服器與網路路由 代理伺服器設定會加密儲存於金庫中。密碼及 MTProxy 機密資訊 不會透過 API 傳回,也不會寫入證據記錄中。每個工作區皆可自行選擇 其 Telegram 路由及 [IP 模式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/connection/#ip-modes)。 **「隱藏地址」**模式會拒絕直接使用 Telegram 備用連線,並要求透過代理伺服器處理外部 HTTP 請求。明確選取的備用模式允許在延遲後直接存取 Telegram; 隧道/VPN 模式則允許直接連線。選擇隧道 模式並不會安裝或驗證 VPN。這些設定不會控制所有裝置 流量、瀏覽器、套件管理員或由本地代理主機進行的 DNS 解析。 MTProxy 僅傳輸 Telegram 流量。外部請求可使用獨立的 SOCKS5/HTTP 代理、工作區的 SOCKS5/HTTP 路由,或允許的直接路由; 亦可將其停用。獨立見證器擁有其專屬的傳輸設定。 一般 SOCKS5/HTTP CONNECT 認證並不會由這些代理 協定本身進行加密。偽造的 TLS MTProxy 密鑰目前仍不被支援。 ## 登入與會話匯入 轉換後的 .tgwitness-session 檔案在 載入並儲存至金庫之前,會包含明文授權密鑰。離線命令列介面 (CLI) 接受經過審核的 Telethon 資料結構。 面板匯入功能另支援 Pyrogram SQLite、現代單一帳戶 TData ZIP, 以及已建檔的 JSON 輸入格式。此功能需經身份驗證,限四個檔案/8 MiB, 並在記憶體中處理上傳內容,無需解壓縮存檔或儲存原始檔案。 正規化的憑證僅會回傳給發出請求且已驗證的瀏覽器; 在 Telegram 授權成功後,這些憑證會儲存於加密的保管庫中。 請保護原始檔案與轉換後的檔案,並避免多個客戶端同時複製同一組授權憑證。 資料處理過程會驗證容器校驗和、本地解密雜湊值以及結構 長度。系統會暫時使用使用者提供的桌面版本地通行碼,且不會儲存該密碼。 此有限解析器無法保證所有桌面版皆相容。 QR 圖像在本地端生成,包含短效期的 Telegram 登入憑證,且 絕不會傳送至外部渲染服務。鎖定裝置、切換工作區、重新登入, 以及路由變更都會取消待處理的 QR 嘗試。重新載入或關閉分頁可能會導致 該嘗試維持待處理狀態直至過期。成功的 QR 登入仍會強制執行帳戶綁定。 一般 API 請求體仍限制為 16 KiB;經認證的匯入路徑接受 最多 12 MiB 的編碼 JSON,並會另行強制執行較小的解碼檔案限制。 登入代碼及 Telegram 兩步驟驗證密碼均不會被永久儲存。電話號碼/代碼雜湊狀態僅在 授權期間暫存於記憶體中。Telegram 連線會話賦予帳戶存取權限;切勿 將資料目錄、會話、憑證、金庫金鑰或私人簽署金鑰上傳至 GitHub。 ## 日誌與傳輸 預設的 API 驗證回應已進行替換,以避免回傳憑證 值。應用程式存取記錄功能已停用。請勿設定反向代理伺服器 以記錄 Authorization 標頭或請求正文。HTTP 會以明文傳輸憑證 和登入密鑰:只要連線離開 localhost,請務必使用 HTTPS 或 SSH 隧道。 ## 完整性限制 本地驗證會檢查記錄簽名、雜湊鏈、附件及匯出清單。 管理員持有本地簽署金鑰,並可建立另一份已簽署的日誌; 獨立保存的檢查點可偵測其所涵蓋的前綴是否遭替換。 請將金鑰指紋與檢查點交由收件者或獨立見證人保管。 若需經過獨立驗證的資料蒐集,請選擇 [GitHub Actions 擷取](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md) 或 [Intel TDX 部署](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/#confidential-vm-on-phala-cloud-intel-tdx)。 其驗證器除檢查檔案庫完整性外,還會驗證工作流程的來源追溯性或硬體測量結果。 可選的時間戳記與加密的異地副本可提供時間錨點及可恢復的副本; [證據格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/#verification-scope)描述了各模式下的驗證流程。 ## 若您懷疑有問題 請保留原始資料目錄,並使用另一份副本進行分析。 請透過 [安全政策](https://github.com/phishdestroy/TgWitness/blob/main/.github/SECURITY.md)回報受影響的版本、操作及可重現步驟,同時確保帳戶資料與憑證的隱私。 --- # 架構 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/architecture/ 說明收集器、控制面板、日誌、工作節點及見證節點等組件,以及資料在這些組件間的流動方式。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 說明收集器、控制面板、日誌、工作節點及見證節點等組件,以及資料在這些組件間的流動方式。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![開發](https://phishdestroy.github.io/TgWitness/assets/chapter-develop.svg) 一個 Python 程序負責託管 FastAPI 控制面板以及任意數量的隔離工作區, 每個工作區皆配有 Telethon 使用者帳戶客戶端。 SQLite 儲存僅支援追加的簽名事件日誌及可變更的操作設定。 加密金庫中存放 API 憑證、StringSession 以及簽名金鑰。 前端採用純粹的打包 HTML/CSS/JavaScript 格式:無需 Node 建置、CDN 或 前端執行時下載。 Optional browser and AyuGram recorders run in **separate processes or containers**. The `tgwitness_capture` package owns their event format, keys, artifacts, checkpoint API, independent witness and standalone verifier. It is bundled in the main wheel and can also be installed alone from `addons/capture`, without importing the collector. The main panel's `capture_api.py` and `capture_connections.py` provide administrator-only, workspace-scoped controls under `/api/capture`; connection tokens live in the encrypted vault. No recorder or outbound request starts with the main process. Each explicit command verifies a fresh challenge against the pinned recorder key. Exports are verified before download and keep their original signature; they do not become Telegram message events. Collection sessions and proxy routes stay with each client. See the English [Independent capture guide](https://github.com/phishdestroy/TgWitness/blob/main/docs/OPTIONAL-CAPTURE.md) for deployment and trust boundaries. | 模組 | 責任聲明 | | --- | --- | | collector.py | 授權、對話選取、更新、快照、媒體佇列、連線監控 | | interactions.py / telegram_client.py | 明確的面板操作、簽名收據、持久性請求 ID 以及任務本地的回調/加入重試政策 | | message_content.py | 可觀察的訊息比對,不包含傳輸存取元資料 | | workers.py | 在執行取消清理操作前,請先等待匯出檔案工作程序完成 | | distributed_export.py / distributed_pages.py | 並行聊天任務、按帳戶預留、簽名檢查點以及歸檔驗證後的清理作業 | | distributed_takeout.py / export_timing.py | 可恢復的「Takeout」會話,以及每次開始或恢復的時程 | | store.py | WAL 交易、有序事件鏈、查詢篩選器、運作設定 | | fulltext.py | 衍生出的全文索引(詞形變體、BM25),與簽名日誌的開頭部分綁定;絕不外匯 | | security.py | 建立私人檔案、加密儲存庫、Ed25519 簽名、單一進程鎖定 | | evidence.py | 完整日誌匯出、衍生檔、檢查點、附件驗證 | | verify.py | 獨立運作、唯讀驗證器(標準函式庫 + 加密技術):存檔、涵蓋範圍、證據日誌及頻道貼文、個人檔案 | | app.py | 經認證的 API、生命週期、請求驗證、靜態控制面板 | | profiles.py | 多帳戶收集器、共用存取控制器、按工作區管理的生命週期 | | access.py | 範圍限定授權、權限檢查、IP 限制、會話限制及管理員控制台 | | proxy_catalog.py | 公開頻道快照、傳輸檢查、共享代理伺服器池及基於運作狀態的選擇機制 | | provenance.py | 經簽署的獲取執行階段身分、程式碼及依賴項測量 | | network.py | 經驗證的各工作區傳輸路徑;已遮蔽的狀態與證據;Telethon 傳輸選項 | | sessions.py | 已審核 Telethon SQLite 資料結構的離線唯讀轉換 | | account_import.py | 對受支援的帳戶檔案及 JSON 進行記憶體內偵測與正規化 | | tdata.py | 功能有限的現代 TData ZIP 讀取器,具備校驗和/解密驗證功能,不進行檔案解壓縮 | | doctor.py | 無需資料蒐集、登入或安裝套件即可進行本地就緒性檢查 | | download.py | 經過驗證的串流匯出下載功能,具備讀取限制且不會覆寫資料 | | monitoring.py | 經驗證的「按工作區」事件政策與「按類型」附件規則,由處理者、狀態及簽名收據共享 | | scope.py | 監測範圍(指定聊天室、Telegram 資料夾、整個帳戶)、來源類型、排除項目、重新檢查層級 | | dossier.py | 根據儲存的記錄建立的每則聊天對話中的人物檔案:包含附有記錄參考的事實、頭像的 SHA-256/pHash 值,以及提及內容的擷取 | | witness_api.py | 唯讀見證代幣及其可擷取的簽名日誌頭部 | | witness.py | 獨立見證流程:自有金鑰與日誌、頭部檢查、簽名頻道貼文、匯出 | | alerts.py | Apprise 通知與控制面板的通知清單 | | logging_config.py | 無視窗模式啟動時的控制台記錄與輪替式伺服器診斷 | | static/ | 響應式介面、本地存取閘道、篩選器、詳細資訊、匯出功能、帳戶設定 | | demo.py | 標示為「合成日誌」,與實際蒐集資料完全隔離 | 監測處理程序須於連線前完成註冊。即時資料蒐集受以下條件限制: 活躍的客戶端身分、明確的執行狀態、已啟用的來源,或監測 範圍(資料夾或整個帳戶模式會在首次更新時將新聊天室新增為來源),以及事件 政策。遭拒絕或已被取代的客戶端無法貢獻即時更新。 原始反應與成員資格更新 均遵循可見性限制。傳入訊息內容及其持久化媒體任務將 一併提交。任務保留原始時間線描述符,並將其雜湊值綁定至 經簽名的訊息觀察記錄。發送者/編輯者/刪除者的語義相互分離。 每個工作區僅接受一個帳戶,並擁有專屬的目錄及簽署身分。 主工作區為維持相容性而保留在根目錄下;額外的工作區則位於 profiles// 目錄中。一個攜帶者憑證(bearer token)控制整個安裝環境;工作區並非 獨立的授權租戶。 流程鎖用於保護目錄;資料庫鎖則 用於序列化事件插入。每次追加操作皆會以 FULL 同步模式同步提交至 SQLite WAL。事件更新/刪除觸發器可防止 一般應用程式進行編輯;檔案系統管理員仍處於信任邊界之內。 API 授權採用承載者憑證(bearer token)。登入操作會進行序列化處理,並設有時間限制。 帳戶上傳採用專用的 12 MiB 編碼本體限制及 8 MiB 解碼檔案 限制;一般 API 請求則維持 16 KiB 的限制。 轉換在工作 執行緒中執行,將上傳資料保留在記憶體中,並將正規化的輸入傳回給已驗證的 瀏覽器。QR 登入具備每個工作區的候選識別碼、短效識別碼、等待任務, 以及明確的取消機制。僅被接受的授權才會成為活躍的客戶端。 Telegram FloodWait 會回傳 Retry-After 值;憑證和原始 RPC 錯誤訊息不會在 API 錯誤中公開。 日誌匯出在非異步 事件迴圈外執行,並按工作區進行序列化。它們在持續進行 WAL 寫入的同時, 串流傳輸穩定的讀取快照。聊天記錄擷取工作可於 不同帳戶上並行執行;每個帳戶將保持預留狀態,直至其工作停止為止。已暫停或 失敗的工作將保留其檢查點。成功驗證存檔後,即可清理 其工作檔案,僅保留 ZIP 檔案、簽名計畫及狀態。工作區收集器 共用同一個程序/事件迴圈。 當前的歷史快照與即時更新可能有所重疊。兩者皆為獨立的觀察記錄, 並標註來源;重複項目不會被靜默合併。系統不會根據缺失的 ID、捏造的已刪除文字、強制成員枚舉或自動加入群組 等情況進行推論。 關於面向操作者的說明,請參閱「[資料蒐集運作方式」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/) 以及「[帳戶與會話格式」](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/)。 網路配置儲存於加密金庫中。套用路由會關閉舊的 客戶端並取消未完成的登入;後續連線將使用該路由,且無 直接備用方案。 新的外部金鑰安裝會透過 HKDF-SHA256, 從主金鑰檔案及儲存的隨機鹽值中推導出每個工作區的 Fernet 金鑰。此機制將 機密資訊與資料目錄分開保護,而非以明文形式保護日誌/媒體內容。 本地示範入口使用獨立生成的程序權限,絕不使用已設定的 面板代幣。發行與接受需明確啟用示範模式,並需使用合成根 (無額外工作區或授權會話)、迴路對等方/主機,且不得包含代理 轉發標頭,亦不得進行跨來源瀏覽器請求。 正式版 API 維持承載者 驗證機制,並在示範模式下拒絕收集變更。 --- # 已測試的內容 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/ Telegram 即時測試、自動化檢查、瀏覽器檢查,以及尚未經核實的內容。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) Translation coverage: this edition includes material from the English original. Telegram 即時測試、自動化檢查、瀏覽器檢查,以及尚未經核實的內容。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [證據與驗證](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ![證據與驗證](https://phishdestroy.github.io/TgWitness/assets/chapter-evidence.svg) **更新於 6 年 11 月 2026 日。**結果與每次執行所記錄的修訂版本、環境及 工作負載相關聯。[「當前功能](https://github.com/phishdestroy/TgWitness/blob/main/docs/STATUS.md)」描述了 可用的工作流程;本頁面記錄了實際已驗證的內容。 [效能圖表](https://phishdestroy.github.io/TgWitness/docs/validation/) · [經簽署的英文審計報告](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/REPORT.md) · [可下載的測量數據](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/MEASUREMENTS.csv) | 最新證據 | 結果 | 範圍 | | --- | --- | --- | | 版本審計 · 11 月 6 日 | 1,461 項核心測試通過;37 項平台測試跳過 | 來源 `92e539af40d8`;保留已公開的調查結果 | | 最新匯出檔 · 11 月 6 日 | 127.713 和 141.781 筆/秒,完整週期 | 每台伺服器限兩個帳戶;文字與元資料透過 WARP 傳輸 | | 保留的存檔 · 11 月 6 日 | 48 個檔案;已驗證 3,598,381 筆記錄 | 已將現有存檔與固定工作區金鑰進行比對 | | Trusted Live · 11 月 5 日 | 受保護的 CPU 記錄與 WARP 檢查 | 官方桌面版登入功能與原生匯出功能仍未完善 | | Phala / Intel TDX · 11 月 4 日 | 後續執行中,所有 16 項驗證器檢查均通過 | 歷史部署;CVM 上沒有 Telegram 帳戶 | **本頁內容** - [版本審計與最新匯出 · 6 年 11 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#release-audit-and-fresh-exports--6-november-2026) - [Trusted Live CPU Ubuntu 與 WARP · 5 年 11 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#trusted-live-cpu-ubuntu-and-warp--5-november-2026) - [Phala Cloud 即時部署 · 4 年 11 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#live-phala-cloud-deployment--4-november-2026) - [即時伺服器日誌清單 · 1 年 2026 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#live-server-journal-inventory--1-november-2026) - [近期離線與故障注入檢查 · 1 2026 年 11 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#recent-offline-and-fault-injection-checks--1-november-2026) - [Telegram 即時測試,完整帳戶 · 29 年 10 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#live-telegram-test-whole-account--29-october-2026) - [使用 libarchive 開啟的密碼保護匯出檔 · 29 年 10 月 2026 日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#password-protected-export-opened-with-libarchive--29-october-2026) - [Telegram 即時測試 · 2026年10月27日至29日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#live-telegram-test--27-to-29-october-2026) - [合成本地容量測量](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#synthetic-local-capacity-measurement) - [對一百萬則訊息進行全文搜尋 · 5年11月2026日](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#full-text-search-on-one-million-messages--5-november-2026) - [剩餘資格說明](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/#remaining-qualification) ## 版本審計與最新匯出 · 6 年 11 月 2026 日 本次審計採用原始碼版本 v0.9.1 `92e539af40d8368d198ff5e040f1d876f2c1310e`,發行版 `92e539af40d8-83e41104669e`。三台 伺服器均通過已安裝套件的煙霧測試。簽名報告保留了當時觀察到的狀態。 [![兩項新工作負載的擷取率與完整匯出率](https://phishdestroy.github.io/TgWitness/assets/performance.svg)](https://phishdestroy.github.io/TgWitness/docs/validation/) | 工作量 | 記錄 | 取得 | 完整週期 | 完整週期速率 | | --- | --- | --- | --- | --- | | 伺服器 A · 兩個帳戶 | 27,030 | 189.043 秒 | 211.647 秒 | 127.713 筆/秒 | | 伺服器 B · 兩個帳戶 | 29,299 | 182.513 秒 | 206.650 秒 | 141.781 筆/秒 | 兩次匯出均未啟用「繼續傳輸」功能,排除附件與頭像,且最終 未產生任何重複或重複使用的記錄。完整週期包含準備、 擷取、篩選、封裝及存檔驗證。伺服器 A 亦執行了 受保護聊天室的讀取檢查。A 端發生四次 FloodWait 事件,B 端發生三次, 均獲得妥善處理。這些觀察結果並不能確立普遍的吞吐量保證。 | 檢查 | 結果 | 資格要求 | | --- | --- | --- | | 核心 pytest | 1,461 項通過 | 37 處平台跳過 | | 瀏覽器 / 瀏覽器使用者體驗 / 證據 / 網站 | 102 / 66 / 15 / 9 項通過 | 這些程式與其他測試存在重疊;計數結果不可相加 | | Capture 外掛程式 | 124 項通過 | 三項官方網頁檢查因必需的 Chromium 沙盒機制而受阻 | | API 授權 | 269 條路徑;538 個請求通過 | 憑證遺失與存取權限遭撤銷 | | 保留的存檔 | 48 筆中已驗證 48 筆 | 3,598,381 筆記錄;已釘選的工作區金鑰 | | 即時車隊讀取檢查 | 40 個設定檔中有 24 個通過驗證 | 16條 WARP 路徑未通過資格認證;這些配置檔未建立連線 | 這份[經簽署的報告](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/REPORT.md)記錄了所有已公開的 發現結果,包括未公開的秘密聊天快照中存在的三項缺陷,這些缺陷 未出現在經審計的主建置版本中。先前 [針對公開歷史紀錄的](https://github.com/phishdestroy/TgWitness/blob/main/docs/EXPORT-BENCHMARK-2026-11-06.md)評估採用了不同的 修訂版本和工作負載;其比率不得與本次比較結果合併。 請使用 [固定金鑰和驗證器](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/README.md#verify-the-original-files)來驗證原始報告。 其簽名可保護操作員的報告免遭篡改。這並非 獨立證明、Telegram 作者身份證明或 GDPR 認證。 ## Trusted Live CPU Ubuntu 與 WARP · 5 年 2026 月 5 日 本次保留的整合執行環境採用了僅使用 CPU 的 Ubuntu 24.04.5.5 來賓系統(4 個 vCPU、8 GiB), 在 RunPod CPU 主機內的 QEMU 環境中運行。資料收集器使用 `14e642a5`;驗證使用 `02072461`。最終的修正已合併至 [PR #114](https://github.com/phishdestroy/TgWitness/pull/114) ,代號為 `755f78f6`,其代碼樹與測試中的 PR 頭部一致。此環境並非 TEE。 - 一個真實的 WARP Connector 報告狀態正常;經代理的 HTTPS 報告顯示 WARP 和 Gateway 已啟用。三個探測器觀察到相同的出站位址,這並不代表固定 IP 的保證。 - 斷開 WARP 連接導致代理請求失敗。直接連至閘道服務的 HTTPS 請求遭拒絕。在記錄器命名空間中,直接的 IPv4/IPv6、外部 DNS 以及 Docker 的內嵌 UDP 解析器均遭封鎖。 - 具有範圍限制的唯讀提供者代幣可讀取「健康狀態/連線」資訊,但無法 讀取連接器註冊代幣。簽署過的提供者觀察結果包含 明確標示為不可用的樣本。由於該見證程式運行於操作員的主機上,因此這 僅證明了記錄與保留功能,而非獨立第三方保管。 - 官方桌面版已進入未經認證的歡迎畫面。在擷取過程中,受保護的鍵盤 輸入遭拒。已解碼三個 H.264 顯示區段,並 檢查其時鐘疊加層。針對 18 個事件的預檢存檔,已 根據固定記錄器金鑰及保留的檢查點進行驗證。 - 最終的擷取測試在 Windows 和 Linux 持續整合環境中,使用真實的 Chromium/FFmpeg 通過了 114 個案例。五項錨點測試與依賴項警示檢查均已通過。 初始配置的 2 vCPU/4 GiB 環境在承受並發影像建置負載時發生超時, 並透過防護機制停止運作;此情況不被視為成功。手動測試帳號 登入、原生聊天記錄匯出、真實混合模式比較以及 Telegram 端登出功能仍 待處理。未導入任何提供的 Telethon 會話。附件、自動 OCR、 本地 drand BLS 驗證以及 Trusted Live TDX 證明均未通過資格審查。 ## Phala Cloud 即時部署 · 2026 年 11 月 4 日 **歷史結果:**後續部署均通過所有16項驗證器檢查, 包括 Intel TDX 及快速隧道。重新啟動證據、簽名位址 發現及報告時間戳記均分別進行了檢查。每個測試 CVM 均 在執行完畢後被移除。 | 設定 | 記錄值 | | --- | --- | | 提供者 | Phala Cloud · `tdx.small` · US-WEST-1 | | 部署 | `--provider phala --quick-tunnel`;初始工作區為空 | | 初始收集器 | `df7d860c` · v0.8.1 | | 包含所有修正的收集器 | `53a0f7e9` | | 正式環境訪客 | `dstack-0.5.12`;SSH 存取已停用 | | 外部服務 | ntfy.sh、GitHub 及 Intel PCS | | 觀察到的成本 | 七種 CVM,總計約1.9美分;歷史測試定價 | 以下序列分別列出初始失敗、修正及已完成的檢查。 這些 CVM 未連接任何 Telegram 帳戶。 **部署版本 1–2 · 服務供應商差異與回歸測試** The first two deployments found five differences from the simulated Phala Cloud. Private Phala regressions reproduce each difference and fail without its fix: | 在 Phala Cloud 上 | 修正前 | 修正 | | --- | --- | --- | | 必須指定 `compose_file.name` | HTTP 422 錯誤,未建立任何內容 | Docker Compose 配置中包含 CVM 名稱 | | 除非指定為空,否則 Phala 會將其自身的啟動前腳本新增至被測的 app-compose 中(v0.0.20:Docker 登入、`docker compose pull`、root 密碼、來自 `user_config` 的 SSH 金鑰) | `tdx_compose` 失敗:程式碼超出已發佈的 Docker Compose 配置範圍 | app-compose 將 `pre_launch_script` 設定為 `""`;Phala 隨後會將其省略 | | 若未指定 `image`,Phala 會預設選用 `dstack-dev-0.5.12`(開發版),且此版本已啟用 SSH 存取權限 | `server_state` 失敗。此映像僅有硬體驗證記錄通過;僅供應商記錄與 `tdx_os` 顯示此結果 | 部署過程會要求使用 Phala 當前版本(`dstack-0.5.12`)的生產環境建置版本 | | 當 dstack 閘道器關閉時,CVM 詳細資訊中永遠不會出現 `instance_id` | 部署等待 30 分鐘後失敗 | 實例 ID 取自 CVM 狀態 | | 重新啟動、停止及啟動均屬 CVM 操作,而非應用程式版本更新 | `provider_actions` 未列出重新啟動紀錄 | 這些操作也包含讀取操作 | **部署3 · 認證、存取檢查與重新啟動證據** - 該 CVM 在關閉 SSH 存取的情況下執行 `dstack-0.5.12`。收集器在建立後約 1.5 分鐘發布其簽名位址。部署後通過 `tdx_binding`、`tdx_quote`(Intel TCB UpToDate、硬體驗證記錄 v4、FMSPC `20a06f000000`、非除錯模式、不可遷移、支援從 Intel 擷取的 加密驗證資料)、`tdx_compose_hash`、`tdx_compose`(逐位元組)以及 `tdx_identity`(KMS 金鑰)。 - 位於 trycloudflare.com 網址的控制面板在未提供令牌或提供錯誤令牌時會返回 401 狀態碼, 而使用控制面板令牌時則會返回 200 狀態碼。 - `verify` 搭配 `--source` 設定為 GitHub 的提交存檔,且指紋已 另行通過:伺服器、`server_state`、防火牆(無閘道、無公開端點)、供應商日誌、 帳單明細、指紋、來源雜湊、開機,以及五項 `tdx_*` 檢查均通過。 Cloudflare 及 `tdx_os` 無法取得,因此結果為「不完整」。 - 透過 Phala 的 API 執行兩次重新啟動:每次 CVM 都在兩分鐘內恢復運作,並使用 相同的收集器金鑰、新的簽名位址,而舊的位址則回傳 530 狀態碼。`verify` 將 新的開機及兩次重新啟動皆報告為 REVIEW。 透過 `--evidence`,系統確認了日誌 簽名以及三次啟動,每次皆擁有來自同一 CVM 的獨立 Intel TDX 硬體驗證記錄。 - `destroy` 僅移除了該 CVM。隨後工作區變為空狀態,且控制台網址停止 回應。 - 控制台精靈的價格查詢顯示 `tdx.small`,每小時 0.058 美元。若輸入錯誤的金鑰,則會顯示 「未接受該 API 金鑰」的純文字訊息。 **後續修正 · 簽名位址偵測與作業系統測量** - Without the address key, `verify` followed the newest well-formed post on the address topic, which is printed in the published compose. One forged post sent it to a host that does not exist, and `statement` failed: a forger could not pass as the collector, but could block third-party verification, for up to 12 hours with a forged future timestamp. The collector now also posts its address signed with its own key, `verify` accepts only such posts when the collector makes them, and posts are ordered by ntfy.sh's receive time. A private cloud-wizard regression replays the forged posts. A CVM runs this only from a commit that contains it, so this run's collector did not sign its address yet and `verify` said so. - `tdx_os` 原先依賴 `dstack-mr`,而該工具目前的版本提供的是 `measure-os`,並非文件中提到的 `measure --json`。驗證器現在會根據已發布的映像檔和虛擬機器設定(包含 ACPI 表格)自行計算 MRTD 和 RTMR0-2。 **部署4 · 所有16項檢查、報告封印及重新啟動驗證** - 部署程序曾一次下載已發佈的 `dstack-0.5.12`,並將其與 CVM 回報的作業系統映像雜湊值進行比對,而 `tdx_os` 通過驗證:MRTD、RTMR0、RTMR1 及 RTMR2 均等於針對 QEMU 8.2.2、1 個 vCPU 及 2 GiB 所計算的數值相符。然而,針對聲稱具備 4 GiB、2 個 vCPU、 QEMU 9.2.1 或第二張網路卡的配置,相同計算方式得出的 RTMR0 數值則不同;若內核、韌體或命令列 發生變更,以及針對開發版映像,驗證均會失敗。 - `verify` 通過了全部 16 項檢查(包含快速隧道連接器),因此結果 為「通過」。 它寫入了 HTML 和 PDF 憑證,並以數位印章加蓋簽名與時間戳記,其中包含來自 比利時政府時間戳記單位 TSU 202301(已列入比利時可信 清單)的合格 eIDAS 時間戳記、FreeTSA 時間戳記以及驗證者的簽名;`check-report` 確認了所有這些 內容以及 PDF 文件的簽名。 - 重新啟動後,`verify --evidence` 確認了兩次啟動,每次均伴隨在 CVM 內部生成的硬體驗證,且每次 皆從已發佈的 `dstack-0.5.12` 啟動;重新啟動與新一次的啟動均為 REVIEW 狀態。 - `destroy` 使工作區保持空置狀態。 **部署版本5 · 由收集器簽署的發現機制與偽造貼文的拒絕機制** 此資料收集器自提交版本 `53a0f7e9` 開始運行,該版本已包含上述修正。 - 該收集器在其地址旁發布了以自身金鑰簽署的地址,緊鄰操作員的 HMAC 貼文。 隨後,該主題中新增了兩則偽造貼文,一則 HMAC 值為零,另一則由另一把 Ed25519 金鑰簽署,兩者均聲稱時間為 2096 年。 `verify` 採用由 收集器金鑰簽署的地址,並通過了全部 16 項驗證;該印章再次附有符合資格的比利時時間戳記、 FreeTSA 的時間戳記以及驗證者的簽名,而 `check-report` 則確認了這些資訊。 - 重新啟動後,收集器發佈了經簽名的全新位址:`verify` 立即偵測到該位址, 營運商的 **透過 HMAC 發佈,於 27 秒後偵測到當前位址**,兩者均忽略了 偽造的發佈。`verify --evidence` 確認有兩台裝置從 `dstack-0.5.12` 啟動。 - 部署過程列出了 Phala 向 CVM 收取的費用(含磁碟空間):每小時 0.06078 美元。 ### 面板精靈與剩餘範圍 面板精靈在 Phala Cloud 上執行了兩次,一次透過其工作 API,另一次則透過 搭載真實 Chromium 核心的瀏覽器:價格查核、以 **Advanced** 為提交標籤進行建立,全部六項 驗證檢查均通過,伺服器清單顯示計費價格(每月 44.37 美元), **Find 當前位址**、下載已量測的 Docker Compose 配置,以及刪除操作。瀏覽器未出現任何頁面錯誤。 每次操作結束後,工作區均呈空狀態。 未涵蓋內容:Phala 上的 Cloudflare 網域、CVM 上的 Telegram 帳號,以及 `dstack-0.6.1` 映像檔。精靈在建立前的價格僅為 Phala 的運算價格,因為其 API 僅針對現有 CVM 列出 磁碟價格;伺服器清單則顯示建立後的計費價格。 本節中所有價格均於 4 年 2026 月 4 日觀察所得。 ## 即時伺服器日誌清單 · 1 年 2026 月 2026 日 大約在 UTC 19:15,透過序列化的唯讀 SQLite `query_only` 查詢,統計了 正在運行的伺服器上十個工作區資料庫中的事件數量。在查詢期間, 資料收集仍持續進行,因此這並非橫跨所有工作區的原子快照。 | 在十個工作區資料庫中觀察到 | 計數 | | --- | --- | | 包含至少一個 `message.new` 事件的工作區 | 8 | | 日誌記錄,包括運作事件 | 1,610,818 | | `message.new` 事件 | 900,232 | | `message.edited`事件 | 80,683 | | `message.deleted`事件 | 400,536 | | `message.recovered`事件 | 53,403 | | `message.snapshot` 事件 | 2,183 | | `media.saved`事件 | 50,418 | | `media.failed`事件 | 5,575 | | `coverage.gap`事件 | 11 | | 資料庫位元組(不包含 WAL 檔案及媒體檔案) | 7,909,003,264 | 這些是 **事件計數**,而非唯一的訊息、使用者或媒體檔案。同一則 訊息可能出現在多個工作區中,且編輯或刪除操作可能會產生 另一個日誌事件。 `media.failed` 統計的是歷史失敗事件,而非 當前的媒體佇列。這些查詢並未 **不** 重新驗證簽名以及所有 紀錄的完整 1,610,818 記錄、測量傳送狀況或吞吐量,亦未確認 是否已擷取每個 Telegram 事件。此處未發布任何訊息內容、帳號或聊天室 ID、 工作區標籤、憑證或私人檔案。 在本次審查中,獨立配置的公開監測器涵蓋了三個來源: 其中一個擷取回應為「OK」,另外兩個則回報 `no_response`。該監測器 並非十個工作區的健康狀態摘要。`no_response` 表示觀察者無法 在該次檢查中取得回應;這並不代表訊息遺失。下方規模較小的 10月29日測試擁有其專屬的明確簽名與雜湊鏈驗證。 ## 近期離線與故障注入檢查 · 1 年 11 月 2026 日 這些檢查使用虛構資料和本機檔案;它們為 當前來源提供回歸測試證據,而非針對其他實際運作中的 Telegram 傳送測量: | 檢查 | 測試項目 | | --- | --- | | Source archive | 兩個建置版本的原始碼位元組內容完全相同,但檔案時間已變更,所產生的 ZIP 檔案及校驗和均相同。壓縮檔的位元組內容與檔案雜湊值完全吻合;私人測試檔案未被包含在內。模擬寫入失敗的情況下,先前壓縮檔及其校驗和均保持不變。 | | Account export recovery | 第二個 ZIP 成員發生模擬磁碟錯誤後,未產生任何已發布或不完整的 ZIP 檔案。恢復作業將每個簽名收據維持字節級別完全一致,並使用預期的簽名指紋產生可獨立驗證的壓縮檔,同時將合成覆蓋缺口保留為部分結果。規模斷言機制可防止隨著歷史記錄增長而重複掃描任務與收據。 | | Minimized disclosure privacy | 在所有三種身分識別模式下,以及在文字省略的情況下,均已對合成 Unicode 名稱與別名、嵌套元資料、未知發送者及媒體欄位進行了檢查。遮蔽限制失敗並未在未經提示的情況下削弱遮蔽效果;原始的簽名帳戶匯出檔保持不變。 | | Linux media decoder and OCR | 在提交 `5a9e0814` 時,[Linux Docker CI 檢查](https://github.com/phishdestroy/TgWitness/actions/runs/41341200341/job/124951395192)通過了以下項目:以 Ogg/Opus、MP3、M4A、含影片的 MP4、WAV 及 FLAC 為輸入的生成檔案;偽造時長與次級檔案參照的控制測試;以及 48 個變異解析器測試案例(34 個被拒絕,14 個在範圍內解碼成功)。真實的 Tesseract OCR 在原始位元組未經變更的情況下成功運行。解碼器與 OCR 均在網路隔離的容器中運行,且未使用 Whisper 模型。 | 這些檢查會在[「拉取請求」](https://github.com/phishdestroy/TgWitness/blob/main/.github/workflows/pr-check.yml)及 [「完整檢查」](https://github.com/phishdestroy/TgWitness/blob/main/.github/workflows/checks.yml)工作流程中執行。 它們旨在測試這些失敗邊界,而非每種可能的儲存失敗情況,亦非 評估洩露內容是否自動安全可發布。媒體檢查不會測量 語音辨識準確度或 Telegram 傳送狀況。分享前請審閱每個衍生內容。 ## Telegram 即時測試,完整帳戶 · 2026年10月29日 在進行以下測試後,該帳號仍持續運作。10月29日 UTC 12:10,其監控範圍 已切換至整個帳號(頻道、群組、私人聊天室及機器人);控制面板要求 確認,並由簽名日誌記錄此操作。截至 UTC 17:59,日誌內容如下: | 記錄時間:10月27日 21:36 至 10月29日 17:59(UTC) | 計數 | | --- | --- | | 日誌記錄 | 9,968 | | 新訊息 | 5,308 | | 在切換至完整帳戶後,其中一部分 | 3,878 | | 刪除記錄 | 784 | | 其中部分訊息在 TgWitness 儲存該訊息後被刪除 | 596 | | 編輯 | 41 | | 經重新核對後新增的訊息 | 2,273 | | 經重新檢查後已無法找到的訊息 | 18 | | 透過歷史快照儲存的訊息 | 242 | | 已儲存的附件 | 247 | | 收集器啟動 | 19 | | Telegram FloodWait 暫停 | 26 | - 該小組的「**Verify」**核查已確認所有 9,968 筆記錄的簽名與雜湊鏈。 - 訊息來自 2 個群組或頻道,以及 3 個私人聊天室和機器人。其中有一次是在「**聊天室**」中 按下訊息按鈕;該請求及 Telegram 的回應均記錄於日誌中。 - 當收集器在重新啟動時重新掃描該帳戶時,新增了聊天室。由於 「儲存新聊天室的早期訊息」功能已關閉(`history = 0`),因此此處不予說明。 未涵蓋內容:反應、成員變動、個人檔案、發送訊息、透過 邀請加入、代理伺服器、通知、witness 機器人以及同時管理多個帳戶。公開檔案 僅包含計數資料。 ## 透過 libarchive 開啟受密碼保護的匯出檔案 · 2026年10月29日 由匯出加密程式碼所建立的壓縮檔(WinZip AES-256 格式,7-Zip 和 WinRAR 可讀取),已透過 Windows 版 `tar`(bsdtar 3.6.2、libarchive)開啟。 輸入正確密碼後, 解壓縮後的檔案與原始檔案的 SHA-256 值相符;輸入錯誤密碼則會顯示「密碼短語不正確 」而遭拒絕。7-Zip 和 WinRAR 本身並未被執行。 ## Telegram 即時測試 · 2026年10月27日至29日 一個真實的 Telegram 帳戶,透過內建的 API 配對池登入,記錄了某個 超級群組自 **10 月 27 日 21:36 UTC 至 10 月 29 日 05:15 UTC** 期間的訊息。在此期間, 資料收集器共啟動了 12 次。 | 已記錄 | 計數 | | --- | --- | | 日誌記錄,包含心跳訊號與服務記錄 | 2,385 | | 新訊息 | 1,291 | | 刪除記錄 | 472 | | 其中部分訊息在 TgWitness 儲存文字後被刪除 | 347 | | 編輯 | 12 | | 暫停期間遺漏的訊息,已透過重新檢查補入 | 12 | | 已儲存的附件 | 17 | | 未下載附件(下載功能已關閉,或無檔案可下載) | 14 | | Telegram FloodWait 在重新檢查時會暫停,每次暫停 3 秒 | 8 | - 所有 2,385 筆記錄的簽名與雜湊鏈,皆可透過該日誌的 公鑰進行驗證。 - 重新啟動後,收集器將從儲存的更新狀態(`pts`)繼續運作,而 Telethon 會進行補齊;隨後的重新檢查則會新增仍缺失的訊息。 - 在每次 FloodWait 事件中,資料擷取器會等待指定時間後再繼續執行。 - 該帳號保持登入狀態,且同一會話於 10 月 29 日重新連線。 本次測試未涵蓋的項目:同時處理多個帳戶、管理員角色、代理伺服器、 持續數小時以上的服務中斷,以及完整的[即時驗收程序](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/LIVE_ACCEPTANCE.md)。 公開檔案僅包含上述統計數據:不包含任何帳戶或聊天室識別碼、訊息或 憑證資訊。 ## 合成本地能力測量 Private synthetic capacity run: 10,000 events across 100 chats. | 指標 | 觀察到 | | --- | --- | | 輸入 | 涵蓋 100 個精選合成來源的 10,000 則合成訊息事件 | | 訊息內容 | 400 個字元;不含媒體或網路內容 | | 資料擷取 | 53.273 秒;每秒 187.7 次事件 | | 處理器延遲 | p50 4.162 毫秒;p95 7.784 毫秒;最大值 129.118 毫秒 | | ZIP 匯出 | 啟用 tracemalloc 時耗時 19.868 秒 | | Python 匯出區塊的峰值追蹤 | 0.51 MiB;不處理 RSS | | ZIP 檔案大小 | 4,610,962 位元組 | | 獨立驗證 | 所有 10,000 筆事件均已驗證 | 此測量針對本 Windows 主機上的本地序列記錄/匯出路徑。它 不測量 MTProto 傳輸、並行帳戶、Telegram 流量限制、媒體檔案、 長期運行的負載,亦不保證實際聊天數目。此測量是在 最終離線時間戳工具推出之前進行的,該工具並不會改變所測量的訊息路徑。 ## 對一百萬則訊息進行全文搜尋 · 2026年11月5日 指令: `python tools/bench_fulltext.py --messages 1000000 --work ` A deterministic signed journal of 1,000,000 synthetic messages in 200 chats (Russian word forms, Ukrainian, English, Chinese, Japanese, links and handles) was indexed in 71 seconds; the index took 58 MiB beside a 1.50 GiB journal. Best-match searches took 9 to 190 ms (median), against 2.4 to 3.2 seconds for the previous substring search. Full results, hardware and limits: [Full-text search](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/#benchmark). Private compatibility tests also verify a frozen signed archive made before full-text search with the current verifier, and a current archive with the frozen archive's own `verify.py`. ## 其餘資格說明 所保留的即時日誌可記錄實際的訊息收集、編輯、刪除通知、附件、 重新檢查及速率限制處理。 它並未完整記錄訊息送達狀況,亦未建立受控的 角色可見性矩陣、反應主體、延長的 FloodWait、帳號封禁以及 網路/程序中斷恢復等資訊。QR 代幣的發行仍與已完成的 行動端 QR 碼確認程序有所區別。 Docker/Compose 及安裝檢查已記錄於 CI 中;實際的 Phala 部署 與外部時間戳記驗證已於上文說明。這些並未建立 持續的高負載、完整的實時平台/角色矩陣、獨立的安全 審查、長期歸檔驗證或鑑識認證。已實作儲存的 MTProto 狀態 與補齊功能;原子無損實時重播功能尚未建立。 較新的後補機制會以原子方式提交訊息與游標,並保留可用的 「近期操作」,但其合成覆蓋範圍有別於實時驗證。 有關受控驗證矩陣,請參閱[實時驗收部分](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/LIVE_ACCEPTANCE.md)。 [公開審計目錄](https://github.com/phishdestroy/TgWitness/blob/main/website/validation/audit/README.md)僅包含 已簽署的報告及彙總測量結果。詳細的操作紀錄、 原始擷取資料及帳戶資料仍屬私有。位於 `docs/assets/` 中的應用程式截圖使用虛構的示範資料。 --- # 授權說明及架構不相容聲明 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/license/ TgWitness 採用 MIT 授權,供所有人使用,並說明其為何在架構上與 Taylor Wessing 的工作流程不相容。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) TgWitness 採用 MIT 授權,供所有人使用,並說明其為何在架構上與 Taylor Wessing 的工作流程不相容。 TgWitness 依據 [MIT 授權條款](https://phishdestroy.github.io/TgWitness/LICENSE)發行。本聲明未附加任何授權條件。 > 簽名並不能將謊言轉化為事實。 > > > > 對於那些認為在名字前加上「Dr.」就能讓後面所說的一切都成為事實的企業、律師事務所或個人而言,TgWitness 並不適合。頭銜、信頭和簽名均不能凌駕於證據之上。 > > > > 若您的工作流程是從客戶已付費的結論出發,並要求記錄必須配合該結論,那麼您需要的是另一種工具。TgWitness 的存在目的在於保存記錄,並使其開放供查驗。 > > > > 就讓那些「博士」們去處理他們企業客戶的資產負債表吧。頭銜無法治癒謊言。 > > > > 數學不進行協商。 [原始記錄](https://phishdestroy.io/steam_dossier/taylor_wessing) · [道德聲明與歷史延續性](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/notice/) [完整 MIT 授權條款](https://phishdestroy.github.io/TgWitness/LICENSE) · [專案](https://github.com/phishdestroy/TgWitness/blob/main/README.md) · [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Home.md) --- # 操作員不相容通知 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/notice/ 關於 Taylor Wessing 及其來源記錄的操作員公告。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 關於 Taylor Wessing 及其來源記錄的操作員公告。 **PhishDestroy · TgWitness 專案公告** [原始記錄](https://phishdestroy.io/steam_dossier/taylor_wessing) · [原始「聲明」](https://phishdestroy.github.io/TgWitness/NOTICE) ## ⚖️ 道德聲明與歷史延續性 我們最近得知,對於某些律師事務所——尤其是托拜厄斯·謝林斯基博士(Dr. Tobias Schelinski)與帕特里克·文森特·祖爾海德博士(Dr. Patrick Vincent Zurheide)——而言,數學與客觀事實皆無關緊要。 將 GDPR 不合規行為作為商業服務推銷給企業,卻連自身的基本資料處理都做不好,這並非法律專業知識。 若抱持「你就是法律」的錯覺,或以為偽造索賠文件上某位精英的簽名能神奇地將謊言轉化為真相,都無法掩蓋技術上的無能。 本工具不適用於以下情況占主導地位的司法管轄區: - 企業統治 - 私有化或商業化司法 - 金權政治 - 盜賊統治與制度性腐敗 特別提及 Patrick Zurheide 博士、Tobias Schelinski 博士,以及那些企圖將「被遺忘權」武器化,以掩蓋自身資料處理失誤、美化其機構淵源,並抹除歷史紀錄的人士: > Taylor Wessing(托拜厄斯·謝林斯基博士與帕特里克·文森特·祖爾海德博士)→ Wessing & Berenberg-Gossler → Stonewall Top 100 → 格拉夫·馮·德·戈爾茨博士 Wessing & Partner (自 1957 年起)→ 呂迪格·馮·德爾·戈爾茨伯爵 → 1935 年修訂版的第 175 條 為嚴格遵守 MIT 授權條款,我們不限制本軟體的使用。然而,必須明確指出:企業聘僱、法律威嚇及要求刪除數位資料等行為,皆無法抹去歷史、改寫淵源,亦無法隱瞞真相。 [MIT 授權條款](https://phishdestroy.github.io/TgWitness/LICENSE) · [我們對 Taylor Wessing 的立場](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/license/) · [證據模型](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/) [專案](https://github.com/phishdestroy/TgWitness/blob/main/README.md) · [文件說明](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [維基](https://github.com/phishdestroy/TgWitness/blob/main/docs/wiki/Home.md) --- # TgWitness Changelog & Release Notes Canonical page: https://phishdestroy.github.io/TgWitness/docs/reference/changelog/ Read TgWitness changes by version, including unreleased work. Check release notes before assuming a source feature is included in an installed package. [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/llms.txt) Translation coverage: this edition includes material from the English original. 按版本列出所有變更,包含尚未發布的變更。 [TgWitness](https://github.com/phishdestroy/TgWitness/blob/main/README.md) / [Documentation](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) · [Project reference](https://github.com/phishdestroy/TgWitness/blob/main/docs/README.md) ![Project reference](https://phishdestroy.github.io/TgWitness/assets/chapter-project.svg) **On this page** - [Unreleased](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#unreleased) - [0.9.1 preview · 5 November 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#091-preview--5-november-2026) - [0.9.0 preview · 4 November 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#090-preview--4-november-2026) - [0.8.1 preview · 2 November 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#081-preview--2-november-2026) - [0.8.0 preview · 2 November 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#080-preview--2-november-2026) - [0.7.1 preview · 1 November 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#071-preview--1-november-2026) - [0.7.0 preview · 31 October 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#070-preview--31-october-2026) - [0.6.1 · 27 October 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#061--27-october-2026) - [0.6.0 · 27 October 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#060--27-october-2026) - [0.5.1 · 27 October 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#051--27-october-2026) - [0.5.0 · 26 October 2026](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/changelog/#050--26-october-2026) ## Unreleased - Isolate request-body capacity and token-family lockouts, set Secure download cookies behind trusted HTTPS proxies, limit pending tickets per access, and expose journal write failures. - Add an English Secret Chat demo with fictional requests, replies, attachments and retained deletion notices. Document the separate development implementation and its open defects; the demo does not enable Telegram connections. - Remove the unused one-shot exporter and check recovery against the current exporter. Reject unexpected or repeated message IDs in recheck responses. - Combine concurrent exports with resumable Standard API and Takeout acquisition. Each job retains its own progress, timings and signed checkpoints; accounts remain reserved until that job stops. Include the account controls, batch import and report-verification updates in the same build. - Add offline `VERIFY.cmd` / `VERIFY.sh` launchers, plain-language verification explanations and saved UTF-8 transcripts to signed exports in all 25 panel languages. Build a separate Windows verifier with an embedded runtime and a language menu. Unpinned signers remain unconfirmed; successful integrity verification does not establish admissibility. - Add optional jurisdiction guidance for 25 countries to Report Studio and exported assessments, with separate civil/criminal sources, local-language summaries and next steps derived from the actual package. Guidance remains a research draft, does not raise assurance, and is excluded from reusable layout profiles and inherited sharing-copy settings. - Allow the pinned Russian morphology dictionary resources in Windows portable builds while continuing to reject unrecognized files in dependency data directories. - Keep missing-on-recheck observations separate from deletion notices in HTML, JSON and PDF counts and viewer labels. Do not claim unscoped deletion IDs were never saved when their chat is outside the current observation scope. - Record multiple deleted IDs as a deletion batch without inferring a whole-history clear, the deleting participant, or deletion for everyone. Relabel legacy history-clear events without changing their signed records. - Publish the one-command installer only after application and security checks pass for the exact main commit and the signed package passes Ubuntu local/HTTPS service and Windows PowerShell acceptance. Keep the previous download when checks fail or time out. Add authenticated tests of the actual public installer URLs. - Preserve `previous_hash` in the signed-record preview even when its hexadecimal digits resemble a payment card number. Secret masking still applies to message content; the stored record is unchanged. - Reconstruct compact chat snapshots consistently in MCP, retain unknown fields, and distinguish capped lists from removals. Resume date scans, preserve topic names across history reads, and bound image previews. Apply metric choices to filtered reports and count historical service messages separately. - Plan sealed exports against the remaining session time, offer smaller selections, update progress estimates and reserve time for packaging. - Compare every message field, validate record counts and structure, enforce CLI verification options, and display OpenTimestamps states separately. - Close coverage on worker failure, bind heartbeats to the capture run, and verify TDX signing-key binding and supported component statuses. - Add read-only MCP tools (preview): `get_messages_by_date` (one calendar day in a named time zone, computed server-side), `get_pinned_messages`, `get_chat_stats` with `gap_summary`, `get_topics`, and `get_media`, which returns a verified, downscaled image preview anchored to its SHA-256 and `media.saved` record. Every MCP tool now declares an output schema. New connections include these tools; existing connections keep the tools they were issued with. - Show each account's selected route and checked exit address, group session controls, and retain interface preferences when adding an account. Record connection changes without repeating identical background checks. Validate withheld-marker contents and reply states in minimized exports, including rejection of a missing-source label for an included record. - Update collection-mode instructions and Russian guidance. Allow a bounded publication-settling interval while requiring exact installer bytes. - Mark messages left out of a minimized disclosure (preview): inside each disclosed chat, withheld messages appear as content-free markers naming the selection rule, one per run or one per message, and disclosed replies state whether they answer a disclosed message, a withheld one or one that is not in the source export. The package format becomes `tgwitness-account-disclosure-v2`; `verify.py` rejects markers with content and replies pointing at missing records, and still verifies version 1 packages. - Repeat gap analysis with the settings carried by the signed export, count each service-message number once, and bound account estimates to the measured interval. Require explicit whole-account scope, retain pause/resume boundaries, and interrupt expensive archive scans at their time budget. - Add missing message numbers (preview): `coverage.json`, the HTML and PDF reports, `verify.py` and the archive's `get_capture_status` measure numbers Telegram assigned and this collector never saw, per channel or supergroup and for the account-wide sequence of private chats, bots and ordinary groups during whole-account collection. Each result states whether it applies and why, lists its parameters, and anchors listed gaps to the neighbouring observations. **Parameters → Gap analysis** sets the listed gaps, the account-wide sequence and an optional service-message estimate that is never subtracted. A gap names no actor and no reason. - Record in the signed message when self-destructing media is fetched despite a type or duration rule (`media_capture.rule_override`), with the limits that still applied. - Add chat-state snapshots (preview): while observing, every enabled source is read periodically and saved as a signed `chat.state` record with title, description, counts, pinned messages, administrators with rights, and gifts on channels and profiles, plus the differences from the previous snapshot. Unpinning, rights changes and gift conversions or upgrades without a service message become visible. Parts Telegram refuses are named and carried forward, never reported as removed. **Parameters → Chat state** sets the interval, pause and parts. - Add anomaly indicators to evidence reports (preview) as registered, versioned processors in `tgwitness/metrics/`: first-time posters per day with flagged injection-like days, service messages among message numbers, joins and departures per month, and pins and unpins per month. Reports list every processor that ran with its version and print its method; **Parameters → Report metrics** chooses them. - Keep ranked-search pages within the first 1,000 results regardless of page size, order OCR/transcription results before pagination, and retain exact match positions when Unicode expansions and invisible-character removal cancel each other's length changes. - Keep photo downloads on the still variant named by their metadata and hash manifests, including after file-reference renewal. Reject truncated photo/chat attachments and corrupt reused files instead of counting them as saved. Check recovered multi-account message IDs against missing intervals without expanding large gaps. - Release a session's local connection lock after transport shutdown, including when a disconnected client was already removed from the workspace. Cancelling the waiting operation cannot release the lock early, and closing an older session cannot unlock a different current key. - Apply a chat export's skip/hash-only choice to recovered messages and profile photos, and record that choice in the acquisition metadata. Reject changed messages before fetching attachments in the separate files stage. Count missing message numbers as intervals so sparse histories do not exhaust memory, including during a cancellable full recheck. - Preserve available self-destructing photos, videos and files in the API journal with a dedicated immediate queue, explicit TTL/view-once labels and signed saved/unavailable/not-saved outcomes. Block read receipts in the API client, including batches and wrapped requests. Keep byte limits, disk reserves and Telegram backoff; saved bytes do not establish human viewing. - Preserve image-rendered Unicode emoji in official Web message text, reply previews, reactions and derived page text without changing the client DOM. A live account test exposed the omission; video and saved pages already retained the image. - Improve chat-export Takeout, unreadable-message recovery, shared absent-number rechecks and bounded range retries. Preserve observed deletions in export scope, compare verified archives, and distinguish archive integrity from an independently confirmed signer. - Protect imported sessions from remote logout, close idle connections and prevent simultaneous reuse of a session key. Add explicit session management and masked two-step password entry; cancellation or switching workspaces prevents submission. Read single-account export messages before their separate attachment stage. - Keep source export and AI actions disabled while local source search is pending, empty or has failed; clear stale previews before the next search. Exercise delayed replies explicitly in browser checks. - Use unambiguous synthetic privacy identifiers and report the exact marker/context on handover-test failures, avoiding accidental matches inside report metadata. - Add an in-panel comparison of collection methods and explain account task ownership beside full-history controls. Refresh source-version badges, qualification records and Trusted Live network results; check version labels before publication. - Add [full-text search](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/search/) (preview): Russian and Ukrainian word forms, English stems, Chinese and Japanese phrases without spaces, exact phrases, domains in hidden links and buttons, @usernames, wallets and phones, filters for chat, sender, message ID and observation period, ranked with BM25. The index is derived from the signed journal, bound to its latest record hash, never exported, and can be kept on disk, in memory only or turned off. Recognized text is indexed in memory only and labelled as machine recognition. - Ask the archive retrieves the best matches from the full-text index when it is complete, keeps the 24-source limit, and cuts long texts around their match. MCP `search_messages` accepts `ranked=true`. - Add `tgwitness index status|rebuild` with JSON output on stdout and stable exit codes. - Fix ranked search paging: `next_offset` is now returned when more matches exist, through `/api/search`, MCP `search_messages` and Ask the archive's partial marker. Paging stops at the first 1,000 results. - Fix Ask the archive failing on questions longer than 24 words or 200 characters. The full-text query keeps the question's first distinct words; a query the index cannot read falls back to exact-text retrieval. - Centre excerpts on the match in long texts that hide zero-width characters between letters. - Build the website when a language lacks new translations: untranslated blocks stay in English with the page notice and are listed by the build. - Add the [command line](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/cli/) (preview): `tgwitness search`, `context`, `messages`, `stats` and `export` with `--json` and stable exit codes, reading a stopped workspace directly or a running panel through a scoped, revocable archive connection. Add `.agents/skills/tgwitness-cli/SKILL.md` for agents. - Add the `get_activity_stats` archive tool, also offered over MCP: messages by UTC hour and weekday, peak days, edit and deletion shares, senders, domains and @handles, with coverage gaps. Computed on request, not stored. - Add the `export_messages` archive tool for the command line: saved observations streamed as JSON Lines in journal order, with full text and a completion record. It is granted only when selected; existing connections keep the tools they were issued with. - Recheck archive access before every streamed record, including completion. Revoked or expired connections end without a completion record; lazy export reads share the archive worker limit and timeout. - `tgwitness index` and the new commands find the data directory of the installation that runs them. ## 0.9.1 preview · 5 November 2026 - Keep message and attachment outcomes visible after single-chat sealed capture, including missing data, failed files and unfinished downloads. Translate final status when changing language after shutdown, and clear connection or export errors once they recover while retaining rejected-action and unconfirmed-revocation warnings. - Update the pinned OAuthLib dependency to 4.0.1 for CVE-2026-49272 and regenerate the runtime, browser and MCP hash locks. - Show in-flight attachment bytes without counting them as preserved evidence, reset progress on retries and clear it on pause. Keep official-client chat controls disabled during QR/2FA login and until a chat is available. Explain that Takeout approval requires another previously signed-in device. Bound CI dependency installation and avoid the stalled Azure package mirror. - Add explicitly selected direct networking for official Web capture through GitHub Actions. Proxy remains the default and never falls back to direct. The panel and signed verification report disclose direct IP exposure, and verification rejects a mismatch between the selected route and the hosted network. - Add an optional official Telegram Web observation mode with passive or sequential paced viewing, a fresh profile, restricted UI actions, login-excluded video and signed rendered observations. A required proxy bridge prevents direct fallback; exit changes stop recording. The GitHub Actions mode uses the approved sealed workflow and recipient encryption. - Bind official recordings to independently saved source/settings, check video segment order and clean endings, record fresh drand rounds and support independent public-relay comparison. Report unfinished procedures, unconfirmed logout and the limits of local or Cloudflare assurance explicitly. See [Official client witness](https://github.com/phishdestroy/TgWitness/blob/main/docs/OFFICIAL-WITNESS.md) for scope and validation. - Add opt-in Trusted Live preview: isolated official Desktop/Web sessions, native JSON preservation, guarded visual recording, per-chat continuity annotations, and verifier-recomputed reports. Supply a Linux network guard with no direct fallback, periodic proxy-routed drand observations, and optional independent read-only Cloudflare samples. Account/WARP/TDX qualification remains pending; see `docs/TRUSTED-LIVE.md`. - Make sealed export modes explicit: Telegram Takeout by default, regular API account export, or a single-chat event journal, with differences and limits shown before collection. Select multiple chats, save agreed settings, verify them with `--expected-selection`, and reject incomplete account exports with `--require-complete`. Correct the outdated one-chat-only hosted documentation. - Preserve signed message pages before requesting files or hashes. Resume from frozen history, retain completed attachments, and finish an interrupted export with explicit gaps when time or disk is limited. - Add Telegram Desktop compatible JSON/HTML views alongside authoritative signed data. GitHub capture supports full-account and selected-chat exports through regular API or Takeout, with chat types, dates and media settings. - Deliver large GitHub archives in encrypted parts with a signed, attested manifest and verified local assembly. Remove the fixed 4 GiB delivery failure without omitting preserved evidence. - Retry transient pinned OCR source downloads without relaxing checksum checks. Retry brief Windows file-sharing failures when saving private state. - Configure account exports before collection: select chats and media types, exclude avatars by default, and choose downloads, Telegram range hashes or metadata only. Keep a shared attachment budget and record incomplete files explicitly. - Show Takeout approval requirements and retry deadlines before collecting; check approval again without replacing the waiting session. Phone, QR and existing-session login retain their own authorization flow. - Save Telegram-provided SHA-256 ranges with file representation and data-center metadata. Compare them against locally supplied files; Telegram identifiers and access hashes are not treated as content hashes. - Collect message history across selected chats before processing attachments when messages-first mode is enabled. Preserve the journal in a compact export when full HTML or attachment packaging exceeds the remaining capacity. - Stream sealed delivery encryption without a second full plaintext archive. Remove interrupted ciphertext, preserve the original evidence for retry, and keep capture deadlines across runner steps with time reserved for delivery. - Require sealed-container validation in the release workflow. Phala deployment status now distinguishes verified, incomplete and review-required attestation instead of inferring trust from the provider name. - Validate every sealed-container build input against its pinned source. Retry transient package downloads up to three times while retaining signature, SHA-256 and exact-package checks before offline installation. - Include the hash-export configuration examples in source archives and preserve the translated documentation and required site assets from the latest main revision. - Keep the current tunnel address when an older signed address post is replayed. Signed posts are ordered by their signed time; unsigned posts use the relay's receive time. - Trust only the Caddy proxy on the private Docker HTTPS network and normalize client addresses for authentication limits. - Keep operator IP addresses out of new signed access events, hide administrative payloads from shared views, and enforce workspace and export ownership boundaries. - Reject duplicate JSON keys, prepended ZIP content and HTML injected into report seals; distinguish pinned witness keys from pinned collector keys. ## 0.9.0 preview · 4 November 2026 - Reserve each account exclusively for monitoring, history or an export. Serialize Telegram RPCs and persist full FloodWait deadlines. - Add durable distributed chat exports with date/language/reply filters, bounded labelled context, signed chunks and explicit pause/resume. See [Distributed chat export](https://github.com/phishdestroy/TgWitness/blob/main/docs/DISTRIBUTED-EXPORT.md). - Keep account reservations until every export worker has stopped, including repeated pause requests and sibling worker failures. History loading in sealed sessions also reserves the account exclusively. - Add participant timelines from saved observations: names, membership, explicit deletion flags and message activity. Profile refreshes are bounded; optional presence recording preserves unavailable or expired status as unknown and does not attribute online activity to a chat. - Save, import and reuse report layout profiles without copying case details or report filters. Profiles are validated and isolated by workspace. - Automatically offload eligible attachments to configured external storage under disk pressure, with reserve-space checks, compression, optional encryption and full readback verification before local eviction. Journals remain local. - Make the recording settings and chat tabs fit narrow screens, including wider system fonts, and fix profile controls and localized labels. - Include reviewed website assets in source archives and verify conditional dependency versions in SBOM inventories. - Phala Cloud deployments work on Phala Cloud itself (first real run, 4 November 2026): the compose carries its name, Phala's own pre-launch script is kept out of the measured app-compose, the production OS image is chosen instead of Phala's development default, the instance ID is read from the CVM state, and restarts from the CVM's operations count in `provider_actions`. Private Phala regressions simulate each of these. - `tdx_os` without outside tools: the verifier downloads the published dstack OS image once, matches it to the hash the CVM reports and computes MRTD and RTMR0-2 itself, the ACPI tables QEMU builds for the VM's shape included. A development image, other firmware, kernel, command line, memory, vCPUs or devices fail. Each journal start is checked the same way. - Attestation certificate for Phala deployments: `verify --report` also writes HTML and a signed PDF, sealed by a qualified eIDAS time stamp from the Belgian government's time-stamping authority, a FreeTSA time stamp and the verifier's own key; `check-report` checks the seal. - Quick tunnel addresses are also posted signed with the collector key, so a verifier is not misled by forged posts on the address topic; on Phala Cloud the tunnel check passes, since its connector runs inside the measured compose. ## 0.8.1 preview · 2 November 2026 - Runtime, sealed and media containers moved to pinned Wolfi/glibc with Python 3.12 and hash-locked system packages (AMD64 + ARM64). Image scans are clean of HIGH/CRITICAL. - Tesseract 5.5.4 built from verified source, English and Russian data pinned. - Release checks now cover real OCR, offline transcription, signed multilingual PDFs and container restrictions. The source archive includes all container build inputs. - **Extras → Independent capture** in the English panel: browser/AyuGram recorders with encrypted tokens, pinned keys, tab selection, start/pause, snapshots, checkpoints and verified ZIP downloads. Everything is off by default. - New optional `tgwitness-capture` package: Chromium PNG/MHTML snapshots, AyuGram SQLite copies, optional silent video, Ed25519 event chains, signed ZIP/HTML reports and a standalone verifier. Each recorder has its own key and storage. - Fixed Phala installs: source bundles were missing the capture package. ## 0.8.0 preview · 2 November 2026 **Reports** - Report studio: eight designs (Classic, Editorial, Briefing, Analytics, Technical, Overview, Reading series, Ledger & margin), live preview, HTML and native signed PDF. Switching designs keeps filters, charts and notes. - Pick report data by chat, author, date and event type and preview it before saving. Edits show before/after, deletions show what was saved earlier. - Reports look like proper dossiers now: cover, key figures, evidence map, numbered findings, timeline. PDFs get an A4 cover with QR, bookmarks and page refs. - Each report explains what its conclusions rest on: export-time checks, observations, missing material, how to check it independently (EN/RU/DE wording). - Send, edit and observed times are shown separately, plus replies, threads and metadata. **Case Board and groups** - Private Case Board: signed bookmarks, exact-version highlights, action slices, collections, threaded comments and statuses. Team notes stay apart from observations; the verifier checks board exports too. Export permission alone doesn't reveal team notes. - Account groups share settings. Members follow the group, an account's own value wins until reset. Changes show which accounts they hit and ask before overwriting. Access can be granted to a whole group. - Group screen at `/groups/`: accounts, problems, shared chats, group export. **Setup and connection** - Six-step first setup and one Settings page with simple/standard/expert levels, in all 25 languages. Each step has its own URL, Back works. - The setup asks whether the account is a separate one; a main account only records chosen chats. After Start it shows that connection, events, sources and files work. - Guided Connection screen: pick accounts, prepare and check a route, then apply. Direct, own proxies, public MTProto pool, WireGuard profiles and portable WARP. - Automatic connection tries public MTProxy, then WARP, then direct (if allowed) and shows a status indicator instead of failing silently. - Video duration limits in file policies. **Panel and safety** - No more one-click accidents: pausing, excluding and removing sources are confirmed, sending from a chat needs "Write as @account" first, route changes while observing offer to pause. - One set of counters everywhere (deleted with text, deleted before saving, missing on recheck). - Account files are inspected before connecting. URL, workspace and account always agree, a mismatch blocks actions. Chats open read-only and mask detected secrets. - Downloads fall back to normal browser downloads, big archives stream through one-time cookies. Prepared exports keep size, SHA-256 and "Download again". - Panel token rotation keeps the new session alive. Temporary network failures offer Retry. - Panel dialogs instead of `window.confirm`, journal paging fixed, lots of small UI fixes. - Public-channel showcase: expiring read-only links with redacted authors and signed snapshots. **Servers and evidence** - Extras → Server 24/7: a Hetzner server from the panel with a quick tunnel or your own domain. `python -m tgwitness.cloud destroy` cleans everything up. - Phala Cloud option: the collector runs in an Intel TDX confidential VM, `verify` checks the attestation up to Intel's root. - Gateway DNS (`--gateway-dns`): the server only resolves through Cloudflare Gateway. - Optional drand rounds and Telegram device lists in evidence mode. - Setup by goal: four questions, suggested settings, credibility and reliability scales. **Other** - Notification service catalog with icons, optional operator control bot, Discord witness posts. - Storage separates backups, verified file offloading and evidence retention. - AI previews show the endpoint and outside route. - Pull requests run both panel suites, including Firefox and WebKit downloads. Release packages wait for dependency, CodeQL and container audits. - Docs: a [panel guide](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/panel/) for every screen. ## 0.7.1 preview · 1 November 2026 - **Start here** with two paths: export my account, or follow an investigation. - Account export through Telegram Takeout or the regular API, resumable, with signed progress and coverage records ([account export](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/account-export/)). - Separate signed sharing copies with filters, pseudonyms and optional text/file removal. Signatures establish integrity; they do not establish Telegram authorship, completeness or legal admissibility. - Readable offline reports for account exports and sharing copies, printable, with record links and instructions for the recipient. - Clear handoff after download: original vs sharing copy, report preview, instructions to copy. - Rejected Telegram logins are told apart from paused accounts and network errors. **Sign in again** keeps the workspace. - Load the history of enabled sources with pause/resume, plus a signed progress report ([history](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/history/)). - Read-only MCP at `/mcp`, local archive search with optional AI, local OCR/transcription, signed webhooks with retries. - GitHub Actions capture preview: one chat on a temporary runner, encrypted result, pinned provenance ([sealed capture](https://github.com/phishdestroy/TgWitness/blob/main/docs/SEALED-ACTIONS.md)). - Self-contained signed reports in 25 languages with chain of custody; archives add `custody.json` and `SHA256SUMS`. - Panel rework: workspace URLs, Back/Forward, drafts survive updates, Ctrl/Cmd+S, Sources split into tabs, Parameters search, journal filters and inspector, live updates. - Batch session import, account groups, MTProxy dashboard with ping, countries and own lists. - MTProxy decryption through OpenSSL (it used to eat a whole CPU core). - Stronger masking in sharing copies, bounded media decoding, repeatable source ZIPs. - Notification services refuse redirects. Weekly Dependabot, nightly CodeQL and container scans. - Lots of fixes: stuck chat profiles, quick search, DST in search dates, 502s behind Caddy, GIF/sticker downloads, slow proxy list parsing, duplicate sessions on import. ## 0.7.0 preview · 31 October 2026 - OpenTimestamps proofs are parsed strictly; Bitcoin attestations show as `bitcoin-unverified` until you run `ots verify`. - Verification reports which part of the journal witness checkpoints cover; `--require-witness` demands a pinned witness and matching final record. - Access and permissions guides, updated proxy and IP mode guides. - Panel and docs site in 25 languages. Site publishing fails on missing translations. - Added the [roadmap](https://github.com/phishdestroy/TgWitness/blob/main/docs/ROADMAP.md). ### Initial preview contents · 30 October 2026 - First GitHub release: Windows portable, wheel, source archive. - The setup guide has an "Open to everyone" section: no country or sanctions blocks, and Taylor Wessing as the only incompatibility we name. It is our position, not a licence condition. - The README and Wiki now present the authors' Ethical Notice & Historical Continuity statement, with document references, historical context and an explicit explanation that MIT permission applies to everyone. - The operator notice and the Taylor Wessing page speak in our own voice. - Returned to the MIT License. A tool whose output third parties must be able to check should not stumble over its licence. `LICENSE` is the standard MIT text again, the package declares MIT with the OSI classifier, and the container, portable package, website, Wiki and translated README labels say so. Our statement stays in NOTICE and on the Taylor Wessing page as our position; it adds no licence condition. The presentation artwork reads "open source" again. - Added our Operator Incompatibility NOTICE to README, SECURITY, the documentation, Wiki and website. A single source keeps the complete statement consistent across those pages; source, Python and portable distributions include NOTICE alongside the licence. - High-assurance deployment (`python -m tgwitness.cloud`, [guide](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/high-assurance/)) on Hetzner, DigitalOcean, Linode, Vultr or EC2: no SSH key, no inbound ports, panel only through a Cloudflare Tunnel, and a `verify` command for third parties. - Local launchers open the panel in the browser once it's up. - Read-only online demo of the real panel with fictional data. - Wiki with 13 guides, docs website with a reference section, search, diagrams and 13 languages. - **Sign out of Telegram** on the Account page. - About 940 Russian panel strings fixed by hand. - Observation scope: chosen chats, a folder or the whole account, by type. New chats are picked up immediately. - Investigation mode for accounts that join groups and talk to bots. - People profiles (opt-in per chat), independent witness bot, notification excerpts, Parameters page, light/dark theme. - Panel mini-client: send messages, press bot buttons, preview and join invites. - Fixed message loss after a long stop (rechecks used to stop after 1,000 messages). - Many fixes from a full review: attachment byte counts, restore checks, scope edge cases, verify.py witness handling, off-site copy retries. - Pillow 13 (39 advisories against 12.3). ## 0.6.1 · 27 October 2026 - Renamed TgWatch to TgWitness, old archives still verify. - Evidence mode timestamps checkpoints with RFC 3161 and OpenTimestamps. - Password-protected AES-256 ZIP exports. - Notifications through Apprise. - 13 interface languages; README, Quick start and Deployment in 12 languages. - Encrypted off-site copy to S3-compatible storage with Object Lock. - Catch-up after restart and rechecks every 15 minutes. - Built-in pool of public API pairs, no own API ID needed. - New Chats view, Accounts view, multi-account chat export, signed full chat export. - Windows portable package, public website, GitHub Pages workflow. - Better launchers on all platforms, redesigned panel, new logo. ## 0.6.0 · 27 October 2026 - New account form with Phone, QR code, Files and Auth key tabs. - Auth Key + DC ID sign-in, Telethon/Pyrogram sessions, TData ZIPs, StringSession, account JSON. - QR login with 2FA, Desktop local passcodes. - Demo opens on its sample journal; refreshed panel look. ## 0.5.1 · 27 October 2026 - Only the active account client is accepted; rejected logins are disconnected. - Windowless Windows launches with logs in `logs/server.log`. - Case-insensitive Unicode search, full UTC dates on phones. - Linux/macOS launch scripts, Docker helpers, optional HTTPS with Caddy, GHCR images. - Docs on export signatures and investigation handoff. ## 0.5.0 · 26 October 2026 - Per-account monitoring categories, presets and signed policy changes. - Direct local entry to synthetic demos. Older history: [release status](https://github.com/phishdestroy/TgWitness/blob/main/docs/internal/RELEASE.md) and [verification](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/verification/). --- # 一個日誌。四種收集模式。八個驗證等級。 Canonical page: https://phishdestroy.github.io/TgWitness/zh-Hant/guides/modes.html 收集範圍、事件邊界、八種驗證機制以及六個虛構的調查情境。 [Project context and measured scale](https://phishdestroy.github.io/TgWitness/docs/reference/overview/) [Documentation index](https://phishdestroy.github.io/TgWitness/zh-Hant/llms.txt) 模式、情境與證據等級 TgWitness 記錄已連線帳戶所觀察到的內容。第三方可透過獨立受信的金鑰,驗證該記錄的完整性。 [收集模式](https://phishdestroy.github.io/TgWitness/zh-Hant/guides/modes.html#scope)[應用情境](https://phishdestroy.github.io/TgWitness/zh-Hant/guides/modes.html#scenarios)[證據等級](https://phishdestroy.github.io/TgWitness/zh-Hant/guides/modes.html#levels) 3–5 分鐘概覽 · 虛構範例 · 現行實作 1. **Telegram** 帳戶可見的更新 2. **收集器** 關聯記錄,每筆均經簽署 3. **驗證者** 可信密鑰 + 保留的邊界 `h₁ → h₂ → h₃ · Ed25519`完整性已通過驗證。Telegram 的來源與訊息的真實性仍是兩個獨立的問題。 ## 選擇觀察範圍 三種範圍與一個調查預設值。排除項目與啟用的來源類型仍適用。 預設**選定的聊天室** 記錄 僅採用經人工精選的來源。 新聊天室 不會自動新增。 選擇 一組已知的頻道或群組。尚未確定任何固定的聊天容量。 **不執行** 本系統不會偵測其他聊天室,亦不會補全較早的聊天紀錄。 帳戶資料夾**Telegram 資料夾** 記錄 包含資料夾及其分類,若已設定,則排除排除項目及已歸檔的聊天室。 新聊天室 匹配活躍的聊天室;一小時內的資料夾變更。 選擇 分析師已建立案件資料夾。請確認資料是透過專用帳戶進行蒐集。 **不執行** 它不會套用資料夾的變更 muted/read 條件。 確認範圍**完整帳戶** 記錄 選定類別中,帳戶可見的聊天室,包括私人對話與機器人。 新聊天室 將於首次更新時新增。 選擇 專用的觀察帳戶,包括參與案件的帳戶。 **不執行** 它不會自動加入聊天室,也不會繞過來源存取機制。 整個帳戶預設值**調查模式** 記錄 所有來源類型、自身操作、來源檔案,以及新發現來源最近 200 則可見訊息。 新聊天室 新的聊天室或機器人將獲得一個檔案及歷史紀錄快照。 選擇 透過控制面板加入團隊或與機器人互動。檢視並儲存預設設定。 **不執行** 它不會對所有現有聊天室進行快照,也不會監測在其他客戶端按下的回調功能。 這些卡片僅供本地比對使用,並非即時收集器控制項。它們不會對帳戶造成任何變更。 **不執行** 任何模式均不得讀取秘密聊天內容、在程序停止時進行記錄、自行加入來源,或檢索超出請求範圍的早期歷史紀錄 snapshot/export. [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/) ## 透過 GitHub Actions 擷取(預覽版) 新的 Telegram 登入工作階段、一個聊天、加密封存和 GitHub 來源證明。 [開啟擷取助手](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/capture/) ## 記錄內容 僅已傳送或明確請求的觀察記錄才會被納入紀錄。來源不明的觀察記錄將維持未知狀態。 擷取開關 · 本地化示意圖新訊息編輯刪除內容反應會員資格 此面板會針對每個工作區套用這些設定。關閉某項設定時,現有記錄將予以保留;重新開啟該設定時,不會重建遺漏的事件。 **事件矩陣:已保存的資料與尚待釐清的未知事項** | 類別 | 已儲存 | 仍屬未知 | | --- | --- | --- | | 訊息 | 文字、ID、發送者元資料、回覆上下文及原始更新封套。 | 無第三方可驗證的 Telegram 簽名。 | | 編輯 | 所有被觀察到的版本,且不覆寫較早的版本。 | 中間的編輯可能被遺漏;發送者未必就是編輯者。 | | 刪除 | 若可取得,請一併附上通知內容及先前儲存的文字。 | 未提供刪除者及確切的操作時間。 | | 無範圍限制的刪除 | 帳戶層級通知;未知對等方仍會明確標示。 | 不進行猜測性聊天。關聯時,在可能的情況下會使用先前儲存的帳戶範圍內 ID。 | | 反應 | 已傳遞的計數器與可見的近期身分。 | 並非所有反應器皆可見;若要取得完整的可用清單,需進行獨立查詢。 | | 會員資格 | 已傳送的服務訊息與參與者更新。 | 角色與聊天類型會限制可見性;沉默並不代表不存在。 | | 附件 | 原始版本描述符、儲存的位元組、 SHA-256 以及嘗試結果。 | 已消失的檔案可能無法取得;較新版本不會取代它。 | | 歷史快照 | 目前可見的訊息,標記為歷史觀察記錄。 | 先前的編輯內容及已消失的內容均不予重建。 | | 自身行為 | 發送 messages/edits 及相應的回覆鍵盤 button_press 的元資料。 | 在其他 Telegram 客戶端觸發的回呼將無法被偵測到。 | | 機器人按鈕 | 回呼、URL、網頁應用程式及請求元資料將與訊息一併保留。 | URL 及 phone/location 請求皆為純文字,不會自動開啟或執行。 | ### 預設附件限制 照片 20 MiB 影片 100 MiB 檔案 50 MiB 動畫 20 MiB 影片筆記 50 MiB 語音 20 MiB 音訊 50 MiB 貼圖 5 MiB **不執行** 開關功能不會刪除嵌入的元資料,也不會停用運作紀錄。擷取功能不會識別 Telegram 未提供的行為者。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/) ## 請僅使用您所擁有的授權 每個帳戶皆擁有專屬的工作區、日誌、簽名金鑰、路由及佇列。 ### 電話號碼 + 代碼 啟用時 2FA 。 ### QR code 請從授權裝置進行掃描; 2FA 可能仍需如此。 ### Telethon .session 匯入該帳戶的會話檔案。 ### Pyrogram .session 匯入受支援的 Pyrogram 會話格式。 ### TData ZIP 僅支援一個 Desktop 帳戶;若已設定,則使用本機通行碼。 ### StringSession text 貼上一個 Telethon StringSession. ### .session + .json 選擇會話及相應的相關元資料。 ### 授權金鑰 HEX + DC ID 導入帳戶授權時,須一併包含其資料中心識別碼。 **API pair** 您自己的 API 配對組合為選用項目。若未提供, TgWitness 系統將使用公開配對池,其中包含來自官方 Telegram Desktop 的配對。 `Direct · SOCKS5 · HTTP CONNECT · MTProxy`MTProxy 此功能尚屬實驗性質;內建的公開 MTProxy 清單。代理路由失敗時,不會回退至直接連線。 同一台機器上的兩個工作區並不等同於兩個獨立的見證者。 **不執行** 匯入操作不會繞過 Telegram 的授權機制, 2FA 亦不支援未受支援的連線格式。帳戶仍共用同一應用程式執行程序。 [帳號格式](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/accounts/) ## 從控制面板進行操作 發送或回覆訊息、按下當前機器人按鈕、儲存連結預覽後,請明確加入聊天室,或透過其啟動參數啟動機器人。 `interaction.preview``interaction.requested``interaction.result` 預覽、請求及結果回執均經簽署。按下按鈕前,伺服器會再次擷取訊息,並拒絕已變更的鍵盤輸入。回傳的回呼文字與網址仍屬已記錄的上下文。 **不執行** 不包含網頁應用程式、支付功能、 phone/location 分享或內嵌查詢。顯示網址並不代表會開啟該連結。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/collection/) ## 恢復與連續性 應顯示缺口,而非隱藏。 ### 恢復已儲存的位置 重新啟動後,系統會向 Telegram 查詢遺漏的更新。有限的保留時間與過期的差異紀錄可能導致資料缺口。 ### 重新檢查可見訊息 預設值:優先來源每 15 分鐘更新一次,其餘來源每 6 小時更新一次。結果包含 message.recovered 以及 message.missing_on_recheck. ### 閱讀 coverage.json 簽署後的匯出檔將附帶觀察期間、附有理由的缺口,以及未被觀察到的 ID。重新檢查時發現缺失的記錄,並不等同於刪除通知。 **不執行** 後續的歷史快照並不會抹除服務中斷的紀錄,亦無法復原所有消失的版本。儲存的游標並非對日誌接受情況的無損確認。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ## 七個層級。不同的問題。 每個機制皆用於解答特定範圍的問題。應分別配置外部服務,並將其信任錨點保留在收集器之外。 1. ### 記錄 SHA-256 鏈 + Ed25519 每筆事件;首個 previous_hash 為 64 個零。 **第三方驗證** 在固定收集器金鑰下的排序與簽名。 **不執行** 這並不能證明其源自 Telegram 或內容完整無缺。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 ``` 2. ### 容器 manifest.json 列出檔案雜湊值; manifest.sig 對其進行簽署。 media.saved 將附件位元組綁定至某個事件。 **第三方驗證** 所提供的檔案與已簽署的清單及媒體收據內容一致。 **不執行** 它不會對另行下載的 CSV, HTML 或截圖進行簽名。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 ``` 3. ### 保留的邊界 啟動時進行檢查點備份,預設每 5 分鐘執行一次,並進行有序停止。請在其他位置保留一份副本。 **第三方驗證** 後續的匯出內容須與先前保留的長度及頭部資訊一致;可偵測到回滾情況。 **不執行** 它無法偵測日誌與所有保留檢查點同時被替換的情況。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --checkpoint checkpoint.json ``` 4. ### 外部時間 證據模式會傳送一個檢查點 SHA-256 至 RFC 3161 主管機關(FreeTSA, DigiCert) 及 OpenTimestamps 行事曆。 **第三方驗證** 經驗證的 TSA 回應會為這些位元組標記時間;經確認的 OpenTimestamps 證明則將其錨定於比特幣。 **不執行** 它不會將已準備的請求或待處理的日曆收據視為已確認的時間戳記。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --tsa-ca trusted-ca.pem ots upgrade checkpoint.ots ots verify checkpoint.ots ``` 5. ### 獨立見證人 將主機、範圍限定唯讀端點、新挑戰及其專屬 key/journal 以及 TGW1 頻道貼文。 **第三方驗證** 先前已接受的分支頭;狀態包括 ok、 key_changed、回滾、分叉、無效以及 no_response. **不執行** 這不會將同一收集器主機上的兩個工作區轉變為獨立的見證者。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --witness witness.zip --witness-fingerprint WITNESS_SHA256 --channel result.json ``` 6. ### 站外副本 S3- 相容版本,以 AES-256-GCM; Object Lock 加密的相容副本(當儲存桶支援此功能時)。 **第三方驗證** Restore 僅在日誌、檢查點及保存媒體的驗證成功後,才會發布檔案。 **不執行** 若未提供匯出的金鑰,則無法進行還原;若未檢查儲存回應,則不假設資料已保留。 **驗證指令** ``` python -m tgwitness.replica restore --key-file KEY.json --out EMPTY_DIR ``` 7. ### 執行來源追蹤 簽名執行收據:來源雜湊值、依賴項版本及程序上下文。由系統自行回報。 **第三方驗證** 簽名收集器針對其自身執行所回報的內容。 **不執行** 本系統不提供獨立的程序驗證,亦無法排除記錄前系統已遭入侵的可能性。 **驗證指令** ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 ``` ### 無任何層級能證明 每則 Telegram 更新的送達;文字內容的真實性;發送者 ID 確實識別真實人士;記錄前未發生資料蒐集者遭入侵的情況;以及在法庭上的可採納性。 [獨立見證人](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/witness/) 本地 SHA-256 實驗 ### 嘗試修改記錄 2 下一筆記錄會保留先前儲存的連結。變更文字內容會改變記錄 2 的計算結果哈希值。 記錄 2 的內容 記錄 1`h1`以 64 個零開頭 記錄 2`h2`包含已儲存的 h1 記錄 3`h3`包含已儲存的 h2 靜態範例: h2 涵蓋「11:00 見面」。若變更該文字,將導致 h2;記錄 3 仍引用已儲存的 h2. **檢查完整的摘要** 儲存紀錄 2 的雜湊值 `SHA-256(e₂)` 重新計算的第 2 筆記錄雜湊值 `SHA-256(e₂)` 此範例僅計算雜湊值,而非簽名。實際的驗證器會將每個簽名與連結與可信密鑰進行比對。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/how-it-works/) ## 選擇一條穿越證據的路徑 虛構情境。請在相關事件發生前開始蒐集資料;除內容外,亦須保留其邊界與間隙。 ### 頻道變更付款詳細資訊 模式 → 事件 選定的聊天室 → 訊息、編輯、刪除。 輸出 透過雜湊值記錄觀察到的貼文版本與附件。 驗證 已簽署 ZIP + 保留檢查點 + 經驗證的 TSA 回應。 **不執行** 它無法復原從未被擷取過的原始資料。 ### 事件發生後,訊息將會消失 模式 → 事件 資料夾或整個帳戶 → 所有事件類別。 輸出 已儲存的原始內容、刪除通知及存在缺漏的涵蓋範圍。 驗證 簽署 ZIP + 獨立見證日誌。 **不執行** 若通知中未提供行為者資訊,則無法據此識別刪除者。 ### 調查商店機器人 模式 → 事件 調查預設 → 按鈕、連結預覽及明確的機器人啟動。 輸出 簽署過的互動收據、回傳的回調函式及儲存的設定檔。 驗證 已簽署 ZIP;請根據 ZIP. **不執行** 它不會開啟機器人網頁應用程式、進行付款,也不會記錄其他客戶端的回調。 ### 參與者在不同聊天室中會更換名稱 模式 → 事件 任何範圍 → 被觀察的 sender/profile 元資料。 輸出 依數值 ID 排列的名稱/使用者名稱歷史紀錄、「亦見於」連結及提取的線索。 驗證 檔案 JSON 已與簽名版本進行比對 ZIP. **不執行** 它不會將錢包、類似手機號碼的字串或使用者名稱轉化為經證實的身分。 ### 長期觀察,並備有異地副本 模式 → 事件 任何範圍 → 證據模式及一個 S3 具備支援功能的複本 Object Lock. 輸出 加密副本、保留的檢查點及時間戳記回應。 驗證 請使用匯出的金鑰進行還原,然後在不使用原始伺服器的情況下進行驗證。 **不執行** 本文件無法取代獨立見證人或另行保留的解密金鑰。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/) ## 交付可驗證的套件 請提供已簽名的原始檔、獨立保存的金鑰指紋、相關檢查點以及驗證結果。 - 已簽署 ZIP - JSONL - CSV - HTML - 檢查點 - 已讀回執 - 聊天記錄匯出: chat.json / chat.html - 檔案 JSON - 密碼保護 AES-256 ZIP - 針對多個帳戶分別進行匯出 - 串流 CLI:5 GiB 預設限制 ``` python -m tgwitness.verify evidence.zip --fingerprint TRUSTED_SHA256 --checkpoint checkpoint.json ``` 應從可信副本中取得驗證器,而非從正在檢查的存檔中取得。 **不執行** 獨立版 CSV 與 HTML 並非簽名容器。密碼用於保護傳輸機密性,而非真實性。多次匯出不會合併帳戶日誌。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ## 請比對交付的成果 基本 artefact 未附加簽名、時間戳記或見證系統。腳本與記錄器因實作而異;「部分」意指僅限於已擷取或可見的內容。 | 方法論 | 編輯/刪除 | 簽名記錄 | 外部時間 | 獨立見證人 | 涵蓋範圍/缺漏 | 無作者的驗證 | | --- | --- | --- | --- | --- | --- | --- | | Telegram Desktop 匯出 | 部分 | 否 | 否 | 否 | 否 | 否 | | Telethon 快照腳本 | 部分 | 否 | 否 | 否 | 否 | 否 | | 刪除記錄器:文字日誌 | 部分 | 否 | 否 | 否 | 否 | 否 | | 螢幕截圖/網頁擷取 | 部分 | 否 | 否 | 否 | 否 | 否 | | TgWitness 附帶已配置的額外設定 | 部分 | 是 | 是 | 是 | 部分 | 是 | **不執行** 本表格並未評估每項腳本或記錄產品。可選的時間與見證檢查需具備專屬的服務與信任錨點;其中任何一項均無法確立來源真實性。 [閱讀詳細內容](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/) ## 將限制與證據一併保留 當驗證範圍保持明確時,驗證才具有實用價值。 - 秘密聊天功能不可用。 - 當程序停止時,不會記錄任何內容;恢復能力受到限制。 - 經驗證的紀錄並不證明其內容屬實。 - 持有金鑰的操作者可對任意內容進行簽署。獨立見證者與時間戳記旨在限制後續內容替換,而非防止初始擷取時的欺詐行為。 - 請使用專用帳號,而非您的主要帳號。 - Telegram 可能會因請求量過大而限制帳戶。 **不執行** 任何模式或證據等級均無法確立法律上的可採納性、Telegram 訊息的完整傳送,或現實世界中的身分。 [設定指南](https://phishdestroy.github.io/TgWitness/demo/guide.html?lang=zh-Hant)[專用帳戶](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/dedicated-account/)[EVIDENCE.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/evidence/)[INVESTIGATION.md](https://phishdestroy.github.io/TgWitness/zh-Hant/docs/reference/investigation/)