Repository navigation
Releases: zhuyansen/backlink-guard
Release list
0.7.0: lost links, referring-site counting
lost <your-domain>: the pages of yours that backlinks point at and that answer 404 or 410, most referring
domains first, each with its links, the strongest referring domain and a suggested 301 target: the live page
in your own sitemaps (robots.txt or /sitemap.xml, indexes followed, up to 10 files and 50,000 pages) whose path
is closest, with the match from 0 to 1 and no suggestion under 0.50. One polite GET a page (redirects followed,
four at a time, at most 200 pages). Only 404 and 410 are dead, also at the end of a redirect chain; any other
HTTP error is reported as refused and no answer as unreachable, never as dead. Nothing is redirected. The
finding cites Google's page on redirects (301 or 308 for a page that has moved for good).- Referring domains beside every link count:
auditreads up to 1,000 backlinks one by one from AIsa (--rows;
about $0.06, cached 7 days and shared withlost), and its anchor table, anchor findings and the log's
repeated-anchor finding say how many referring domains (or sites) are behind each count. Without an AIsa key
the top linking pages from GoAnyAPI stand in. - Site-wide links: one referring domain linking to one page of yours from 20 or more of its pages (
--sitewide),
or from three or more with most of them in its footer, sidebar, header or navigation. Each is a note citing
Google's "widely distributed links in the footers or templates of various sites", is listed in its own table,
and counts as one link wherever a share is worked out (the anchor shares, also with--deep): "N links from
1 site, counted once". - Registrable domains:
page.registrablekeeps a subdomain of a shared host (github.io, blogspot.com,
netlify.app and the like) as its own referring domain; more two-label suffixes (org.uk, com.sg, co.za …). page.fetchkeeps the final URL of a request that ended in an HTTP error, so a redirect chain that ends in a
404 says where it ended.auditnow costs about $0.12, with--deepabout $0.16.
backlink-guard 0.6.0
中文说明在英文之后。
What to do with each site. Every row now ends in an action: skip, look first, free only, low value or submit, with its reason. It reads the verdict, the link policy and the value together, so you no longer combine four columns yourself. On 100 labelled sites no rule had been tuned on, 3 of the 40 that Ahrefs marks SPAM come out submit; all 10 bad sites around shared checkout links come out skip; the ten well-known directories and communities come out submit. Grades are the same as in 0.5.
New
- Action (
action,action_reason): skip (avoid, nobody can reach it, or findings against it and almost no visitors), look first (a check failed or was refused, it may be one of an operator's several sites, or two findings stand against it), free only (it sells followed links or wants a link or badge back: list for free, never pay or link back), low value (nothing against it, under 1,000 visits a month), submit. - Networks across checks: page templates and analytics or ads accounts are remembered on your machine for a year, so a site checked on its own is still matched against one operator's sites seen before. Block pages and platform default titles do not count as templates.
- Reports for the shared spam-link list: when a check finds one operator's sites that the list lacks, and at least half of them have something else against them, the report ends with a link to a filled-in report form (
networksin the JSON). Opening it sends nothing; the list now takes a whole network in one report. - Install: with pip or uvx straight from this repository (PyPI is on its way), or as a Claude Code plugin.
Changed
- Quotes start and end on whole words, with … where they cut the page short.
- Your log, the paid answers and the networks seen before live in
~/.backlink-guard, so an installed command keeps one log wherever it runs. - The README is shorter: a quick start, the action column and how well it works. The nine tests moved to docs/validation.md.
Upgrading from 0.5
- Run from a clone that has
./state, nothing moves. An installed command uses~/.backlink-guard;BACKLINK_GUARD_STATEputs it anywhere else. --jsonrows gainactionandaction_reason, and the result gainsnetworks.grade,risk,policyandvalueare unchanged.
Install
pip install "git+https://github.com/zhuyansen/backlink-guard"
backlink-guard vet <site> --freeIn Claude Code:
claude plugin marketplace add zhuyansen/backlink-guard
claude plugin install backlink-guard@backlink-guardPython 3.10 or newer, no dependencies.
中文
每个站该怎么做,直接告诉你。 每一行现在都会给出一个建议:跳过(skip)、先看看(look first)、只免费提交(free only)、价值低(low value)、可以提交(submit),并附上理由。它把结论、链接政策和价值放在一起判断,不用再自己去合并四列。在 100 个规则从没见过的标注站上,Ahrefs 标了 SPAM 的 40 个里只有 3 个被建议提交;和共用收款链接有关的 10 个坏站全部建议跳过;十个知名目录和社区全部建议提交。结论和 0.5 完全一样。
新增
- 建议(
action、action_reason):- 跳过:判 avoid、没人能访问,或者有问题且几乎没人访问。
- 先看看:有检查失败或被拒绝、可能是同一个人运营的多个站之一,或者有两条问题。
- 只免费提交:它卖传权重的链接,或要求回链、挂徽章;可以免费收录,但别付钱、别回链。
- 价值低:没有问题,但月访问不到 1,000。
- 可以提交:以上都不是。
- 跨批次识别站群:页面模板和统计、广告账号会在本机记一年。单独查一个站时,也会和之前查到的同一运营者的站比对。拦截页和平台默认标题不算模板。
- 向共享名单举报:检查中发现名单上没有的站群,并且其中至少一半还有别的问题时,报告最后会附上一个已经填好的举报链接(JSON 里是
networks)。打开链接不会发出任何东西;名单现在也支持一份举报提交整个站群。 - 安装方式:用 pip 或 uvx 直接从这个仓库安装(PyPI 版本稍后上线),或者作为 Claude Code 插件安装。
改动
- 引用的原文从完整的词开始、到完整的词结束,截断处加「…」。
- 提交记录、付费结果和查到过的站群都存在
~/.backlink-guard,装好的命令在哪个目录运行都用同一份记录。 - README 精简了:快速上手、建议列和效果如何。九轮测试挪到 docs/validation.zh-CN.md。
从 0.5 升级
- 在已有
./state的克隆目录里运行,什么都不用动。装好的命令用~/.backlink-guard;设置BACKLINK_GUARD_STATE可以换到别处。 --json的每一行新增action和action_reason,结果里新增networks。grade、risk、policy、value都没变。
安装
pip install "git+https://github.com/zhuyansen/backlink-guard"
backlink-guard vet <站点> --free在 Claude Code 里:
claude plugin marketplace add zhuyansen/backlink-guard
claude plugin install backlink-guard@backlink-guard需要 Python 3.10 或更新版本,没有任何依赖。
backlink-guard 0.5.0
中文说明在英文之后。
Verdicts you can act on. In 0.4.1 a single caution finding made a caution, so most sites came out caution. Now caution takes two caution findings, and the spam score counts from 50. Every row also carries a risk number (3 for each avoid finding, 1 for each caution) to order sites with the same verdict.
On 100 sites no rule had been tuned on (40 that Ahrefs marks SPAM, 60 it does not), the same saved results graded with each version's rules:
| 0.4.1 rules | 0.5.0 | |
|---|---|---|
| SPAM sites flagged | 38 of 40 | 28 of 40 |
| Normal sites flagged | 46 of 60 | 21 of 60 |
The 12 SPAM sites let through had one weak finding at most, 11 of them under 1,500 visits a month. Every normal-labelled site that 0.5.0 calls avoid, on this set and on the first 90, does not load or has no pages in Google. The risk number ranks a SPAM site above a normal one about 75% of the time.
New
- Link policy and Value beside the verdict: what a link there would mean under Google's link spam policies (one finding is enough), and what a listing can bring (the site's reach, or none when nobody can reach it).
- Checkout links shared across sites (Stripe, Gumroad, Lemon Squeezy, Polar, Creem, Dodo, Paddle): a network selling links through one checkout link (
checkout_network), or a gambling or adult product injected into hacked sites (injected_checkout). On 16 test sites, 9 of the 10 bad ones went from caution to avoid, and none of the 6 that merely cite those products got a checkout flag. - The shared spam-link list (backlink-spam-list): a listed site is avoid, with the entry's evidence. Found a network it lacks? Report it.
- One owner across sites (
same_owner): sites in one check reporting to one AdSense, Analytics, Tag Manager, Clarity or Facebook pixel account. - Age, visitors and identity: registration date, where visitors come from (AI assistants included), a lapsed domain picked up again (
reregistered), pages that invite guest posts (guest_posts, a note), the site's Google Knowledge Graph type.--deepadds Ahrefs DR, technology, ChatGPT mentions and Semrush numbers. recheck: the sites in your log checked again and compared with the last look. Monthly is enough.vet --referrals ga4.csv: what each site actually sent you, from your GA4 export, beside its verdict.scripts/regress.py: grade saved results again after a rule change, in seconds and for free.
Changed
- Free checks first: a site its own pages already put at avoid (dead, parked, a shortener, a network page, a link seller) gets no paid check.
incomplete: a site that looked ok while a key check failed is no longer reported as ok.- A fall in visits in the newest month of the data is a note (
traffic_drop) until the next month confirms it: in September 2026 one visits estimate halved for many sites whose Google traffic held. - A failed
site:lookup, or a home page that gives no answer, is asked once more before it counts. - Sites with 100,000 visits a month or more (github.com, pypi.org) are no longer read as badge networks.
Upgrading from 0.4
- A site with one caution finding now reads ok; the finding is still listed under Why.
--jsonrows gainrisk,policy,value,missingand, when paid checks were skipped,skipped.gradecan beincomplete.vetreads the shared list from GitHub once a run and keeps it a day;BACKLINK_SPAM_LIST_URLpoints it at another copy. A list that cannot be read is reported as an error of the run, never read as empty.
Install
git clone --branch v0.5.0 https://github.com/zhuyansen/backlink-guard
cd backlink-guard
python -m backlink_guard vet <site> --freePython 3.10 or newer, standard library only. Or pip install "git+https://github.com/zhuyansen/backlink-guard@v0.5.0".
中文
结论终于能直接拿来用了。 0.4.1 里一条 caution 信号就判「谨慎」,大部分站都落在这一档。现在要两条 caution 信号才判谨慎,垃圾分从 50 分起算。每行还多了一个风险分(每条 avoid 记 3 分,每条 caution 记 1 分),用来给同一档的站排先后。
在 100 个规则从没见过的站上(Ahrefs 标了 SPAM 的 40 个、没标的 60 个),把同一批结果按两个版本的规则各评一遍:
| 0.4.1 规则 | 0.5.0 | |
|---|---|---|
| 标出的 SPAM 站 | 40 个里 38 个 | 40 个里 28 个 |
| 误标的正常站 | 60 个里 46 个 | 60 个里 21 个 |
放过的 12 个 SPAM 站,每个最多只有一条弱信号,其中 11 个每月访问不到 1,500。在这批站和最初那 90 个站里,被 0.5.0 判 avoid 的「正常」站全都打不开,或在 Google 查不到页面。风险分把 SPAM 站排在正常站前面的概率约为 75%。
新增
- 「链接政策」和「价值」两栏,放在结论旁边:在这里拿链接,按 Google 的链接垃圾政策意味着什么(一条就算);以及收录能带来什么(对方的触达,没人能访问时为「无」)。
- 收款链接查站群(Stripe、Gumroad、Lemon Squeezy、Polar、Creem、Dodo、Paddle):一批站挂同一个收款链接卖外链(
checkout_network),或赌博、成人产品的收款链接被注入被黑的站(injected_checkout)。在 16 个测试站上,10 个坏站里 9 个从 caution 升到 avoid;只是引用这些产品的 6 个站,没有一个被标出收款链接问题。 - 共享的 spam 外链名单(backlink-spam-list):名单上的站直接判 avoid,并附上条目里的证据。发现名单里没有的站群,欢迎提交。
- 同一个人的站(
same_owner):同一次检查里,几个站用的是同一个 AdSense、Analytics、Tag Manager、Clarity 或 Facebook 像素账号。 - 站龄、访客和身份:注册日期、访客从哪来(包括 AI 助手)、过期后被重新注册的域名(
reregistered)、招客座稿的页面(guest_posts,提示级)、这个站在 Google 知识图谱里的类型。--deep还会加上 Ahrefs DR、技术栈、ChatGPT 提及次数和 Semrush 数据。 recheck:把记录里已经提交或上线的站再查一遍,和上次比较。每月一次就够。vet --referrals ga4.csv:读你的 GA4 导出,把每个站实际给你带来的访问放在结论旁边。scripts/regress.py:改规则之后,用存下的结果重新评级,几秒钟,不花钱。
改动
- 先做免费检查:自己的页面已经能判 avoid 的站(打不开、停放域名、短链、站群页面、卖外链),不再花钱做付费检查。
incomplete(待定):看起来没问题、但有关键检查失败的站,不再报成 ok。- 数据里最新一个月的流量下跌,先只作提示(
traffic_drop),等下个月确认:2026 年 9 月有一份访问量估算,让很多 Google 流量没变的站看上去腰斩了。 site:查询失败、首页完全没有响应的,都会再查一次才算数。- 月访问 10 万以上的站(github.com、pypi.org)不再被判成「徽章站群」。
从 0.4 升级
- 只有一条 caution 信号的站现在判 ok,这条信号仍然列在「原因」里。
--json的每一行新增risk、policy、value、missing;跳过了付费检查的还有skipped。grade可能是incomplete。vet每轮从 GitHub 读一次共享名单,缓存一天;可以用BACKLINK_SPAM_LIST_URL指向别的副本。名单读不到时,会作为本轮的错误报出来,不会当成空名单。
安装
git clone --branch v0.5.0 https://github.com/zhuyansen/backlink-guard
cd backlink-guard
python -m backlink_guard vet <site> --free需要 Python 3.10 或更新版本,只用标准库。也可以 pip install "git+https://github.com/zhuyansen/backlink-guard@v0.5.0"。