Open-source project
ermaozi/get_subscribe avatar
ermaozi/get_subscribe

ermaozi/get_subscribe: auto-collected free Clash and V2Ray subscription links, and what the TCP reachability split actually means

✈️ 白嫖免费机场 / 免费VPN -> 自动获取免 clash/v2ray/trojan/sr/ssr 订阅链接,持续更新 | 科学上网 | 翻墙

9,326 stars672 forksPythonGPL-3.0

At a glance

What is it?
A GPL-3.0 Python scraper that republishes free airport subscription links for Clash and V2Ray every 12 hours, then sorts the nodes into reachable, unreachable and untested buckets. The README's own warning says not to use it as a production network.
Who is it for?
Use it if you want a short-lived test endpoint or you are studying how subscription aggregation and TCP probing are wired together in Python; the repository layout, requirements.txt and check_nodes.py are readable enough for that. Do not use it as the network for a business, a content channel or anything tied to an account you care about, because the README says shared exit IPs carry abuse history and raise the odds of rate limiting and login challenges.
Can I use it commercially?
Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem is not finding nodes, it is finding out which ones answer at all

Free subscription lists circulate as plain text dumps. A Clash config with two hundred proxies is useless if half the entries point at hosts that no longer resolve, and there is no signal in the file itself about which half. The README states the project's answer: after each automated collection it keeps the full subscription under subscribe/ and also writes three directories, subscribe/reachable/, subscribe/unreachable/ and subscribe/untested/, each containing clash.yml and v2ray.txt. That is the actual product. The link list is the raw material; the split is the part that saves time.

The audience is narrow. Someone who needs a test endpoint for a few hours, or someone reading the Python to see how a collector and a prober fit together. The README is explicit that it is not for content creators, live streamers, self-media operators or e-commerce staff, and gives the reason: an exit IP with a messy history is more likely to hit platform risk controls, which shows up as throttled reach, account anomalies or an escalated login verification step. That warning sits at the top of the page, above the links, which is the right place for it.

How the collector and the reachability splitter work

The repository root shows the shape of the pipeline: main.py, check_nodes.py, get_projaec_info.py (the misspelling is in the file name), requirements.txt, and the directories subscribe/, worker/, log/, mail/ and tests/. The README says collection runs on a 12-hour cycle and that each run keeps the complete subscription before generating the three classified directories.

The classification rule is stated plainly and is worth reading twice. subscribe/reachable/ holds nodes where a TCP connection could be established from the machine that ran the job. subscribe/unreachable/ holds nodes where the TCP connection or the DNS resolution failed. subscribe/untested/ holds UDP and QUIC protocols, addresses that could not be resolved, and non-public addresses, and the README says these are not judged unavailable. The project also publishes a health report at https://www.ermao.net/sub/health.json that records the detection time and the count in each category.

The README then draws the boundary itself: this is not proxy authentication, not an egress access test and not a speed test. A node that accepts a TCP connection is not a node that proxies traffic, and a failure may be a limitation of the probing machine's own network rather than a dead node. Read the three directories as a first filter, not a verdict. The client tutorials linked from the README cover Android, Windows and iOS, and the README notes that video works in off-peak hours while peak hours can stutter.

Installing the collector and reading the classified output

The README does not give install steps for running the collector yourself; it points readers at the hosted subscription URLs and at client setup guides for Android, Windows and iOS. What the repository does provide is requirements.txt, which pins requests==2.34.2, matplotlib==3.10.9, pandas==2.3.3 and PyYAML==6.0.3. That is enough to stand the project up locally if you want to run the collection yourself rather than consume the hosted links.

Create a virtual environment and install the pinned set:

bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

With the dependencies in place, main.py is the entry point for a collection run:

bash
python main.py

After a run, the repository layout implies the classified output lands under subscribe/, alongside the full subscription. To consume the hosted versions instead, the README gives these two base URLs:

bash
https://www.ermao.net/sub/clash/ermao.net
https://www.ermao.net/sub/v2ray/ermao.net

The README states that swapping clash for v2ray in a link returns the other format, so the classification links follow the same pattern: https://www.ermao.net/sub/reachable/clash/ermao.net, https://www.ermao.net/sub/unreachable/clash/ermao.net and https://www.ermao.net/sub/untested/clash/ermao.net. Paste one into a Clash-compatible client and you should see the proxy list populate. Then open https://www.ermao.net/sub/health.json and check the detection time against the counts; if the timestamp is not recent, the 12-hour cycle has not completed and the categories describe an older run.

What the TCP probe cannot tell you, and where the project is the wrong tool

The probe is a reachability check, and the README says so in a sentence that undercuts most of the enthusiasm a link list can generate: connectable does not equal usable, and a failure may be the probing machine's network restriction. A node can accept a TCP handshake and still refuse to carry traffic, fail authentication, or be saturated. Nothing in the published classification measures throughput, latency or whether the exit IP is blocked by a given service.

