[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81976":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":9,"pushedAt":9,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":15,"starSnapshotCount":15,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},81976,"SenPaiScanner","MatinSenPai\u002FSenPaiScanner","MatinSenPai","A light-weight scanner for Cloudflare IPs, written in Golang",null,"Go",1443,80,4,35,0,19,330,1110,98,103.73,"MIT License",false,"main",true,[],"2026-06-12 04:01:36","# SenPai Scanner\n\n[![CI](https:\u002F\u002Fgithub.com\u002Fmatinsenpai\u002Fsenpaiscanner\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fmatinsenpai\u002Fsenpaiscanner\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002Fmatinsenpai\u002Fsenpaiscanner?style=flat-square)](https:\u002F\u002Fgithub.com\u002Fmatinsenpai\u002Fsenpaiscanner\u002Freleases\u002Flatest)\n[![Go Version](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fgo-mod\u002Fgo-version\u002Fmatinsenpai\u002Fsenpaiscanner?style=flat-square)](go.mod)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue?style=flat-square)](LICENSE)\n[![Platforms](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-linux%20%7C%20macOS%20%7C%20windows-informational?style=flat-square)](#installation)\n\nA Cloudflare IP finder with a terminal UI, built for networks where latency is unpredictable and connections drop without warning. Paste your VLESS or Trojan config, pick your settings, and let it find IPs that actually work through your proxy — no commands to memorize.\n\n---\n\n## How it works\n\nRun `senpaiscanner` and you land in a short menu. Navigate with arrow keys and Enter — no flags, no subcommands.\n\n```\n┌────────────────────────────────────────────────────────────┐\n│  ▶  Find Working IPs   paste a config and test CF IPs      │\n│     About                                                │\n│     Quit                                                 │\n└────────────────────────────────────────────────────────────┘\n```\n\n**Find Working IPs** runs in two phases:\n\n1. **Phase 1 — Connectivity scan** probes candidate Cloudflare IPs using settings derived from your config URL (SNI, host, WebSocket path, port). It checks trace reachability and, for WebSocket configs, whether a WS-style TLS connection survives DPI.\n2. **Phase 2 — xray validation** launches an embedded xray instance and tests the best Phase 1 hits end-to-end through your actual VLESS\u002FTrojan config. Results show endpoint, transport type, download speed, latency (TTFB), and pass\u002Ffail status.\n\nWhen Phase 2 finishes, press **`c`** to copy working `IP:port` endpoints to the clipboard and save them to `ips.txt` next to the binary (or current working directory).\n\n---\n\n## Installation\n\n### Pre-built binary\n\nDownload from the [releases page](https:\u002F\u002Fgithub.com\u002Fmatinsenpai\u002Fsenpaiscanner\u002Freleases\u002Flatest).\n\n| Platform | Architecture | File |\n|---|---|---|\n| Linux | x86_64 | `senpaiscanner_linux_x86_64.tar.gz` |\n| Linux | ARM64 | `senpaiscanner_linux_arm64.tar.gz` |\n| macOS | Intel | `senpaiscanner_darwin_x86_64.tar.gz` |\n| macOS | Apple Silicon | `senpaiscanner_darwin_arm64.tar.gz` |\n| Windows | x86_64 | `senpaiscanner_windows_x86_64.zip` |\n\n**Linux \u002F macOS:**\n\nstable release:\n```bash\ncurl -fsSL https:\u002F\u002Fgithub.com\u002FMatinSenPai\u002FSenPaiScanner\u002Fraw\u002Frefs\u002Fheads\u002Fmain\u002Finstall.sh | bash\n```\n\npre-release:\n```bash\ncurl -fsSL https:\u002F\u002Fgithub.com\u002FMatinSenPai\u002FSenPaiScanner\u002Fraw\u002Frefs\u002Fheads\u002Fmain\u002Finstall.sh | bash -s -- --prerelease\n```\n\n**Windows (PowerShell):**\n```powershell\n$r = Invoke-RestMethod https:\u002F\u002Fapi.github.com\u002Frepos\u002Fmatinsenpai\u002Fsenpaiscanner\u002Freleases\u002Flatest\n$url = ($r.assets | Where-Object name -like \"*windows*x86_64*\").browser_download_url\nInvoke-WebRequest $url -OutFile senpaiscanner.zip\nExpand-Archive senpaiscanner.zip .\n```\n\n### From source\n\n```bash\ngo install github.com\u002Fmatinsenpai\u002Fsenpaiscanner\u002Fcmd\u002Fsenpaiscanner@latest\n```\n\n---\n\n## Usage\n\n```bash\nsenpaiscanner              # open the TUI\nsenpaiscanner --version    # print version and exit\nsenpaiscanner -v           # same\nsenpaiscanner version      # same\n```\n\nEverything else is inside the TUI — there are no scan-related CLI flags.\n\n### Navigation\n\n| Key | Action |\n|-----|--------|\n| `↑` \u002F `↓` or `k` \u002F `j` | move between rows |\n| `←` \u002F `→` or `h` \u002F `l` | move between options within a row |\n| `Enter` | select \u002F confirm \u002F start |\n| `Esc` | go back |\n| `q` | quit from menu; during a scan, cancel or return to menu when finished |\n\nOn the **Config URL** row, `←` \u002F `→` move the text cursor; `Ctrl+A` \u002F `Ctrl+E` jump to start \u002F end. Vim keys `h` \u002F `j` \u002F `k` \u002F `l` type normally into the URL field on that row.\n\n---\n\n## Find Working IPs\n\nPaste a **`vless:\u002F\u002F`** or **`trojan:\u002F\u002F`** share URL, adjust the setup rows, then start the scan.\n\n### Setup rows (Phase 1)\n\n| Row | Options | Notes |\n|---|---|---|\n| **Source** | Random \u002F From File | random Cloudflare IPv4 ranges, or read candidates from `ips.txt` |\n| **Count** | 1,000 \u002F 5,000 \u002F 20,000 \u002F Custom | IPs to probe in Phase 1; **ignored when Source is From File** |\n| **Workers** | 50 \u002F 100 \u002F 200 \u002F Custom | parallel probers (default 50 — safe on restricted networks) |\n| **Timeout** | 2s \u002F 3s \u002F 5s \u002F Custom | per-probe deadline (default 5s) |\n| **Ports** | Config, 443, 8443, 2053, 2083, 2087, 2096 | multi-select; each IP is tested on every selected port |\n\nPress **Enter** on the last row to continue to the optional config step.\n\n### Optional config (before scan starts)\n\n| Row | Options | Notes |\n|---|---|---|\n| **Config** | paste URL or leave empty | empty → **Phase 1 only** (standard HTTP probe); with URL → Phase 1 + Phase 2 |\n| **Top N** | 10 \u002F 25 \u002F 50 \u002F 100 \u002F All \u002F Custom | how many Phase 1 hits to validate in Phase 2 (only when a config URL is set) |\n\n**Enter** with an empty config field starts a connectivity-only scan. Paste a URL, set **Top N**, then **Enter** again to run full validation.\n\n**Live results file:** every scan writes (and keeps updating) `SenPaiScannerResult-YYYYMMDD-HHMMSS.txt` next to the binary or in the working directory. Open it in any editor while the scan runs to watch results arrive.\n\n### Setup details\n\n**Source → From File:** place `ips.txt` (one IP per line) next to the binary or in the directory you run from. All listed IPs are probed on the selected ports; the Count row is ignored.\n\n**Ports row:** use `←` \u002F `→` to focus a port pill, then **`Space`** or **`Enter`** to toggle it. Select **Config** alone to use the port from your URL. Selecting multiple ports multiplies Phase 1 work (IPs × ports).\n\n**Starting the scan:** `Enter` on **Ports** opens the optional config screen. From there, `Enter` starts the scan (empty config = Phase 1 only).\n\n### Phase 1 — Finding reachable IPs\n\nWithout a config URL, Phase 1 uses a standard Cloudflare HTTP probe (`speed.cloudflare.com`, 64 KiB sample). With a config URL, probes use SNI\u002Fhost\u002Fpath from your link and require WebSocket success when `type=ws`.\n\nPress `q` \u002F `Esc` to cancel and return to the menu.\n\n### Phase 2 — xray validation\n\nThe top Phase 1 candidates are tested through an embedded xray instance with your config. The live table shows:\n\n| Column | Meaning |\n|---|---|\n| **ENDPOINT** | `IP:port` that was validated |\n| **TYPE** | transport (`ws`, `grpc`, `xhttp`, …) |\n| **SPEED** | measured download throughput in Mbps, or `n\u002Fa` if speed could not be measured |\n| **LATENCY** | time to first byte through the proxy (TTFB) |\n| **STATUS** | ✓ working \u002F ✗ failed |\n\n| Key | Action |\n|-----|--------|\n| `c` | copy working endpoints to clipboard **and** save to `ips.txt` |\n| `q` \u002F `Esc` | return to the main menu |\n\nExported lines look like `104.16.72.162:443` — ready to paste into client configs or DNS\u002FIP lists.\n\n### About\n\nVersion string and short project blurb; `Enter` \u002F `q` \u002F `Esc` back to the menu.\n\n---\n\n## Tips for restricted networks\n\n**Start with defaults.** 5,000 random IPs, 50 workers, 5s timeout, and the config port are a good baseline on lossy or filtered lines.\n\n**Use From File after a partial run.** Copy working endpoints with `c`, edit `ips.txt`, then re-run with **Source → From File** to validate only your shortlist on more ports.\n\n**Try multiple ports.** Cloudflare CDN ports (443, 8443, 2053, …) behave differently under DPI. Multi-port selection lets Phase 1 find the best `IP:port` pair before xray validation.\n\n**WebSocket configs need WS-friendly IPs.** Phase 1 runs an idle TLS hold plus a WebSocket upgrade check when your URL uses `type=ws`. An IP that passes trace but fails WS will not become a Phase 2 candidate.\n\n**0% loss alone is not enough.** For HTTP-style probing, non-zero download throughput or a successful WS check is required for an IP to count as healthy.\n\n**Speed in Phase 2 is best-effort.** Connectivity is confirmed via `cp.cloudflare.com\u002Fcdn-cgi\u002Ftrace`. Download speed is measured when possible (Cloudflare speed endpoint, config host, or parallel trace sampling). If speed cannot be measured reliably, the endpoint can still show ✓ with SPEED `n\u002Fa`.\n\n---\n\n## FAQ\n\n**Why doesn't it just run a ping?**\nCloudflare drops ICMP on their edge IPs. SenPai Scanner validates HTTP\u002FTLS behaviour and, for proxy configs, runs traffic through xray — closer to real VLESS\u002FTrojan usage than ping or bare TCP.\n\n**How is this different from warp-plus?**\nSenPai Scanner does not run a permanent proxy. It finds and validates Cloudflare IPs for **your** xray config and exports `IP:port` lists you can plug into Sing-Box, v2rayN, etc.\n\n**Where do the IP ranges come from?**\nEmbedded from Cloudflare's official published lists (`cloudflare.com\u002Fips-v4`, `cloudflare.com\u002Fips-v6`). The binary ships with a snapshot; ranges rarely change.\n\n**\"ips.txt not found\" when using From File**\nPlace `ips.txt` next to the executable or in your current working directory before starting. One IP per line; `#` comments and CSV lines (IP in the first column) are supported.\n\n**The scan feels slow with many ports selected**\nEach selected port is probed for every IP. Testing 5 ports on 5,000 IPs means 25,000 probes in Phase 1 — lower Count or narrow the port list if needed.\n\n**What happened to Quick Scan, Custom Scan, Test IPs, and Discover Colos?**\nThose separate menu flows were removed to focus on one workflow: paste your config, find working endpoints, export results. The core probe engine is still used internally by **Find Working IPs**.\n\n---\n\n## Building from source\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fmatinsenpai\u002Fsenpaiscanner.git\ncd senpaiscanner\nmake build          # current platform\nmake build-all      # all platforms → dist\u002F\nmake test\nmake install        # to $GOPATH\u002Fbin\n```\n\n**Windows (cross-compile all platforms):**\n```powershell\npowershell -ExecutionPolicy Bypass -File build.ps1\n# optional: -Version \"0.4.0\"\n```\nBinaries land in `dist\u002F`.\n\n---\n\n## Contributing\n\nSee **[CONTRIBUTING.md](CONTRIBUTING.md)** for project principles, development setup, and pull request guidelines.\n\nIssues and PRs are welcome. For larger changes, open an issue first to discuss scope.\n\nFor bugs, include your OS\u002Farch, version (`senpaiscanner --version`), the screen you were on, and what you expected vs what happened.\n\n---\n\n## Roadmap\n\n- Configurable download\u002Fupload thresholds for final filtering\n- Persistent settings saved between sessions\n- `Watch` mode for continuous monitoring\n- Export directly to xray\u002FSing-Box JSON from the results screen\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","SenPaiScanner 是一个轻量级的 Cloudflare IP 扫描工具，使用 Go 语言编写。其核心功能包括通过终端用户界面进行操作，支持 VLESS 和 Trojan 配置文件解析，并分两阶段测试 IP 连接性与有效性：第一阶段为连通性扫描，第二阶段则通过嵌入式 xray 实例对最优选 IP 进行端到端验证。该工具特别适用于网络环境不稳定、延迟不可预测或连接容易中断的情况下寻找可用的代理服务器 IP 地址。安装简便，提供跨平台预编译二进制文件，适配 Linux、macOS 及 Windows 系统。",2,"2026-06-11 04:07:21","CREATED_QUERY"]