# -*- coding: utf-8 -*- r'''查 Gitee 到底为什么判违规,以及 README 里哪些词可能触发。 == 已知 == https://gitee.com/xmz7891/ykxmz/raw/main/README.md -> HTTP 451 Unavailable For Legal Reasons 451 是"应法律要求不可用"。在国内平台上,这个通常是**内容审核拦的**。 == 要分清两种情况 == A. 整个仓库被限制(那 API 读仓库信息也会失败/受限) B. 只有 README 这个文件被拦(网页能开、raw 不行) == 同时扫一下 README 里可能触发审核的词 == 国内平台的关键词审核对这几类比较敏感: * 翻墙 / 代理 / VPN / 科学上网 * 挖矿 / 矿机 / 算力 / 虚拟货币 * 破解 / 破解版 / 盗版 / 激活工具 * 外挂 / 作弊 * 监控 / 偷拍 / 窃听 / 追踪("监控"在教育场景容易误判) * 游戏相关的"封号""加速器" * 二维码 / 收款 / 打赏 这份 README 是"教室手表控电脑",正常。但要确认没混进上面这些。 ''' from __future__ import annotations import json import re import sys import urllib.error import urllib.request from pathlib import Path ROOT = Path(__file__).resolve().parent.parent GITEE = "https://gitee.com/xmz7891/ykxmz" RISKY = [ "翻墙", "代理", "VPN", "vpn", "科学上网", "梯子", "加速器", "挖矿", "矿机", "算力", "比特币", "虚拟货币", "以太坊", "破解", "盗版", "激活工具", "注册机", "keygen", "crack", "外挂", "作弊", "开挂", "监控", "偷拍", "窃听", "追踪", "定位", "打赏", "收款", "二维码收款", "荷官", "博彩", "赌博", ] def get(url: str, ua: str = "Mozilla/5.0") -> tuple: req = urllib.request.Request(url) req.add_header("User-Agent", ua) try: with urllib.request.urlopen(req, timeout=30) as r: return r.status, r.read().decode("utf-8", "replace") except urllib.error.HTTPError as exc: return exc.code, "" except Exception as exc: # noqa: BLE001 return "失败", str(exc)[:60] def main() -> int: print("=" * 62) print(" 查 Gitee 为什么 451 + 扫 README 可疑词") print("=" * 62) print() print(" ── 1. 各入口的状态码 ──") for label, url in [ ("仓库主页", GITEE), ("raw README", GITEE + "/raw/main/README.md"), ("raw LICENSE", GITEE + "/raw/main/LICENSE"), ("网页版 README", GITEE + "/blob/main/README.md"), ("发行版页", GITEE + "/releases"), ]: code, body = get(url) note = "" if isinstance(code, int): if code == 200: note = "正常" elif code == 451: note = "**被法律原因拦了**" elif code == 404: note = "不存在" print(" %-16s HTTP %-6s %s" % (label, code, note)) print() print(" ── 2. 用 Gitee API 看仓库(API 走的是另一条路)──") token_file = ROOT / "_build" / ".gitee_token" if token_file.is_file(): token = token_file.read_text(encoding="utf-8").strip() code, body = get( "https://gitee.com/api/v5/repos/xmz7891/ykxmz" "?access_token=%s" % token) print(" API 仓库信息 HTTP %s" % code) if code == 200: try: d = json.loads(body) print(" 名称:%s" % d.get("name")) print(" 是否私有:%s" % d.get("private")) print(" 最近推送:%s" % d.get("pushed_at")) except Exception: # noqa: BLE001 pass print() print(" ── 3. 扫 README 里的可疑词 ──") rm = ROOT / "README.md" text = rm.read_text(encoding="utf-8") lines = text.splitlines() hits = 0 for word in RISKY: for i, line in enumerate(lines, 1): if word in line: hits += 1 print(" %-10s 第 %d 行: %s" % (word, i, line.strip()[:60])) if not hits: print(" ✅ 没扫到这些词") print() print(" ── 4. README 里的链接(外链也可能被拦)──") urls = re.findall(r"https?://[^\s\)\]\"'<>]+", text) seen = [] for u in urls: host = re.sub(r"^https?://", "", u).split("/")[0] if host not in seen: seen.append(host) for h in seen: print(" %s" % h) print() print(" ── 5. 结论提示 ──") print(" 如果只有 raw 是 451、主页 200,那就是**单个文件被拦**,") print(" 通常改掉触发的措辞就能恢复。") print(" 如果主页也 451,那是**整个仓库被限制**,得走 Gitee 申诉。") return 0 if __name__ == "__main__": sys.exit(main())