The second limitation is structural. The README's own warning states that these free subscription links are typically used by many people at the same time and do not meet stability or security conditions, and it lists the symptoms: IP contamination, egress blocked by risk controls, fluctuating speed, and privacy that the user does not control. Those are not bugs to be fixed in check_nodes.py. They follow from shared endpoints.

The third is the production case. The README tells content creators, live streamers, self-media operators and e-commerce staff not to use this class of free subscription as a production network, because an IP with an abuse history raises the chance of platform throttling, account anomalies or an upgraded login verification. If your income depends on the account behind the connection, this project is the wrong tool, and the README says it before you download anything. The same warning notes the links come from the network and are for study and testing only, and that users must follow local laws and regulations.

Compared with commercial airport subscriptions and self-hosted proxies

The README itself points readers toward paid airport subscriptions at https://www.ermao.net/posts/vpn for people who find the free links unusable, and the FAQ answer is blunt: free subscriptions suit temporary testing or short emergencies, and long-term use should go to a service with a stable reputation. The difference is not the protocol. It is who else is on the exit IP and whether anyone is accountable when it stops working. A paid airport typically assigns you to a smaller pool and has a support channel; this project aggregates whatever it collected and republishes it, with no operator behind any individual node.

The other alternative is running your own proxy on a VPS. That inverts the model completely: you control the exit IP, so its history is yours and the risk-control problem in the README largely goes away, at the cost of paying for the host, configuring the server, and maintaining it. This project optimizes for zero setup and zero cost, and the README's warning is the price of that trade. If your requirement is a stable egress with a clean history, a self-hosted proxy is the honest comparison, and get_subscribe does not try to compete with it.

Maintenance, licence and the cost of keeping the collector running

The repository is not archived and the last push was on 2026-09-21. The README describes a 12-hour collection cycle, so the hosted links and the three classified directories are refreshed on that schedule rather than on demand, and the health report timestamp is the way to confirm a cycle completed. If you run the collector yourself, the recurring cost is the host and the network egress for the probing pass, plus the Python dependency set pinned in requirements.txt. Nothing in the README commits to a support channel; the only contact point it lists is a Telegram group, @fanqiangjiaoliu.

The licence is GPL-3.0. For a tool like this the practical consequence is that if you redistribute a modified version, the source has to travel with it under the same terms. It says nothing about the nodes themselves, which are third-party endpoints the project merely collects, and the README does not make any claim about their terms of service. That is a question for whoever operates them, not for the licence file.

Editorial conclusion

Use it if you want a short-lived test endpoint or you are studying how subscription aggregation and TCP probing are wired together in Python; the repository layout, requirements.txt and check_nodes.py are readable enough for that. Do not use it as the network for a business, a content channel or anything tied to an account you care about, because the README says shared exit IPs carry abuse history and raise the odds of rate limiting and login challenges. Before adopting anything here, open subscribe/health.json and confirm the detection timestamp and the three category counts are recent, then read the README warning in full rather than the link list.

Frequently asked questions

What is ermaozi/get_subscribe?

It is a Python project that automatically collects free airport subscription links and republishes them in Clash and V2Ray formats, refreshing on a 12-hour cycle. Beyond the raw links it splits the collected nodes into subscribe/reachable/, subscribe/unreachable/ and subscribe/untested/ based on a TCP connection test from the machine that ran the job.

How do I install and run ermaozi/get_subscribe myself?

The README does not document a self-hosted install; it points at hosted subscription links and client guides for Android, Windows and iOS. The repository does ship requirements.txt pinning requests==2.34.2, matplotlib==3.10.9, pandas==2.3.3 and PyYAML==6.0.3, and main.py is the entry point for a collection run.

What is the difference between the reachable, unreachable and untested directories?

The README states that subscribe/reachable/ holds nodes where a TCP connection could be established from the running machine, subscribe/unreachable/ holds nodes where TCP or DNS resolution failed, and subscribe/untested/ holds UDP/QUIC protocols, addresses that could not be resolved, and non-public addresses, which are not judged unavailable. Each directory contains clash.yml and v2ray.txt.

Is a node in the reachable list actually usable as a proxy?

No. The README says the classification is not a proxy authentication test, not an egress access test and not a speed test, and that being connectable does not mean the proxy works. A failure can also come from the probing machine's own network restrictions rather than the node.

Can ermaozi/get_subscribe be used as a production network for content creation or e-commerce?

The README advises against it. It says content creators, live streamers, self-media operators and e-commerce staff should not use this class of free subscription as a production network, because a shared exit IP with an abuse history is more likely to trigger platform throttling, account anomalies or an escalated login verification.

Official sources

  1. ermaozi/get_subscribe on GitHub
  2. Issues
  3. License: GPL-3.0
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ermaozi-get-subscribe.svg)](https://hysenlabs.com/projects/ermaozi-get-subscribe)