Compare commits

..

3 Commits

78 changed files with 4837 additions and 12467 deletions

View File

@@ -1,52 +0,0 @@
name: Daily Data Factory
on:
schedule:
# 每天 UTC 03:00 执行,为各节点全天随机拉取准备好弹药
- cron: '0 3 * * *'
workflow_dispatch:
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
permissions:
contents: write
jobs:
update-data:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Execute Trends Engine (搜索词库)
run: python scripts/fetch_trends.py
- name: Execute Trust URL Engine (活体新闻流融合)
run: python scripts/fetch_trust_urls.py
- name: Commit and Push All Data
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
# 一揽子添加搜索词库和地区白名单的变化
git add data/keywords/
git add data/regions/
# 防御机制:如果没有新数据,就静默退出,不产生空提交
if git diff --staged --quiet; then
echo "No changes, skipping."
exit 0
fi
# 策略:将两路数据的更新合并为一个原子提交
git commit -m "chore(data): 🤖 自动机兵:同步全战区热点词库与活体新闻流 [$(date +'%Y-%m-%d')]"
git push origin main

View File

@@ -2,8 +2,8 @@ name: Automated Massive UA Factory
on:
schedule:
# 每个月 1 号凌晨 04:00 执行
- cron: '0 4 1 * *'
# 每个月 1 号凌晨 00:00 执行
- cron: '0 0 1 * *'
workflow_dispatch: # 允许手动点击运行
jobs:

137
README.md
View File

@@ -5,29 +5,38 @@
![License](https://img.shields.io/github/license/hotyue/IP-Sentinel)
> **一个极度轻量、零感知、支持中枢遥控的 VPS IP 自动化养护与区域纠偏引擎。**
> **💡 提示:如果本项目提升了您的节点稳定性,请点击右上角点亮 🌟 Star您的支持是我们持续研发和维护指纹库的核心动力。**
📢 官方战术交流频道: 🛰️ [IP-Sentinel Matrix](https://t.me/IP_Sentinel_Matrix)
专为解决 VPS IP 被 Google 等数据库错误定位到中国大陆/香港俗称“送中”等问题而生。IP-Sentinel 已从单机脚本全面跃升为 **Master-Agent 分布式架构**。它像影子一样潜伏在全球各地的服务器后台,通过高度拟真的真实用户行为为你默默积累 IP 权重,并允许你通过 Telegram 随时随地对整个舰队进行毫秒级“点名”与“遥控”。
## ✨ 核心极客特性 (Core Architecture)
## ✨ 核心极客特性
- 📊 **深海声呐全维探针 (Deep Sea Sonar v4.0.4)**:内嵌强效正则去污的 JSON 提取引擎,无损展现免掩码的真实 IP 情报。聚合 Scamalytics、AbuseIPDB 等五大权威防欺诈库,精准嗅探代理/VPN特征、25端口及流媒体原生解锁状态并自带 Google “送中”高危预警与污染趋势图谱
-**无损高并发引擎 (WAL Concurrency)**:司令部 SQLite 数据库全面激活 `WAL` (Write-Ahead Logging) 模式与毫秒级排队算法。即使对 500 台边缘节点发起全军总攻,也能完美规避 `database is locked` 与 Telegram `429` 拦截。
- 🪶 **抽脂级极简部署 (Zero-Bloat Native)**:全栈剔除第三方依赖,基于 Python3 原生标准库运行。安装强制注入 `--no-install-recommends` 防捆绑参数。无论是 128MB 内存的极简 NAT还是 Alpine 游击队容器,均可如丝般顺滑运行。
- 🎛️ **扁平化指挥矩阵 (Flat Command Matrix)**:引入扁平化四级战区降维视图与双轨身份制。深度定制 Inline Keyboard 逃生舱交互,支持原位丝滑重绘 (In-place UI Edit),实现毫秒级模块热启停与跨地域深海声呐投放。
- 🔄 **全栈零信任 OTA 引擎 (Zero-Trust OTA Upgrade)**:首创双端物理熔断机制。长官可通过私有中枢,一键向全舰队下发静默热重载指令;更支持**「司令部金蝉脱壳」**,实现真正的全栈去 SSH 化运维。
- 🛡️ **SSOT 溯源与热更新装甲 (Smooth Upgrade Engine)**:全系脚本彻底消灭硬编码,动态抓取云端版本信标。自带状态机嗅探逻辑,即便是手动在老节点执行安装,也仅需回车瞬间完成配置继承与无损换代。
- 🗺️ **全球拓扑矩阵与活体词库 (Global Nexus)**:接入 GitHub Actions 云端兵工厂,每日静默同步全球各大区真实热搜榜单与高权重本土站点,让伪装行为永远贴合当地网络脉搏。
- 👻 **绝对时空对齐与高频错峰 (UTC-Seeded Scheduling)**:摒弃传统随机轮询,全栈强制接管底层时钟为**绝对 UTC 时间**。全舰队以 **20 分钟 (每日 72 次)** 的极高密度进行养护巡逻,叠加基于部署锚点的天然削峰与随机防并发休眠,完美化解十万级集群的“惊群效应”与 API 熔断。
- 🖧 **极速预检与三级容灾架构 (Fail-Fast & Fallback)**:底层引擎强力接管发包参数 (`--interface`) 的同时,创新引入 **4 秒极速预检 (Fail-Fast)** 雷达与**三级阶梯脱壳**机制。无论是纯 IPv6 孤岛、WARP 劫持死锁还是复杂 NAT 嵌套,系统均能瞬间避开网络黑洞,彻底杜绝探针假死与流量溢出。
- 🗺️ **全球拓扑矩阵 (Global Nexus)**v3.1 跨洲际跃升。守护版图现已横跨亚、欧、美三大洲(美、日、英、德、法、新、港)。为每个国家注入极其硬核的“原生本地化”搜索词库与本土高权重站点(如政府、权威媒体、高铁网),真正实现“拟真融入”
**—— 💎 骨干基建特征 ——**
- 🏭 **全自动云端军工厂 (CI/CD Data Factory)**:依托 GitHub Actions 构建双轨无人值守流水线。**每月 1 日**批量锻造 4000+ 带有绝对物理分区的原生终端指纹库;**每日凌晨 (UTC)** 实时抓取全球各战区 Google 真实热搜榜单与本土骨干新闻 RSS。为前线舰队源源不断地输送最鲜活的伪装弹药。
- 🔒 **叹息之墙 (Zero-Trust HMAC)**:底层通讯引入 时间戳 + HMAC-SHA256 军用级动态签名。指令有效期仅 60 秒(阅后即焚),未授权请求直接触发系统级 403 物理熔断,彻底免疫中间人抓包与重放攻击
- ☁️ **云端中枢 (Public Master)**:官方公共机器人 [@OmniBeacon_bot](https://t.me/OmniBeacon_bot) ,新手免自建,一键接入极速入伍!同时支持硬核极客私有化 SQLite 分布式部署。
- 👁️‍🗨️ **玻璃房透明遥测 (Glasshouse)**:基于 Cloudflare Workers 的全透明计数中枢,绝对零隐私收集,仅作原子累加,底层网关源码全开源
- 👻 **设备资产持久化 (Hash-Seeded Persona)**v3.2 核心换代。彻底摒弃传统的“随机抽取指纹”,引入基于节点物理 IP 的哈希锚定引擎。利用不可变哈希种子,为您的每台 VPS 在千万级指纹库中永久锁定 3 个绝对专属设备(如固定表现为 1台 Mac、1台 iPhone、1台 PC 交替上网)。完美构建高权重真实家庭内网画像,根除“僵尸网络”同质化特征!
- 🏭 **自动化指纹兵工厂 (Automated UA Factory)**:依托 GitHub Actions CI/CD 流水线,每月 1 日无人值守全自动生成 4000+ 带绝对物理分区的真实终端设备数据。配合边缘节点的守护进程静默拉取,实现千万级指纹资产的“自动驾驶”级演进
- 🖧 **底层路由死锁 (Hard-Bind Routing)**v3.2.1 热修复升级。底层探测引擎强力接管 curl 核心参数 (--interface),强制将发出的每一滴伪装流量死死绑定在您设定的物理网卡或隧道 IP 上,彻底杜绝双栈或多网卡环境下的流量溢出漏洞
- 🎯 **多级容灾与高精度探针 (High-Precision Probe)**v3.2.2 底层重构。重写战报模块与底层协议自适应逻辑,植入多级 ISP 容灾探针链路,并按“底层数据共识原则”智能清洗冗余 AS 号。确保在纯 V6、隧道或弱网环境下数据获取依然 100% 精准畅通。
- 🔄 **平滑热更新装甲 (Smooth Upgrade Engine)**v3.2.2 体验进化。全系植入状态机嗅探逻辑。无论是 Master 司令部还是 Agent 边缘节点再次执行部署脚本时将自动识别并继承历史配置、SQLite 数据库与锚定 IP一键回车即可瞬间完成无损换代告别繁琐的重复配置。
- ☁️ **云端中枢 (Public Master)**:引入官方公共机器人 @OmniBeacon_bot,新手无需部署 Master 司令部,部署 Agent 时一键回车即可调用官方加密网关30 秒极速入伍!
- 🧠 **分布式中枢 (Master-Agent)**:对于硬核极客,支持私有化部署。一台 Master 主控集成 SQLite 数据库,统管无数台 Agent 边缘节点,确保数据绝对私有。
- 🔒 **叹息之墙 (Zero-Trust HMAC)**:全面废弃明文 Token底层通讯引入 时间戳 + HMAC-SHA256 军用级动态签名。指令有效期仅 60 秒(阅后即焚),彻底免疫中间人抓包、重放攻击与端口爆破。
- 🛡️ **工业级并发与自净引擎**:底层 Webhook 采用多线程模型彻底免疫慢速耗尽攻击;独创“智能清道夫”逻辑,覆盖安装/升级时自动绞杀僵尸进程与冗余定时任务,绝对纯净,告别玄学冲突。
- 🎮 **TG 战术面板 (Command Center)**:无需记忆繁琐命令,全 Inline Keyboard 交互。支持一键下发伪装指令、一键索要精准战报、毫秒级抓取边缘节点实时运行日志。
- 👁️‍🗨️ **玻璃房透明遥测 (Glasshouse Telemetry)**:引入基于 Cloudflare Workers 的全透明计数中枢,首页动态徽章实时展示全球真实装机与调用量。绝对零隐私收集,仅作原子累加,底层网关源码全开源,接受全网极客审计。
-**丝滑战术交互 (Seamless UI)**:司令部交互面板像素级打磨。新节点发送暗号入伍成功后,司令部将无缝零延迟自动呼出最新的活跃节点阵列面板,彻底免除重复输入命令的繁琐,掌控感拉满。
## 📂 项目架构 (Monorepo)
@@ -36,69 +45,56 @@
```text
📦 IP-Sentinel
┣ 📂 .github/workflows/ # 🏭 自动化兵工厂:每月定时触发指纹生成的 CI/CD 流水线
┣ 📂 master/ # 🧠 司令部SQLite 存储 (含 ip_trend_log 趋势跟踪表)、TG 监听与 Webhook 调度
┣ 📂 core/ # 🛡️ 边缘哨兵Webhook 被动监听、哈希锚定执行引擎 (集成深海声呐探测模块)
┣ 📂 master/ # 🧠 司令部SQLite 存储、TG 监听与 Webhook 调度中心
┣ 📂 core/ # 🛡️ 边缘哨兵Webhook 被动监听、哈希锚定执行引擎
┣ 📂 scripts/ # 🐍 兵工厂引擎:基于 Python 的多物理分区 UA 生成器
┣ 📂 data/ # 🗂️ 全球数据规则库 (动态拓扑)
┃ ┣ 📜 map.json # 🌍 全球区域大脑 (v3.5.0 大洲战区拓扑)
┃ ┣ 📜 map.json # 🌐 全球区域索引大脑 (Master Index)
┃ ┣ 📂 regions/ # 🧊 冷数据:按 [国家/省州/城市] 深度细分的 LBS 锚点
┃ ┣ 📂 keywords/ # 🔥 热数据:按国家归类的动态搜索词库 (OTA 自动更新)
┃ ┗ 📜 user_agents.txt # 🔥 热数据:由兵工厂每月锻造的绝对坐标专属设备库
┣ 📜 version.txt # 🚩 双端版本信标Agent/Master 独立解耦的 KV 环境配置
┗ 📂 telemetry/ # 👁️‍🗨️ 玻璃房计划Cloudflare Workers 透明计数器网关源码
```
## 🚀 极速部署 (Quick Start)
> 🛡️ **跨平台装甲支持**Debian / Ubuntu / CentOS / RHEL / Alpine Linux / Arch Linux
系统现提供两种接入模式,请根据您的战术需求选择:
### 🔹 模式 A私有独立模式 (全自主、强烈推荐)
适合追求绝对数据隐私与舰队最高控制权的领主。
v3.2.x 提供了两种接入模式,请根据您的战术需求选择:
> ☢️ **核按钮系统已就绪**:采用私有部署,您将解锁 **OTA 远程静默升级** 权限!所有私有前线节点均可通过您的 TG 面板实现一键全网代码热重载换代!
### 🔹 模式 A官方公共模式 (最简、推荐)
**适合不想折腾、只想快速养护 IP 的新兵。**
- **部署 Master (中枢大脑)**:找一台 VPS 作为司令部(仅需部署一台),执行:
- [官方部署教程](https://blog.iot-architect.com/engineering-practice/ip-sentinel-master-deployment-guide/)
```bash
curl -fsSL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/master/install_master.sh -o /tmp/ins_master.sh && sudo bash /tmp/ins_master.sh
```
- 部署 Agent (边缘哨兵):在需要养护的机器上执行 Agent 脚本,安装时选择私有独立中枢,并分别输入您自建机器人的 [Token](https://blog.iot-architect.com/engineering-practice/create-private-telegram-bot-via-botfather) 以及您的个人 [Chat ID](https://blog.iot-architect.com/engineering-practice/get-telegram-personal-id-via-userinfobot)
- [官方部署教程](https://blog.iot-architect.com/engineering-practice/ip-sentinel-installation-and-upgrade-guide/)
1. **关注机器人**:在 TG 中关注 [@OmniBeacon_bot](https://t.me/OmniBeacon_bot) 并发送 `/start`
2. **部署 Agent**:在目标 VPS 上执行以下指令,安装过程中**直接回车**使用官方机器人,并输入您的 Chat ID
```Bash
curl -fsSL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh -o /tmp/ins_agent.sh && sudo bash /tmp/ins_agent.sh
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh)
```
- 激活节点:安装完成后,您的手机会收到一条 #REGISTER# 注册暗号,将其转发给您自己的机器人即可完成编队入库。
3. **激活节点**:安装完成后,您的手机会收到一条 #REGISTER# 暗号,将其转发给机器人即可完成入库。
### 🔸 模式 B官方公共模式 (最简体验)
适合不想折腾、只想快速体验养护效果的新兵。
### 🔸 模式 B私有独立模式 (全自主、硬核)
**适合追求绝对数据隐私、需自建机器人的领主。**
- 关注机器人:在 TG 中关注官方安全网关 [@OmniBeacon_bot](https://t.me/OmniBeacon_bot) 并发送 /start。
- 部署 Agent在目标 VPS 上执行以下指令,安装过程中选择官方公共网关,并输入您的 Chat ID
- [官方部署教程](https://blog.iot-architect.com/engineering-practice/ip-sentinel-installation-and-upgrade-guide/)
1. **部署 Master**:找一台 VPS 作为大脑(仅需部署一台),执行:
```Bash
curl -fsSL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh -o /tmp/ins_agent.sh && sudo bash /tmp/ins_agent.sh
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/master/install_master.sh)
```
- 激活节点:同上,将收到的暗号转发给官方机器人即可
2. **部署 Agent**:在需要养护的机器上执行 Agent 脚本,输入您自建机器人的 Token 以及与 Master 一致的配置
```Bash
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh)
## 🆙 架构级无损热升级指引 (Upgrade Guide)
```
3. **激活节点**:同上,将暗号转发给您自己的机器人即可。
### 📡 方式一OTA 远程静默升级 (私有中枢专属)
如果您是私有中枢领主,当司令部首页 (`/start`) 或每日战报提示发现新版本时:
### ⚠️ 平滑升级指引 (Upgrade to v3.2.2)
1. **升级 Master 司令部自身**:在司令部顶级菜单,点击最上方的 `[ 🆙 升级司令部至 vX.X.X ]`。中枢将释放幽灵进程静默重构,数秒后向您发送捷报
2. **升级全舰队 Agent**:在司令部顶级菜单,点击 `[ ☢️ 全舰队 OTA 热重载 ]`
3. **升级单节点 Agent**:进入 `🌍 全球战区雷达` -> 选择目标节点 -> 在统一终端面板点击 `[ 🆙 OTA 静默升级 ]`
*(⚠️ 节点收到指令后会在后台挂起静默拉取,全程无需登录 SSH完成后将主动发回心跳确认)*
得益于 **v3.2.2 全新引入的平滑热更新引擎 (Smooth Upgrade Engine)**,系统升级现已变得极其优雅与安全
### 💻 方式二SSH 终端平滑直装 (适用于官方网关或老旧节点)
如果您的节点不支持 OTA或者您的节点版本过于陈旧 (如 v3.3.1)
无需卸载旧版本,无论您是要升级 Agent 边缘节点还是 Master 控制中枢,只需在您的终端中**再次运行上方对应的官方部署指令**。
- 登录该节点的 SSH 终端,再次运行上面的 core/install.sh 官方安装指令。
安装雷达会自动嗅探您的历史部署状态(包括您的 Token、区域设定、SQLite 数据库及物理网卡锚点)。当询问是否平滑升级时,您只需**一路回车 (默认选 y)**,脚本将在短短 3 秒内瞬间完成核心装甲的无损换脑手术,您的所有战术资产将得到 100% 保留!
- 安装引擎自带状态机嗅探逻辑它会自动读取老旧数据您只需一路回车3 秒即可在本地完成配置继承、数据同步与新内核的无损覆盖热重载!
## 🗑️ 一键无痕卸载
🗑️ 一键无痕卸载
如果你需要清理某个边缘节点,只需重新运行 `core/install.sh` 并选择 **[2]**,或直接在节点终端执行:
```Bash
@@ -106,7 +102,7 @@ bash /opt/ip_sentinel/core/uninstall.sh
```
## 🧓 传家宝老旧系统专用通道 (Debian 9)
### 🧓 传家宝老旧系统专用通道 (Debian 9)
如果你的小鸡系统版本过低(如 Debian 9由于官方 APT 源已关闭且 Python 版本过旧,无法使用主线版本,请使用 **Legacy 兼容分支** 部署。
*(注意:该分支仅作基础维护,不享受新功能迭代,请尽可能升级你的系统)*
@@ -115,39 +111,20 @@ bash /opt/ip_sentinel/core/uninstall.sh
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/legacy/core/install.sh)
```
## 📡 战术联络 (Community)
📡 战术联络 (Community)
如果你在使用过程中遇到任何疑难杂症,或者想围观大佬们的养护战报,欢迎加入我们的基地:
- Telegram 频道: [@IP_Sentinel_Matrix](https://t.me/IP_Sentinel_Matrix)
## 🤝 参与贡献 (Contributors)
🤝 参与贡献
如果你想为项目增加新的节点区域(例如德国、英国、新加坡等),或者提供更丰富的本土化搜索词库,非常欢迎提交 Pull Request
**🌟 感谢以下所有为 IP-Sentinel 添砖加瓦的指挥官们!** 你们的每一次 PR 都在让这艘战舰的全球雷达覆盖得更广。
<a href="https://github.com/hotyue/IP-Sentinel/graphs/contributors">
<img src="https://contrib.rocks/image?repo=hotyue/IP-Sentinel" alt="Contributors" />
</a>
如果你想为项目增加新的节点区域(例如德国、英国、大洋洲等),或者提供更丰富的本土化搜索词库,非常欢迎提交 Pull Request
> - 感谢 @xykt 本项目IP质量检测采用[xykt/IPQuality](https://github.com/xykt/IPQuality) 脚本!
**💡 全球节点贡献规范:**
**v3.0 全球节点贡献规范:**
1.`data/regions/国家代码/省州代码/` 目录下新增对应城市的配置 `.json`
2.`data/keywords/` 目录下新增或完善配套国家的词库 `kw_XX.txt`
3. **最重要的一步:**`data/map.json` 中登记你的国家、省州与城市信息。安装脚本将自动读取地图,在全球雷达中点亮你的节点!
## ⚠️ 免责声明
⚠️ 免责声明
本项目仅供网络原理研究、个人 VPS 维护学习使用。请遵守当地法律法规及目标服务商的 TOS服务条款切勿用于恶意高频请求或任何非法用途。使用者需自行承担因不当使用造成的 IP 封禁或其他相关风险。
## 保持联系
[![Blog](https://img.shields.io/badge/Blog-个人博客-blue)](https://blog.iot-architect.com)
如果你觉得这个项目对你有帮助,欢迎关注我的个人博客,我会定期分享技术教程。
## Stargazers over time
[![Stargazers over time](https://starchart.cc/hotyue/IP-Sentinel.svg?variant=adaptive)](https://starchart.cc/hotyue/IP-Sentinel)

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# ==========================================================
# 脚本名称: agent_daemon.sh (受控节点 Webhook 守护进程 - 动态锚点版)
# 脚本名称: agent_daemon.sh (受控节点 Webhook 守护进程 V3.0.3)
# 核心功能: 智能防打扰注册、进程自检、模块级路由分发(403拦截)
# ==========================================================
@@ -17,53 +17,45 @@ source "$CONFIG_FILE"
# 默认 Webhook 监听端口
AGENT_PORT=${AGENT_PORT:-9527}
# [v3.5.2 核心] 载入不可变主键与可变展示名 (双轨身份)
if [ -z "$NODE_NAME" ]; then
IP_HASH=$(echo "${PUBLIC_IP:-127.0.0.1}" | md5sum | cut -c 1-4 | tr 'a-z' 'A-Z')
NODE_NAME="$(hostname | tr -cd 'a-zA-Z0-9' | cut -c 1-10)-${IP_HASH}"
NODE_NAME=$(hostname | cut -c 1-15)
# --- [重点升级 1: 守护进程防冲突自检] ---
if pgrep -f "webhook.py $AGENT_PORT" > /dev/null; then
exit 0
fi
NODE_ALIAS="${NODE_ALIAS:-$NODE_NAME}"
# 1. 尝试获取实时公网 IP
# 1. [v3.0.1修复] 严格按照 install.sh 锁定的网络协议 (v4/v6) 获取 IP
RAW_IP=$(curl -${IP_PREF:-4} -s -m 5 api.ip.sb/ip | tr -d '[:space:]')
# [v3.3.1 修改] 为新获取到的 v6 自动加方括号;如果网络波动没抓到,强制信任本地 config 中的公网面孔
if [ -n "$RAW_IP" ]; then
if [[ "$RAW_IP" == *":"* ]] && [[ "$RAW_IP" != *"["* ]]; then
AGENT_IP="[${RAW_IP}]"
else
AGENT_IP="$RAW_IP"
fi
# 为新获取到的 v6 自动加方括号,以确保与之前锁定的格式对齐比对
if [[ "$RAW_IP" == *":"* ]] && [[ "$RAW_IP" != *"["* ]]; then
AGENT_IP="[${RAW_IP}]"
else
AGENT_IP="${PUBLIC_IP:-${BIND_IP:-Unknown}}"
AGENT_IP="$RAW_IP"
fi
if [ -n "$AGENT_IP" ]; then
# --- [重点升级 2: 智能防打扰注册机制] ---
LAST_IP=""
[ -f "$IP_CACHE" ] && LAST_IP=$(cat "$IP_CACHE" | tr -d '[:space:]')
# 只有当这是第一次运行,或者公网 IP 发生变动时,才发送 Telegram 申请
if [ "$AGENT_IP" != "$LAST_IP" ]; then
# [静音手术] 仅在本地静默更新 IP 缓存,彻底切除重复的 TG 发信逻辑,做沉默的守夜人
# V3.1.3 协议升级: 在底部暗号中精准嵌入 ${REGION_CODE} 大区标识
REG_MSG="👋 **[边缘节点接入申请]**%0A大区: \`${REGION_CODE}\`%0A节点: \`${NODE_NAME}\`%0A地址: \`${AGENT_IP}:${AGENT_PORT}\`%0A%0A⚠ **安全验证**: 为防止非法节点接入,请长按复制下方代码,并**发送给我**以完成最终授权录入:%0A%0A\`#REGISTER#|${REGION_CODE}|${NODE_NAME}|${AGENT_IP}|${AGENT_PORT}\`"
curl -s -m 5 -X POST "${TG_API_URL}" \
-d "chat_id=${CHAT_ID}" \
-d "text=${REG_MSG}" \
-d "parse_mode=Markdown" > /dev/null
echo "✅ [Agent] 已向司令部发送接入申请,请在 Telegram 手机端完成授权!"
echo "$AGENT_IP" > "$IP_CACHE"
echo " [Agent] 发现本地 IP 变动,已静默更新缓存: $AGENT_IP"
else
echo " [Agent] IP 未变动 ($AGENT_IP)继续后台静默监听"
echo " [Agent] IP 未变动 ($AGENT_IP)跳过重复注册申请"
fi
fi
# ================== [v3.6.3 新增: 自动生成自签名 TLS 加密证书] ==================
# [修复] 彻底废除官方网关免 TLS 的裸奔逻辑,全网强制生成证书装甲
CERT_FILE="${INSTALL_DIR}/core/cert.pem"
KEY_FILE="${INSTALL_DIR}/core/key.pem"
if [ ! -f "$CERT_FILE" ] || [ ! -f "$KEY_FILE" ]; then
echo "🔐 [Agent] 正在生成本地自签名 TLS 加密证书 (2048位 RSA)..."
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout "$KEY_FILE" -out "$CERT_FILE" \
-subj "/C=US/O=IP-Sentinel/CN=Agent-Sec" >/dev/null 2>&1 || true
fi
# ==============================================================================
# 3. 启动轻量级 Python3 Webhook 监听服务 (v3.0.4 动态 HMAC 签名防重放)
cat > "${INSTALL_DIR}/core/webhook.py" << 'EOF'
import http.server
@@ -74,7 +66,7 @@ import os
import html
# ================== [v3.0.4 新增密码学与解析依赖] ==================
import urllib.parse
import urllib.request
import urllib.request # [修复] 提升至全局作用域,防止局部变量遮蔽
import hmac
import hashlib
import time
@@ -82,15 +74,6 @@ import time
PORT = int(sys.argv[1])
# 🛡️ 防重放攻击 (Nonce 缓存池)
USED_SIGNS = {}
def clean_used_signs():
now = time.time()
# 清理过期签名 (超 60 秒的安全窗口)
expired = [s for s, t in USED_SIGNS.items() if now - t > 65]
for s in expired:
del USED_SIGNS[s]
# 🛡️ 提取全局鉴权 Token (利用 CHAT_ID 作为 PSK 预共享密钥)
AUTH_TOKEN = ""
if os.path.exists('/opt/ip_sentinel/config.conf'):
@@ -120,9 +103,8 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
return
try:
current_time = int(time.time())
# 校验 2时间戳防重放 (误差 ±60秒 内有效,拒绝隔夜抓包重放)
if abs(current_time - int(req_t)) > 60:
if abs(int(time.time()) - int(req_t)) > 60:
self.send_response(401)
self.end_headers()
self.wfile.write(b"401 Unauthorized: Request Expired\n")
@@ -131,17 +113,9 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
self.send_response(401)
self.end_headers()
return
# 校验 2.5:基于 60秒 窗口的精确重放拦截 (拦截 MITM 并发洗劫)
clean_used_signs()
if req_sign in USED_SIGNS:
self.send_response(401)
self.end_headers()
self.wfile.write(b"401 Unauthorized: Replay Attack Detected\n")
return
# 校验 3HMAC 数据完整性与身份合法性校验
msg = f"{req_path}:{req_t}".encode('utf-8')
msg = "{}:{}".format(req_path, req_t).encode('utf-8')
expected_sign = hmac.new(AUTH_TOKEN.encode('utf-8'), msg, hashlib.sha256).hexdigest()
# 使用 compare_digest 防御时序攻击
@@ -150,20 +124,17 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
self.end_headers()
self.wfile.write(b"401 Unauthorized: Signature Mismatch\n")
return
# 鉴权通过,记录该签名至防重放内存池
USED_SIGNS[req_sign] = current_time
# ================== 路由分发 (恢复为安全的精确匹配) ==================
# 路由 0: 全局统筹调度
# 路由 0: 全局统筹调度 (处理 /trigger_run 一键全节点维护)
if req_path == '/trigger_run':
if os.path.exists('/opt/ip_sentinel/core/runner.sh'):
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: runner\n")
os.system("nohup bash /opt/ip_sentinel/core/runner.sh >/dev/null 2>&1 &")
subprocess.Popen(['bash', '/opt/ip_sentinel/core/runner.sh'])
else:
self.send_response(404)
self.end_headers()
@@ -175,7 +146,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: mod_google\n")
os.system("nohup bash /opt/ip_sentinel/core/mod_google.sh >/dev/null 2>&1 &")
subprocess.Popen(['bash', '/opt/ip_sentinel/core/mod_google.sh'])
else:
self.send_response(403)
self.send_header("Content-type", "text/plain")
@@ -189,7 +160,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: mod_trust\n")
os.system("nohup bash /opt/ip_sentinel/core/mod_trust.sh >/dev/null 2>&1 &")
subprocess.Popen(['bash', '/opt/ip_sentinel/core/mod_trust.sh'])
else:
self.send_response(403)
self.send_header("Content-type", "text/plain")
@@ -202,7 +173,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: tg_report\n")
os.system("nohup bash /opt/ip_sentinel/core/tg_report.sh >/dev/null 2>&1 &")
subprocess.Popen(['bash', '/opt/ip_sentinel/core/tg_report.sh'])
# 路由 4: 抓取并回传实时日志
elif req_path == '/trigger_log':
@@ -229,241 +200,25 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
if lines:
log_data = html.escape("".join(lines[-15:]))
# [v3.5.2 核心] 获取版本与节点展示别名
local_ver = config.get('AGENT_VERSION', '未知')
node_alias = config.get('NODE_ALIAS', config.get('NODE_NAME', 'Unknown-Node'))
node_name = subprocess.check_output(['hostname']).decode('utf-8').strip()[:15]
text_msg = "📄 <b>[{}] 实时运行日志:</b>\n<pre><code>{}</code></pre>".format(node_name, log_data)
text_msg = f"📄 <b>[{node_alias}] 实时日志 (v{local_ver}):</b>\n<pre><code>{log_data}</code></pre>"
# [v4.0.3 体验升级] 引入 json 模块并改用 JSON Payload挂载返回控制台按钮
import json
node_name_cb = config.get('NODE_NAME', 'Unknown')
payload = {
data = urllib.parse.urlencode({
'chat_id': config.get('CHAT_ID', ''),
'text': text_msg,
'parse_mode': 'HTML',
'reply_markup': {
'inline_keyboard': [[{'text': '⚙️ 调出该节点控制台', 'callback_data': f'manage:{node_name_cb}'}]]
}
}
data = json.dumps(payload).encode('utf-8')
'parse_mode': 'HTML'
}).encode('utf-8')
req = urllib.request.Request(
config.get('TG_API_URL', ''),
data=data,
# [动态化] 彻底消灭硬编码,使用运行态版本号,并声明 JSON 头
headers={
'User-Agent': f'IP-Sentinel-Agent/{local_ver}',
'Content-Type': 'application/json'
}
headers={'User-Agent': 'IP-Sentinel-Agent/3.0.4'}
)
urllib.request.urlopen(req, timeout=10)
except Exception as e:
print(f"Log transmission failed: {e}")
# ================== [v4.0.0 新增: 触发深海声呐] ==================
elif req_path == '/trigger_quality':
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: trigger_quality\n")
print("Log transmission failed: {}".format(e))
if os.path.exists('/opt/ip_sentinel/core/mod_quality.sh'):
os.system("nohup bash /opt/ip_sentinel/core/mod_quality.sh >/dev/null 2>&1 &")
# =================================================================
# 路由 5: 节点重命名展示别名同步接口 (Base64 终极防御版)
elif req_path == '/trigger_rename':
b64_alias = query.get('b64', [''])[0]
if not b64_alias:
self.send_response(400)
self.end_headers()
self.wfile.write(b"400 Bad Request: Alias is empty\n")
return
import re
import base64
try:
# 1. 还原 URL 安全的 Base64 字符并解码 (杜绝乱码与 WAF 拦截)
pad = len(b64_alias) % 4
if pad > 0:
b64_alias += '=' * (4 - pad)
b64_alias = b64_alias.replace('-', '+').replace('_', '/')
raw_alias = base64.b64decode(b64_alias).decode('utf-8', errors='ignore')
# 2. 强清洗:杜绝 TG Markdown 崩溃严格限制中英数最大20字符
decoded_alias = raw_alias.replace('_', '-')
safe_alias = re.sub(r'[^a-zA-Z0-9\-\u4e00-\u9fa5]', '', decoded_alias)[:20]
if safe_alias:
# 3. 强容错读写 config.conf (引入 fcntl 排他锁与 r+ 模式防并发清空)
config_path = '/opt/ip_sentinel/config.conf'
import fcntl
with open(config_path, 'r+', encoding='utf-8', errors='ignore') as f:
fcntl.flock(f, fcntl.LOCK_EX)
lines = f.readlines()
alias_found = False
for i, line in enumerate(lines):
if line.startswith('NODE_ALIAS='):
lines[i] = f'NODE_ALIAS="{safe_alias}"\n'
alias_found = True
break
if not alias_found:
lines.append(f'NODE_ALIAS="{safe_alias}"\n')
f.seek(0)
f.writelines(lines)
f.truncate()
fcntl.flock(f, fcntl.LOCK_UN)
# [v3.5.2 极致丝滑] 移除向 TG 推送冗余报文的逻辑,直接向 Master 回执成功状态即可
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: trigger_rename\n")
return
except Exception as e:
self.send_response(500)
self.end_headers()
self.wfile.write(f"500 Internal Error: {str(e)}\n".encode('utf-8'))
return
self.send_response(400)
self.end_headers()
self.wfile.write(b"400 Bad Request: Invalid Characters\n")
# ================== [v3.5.3 新增: 模块动态启停接口] ==================
elif req_path == '/trigger_toggle':
mod_name = query.get('mod', [''])[0]
target_state = query.get('state', [''])[0].lower()
if mod_name not in ['google', 'trust'] or target_state not in ['true', 'false']:
self.send_response(400)
self.end_headers()
self.wfile.write(b"400 Bad Request: Invalid parameters\n")
return
config_key = f"ENABLE_{mod_name.upper()}="
try:
config_path = '/opt/ip_sentinel/config.conf'
import fcntl
with open(config_path, 'r+', encoding='utf-8', errors='ignore') as f:
fcntl.flock(f, fcntl.LOCK_EX)
lines = f.readlines()
found = False
for i, line in enumerate(lines):
if line.startswith(config_key):
lines[i] = f'{config_key}"{target_state}"\n'
found = True
break
if not found:
lines.append(f'{config_key}"{target_state}"\n')
f.seek(0)
f.writelines(lines)
f.truncate()
fcntl.flock(f, fcntl.LOCK_UN)
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: trigger_toggle\n")
except Exception as e:
self.send_response(500)
self.end_headers()
self.wfile.write(f"500 Internal Error: {str(e)}\n".encode('utf-8'))
# ================== [v3.6.0 新增: 零信任 OTA 远程静默升级路由] ==================
elif req_path == '/trigger_ota':
try:
# 动态读取最新 config 内存态
config_mem = {}
config_path = '/opt/ip_sentinel/config.conf'
if os.path.exists(config_path):
with open(config_path, 'r', errors='ignore') as f:
for line in f:
line = line.strip()
if '=' in line and not line.startswith('#'):
key, val = line.split('=', 1)
config_mem[key] = val.strip('"\'')
# 🛡️ 熔断校验 1: Agent 本地是否开启了 OTA 授权
if config_mem.get('ENABLE_OTA', 'false').lower() != 'true':
self.send_response(403)
self.end_headers()
self.wfile.write(b"403 Forbidden: OTA Upgrade Disabled locally\n")
return
# 🛡️ 熔断校验 2: 是否处于官方公共网关下 (强行硬编码拦截)
if config_mem.get('TG_TOKEN', '') == 'OFFICIAL_GATEWAY_MODE':
self.send_response(403)
self.end_headers()
self.wfile.write(b"403 Forbidden: OTA strictly disabled under Public Gateway mode\n")
return
# 校验通过,立即返回 200 回执,释放 Master 连接池
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Action Accepted: trigger_ota\n")
# [修复] 逃逸 Systemd Cgroup并引入 bash -n 语法树校验防砖机制
import shutil
import base64
# 动态提取部署时的源地址,废除强制写死 main 分支,保障隔离测试环境
repo_url = "https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
if os.path.exists('/opt/ip_sentinel/core/install.sh'):
with open('/opt/ip_sentinel/core/install.sh', 'r') as f:
for line in f:
if line.startswith('REPO_RAW_URL='):
repo_url = line.split('=', 1)[1].strip('"\'')
break
# 动态构建报错回执文本 (第一层 Base64 隔离换行与特殊字符)
err_msg = f"❌ **OTA 熔断告警**\n📍 节点: `{config_mem.get('NODE_ALIAS', '未知')}`\n⚠ 原因: 脚本语法校验(bash -n)未通过,下载可能不完整。\n🚀 状态: 升级已取消,节点安全。"
err_msg_b64 = base64.b64encode(err_msg.encode('utf-8')).decode('utf-8')
tg_url = config_mem.get('TG_API_URL', '')
chat_id = config_mem.get('CHAT_ID', '')
# [v3.6.3 究极防御] 采用 Base64 将整个 OTA 执行脚本封装 (第二层隔离)
# 彻底免疫因为 python 变量掺杂引号而导致的 shell 注入或截断
ota_script = f"""
export SILENT_OTA="true"
curl -fsSL {repo_url}/core/install.sh -o /tmp/ota_agent.sh
if bash -n /tmp/ota_agent.sh; then
bash /tmp/ota_agent.sh > /opt/ip_sentinel/logs/ota_upgrade.log 2>&1
else
MSG=$(echo '{err_msg_b64}' | base64 -d)
curl -s -m 10 -X POST "{tg_url}" -d "chat_id={chat_id}" -d "text=$MSG" -d "parse_mode=Markdown" > /dev/null 2>&1
echo "OTA Checksum Failed: Script corrupted" > /opt/ip_sentinel/logs/ota_upgrade.log
fi
"""
ota_script_b64 = base64.b64encode(ota_script.encode('utf-8')).decode('utf-8')
# 安全解包并执行
if shutil.which("systemd-run"):
full_cmd = f"systemd-run --quiet --no-block bash -c \"echo '{ota_script_b64}' | base64 -d | bash\""
else:
full_cmd = f"nohup bash -c \"echo '{ota_script_b64}' | base64 -d | bash\" >/dev/null 2>&1 &"
# 彻底统一为 os.system消灭最后一个可能游离的 Popen 僵尸进程
os.system(full_cmd)
except Exception as e:
self.send_response(500)
self.end_headers()
self.wfile.write(f"500 Internal Error: {str(e)}\n".encode('utf-8'))
else:
self.send_response(404)
self.end_headers()
@@ -473,49 +228,21 @@ fi
import socket
# ================== [v3.0.3 变更: 引入多线程模型抵抗 Slowloris 攻击] ==================
class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
class ThreadedDualStackServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
allow_reuse_address = True # 开启端口复用,防止热重启时端口冲突
# [核心修复] 显式关闭 V6ONLY 参数,治愈大量云主机纯双栈下的 IPv4 耳聋现象
def server_bind(self):
if self.address_family == socket.AF_INET6:
try:
self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0)
except Exception:
pass
super().server_bind()
address_family = socket.AF_INET6 if socket.has_ipv6 else socket.AF_INET
try:
# 1. 优先尝试监听双栈/IPv6
ThreadedServer.address_family = socket.AF_INET6
httpd = ThreadedServer(("::", PORT), AgentHandler)
except Exception:
# 2. [核心修复 Issue #23] 若系统内核已禁用 IPv6抛弃报错智能回退至纯 IPv4 监听
ThreadedServer.address_family = socket.AF_INET
httpd = ThreadedServer(("0.0.0.0", PORT), AgentHandler)
# ================== [v3.6.3 核心: 挂载 TLS 加密隧道 (强制装甲版)] ==================
import ssl
cert_path = '/opt/ip_sentinel/core/cert.pem'
key_path = '/opt/ip_sentinel/core/key.pem'
# 全网强制启用 TLS 装甲,彻底消灭 HTTP 裸奔漏洞
if os.path.exists(cert_path) and os.path.exists(key_path):
try:
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile=cert_path, keyfile=key_path)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
except Exception as e:
print(f"SSL 隧道构建失败,退化为 HTTP: {e}")
# ======================================================================================
try:
httpd.serve_forever()
bind_addr = "::" if socket.has_ipv6 else ""
with ThreadedDualStackServer((bind_addr, PORT), AgentHandler) as httpd:
httpd.serve_forever()
except Exception as e:
sys.exit(1)
# ====================================================================================
EOF
# --- [重点升级 3: 移交系统级守护进程接管 (阻塞模式)] ---
echo "🚀 [Agent] 正在启动 Webhook 监听服务 (端口: $AGENT_PORT)..."
exec python3 "${INSTALL_DIR}/core/webhook.py" "$AGENT_PORT"
# --- [重点升级 3: 真正的静默后台启动] ---
echo "🚀 [Agent] 正在后台启动 Webhook 监听服务 (端口: $AGENT_PORT)..."
nohup python3 "${INSTALL_DIR}/core/webhook.py" "$AGENT_PORT" > /dev/null 2>&1 &
disown 2>/dev/null || true
echo "✅ [Agent] 守护进程启动完毕,可安全关闭终端。"

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# ==========================================================
# 脚本名称: mod_google.sh (Google 业务逻辑模块 - 动态锚点版)
# 脚本名称: mod_google.sh (Google 业务逻辑模块)
# 核心功能: 执行坐标微抖动、模拟真实阅读时长、会话行为拉伸
# ==========================================================
@@ -16,27 +16,11 @@ else
exit 1
fi
# 容错机制:如果父进程没有传递 log 函数,则本地定义一个作为 fallback (v3.4.0 引入版本探针)
# 容错机制:如果父进程没有传递 log 函数,则本地定义一个作为 fallback
if ! type log >/dev/null 2>&1; then
log() {
# [v3.4.0 核心] 提取当前配置中的版本锚点
local local_ver="${AGENT_VERSION:-未知}"
# 保证日志目录存在
mkdir -p "${INSTALL_DIR}/logs"
# 日志格式注入 [版本号] 追踪标识
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$2" "$1" "$REGION_CODE" "$3")
# [时区对齐] 强制无视本地时区,以绝对 UTC 时间写入日志
echo "[$(date -u '+%Y-%m-%d %H:%M:%S UTC')] $core_msg" >> "${INSTALL_DIR}/logs/sentinel.log"
# 强制推送到 Systemd Journal (如果系统支持)
if command -v logger >/dev/null 2>&1; then
logger -t ip-sentinel "$core_msg"
else
# 降级输出到 stdout让 Systemd 捕获
echo "$core_msg"
fi
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [%-5s] [%-7s] [%s] %s\n" "$2" "$1" "$REGION_CODE" "$3" >> "${INSTALL_DIR}/logs/sentinel.log"
}
fi
@@ -64,8 +48,8 @@ get_random_coord() {
}
# --- [环境初始化] ---
# [v3.3.1修改] 优先读取对外公网面孔作为哈希种子,兼容 NAT 机的空 BIND_IP
CURRENT_IP="${PUBLIC_IP:-${BIND_IP:-Unknown}}"
# [v3.0.2修复] 直接读取系统已锁定的锚点 IP彻底杜绝“获取IP失败”及隧道偏移
CURRENT_IP="${BIND_IP:-Unknown}"
# -----------------------------------------------------------
# [V3.1.5] 哈希锚定法 (Hash-Seeded Persona)
@@ -109,21 +93,14 @@ CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
log "$MODULE_NAME" "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
CURL_BIND_OPT=""
else
CURL_BIND_OPT="--interface $BIND_IP"
# 智能探测:带冒号为 V6带点号为 V4
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)"
fi
CURL_BIND_OPT="--interface $BIND_IP"
# 智能探测:带冒号为 V6带点号为 V4
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)"
fi
fi
@@ -162,133 +139,53 @@ for ((i=1; i<=TOTAL_ACTIONS; i++)); do
log "$MODULE_NAME" "EXEC " "动作[$i/$TOTAL_ACTIONS]完成 | HTTP状态: $CODE | 抖动坐标: $ACTION_LAT, $ACTION_LON"
# 【核心升级】行为拉伸:每次动作后强制休眠 90 - 120 秒
# 结合动作总数,总耗时将稳定在 10 分钟 到 20 分钟之间
# 【核心升级】行为拉伸:每次动作后强制休眠 90 - 150 秒
# 结合动作总数,总耗时将稳定在 10 分钟 到 25 分钟之间
if [ $i -lt $TOTAL_ACTIONS ]; then
SLEEP_TIME=$((90 + RANDOM % 31))
SLEEP_TIME=$((90 + RANDOM % 61))
log "$MODULE_NAME" "WAIT " "阅读当前页面内容,模拟停留 $SLEEP_TIME 秒..."
sleep $SLEEP_TIME
fi
done
# --- [结果纠偏自检 (V4.0.9 终极三核雷达: URL跳转 + Premium + Music)] ---
# 战术揭秘:汲取开源社区顶级探针的精髓!
# 1. 传统 URL 跳转探测:捕捉 www.google.com 底层 302 重定向域名的真实归属。
# 2. YT Premium 深度探测:提取核心 contentRegion 变量,并强匹配 www.google.cn 送中特征。
# 3. 严格一致性校验:任何一端出现非预期偏移,立即判定为漂移,彻底消除虚假“成功”。
# --- [结果纠偏自检 (V3.2.1 高精度容错版)] ---
# [V3.2.1 热修复] 探针同样应用 $DYNAMIC_IP_PREF 协议自适应
PROBE_RESULT=$(curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -m 15 -s -L -o /dev/null -w "%{http_code}|%{url_effective}" https://www.google.com)
log "$MODULE_NAME" "INFO " "启动三核交叉验证 (URL跳转 + YT Premium + YT Music) 穿透获取 GeoIP..."
# 分离状态码与 URL
PROBE_CODE=$(echo "$PROBE_RESULT" | cut -d'|' -f1)
FINAL_URL=$(echo "$PROBE_RESULT" | cut -d'|' -f2)
# 核心 1: 传统 URL 跳转探测 (请求 www 才能触发准确跳转)
JUMP_HDR=$(curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -m 10 -sI "http://www.google.com/")
JUMP_LOC=$(echo "$JUMP_HDR" | grep -i "^location:" | tr -d '\r\n')
JUMP_GL=""
if [ -z "$JUMP_LOC" ]; then
# 无跳转 (HTTP 200) 通常意味着原生被定位于 US
JUMP_GL="US"
elif [[ "$JUMP_LOC" == *".google.cn"* ]] || [[ "$JUMP_LOC" == *"gl=CN"* ]]; then
JUMP_GL="CN"
elif [[ "$JUMP_LOC" == *"gl="* ]]; then
JUMP_GL=$(echo "$JUMP_LOC" | grep -o 'gl=[A-Za-z]\{2\}' | head -n 1 | cut -d'=' -f2 | tr 'a-z' 'A-Z')
# 0. 致命拦截网络断开、DNS 解析失败或严重超时
if [ "$PROBE_CODE" == "000" ] || [ -z "$FINAL_URL" ]; then
STATUS="🚨 探针失效 (网络阻断或底层路由异常)"
else
# 从域名中提取区域后缀 (如 .co.jp -> JP, .com.hk -> HK, .de -> DE)
JUMP_DOMAIN=$(echo "$JUMP_LOC" | grep -o 'google\.[a-z\.]*' | head -n 1 | sed 's/google\.//')
case "$JUMP_DOMAIN" in
"com") JUMP_GL="US" ;;
"com.hk") JUMP_GL="HK" ;;
"com.tw") JUMP_GL="TW" ;;
"co.jp") JUMP_GL="JP" ;;
"co.uk") JUMP_GL="GB" ;;
"co.kr") JUMP_GL="KR" ;;
"co.in") JUMP_GL="IN" ;;
"co.id") JUMP_GL="ID" ;;
"co.th") JUMP_GL="TH" ;;
"com.sg") JUMP_GL="SG" ;;
"com.my") JUMP_GL="MY" ;;
"com.au") JUMP_GL="AU" ;;
"com.br") JUMP_GL="BR" ;;
"com.mx") JUMP_GL="MX" ;;
"com.ar") JUMP_GL="AR" ;;
"co.za") JUMP_GL="ZA" ;;
"cn") JUMP_GL="CN" ;;
"") JUMP_GL="" ;;
*)
# 提取标准两字母后缀 (.de, .fr, .nl)
LAST_EXT=$(echo "$JUMP_DOMAIN" | awk -F'.' '{print $NF}' | tr 'a-z' 'A-Z')
if [ ${#LAST_EXT} -eq 2 ]; then
JUMP_GL="$LAST_EXT"
else
JUMP_GL="US"
fi
;;
esac
fi
# 核心战术:精准提取最终 URL 的域名部分
ACTUAL_DOMAIN=$(echo "$FINAL_URL" | awk -F/ '{print $3}')
# [V3.2.1 优化] 使用通配符 * 剔除任意前缀 (无论是 www.google. 还是 ipv4.google.)
ACTUAL_SUFFIX=${ACTUAL_DOMAIN#*google.}
# 核心 2: YouTube Premium 探测
YT_PR_GL=""
# [修复] 必须带上本轮循环的专属 UA (-A "$SESSION_UA"),防止被 Google CDN 丢进无状态爬虫兜底页
YT_PR_HTML=$(curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -m 10 -s -L -A "$SESSION_UA" "https://www.youtube.com/premium")
if echo "$YT_PR_HTML" | grep -q 'www.google.cn'; then
YT_PR_GL="CN"
else
# 穷举风控变量提取
YT_PR_GL=$(echo "$YT_PR_HTML" | grep -o '"contentRegion":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
[ -z "$YT_PR_GL" ] && YT_PR_GL=$(echo "$YT_PR_HTML" | grep -o '"countryCode":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
[ -z "$YT_PR_GL" ] && YT_PR_GL=$(echo "$YT_PR_HTML" | grep -o '"INNERTUBE_CONTEXT_GL":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
fi
# 1. 优先验证:绝对匹配目标后缀 (彻底杜绝 com 包含于 com.hk 的陷阱)
if [ "$ACTUAL_SUFFIX" == "$VALID_URL_SUFFIX" ]; then
STATUS="✅ 目标区域达成 ($ACTUAL_SUFFIX)"
# 核心 3: YouTube Music 探测
YT_MU_GL=""
# [修复] 同样加持 UA 装甲,强行唤出完整版前端框架
YT_MU_HTML=$(curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -m 10 -s -L -A "$SESSION_UA" "https://music.youtube.com/")
if echo "$YT_MU_HTML" | grep -q 'www.google.cn'; then
YT_MU_GL="CN"
else
# [修复] Music 的核心配置变量是 INNERTUBE_CONTEXT_GL
YT_MU_GL=$(echo "$YT_MU_HTML" | grep -o '"INNERTUBE_CONTEXT_GL":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
[ -z "$YT_MU_GL" ] && YT_MU_GL=$(echo "$YT_MU_HTML" | grep -o '"countryCode":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
[ -z "$YT_MU_GL" ] && YT_MU_GL=$(echo "$YT_MU_HTML" | grep -o '"GL":"[A-Za-z]\{2\}"' | head -n 1 | cut -d'"' -f4 | tr 'a-z' 'A-Z')
fi
# [基准对齐] 提取配置大区 (兼容州级穿透),并修正英国的 ISO 代码
TARGET_CC="${REGION_CODE%%-*}"
[ "$TARGET_CC" == "UK" ] && TARGET_CC="GB"
# --- 终极审判逻辑 (以 YouTube 核心业务为主导,兼顾底层雷达权重) ---
IS_CN=0
VALID_PROBES=0
# 1. 扫描所有探针,统计有效性并执行“送中”一票否决
for val in "$JUMP_GL" "$YT_PR_GL" "$YT_MU_GL"; do
if [ -n "$val" ]; then
((VALID_PROBES++))
[ "$val" == "CN" ] && IS_CN=1
fi
done
if [ $VALID_PROBES -eq 0 ]; then
STATUS="🚨 探针失效 (三核全部熔断,可能遭严重风控拦截)"
elif [ $IS_CN -eq 1 ]; then
STATUS="❌ 严重高危!三核雷达判定 IP 已被中国大陆锁定 (送中)"
else
# 2. 评估核心流媒体业务是否达标 (只要 YT_PR 或 YT_MU 其一达标,即视为成功)
YT_MATCH=0
[ "$YT_PR_GL" == "$TARGET_CC" ] && YT_MATCH=1
[ "$YT_MU_GL" == "$TARGET_CC" ] && YT_MATCH=1
if [ $YT_MATCH -eq 1 ]; then
# 3. 核心业务达标,进一步评估底层路由权重
if [ -n "$JUMP_GL" ] && [ "$JUMP_GL" != "$TARGET_CC" ]; then
# YT 解锁了,但基础跳转 IP 库漂移了 (降级为 ✅,但备注底层漂移)
STATUS="✅ 目标区域达成 (YT主导成功, Jump副雷达漂移至 ${JUMP_GL}) | Prem: ${YT_PR_GL:-} | Music: ${YT_MU_GL:-}"
# 2. 核心拦截:精准捕捉送中特征 (com.hk)
elif [ "$ACTUAL_SUFFIX" == "com.hk" ]; then
if [ "$REGION_CODE" == "HK" ]; then
STATUS="✅ 目标区域达成 (HK 专属 com.hk)"
else
# 完美达成
STATUS="✅ 目标区域达成 (Jump: ${JUMP_GL:-} | Prem: ${YT_PR_GL:-} | Music: ${YT_MU_GL:-})"
STATUS="❌ 严重漂移!判定为送中区 (实际跳往 $ACTUAL_SUFFIX)"
fi
# 3. 宽容处理:遵守 Google 无跳转新规 (严格限定必须是纯粹的 com)
# [视觉优化] 留在 .com 代表 IP 极度纯净未被区域沙盒锁定,计入成功战绩!
elif [ "$ACTUAL_SUFFIX" == "com" ]; then
STATUS="✅ 目标区域达成 (免签停留 .com 通用主站)"
# 4. 跨区漂移:所有预判之外的后缀,全部视为异常
else
# YouTube 流媒体核心未能解锁目标区域,宣判漂移
STATUS="⚠️ 区域发生漂移!目标 $TARGET_CC,实际 (Jump: ${JUMP_GL:-} | Prem: ${YT_PR_GL:-} | Music: ${YT_MU_GL:-})"
STATUS="⚠️ 跨区跳板漂移 (当前实际归属: $ACTUAL_SUFFIX)"
fi
fi

View File

@@ -1,266 +0,0 @@
#!/bin/bash
# ==========================================================
# IP-Sentinel: 深海声呐 (IP 质量全维异步检测模块 v4.0.0)
# ==========================================================
source /opt/ip_sentinel/config.conf
# ==========================================
# 1. 动态网络锚定与协议自适应 (专为多 IP / NAT 架构打造)
# ==========================================
DYNAMIC_IP_PREF="${IP_PREF:-4}"
PROBE_ARGS=("-y" "-j" "-f") # 默认注入: 自动确认、JSON格式、明文无掩码IP
# 强壮正则:支持 V4, V6 以及带有 [] 护甲的 V6 (兼容多 IP 站群机)
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\[\]\.]+$ ]]; then
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
# 严格探测物理网卡/虚拟 IP 存活状态,防止 IP 漂移导致探针彻底报错
if ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
# 恢复使用官方原生参数 -i不再进行徒劳的底层劫持
PROBE_ARGS+=("-i" "$RAW_BIND_IP")
# 智能识别 V4 / V6强制覆盖系统默认的 IP_PREF
if [[ "$RAW_BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="6"
elif [[ "$RAW_BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="4"
fi
fi
fi
# 补齐协议版本参数 (-4 或 -6)
PROBE_ARGS+=("-${DYNAMIC_IP_PREF}")
# 2. 智能拉取引擎 (官方主干优先防 RCE双栈 CDN 保底,外加文件防伪强校验)
PROBE_SCRIPT="/opt/ip_sentinel/core/ip_probe.sh"
# [校验 1] 验证本地残留脚本是否损坏 (防止之前被墙或拦截返回了 HTML 报错页)
if [ -f "$PROBE_SCRIPT" ] && ! grep -q "xykt" "$PROBE_SCRIPT" 2>/dev/null; then
rm -f "$PROBE_SCRIPT"
fi
if [ ! -s "$PROBE_SCRIPT" ]; then
# 🛡️ 首选防线: 严格遵守从 GitHub 官方主干拉取,捍卫纯净底线
curl -sL -m 10 "https://raw.githubusercontent.com/xykt/IPQuality/main/ip.sh" -o "$PROBE_SCRIPT" 2>/dev/null
# 🚑 文件防伪校验: 如果纯 V6 无法解析 GitHub 返回了 HTML 报错页,剔除它!
if ! grep -q "xykt" "$PROBE_SCRIPT" 2>/dev/null; then
rm -f "$PROBE_SCRIPT" 2>/dev/null
# 降级到双栈 CDN 节点兜底 (仅在 GitHub 彻底失效时启用)
curl -sL -m 15 "https://IP.Check.Place" -o "$PROBE_SCRIPT" 2>/dev/null
fi
chmod +x "$PROBE_SCRIPT" 2>/dev/null
fi
# ==========================================
# 3. 极速预检与容灾打靶系统
# ==========================================
# 封装链路预检函数 (4秒极速探路拒绝死等)
preflight_check() {
local curl_args=("-s" "-m" "4")
# 提取网卡和协议约束
for ((i=1; i<=$#; i++)); do
if [[ "${!i}" == "-i" ]]; then
local next=$((i+1))
curl_args+=("--interface" "${!next}")
elif [[ "${!i}" == "-4" ]]; then
curl_args+=("-4")
elif [[ "${!i}" == "-6" ]]; then
curl_args+=("-6")
fi
done
# 验证该路由设置是否能成功连通外部网络
curl "${curl_args[@]}" "https://www.cloudflare.com/cdn-cgi/trace" >/dev/null 2>&1
return $?
}
# 📡 寻路雷达:测定哪一组参数可以走通
FINAL_ARGS=()
if preflight_check "${PROBE_ARGS[@]}"; then
# 阶梯 0: 原定参数 (带 BIND_IP 和协议) 通畅
FINAL_ARGS=("${PROBE_ARGS[@]}")
else
# 阶梯 1: 剥离物理网卡限制,只保留协议限制
FALLBACK_ARGS=("-y" "-j" "-${DYNAMIC_IP_PREF}")
if preflight_check "${FALLBACK_ARGS[@]}"; then
FINAL_ARGS=("${FALLBACK_ARGS[@]}")
else
# 阶梯 2: 终极裸跑 (不限网卡,不限协议)
FINAL_ARGS=("-y" "-j")
fi
fi
# ==========================================
# 4. 终极实弹打靶
# ==========================================
# 此时 FINAL_ARGS 已经被证实是连通的,我们只执行 1 次 ip.sh
# 将超时放宽至 300 秒,给第三方 API (如 ipregistry) 充足的响应时间
RAW_OUTPUT=$(timeout 300 bash "$PROBE_SCRIPT" "${FINAL_ARGS[@]}" 2>/dev/null)
JSON_DATA="{${RAW_OUTPUT#*\{}"
ESC=$(printf '\033')
JSON_DATA=$(printf "%s" "$JSON_DATA" | sed -e "s/${ESC}\[[0-9;]*[a-zA-Z]//g" -e "s/${ESC}[0-9;]*[a-zA-Z]//g" -e "s/x1b\\[[0-9;]*[a-zA-Z]//g" -e "s/x1b[0-9;]*[a-zA-Z]//g")
IP_ADDR=$(echo "$JSON_DATA" | jq -r '.Head.IP // empty' 2>/dev/null)
if [ -z "$IP_ADDR" ]; then
curl -s -X POST "${TG_API_URL}" \
-d "chat_id=${CHAT_ID}" \
-d "parse_mode=Markdown" \
-d "text=❌ *深海声呐探测失败*
📍 节点:\`${NODE_ALIAS}\`
🌐 锁定IP\`${PUBLIC_IP}\`
⚠️ *未收到有效回波。检测源超时或数据解析受阻。*" >/dev/null
exit 1
fi
ASN=$(echo "$JSON_DATA" | jq -r '.Info.ASN // "Unknown"' 2>/dev/null)
ORG=$(echo "$JSON_DATA" | jq -r '.Info.Organization // "Unknown"' 2>/dev/null)
CITY=$(echo "$JSON_DATA" | jq -r '.Info.City.Name // "Unknown"' 2>/dev/null)
COUNTRY=$(echo "$JSON_DATA" | jq -r '.Info.Region.Name // "Unknown"' 2>/dev/null)
IP_TYPE=$(echo "$JSON_DATA" | jq -r '.Info.Type // "未知属性"' 2>/dev/null)
USAGE_TYPE=$(echo "$JSON_DATA" | jq -r '.Type.Usage.IPinfo // "未知场景"' 2>/dev/null)
# 3. 深度欺诈与信用评估 (各大权威库联查)
SCAM_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.SCAMALYTICS // "0"' 2>/dev/null)
ABUSE_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.AbuseIPDB // "0"' 2>/dev/null)
IPQS_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.IPQS // "0"' 2>/dev/null)
IP2L_SCORE=$(echo "$JSON_DATA" | jq -r '.Score.IP2LOCATION // "0"' 2>/dev/null)
FRAUD_RISK=$(echo "$JSON_DATA" | jq -r '.Score.ipapi // "0%"' 2>/dev/null)
# [修复] 清洗 API 阻断返回的 null 值,保障面板整洁
[ "$SCAM_SCORE" == "null" ] || [ -z "$SCAM_SCORE" ] && SCAM_SCORE="N/A"
[ "$ABUSE_SCORE" == "null" ] || [ -z "$ABUSE_SCORE" ] && ABUSE_SCORE="N/A"
[ "$IPQS_SCORE" == "null" ] || [ -z "$IPQS_SCORE" ] && IPQS_SCORE="N/A"
[ "$IP2L_SCORE" == "null" ] || [ -z "$IP2L_SCORE" ] && IP2L_SCORE="N/A"
[ "$FRAUD_RISK" == "null" ] || [ -z "$FRAUD_RISK" ] && FRAUD_RISK="N/A"
# 代理/VPN 特征探针 (只要有一家认为是代理,就亮黄灯)
IS_PROXY="🟢 干净"
if echo "$JSON_DATA" | jq -e '.Factor.Proxy | to_entries | any(.value == true)' >/dev/null 2>&1 || \
echo "$JSON_DATA" | jq -e '.Factor.VPN | to_entries | any(.value == true)' >/dev/null 2>&1; then
IS_PROXY="🟡 疑似代理/VPN"
fi
# 4. 提取流媒体与 AI 解锁指标 (带解锁类型)
parse_media() {
local status=$(echo "$JSON_DATA" | jq -r ".Media.$1.Status // \"未知\"" 2>/dev/null)
local reg=$(echo "$JSON_DATA" | jq -r ".Media.$1.Region // \"\"" 2>/dev/null)
local type=$(echo "$JSON_DATA" | jq -r ".Media.$1.Type // \"\"" 2>/dev/null)
if [[ "$status" == *"解锁"* ]]; then
echo "🟢 ${reg} (${type})"
elif [[ "$status" == *"仅"* ]] || [[ "$status" == *"机房"* ]] || [[ "$status" == *"待支持"* ]]; then
# 捕捉 Netflix "仅自制"、ChatGPT "仅网页"、TikTok "机房" 等半残状态
echo "🟡 ${status} ${reg}"
elif [[ "$status" == *"屏蔽"* ]] || [[ "$status" == *"失败"* ]] || [[ "$status" == *"中国"* ]] || [[ "$status" == *"禁"* ]]; then
# 捕捉 "屏蔽"、"失败"、"禁会员"、"中国"(送中)
echo "🔴 ${status}"
else
echo "${status}"
fi
}
NF_STAT=$(parse_media "Netflix")
YT_STAT=$(parse_media "Youtube")
DP_STAT=$(parse_media "DisneyPlus")
TK_STAT=$(parse_media "TikTok")
GPT_STAT=$(parse_media "ChatGPT")
APV_STAT=$(parse_media "AmazonPrimeVideo")
# 提取原生 JSON 里的原始状态用于底层隐写回传
RAW_NF_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Netflix.Status // "Unknown"' 2>/dev/null)
RAW_YT_REG=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Region // ""' 2>/dev/null)
RAW_YT_STAT=$(echo "$JSON_DATA" | jq -r '.Media.Youtube.Status // "Unknown"' 2>/dev/null)
# 5. 邮局连通性与黑名单
PORT25=$(echo "$JSON_DATA" | jq -r '.Mail.Port25 // "false"' 2>/dev/null)
[ "$PORT25" == "true" ] && P25_TEXT="✅ 畅通" || P25_TEXT="❌ 封堵"
DNS_BLACK=$(echo "$JSON_DATA" | jq -r '.Mail.DNSBlacklist.Blacklisted // "0"' 2>/dev/null)
DNS_MARK=$(echo "$JSON_DATA" | jq -r '.Mail.DNSBlacklist.Marked // "0"' 2>/dev/null)
# 6. “送中” 逻辑判定
WARNING_MSG=""
# [修复] 官方 JSON 已经去除了方括号,直接匹配 CN 或者状态包含中国
if [[ "$RAW_YT_REG" == "CN" ]] || [[ "$RAW_YT_STAT" == *"中国"* ]]; then
# [修复] 采用 Bash 扩展转义 ($'...'),彻底解决直接打印 \n 字符的问题
WARNING_MSG=$'\n🚨 **[高危] 该节点已被 Google 判定为中国大陆 (送中)**\n'
fi
# 7. 组装情报级 Markdown 战报
# 提取本地运行态版本与生成时间戳
LOCAL_VER="${AGENT_VERSION:-未知}"
# [时区对齐] 深海声呐战报落款强制采用绝对 UTC 时间
CURRENT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
# [体验修复] 探针返回的 IP 带有星号掩码,强制使用中枢下发的真实 IP 拼接,以防直达链接失效!
LINK_IP=$(echo "$PUBLIC_IP" | tr -d '[]')
REPORT="🎯 *IP-Sentinel 深海声呐报告*
📍 节点:\`${NODE_ALIAS}\`
🌐 地址:\`${IP_ADDR}\`${WARNING_MSG}
*🏢 物理身份与网络属性*
\`AS${ASN}\` | \`${ORG}\`
**定位:** \`${COUNTRY} - ${CITY}\`
**属性:** \`${IP_TYPE}\` | \`${USAGE_TYPE}\`
**探针:** ${IS_PROXY}
*🛡️ 欺诈雷达 (0为最优)*
• **Scamalytics:** \`${SCAM_SCORE}/100\`
• **AbuseIPDB:** \`${ABUSE_SCORE}/100\`
• **IPQS:** \`${IPQS_SCORE}/100\`
• **IP2Location:** \`${IP2L_SCORE}/100\`
• **IPAPI 风险率:** \`${FRAUD_RISK}\`
*🎬 核心业务解锁*
• **YouTube:** ${YT_STAT}
• **Netflix:** ${NF_STAT}
• **Disney+:** ${DP_STAT}
• **PrimeVideo:** ${APV_STAT}
• **TikTok:** ${TK_STAT}
• **ChatGPT:** ${GPT_STAT}
*✉️ 邮局与污染度*
• **25 端口出站:** ${P25_TEXT}
• **DNS 污染库:** 严重 \`${DNS_BLACK}\` | 轻微 \`${DNS_MARK}\`
_👉 [🔍 详细信用图谱直达 (Scamalytics)](https://scamalytics.com/ip/${LINK_IP})_
⏱️ \`${CURRENT_TIME}\` | ⚙️ \`v${LOCAL_VER}\`"
# [修复] 剥离显示层的 N/A确保传给 Master 趋势数据库的是纯数字 (无效则记为0)
SAFE_SCAM_SCORE=$(echo "$SCAM_SCORE" | tr -cd '0-9')
[ -z "$SAFE_SCAM_SCORE" ] && SAFE_SCAM_SCORE="0"
# [v4.0.2 扩容] 提取 Google(基于YouTube) 和 ChatGPT 的原生状态
RAW_GOOG_STAT="${RAW_YT_REG:-$RAW_YT_STAT}"
[ -z "$RAW_GOOG_STAT" ] && RAW_GOOG_STAT="未知"
RAW_GPT_STAT=$(echo "$JSON_DATA" | jq -r '.Media.ChatGPT.Status // "未知"' 2>/dev/null)
# [修复] 废除会导致中文 UTF-8 字节被劈裂(产生乱码 )的 awk 暴力截断。
# 原始状态文本极短(如"解锁"、"屏蔽"、"US"),只需洗掉隐形换行符即可安全传输。
S_GOOG=$(echo "$RAW_GOOG_STAT" | tr -d '\n\r ')
S_NF=$(echo "$RAW_NF_STAT" | tr -d '\n\r ')
S_GPT=$(echo "$RAW_GPT_STAT" | tr -d '\n\r ')
CB_DATA="svq|${NODE_NAME}|${SAFE_SCAM_SCORE}|${S_GOOG}|${S_NF}|${S_GPT}"
# 8. 挂载内联键盘并直送指挥部
JSON_PAYLOAD=$(jq -n \
--arg cid "$CHAT_ID" \
--arg txt "$REPORT" \
--arg cb "$CB_DATA" \
--arg cb_manage "manage:${NODE_NAME}" \
'{
chat_id: $cid,
text: $txt,
parse_mode: "Markdown",
disable_web_page_preview: true,
reply_markup: {
inline_keyboard: [
[{text: "📥 将本次体检录入趋势库", callback_data: $cb}],
[{text: "⚙️ 调出该节点控制台", callback_data: $cb_manage}]
]
}
}')
curl -s -X POST "${TG_API_URL}" -H "Content-Type: application/json" -d "$JSON_PAYLOAD" >/dev/null

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# ==========================================================
# 脚本名称: mod_trust.sh (IP 信用净化模块 - 动态锚点版)
# 脚本名称: mod_trust.sh (IP 信用净化模块 V3.1.4 拓扑自适应版)
# 核心功能: 动态扫描本地 LBS 冷数据,提取权威白名单,执行流量净化
# ==========================================================
@@ -11,7 +11,7 @@ UA_FILE="${INSTALL_DIR}/data/user_agents.txt"
# 你的 GitHub 仓库 Raw 数据直链前缀
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
# 临时改为私库地址用于测试
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
# 1. 基础环境校验
[ ! -f "$CONFIG_FILE" ] && exit 1
@@ -41,17 +41,12 @@ if [ ${#TRUST_URLS[@]} -eq 0 ]; then
TRUST_URLS=("https://en.wikipedia.org/wiki/Special:Random" "https://www.apple.com/" "https://www.microsoft.com/")
fi
# 3. 日志规范化 (v3.4.0 引入版本探针)
# 3. 日志规范化
log_msg() {
local TYPE=$1
local MSG=$2
# [时区对齐] 强制无视本地时区,以绝对 UTC 时间生成日志时间戳
local TIME=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
# [v3.4.0 核心] 提取当前配置中的版本锚点
local local_ver="${AGENT_VERSION:-未知}"
# 日志格式注入 [版本号] 追踪标识,保持对齐
echo "[$TIME] [v%-5s] [%-5s] [Trust ] [$REGION] $MSG" | sed "s/%-5s/$local_ver/;s/%-5s/$TYPE/" | tee -a "$LOG_FILE"
local TIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$TIME] [$TYPE] [Trust ] [$REGION] $MSG" | tee -a "$LOG_FILE"
}
# 4. 锁定单次会话指纹
@@ -64,8 +59,8 @@ if [ -f "$UA_FILE" ]; then
TOTAL_UA=${#UA_POOL[@]}
if [ "$TOTAL_UA" -gt 0 ]; then
# [v3.3.1修改] 优先使用固化的公网 IP 作为哈希种子,防止 NAT 节点指纹同质化
SEED=$(echo -n "${PUBLIC_IP:-${BIND_IP:-127.0.0.1}}" | cksum | awk '{print $1}')
# 以本地锁定的公网 IP (BIND_IP) 为种子计算 CRC32 哈希值
SEED=$(echo -n "${BIND_IP:-127.0.0.1}" | cksum | awk '{print $1}')
# 利用确定的种子,在全球 4000 的库中,计算出本机的 3 个绝对专属坐标
IDX1=$(( SEED % TOTAL_UA ))
@@ -100,21 +95,14 @@ CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
log_msg "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
CURL_BIND_OPT=""
else
CURL_BIND_OPT="--interface $BIND_IP"
# 智能探测:带冒号为 V6带点号为 V4
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)"
fi
CURL_BIND_OPT="--interface $BIND_IP"
# 智能探测:带冒号为 V6带点号为 V4
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($BIND_IP)"
fi
fi

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# ==========================================================
# 脚本名称: runner.sh (IP-Sentinel 主控调度引擎 - 动态锚点版)
# 脚本名称: runner.sh (IP-Sentinel 主控调度引擎 V2.0 智能分配版)
# 核心功能: 防并发延迟启动、功能开关(Feature Flag)自适应、多模块概率轮盘调度
# ==========================================================
@@ -15,42 +15,20 @@ if [ ! -f "$CONFIG_FILE" ]; then
fi
source "$CONFIG_FILE"
# ================== [新增: 文件排他锁,防止并发重入引发内存雪崩] ==================
exec 200>"/tmp/ip_sentinel_runner.lock"
if ! flock -n 200; then
echo "[$(date)] ⚠️ 上一轮巡逻任务尚未结束,本次触发自动取消。" >> "$LOG_FILE"
exit 0
fi
# ==================================================================================
# 2. 全局日志写入函数 (导出给子进程共享使用v3.4.0 引入版本探针)
# 2. 全局日志写入函数 (导出给子进程共享使用)
log() {
local module=$1
local level=$2
local msg=$3
# [v3.4.0 核心] 提取当前配置中的版本锚点
local local_ver="${AGENT_VERSION:-未知}"
# 保证日志目录存在
mkdir -p "${INSTALL_DIR}/logs"
# 日志格式注入 [版本号] 追踪标识
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$level" "$module" "$REGION_CODE" "$msg")
echo "[$(date -u '+%Y-%m-%d %H:%M:%S UTC')] $core_msg" >> "$LOG_FILE"
# 强制推送到 Systemd Journal (如果系统支持)
if command -v logger >/dev/null 2>&1; then
logger -t ip-sentinel "$core_msg"
else
# 降级输出到 stdout让 Systemd 捕获
echo "$core_msg"
fi
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [%-5s] [%-7s] [%s] %s\n" "$level" "$module" "$REGION_CODE" "$msg" >> "$LOG_FILE"
}
export -f log
export CONFIG_FILE INSTALL_DIR
# 3. 防僵尸网络特征 (Cron Jitter) - 核心隐蔽逻辑
# 配合每 20 分钟的调度周期,将随机休眠控制在 0 到 180 秒内,彻底打散全球并发请求
# 配合每 30 分钟的调度周期,将随机休眠控制在 0 到 180 秒内,彻底打散全球并发请求
if [ -t 1 ]; then
log "SYSTEM" "INFO " "💻 检测到人工终端干预,跳过静默休眠,立即执行任务!"
else
@@ -91,8 +69,7 @@ fi
if [ -n "$TARGET_MOD" ] && [ -x "${INSTALL_DIR}/core/${TARGET_MOD}" ]; then
log "SYSTEM" "INFO" "命中触发条件,加载并执行子模块: ${MOD_NAME}"
# 核心降耗逻辑:使用 nice -n 19 赋予进程最低 CPU 优先级,绝不抢占 VPS 正常业务的资源
# [安全修复] 注入 200>&-,强行关闭子进程对排他锁的继承权!防止子进程假死导致全局死锁
nice -n 19 bash "${INSTALL_DIR}/core/${TARGET_MOD}" 200>&-
nice -n 19 bash "${INSTALL_DIR}/core/${TARGET_MOD}"
else
log "SYSTEM" "ERROR" "配置了模块 ${MOD_NAME},但未找到对应的可执行脚本: ${TARGET_MOD}"
fi

73
core/tg_daemon.sh Executable file
View File

@@ -0,0 +1,73 @@
#!/bin/bash
# ==========================================================
# 脚本名称: tg_daemon.sh (Telegram 互动监听守护进程)
# 核心功能: 极低功耗长轮询监听 TG 指令,实现远程控制
# ==========================================================
INSTALL_DIR="/opt/ip_sentinel"
CONFIG_FILE="${INSTALL_DIR}/config.conf"
OFFSET_FILE="/tmp/ip_sentinel_tg_offset.txt"
# 1. 环境自检
[ ! -f "$CONFIG_FILE" ] && exit 1
source "$CONFIG_FILE"
# 如果没有配置 TG 机器人,则安静退出守护进程
[ -z "$TG_TOKEN" ] || [ -z "$CHAT_ID" ] && exit 0
# 2. 初始化消息偏移量 (Offset) 记录文件,防止重启后重复处理老消息
OFFSET=0
[ -f "$OFFSET_FILE" ] && OFFSET=$(cat "$OFFSET_FILE")
# 发送消息的快捷工具函数
send_msg() {
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d "chat_id=$CHAT_ID" -d "text=$1" -d "parse_mode=Markdown" > /dev/null
}
# 3. 核心守护循环 (无限长轮询监听)
# timeout=30 表示如果没有新消息,连接会挂起 30 秒才断开重连,极大地降低了系统资源消耗
while true; do
UPDATES=$(curl -s "https://api.telegram.org/bot${TG_TOKEN}/getUpdates?offset=${OFFSET}&timeout=30")
# 使用 jq 检查是否有新消息返回
COUNT=$(echo "$UPDATES" | jq -r '.result | length' 2>/dev/null)
if [[ "$COUNT" =~ ^[0-9]+$ ]] && [ "$COUNT" -gt 0 ]; then
for (( i=0; i<$COUNT; i++ )); do
UPDATE_ID=$(echo "$UPDATES" | jq -r ".result[$i].update_id")
MSG_CHAT_ID=$(echo "$UPDATES" | jq -r ".result[$i].message.chat.id")
MSG_TEXT=$(echo "$UPDATES" | jq -r ".result[$i].message.text")
# 【安全防御】严格权限验证:只响应你部署时填入的 Chat ID无视陌生人消息
if [ "$MSG_CHAT_ID" == "$CHAT_ID" ]; then
case "$MSG_TEXT" in
"/run")
send_msg "🚀 **[指令下达]** 正在后台立即触发 IP 养护任务..."
# 使用 nohup 另起后台独立进程运行,防止阻塞当前监听器的循环
nohup bash "${INSTALL_DIR}/core/mod_google.sh" >/dev/null 2>&1 &
;;
"/log")
LOG_DATA=$(tail -n 15 "${INSTALL_DIR}/logs/sentinel.log")
send_msg "📄 **[最近 15 行系统日志]**%0A\`\`\`log%0A${LOG_DATA}%0A\`\`\`"
;;
"/report")
# 触发生成一次战报
bash "${INSTALL_DIR}/core/tg_report.sh"
;;
"/help"|"/start")
HELP_MSG="🛡️ **IP-Sentinel 控制台**%0A/run - 立刻执行一次养护%0A/log - 抓取最新运行日志%0A/report - 手动生成统计简报"
send_msg "$HELP_MSG"
;;
esac
fi
# 记录处理完毕的 message ID下次请求从新的 ID 开始获取
OFFSET=$((UPDATE_ID + 1))
echo "$OFFSET" > "$OFFSET_FILE"
done
fi
# 基础安全延时,防止极端网络情况下的死循环吃光 CPU
sleep 2
done

View File

@@ -1,8 +1,8 @@
#!/bin/bash
# ==========================================================
# 脚本名称: tg_report.sh (Telegram 每日战报模块 - 动态锚点版)
# 核心功能: 适配 Feature Flag 架构,按需展示独立统计数据OTA 更新预警
# 脚本名称: tg_report.sh (Telegram 每日战报模块 V6.0 动态拼装版)
# 核心功能: 适配 Feature Flag 架构,按需展示 Google/Trust 独立统计数据
# ==========================================================
INSTALL_DIR="/opt/ip_sentinel"
@@ -18,53 +18,26 @@ if [ -z "$TG_TOKEN" ] || [ -z "$CHAT_ID" ]; then
exit 0
fi
# ================== [v4.0.8 核心: 防并发风暴与 60 秒冷却机制] ==================
LOCK_FILE="${INSTALL_DIR}/core/.report_lock"
if [ -f "$LOCK_FILE" ]; then
LAST_RUN=$(cat "$LOCK_FILE" 2>/dev/null)
NOW=$(date +%s)
# 校验 LAST_RUN 是否为有效数字,并比对 60 秒冷却期
if [[ "$LAST_RUN" =~ ^[0-9]+$ ]]; then
if [ $((NOW - LAST_RUN)) -lt 60 ]; then
echo "[$(date -u '+%Y-%m-%d %H:%M:%S UTC')] [v${AGENT_VERSION:-未知}] [WARN ] [Report ] [SYSTEM] ⚠️ 战报请求过于频繁,触发 60 秒防并发风暴拦截。" >> "${INSTALL_DIR}/logs/sentinel.log"
exit 0
fi
fi
fi
echo $(date +%s) > "$LOCK_FILE"
# ==============================================================================
# 2. 节点元数据抓取 (v3.2.2 协议自适应与多级容灾版)
# [v3.5.2 核心: 引入双轨身份架构]
if [ -z "$NODE_NAME" ]; then
IP_HASH=$(echo "${PUBLIC_IP:-127.0.0.1}" | md5sum | cut -c 1-4 | tr 'a-z' 'A-Z')
NODE_NAME="$(hostname | cut -c 1-10)-${IP_HASH}"
fi
NODE_ALIAS="${NODE_ALIAS:-$NODE_NAME}"
NODE_NAME=$(hostname | cut -c 1-15)
# --- [防线 1: 底层路由锁定与协议自适应] ---
CURL_BIND_OPT=""
DYNAMIC_IP_PREF="-${IP_PREF:-4}"
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
CURL_BIND_OPT=""
else
CURL_BIND_OPT="--interface $BIND_IP"
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
fi
CURL_BIND_OPT="--interface $BIND_IP"
if [[ "$BIND_IP" == *":"* ]]; then
DYNAMIC_IP_PREF="-6"
elif [[ "$BIND_IP" == *"."* ]]; then
DYNAMIC_IP_PREF="-4"
fi
fi
# 多节点容灾探测出口 IP (注入协议自适应)
CURRENT_IP=$( (curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -s -m 5 api.ip.sb/ip || curl $CURL_BIND_OPT $DYNAMIC_IP_PREF -s -m 5 ifconfig.me) 2>/dev/null | tr -d '[:space:]' )
# [v3.3.1 修改] 强制兜底:如果外部 API 挂了,优先使用固化的对外公网面孔 (兼容 NAT 机的空 BIND_IP)
[ -z "$CURRENT_IP" ] && CURRENT_IP="${PUBLIC_IP:-$BIND_IP}"
# 强制兜底:如果所有外部 API 挂了,直接使用本地强行锁定的 BIND_IP
[ -z "$CURRENT_IP" ] && CURRENT_IP="$BIND_IP"
# 为可能获取到的 IPv6 自动添加方括号护甲
[[ "$CURRENT_IP" == *":"* ]] && [[ "$CURRENT_IP" != *"["* ]] && CURRENT_IP="[${CURRENT_IP}]"
@@ -108,18 +81,17 @@ case "$REGION_CODE" in
"SG") FLAG="🇸🇬" ;;
"HK") FLAG="🇭🇰" ;;
"GB"|"UK") FLAG="🇬🇧" ;;
"AU") FLAG="🇦🇺" ;;
*) FLAG="🌐" ;;
esac
# 3. 截取过去 24 小时的日志 (每天72次轮询保留最新 1000 行足以覆盖单日战报)
LOG_CONTENT=$(tail -n 1000 "$LOG_FILE" 2>/dev/null)
# 3. 截取过去 24 小时的日志
LOG_CONTENT=$(find "$LOG_FILE" -mtime -1 -exec cat {} \; 2>/dev/null)
if [ -z "$LOG_CONTENT" ]; then
read -r -d '' MSG <<EOT
🛑 **[IP-Sentinel] 告警:节点异常**
----------------------------
📍 **节点名称**: \`${NODE_ALIAS}\`
📍 **节点名称**: \`${NODE_NAME}\`
⚠️ **警告**: 过去 24 小时无运行日志!
🛠️ **建议**: 节点可能刚部署完毕,请在面板手动执行一次养护动作。
EOT
@@ -137,7 +109,7 @@ else
# 开始组装战报头部
MSG="📊 **IP-Sentinel 每日简报 (${FLAG} ${REGION_NAME})**
----------------------------
📍 **节点名称**: \`${NODE_ALIAS}\`
📍 **节点名称**: \`${NODE_NAME}\`
📡 **出口 IP**: \`${CURRENT_IP}\`
🛡️ **IP 属性**: ${IP_TYPE}"
@@ -180,67 +152,18 @@ else
MSG="$MSG
🕒 **最近执行快照 [${LAST_MOD:-"System"}]:**
时间: ${LAST_TIME:-"暂无数据"} (节点本地)
结论: ${LAST_SCORE:-"暂无数据"}"
fi
# ==========================================
# 5. [核心: OTA 云端版本探针与告警模块]
# ==========================================
# 从配置文件提取当前本地版本,若无则默认为未知
LOCAL_VER="${AGENT_VERSION:-未知}"
# [时区对齐] 强制获取当前绝对 UTC 时间,作为全局统一的战报落款
REPORT_UTC_TIME=$(date -u "+%Y-%m-%d %H:%M:%S UTC")
# 极轻量级探针: 抓取 GitHub 云端的 version.txt (超时 3 秒KV解析法)
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
REMOTE_VER=$(curl -s -m 3 "${REPO_RAW_URL}/version.txt" | grep "^AGENT_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
# 构建底部引擎状态块
MSG="$MSG
时间: ${LAST_TIME:-"暂无数据"}
结论: ${LAST_SCORE:-"暂无数据"}
----------------------------
🛡️ **系统引擎状态**
⏱️ 战报生成: \`${REPORT_UTC_TIME}\`
当前运行版本: \`v${LOCAL_VER}\`"
💡 哨兵正在后台默默守护您的资产。"
# 比对逻辑:如果成功抓到了远端版本,且和本地不一样
if [ -n "$REMOTE_VER" ] && [ "$REMOTE_VER" != "$LOCAL_VER" ]; then
MSG="$MSG
最新官方版本: \`v${REMOTE_VER}\` (✨有新版)
💡 *系统提示:检测到新版引擎,建议通过控制台执行 OTA 热更新!*"
elif [ -n "$REMOTE_VER" ] && [ "$REMOTE_VER" == "$LOCAL_VER" ]; then
MSG="$MSG
最新官方版本: \`v${REMOTE_VER}\` (✅已是最新)
💡 *IP-Sentinel 持续为您守护节点。若本项目对您有帮助,欢迎前往 GitHub 赐予 🌟*"
else
# 抓取失败兜底
MSG="$MSG
💡 *IP-Sentinel 持续为您守护节点。若本项目对您有帮助,欢迎前往 GitHub 赐予 🌟*"
fi
# 5. 调用 API 推送 (接入安全网关,挂载控制台按钮与 GitHub 引流)
JSON_PAYLOAD=$(jq -n \
--arg cid "$CHAT_ID" \
--arg txt "$MSG" \
--arg cb "manage:${NODE_NAME}" \
--arg repo_url "https://github.com/hotyue/IP-Sentinel" \
'{
chat_id: $cid,
text: $txt,
parse_mode: "Markdown",
disable_web_page_preview: true,
reply_markup: {
inline_keyboard: [
[{"text": "⚙️ 调出该节点控制台", "callback_data": $cb}],
[{"text": "🌟 前往 GitHub 仓库点亮星标", "url": $repo_url}]
]
}
}')
# 5. 调用 API 推送 (接入安全网关)
RESPONSE=$(curl -s -m 10 -X POST "${TG_API_URL}" \
-H "Content-Type: application/json" \
-d "$JSON_PAYLOAD")
-d "chat_id=${CHAT_ID}" \
-d "text=${MSG}" \
-d "parse_mode=Markdown")
if [[ "$RESPONSE" != *"\"ok\":true"* ]]; then
echo "❌ 战报发送失败API 响应: $RESPONSE" >> "${INSTALL_DIR}/logs/error.log"

View File

@@ -1,97 +1,47 @@
#!/bin/bash
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 - 动态锚点版)
# ==========================================================
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 V3.1.4 焦土版)
# 核心功能: 无痕清理守护进程、定时任务、运行目录及临时缓存
# ==========================================================
# ==========================================================
# 🛑 核心权限防线: 检查是否以 root 权限运行
# ==========================================================
if [ "$EUID" -ne 0 ]; then
echo -e "\033[31m❌ 权限被拒绝: 卸载 IP-Sentinel 需要最高系统权限。\033[0m"
echo -e "💡 请切换到 root 用户 (执行 su root 或 sudo -i) 后重新运行指令。"
exit 1
fi
INSTALL_DIR="/opt/ip_sentinel"
echo "========================================================"
echo " 🗑️ 准备卸载 IP-Sentinel (边缘节点 Edge Agent)"
# [核心: 动态读取并播报即将销毁的本地版本号]
CONFIG_FILE="${INSTALL_DIR}/config.conf"
if [ -f "$CONFIG_FILE" ]; then
CURRENT_VER=$(grep "^AGENT_VERSION=" "$CONFIG_FILE" | cut -d'"' -f2)
[ -n "$CURRENT_VER" ] && echo " 📍 目标版本: v${CURRENT_VER}"
fi
echo "========================================================"
# 1. 停止并删除 Systemd 服务 (适配新架构)
echo "[1/4] 正在停止并删除 Systemd 服务..."
if command -v systemctl >/dev/null 2>&1; then
echo "💡 检测到 Systemd 环境,正在抹除 Systemd 服务单元..."
# [防死锁与走火修复] 先发送 SIGKILL 瞬间抹杀常驻守护进程,防止卡死或触发遗言
systemctl kill --signal=SIGKILL ip-sentinel-agent-daemon.service >/dev/null 2>&1 || true
systemctl disable --now ip-sentinel-runner.service ip-sentinel-runner.timer \
ip-sentinel-updater.service ip-sentinel-updater.timer \
ip-sentinel-report.service ip-sentinel-report.timer \
ip-sentinel-agent-daemon.service >/dev/null 2>&1
rm -f /etc/systemd/system/ip-sentinel-runner.service
rm -f /etc/systemd/system/ip-sentinel-runner.timer
rm -f /etc/systemd/system/ip-sentinel-updater.service
rm -f /etc/systemd/system/ip-sentinel-updater.timer
rm -f /etc/systemd/system/ip-sentinel-report.service
rm -f /etc/systemd/system/ip-sentinel-report.timer
rm -f /etc/systemd/system/ip-sentinel-agent-daemon.service
systemctl daemon-reload
systemctl reset-failed
else
echo "💡 未检测到 Systemd跳过此步骤..."
fi
# 1. 停止运行中的守护进程与主控模块 (涵盖所有历史版本进程)
echo "[1/3] 正在终止后台守护进程与所有养护任务..."
# 2. 停止运行中的守护进程与主控模块 (兜底清理老版进程)
echo "[2/4] 正在终止后台守护进程与所有养护任务..."
# 使用 pkill 替代传统的 pgrep | xargs指令更短、容错率更高
pkill -9 -f "tg_daemon.sh" >/dev/null 2>&1
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1
pkill -9 -f "python3.*webhook.py" >/dev/null 2>&1
pkill -9 -f "webhook.py" >/dev/null 2>&1
pkill -9 -f "runner.sh" >/dev/null 2>&1
pkill -9 -f "updater.sh" >/dev/null 2>&1
pkill -9 -f "tg_report.sh" >/dev/null 2>&1
pkill -9 -f "mod_google.sh" >/dev/null 2>&1
pkill -9 -f "mod_trust.sh" >/dev/null 2>&1
pkill -9 -f "sentinel_scheduler.sh" >/dev/null 2>&1
# 3. 清除系统定时任务 (Cron)
echo "[3/4] 正在清理系统定时任务 (Cron)..."
# [终极安全防御] 直接使用管道流过滤并覆盖,不产生任何 /tmp 落地文件,杜绝劫持提权
crontab -l 2>/dev/null | grep -v "ip_sentinel" | crontab - >/dev/null 2>&1 || true
# ==========================================
# 🛑 [物理抹除] 彻底扫除 Alpine 系统的底层残留与双路径文件
# ==========================================
for CRON_FILE in "/var/spool/cron/crontabs/root" "/etc/crontabs/root"; do
if [ -f "$CRON_FILE" ]; then
grep -v "ip_sentinel" "$CRON_FILE" > "${CRON_FILE}.tmp" 2>/dev/null || true
cat "${CRON_FILE}.tmp" > "$CRON_FILE" 2>/dev/null || true
rm -f "${CRON_FILE}.tmp" 2>/dev/null
fi
done
# 清理 OpenRC 开机启动项
rm -f /etc/local.d/ip_sentinel.start 2>/dev/null
rm -f /etc/local.d/ip_sentinel_scheduler.start 2>/dev/null
# 清理极端环境写在 /etc/profile 里的兜底启动项
if grep -q "sentinel_scheduler.sh" /etc/profile 2>/dev/null; then
sed -i '/sentinel_scheduler\.sh/d' /etc/profile 2>/dev/null || true
# 2. 清除系统定时任务 (Cron)
echo "[2/3] 正在清理系统定时任务 (Cron)..."
if crontab -l >/dev/null 2>&1; then
crontab -l | grep -v "ip_sentinel" > /tmp/cron_backup
crontab /tmp/cron_backup
rm -f /tmp/cron_backup
fi
# 4. 删除所有文件、日志与临时缓存
echo "[4/4] 正在抹除核心程序、配置文件与系统痕迹..."
# 3. 删除所有文件、日志与临时缓存
echo "[3/3] 正在抹除核心程序、配置文件与系统痕迹..."
if [ -d "$INSTALL_DIR" ]; then
rm -rf "$INSTALL_DIR"
fi
# 拔除 /tmp 目录下的所有更新下载临时文件和 V1/V2 遗留的偏移量记录
rm -f /tmp/ip_sentinel_*.txt
rm -f /tmp/ip_sentinel_*.json
echo "========================================================"
echo "✅ 卸载彻底完成IP-Sentinel 已从您的系统中无痕移除。"
echo "💡 提示:如果安装时在防火墙放行了 Webhook 随机端口,请您按需手动关闭。"

View File

@@ -1,18 +1,16 @@
#!/bin/bash
# ==========================================================
# 脚本名称: updater.sh (IP-Sentinel 养料注入与分频调度中枢 - 动态锚点版)
# 核心功能: 静默更新热数据/LBS、指纹库错峰调度、强制出站死锁、版本无缝继承
# 脚本名称: updater.sh (IP-Sentinel V3.1.4 养料注入与维护中枢)
# 核心功能: 静默更新热数据(指纹/词库/LBS规则)、清理瘦身日志
# ==========================================================
INSTALL_DIR="/opt/ip_sentinel"
CONFIG_FILE="${INSTALL_DIR}/config.conf"
UA_TIME_FILE="${INSTALL_DIR}/core/.ua_last_update"
# GitHub 仓库 Raw 数据直链前缀
# 你的 GitHub 仓库 Raw 数据直链前缀 (统一标准)
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
# 临时改为开发地址用于测试
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
# 临时改为私库地址用于测试
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
# 1. 加载本地冷数据配置
if [ ! -f "$CONFIG_FILE" ]; then
@@ -20,139 +18,57 @@ if [ ! -f "$CONFIG_FILE" ]; then
fi
source "$CONFIG_FILE"
# 2. 全局日志写入函数 (v3.4.0 引入版本探针)
# 2. 全局日志写入函数
log() {
# [v3.4.0 核心] 提取当前配置中的版本锚点
local local_ver="${AGENT_VERSION:-未知}"
# 保证日志目录存在
mkdir -p "${INSTALL_DIR}/logs"
# 日志格式注入 [版本号] 追踪标识
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$2" "$1" "$REGION_CODE" "$3")
# [时区对齐] 强制无视本地时区,以绝对 UTC 时间写入日志
echo "[$(date -u '+%Y-%m-%d %H:%M:%S UTC')] $core_msg" >> "$LOG_FILE"
# 强制推送到 Systemd Journal (如果系统支持)
if command -v logger >/dev/null 2>&1; then
logger -t ip-sentinel "$core_msg"
else
# 降级输出到 stdout让 Systemd 捕获
echo "$core_msg"
fi
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [%-5s] [%-7s] [%s] %s\n" "$2" "$1" "$REGION_CODE" "$3" >> "$LOG_FILE"
}
log "Updater" "INFO " "========== 触发后台静默 OTA 热数据更新 =========="
# ==========================================================
# 🛡️ 终极护城河:构建强锚定出站的 curl 请求引擎
# ==========================================================
# 基础参数:跟随 install.sh 锁定的协议偏好 (4 或 6)
CURL_CMD="curl -${IP_PREF:-4} -sL"
# 【防坑核心】如果用户配置了死锁锚点,必须强制绑定网卡,杜绝流量溢出!
if [ -n "$BIND_IP" ]; then
# curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
# [v3.6.3 容错层补丁] 探测网卡存活状态,防止 IP 漂移导致永久断网
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
log "Updater" "WARN " "检测到绑定的出口 IP ($RAW_BIND_IP) 已丢失,自动退回默认路由!"
else
CURL_CMD="$CURL_CMD --interface $RAW_BIND_IP"
fi
fi
# ==========================================================
# 3. 容灾机制拉取 UA 指纹池 (V3.3.0 引入 30 天错峰防惊群逻辑)
# ==========================================================
NOW=$(date +%s)
LAST_UPDATE=0
# 读取上一次更新的时间戳
if [ -f "$UA_TIME_FILE" ]; then
# tr -d 清除可能存在的换行或回车符,防止算术崩溃
LAST_UPDATE=$(cat "$UA_TIME_FILE" | tr -d '\r\n')
fi
# 校验数据合法性,防崩溃
if ! [[ "$LAST_UPDATE" =~ ^[0-9]+$ ]]; then
LAST_UPDATE=0
fi
DIFF=$((NOW - LAST_UPDATE))
# 距离上次拉取超过 30 天 (2592000 秒),才执行下载
if [ "$DIFF" -ge 2592000 ] || [ "$LAST_UPDATE" -eq 0 ]; then
TMP_UA="/tmp/ip_sentinel_ua.txt"
# 使用重装升级后的 CURL_CMD
$CURL_CMD "${REPO_RAW_URL}/data/user_agents.txt" -o "$TMP_UA"
if [ -s "$TMP_UA" ]; then
mv "$TMP_UA" "${INSTALL_DIR}/data/user_agents.txt"
echo "$NOW" > "$UA_TIME_FILE"
log "Updater" "INFO " "✅ 设备指纹池 (User-Agents) 30天错峰滚动更新成功"
else
log "Updater" "WARN " "❌ UA 池拉取失败,保留本地旧数据防崩溃"
rm -f "$TMP_UA"
fi
# 3. 容灾机制拉取 UA 指纹池 (强制遵循锚点协议)
TMP_UA="/tmp/ip_sentinel_ua.txt"
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/data/user_agents.txt" -o "$TMP_UA"
if [ -s "$TMP_UA" ]; then
mv "$TMP_UA" "${INSTALL_DIR}/data/user_agents.txt"
log "Updater" "INFO " "✅ 设备指纹池 (User-Agents) 更新成功"
else
DAYS_LEFT=$(((2592000 - DIFF) / 86400))
log "Updater" "INFO " "⏳ 设备指纹池处于 30 天静默期 (剩余约 ${DAYS_LEFT} 天),跳过拉取"
log "Updater" "WARN " "❌ UA 池拉取失败,保留本地旧数据防崩溃"
rm -f "$TMP_UA"
fi
# ==========================================================
# 4. 容灾机制拉取当地最新搜索词库 (每日高频拉取,保证活体新鲜度)
# ==========================================================
# 4. 容灾机制拉取当地最新搜索词库
TMP_KW="/tmp/ip_sentinel_kw.txt"
$CURL_CMD "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "$TMP_KW"
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "$TMP_KW"
if [ -s "$TMP_KW" ]; then
mv "$TMP_KW" "${INSTALL_DIR}/data/keywords/kw_${REGION_CODE}.txt"
log "Updater" "INFO " "✅ 区域搜索词库 (kw_${REGION_CODE}) 每日同步成功"
log "Updater" "INFO " "✅ 区域搜索词库 (kw_${REGION_CODE}) 更新成功"
else
log "Updater" "WARN " "❌ 搜索词库拉取失败,保留本地旧数据防崩溃"
rm -f "$TMP_KW"
fi
# ==========================================================
# 5. 自适应拉取本地 LBS 专属 JSON 规则库 (每日同步)
# ==========================================================
# 5. 【V3.1.4 核心升级】自适应拉取本地 LBS 专属 JSON 规则库
# 利用 find 穿透寻找本地唯一的 json
REGION_JSON_FILE=$(find "${INSTALL_DIR}/data/regions" -name "*.json" 2>/dev/null | head -n 1)
if [ -n "$REGION_JSON_FILE" ] && [ -f "$REGION_JSON_FILE" ]; then
# 提取本地文件的相对路径 (例如: data/regions/US/CA/San_Jose.json)
REL_PATH=${REGION_JSON_FILE#*${INSTALL_DIR}/}
TMP_JSON="/tmp/ip_sentinel_region.json"
$CURL_CMD "${REPO_RAW_URL}/${REL_PATH}" -o "$TMP_JSON"
# 按照相同的相对路径去云端拉取更新
curl -${IP_PREF:-4} -sL "${REPO_RAW_URL}/${REL_PATH}" -o "$TMP_JSON"
if [ -s "$TMP_JSON" ]; then
mv "$TMP_JSON" "$REGION_JSON_FILE"
log "Updater" "INFO " "✅ 核心战区规则库 ($REL_PATH) 每日同步成功"
log "Updater" "INFO " "✅ 核心战区规则库 ($REL_PATH) 更新成功"
else
log "Updater" "WARN " "❌ 战区规则库拉取失败,保留本地旧数据"
rm -f "$TMP_JSON"
fi
fi
# ==========================================================
# 5.5. 容灾更新深海声呐底层探针 (彻底消除第三方 RCE 依赖)
# ==========================================================
TMP_PROBE="/tmp/ip_sentinel_probe.sh"
$CURL_CMD "https://raw.githubusercontent.com/xykt/IPQuality/main/ip.sh" -o "$TMP_PROBE"
# 🛡️ 供应链防毒:验证脚本内是否包含原作者特有签名,防止被墙重定向为 HTML
if [ -s "$TMP_PROBE" ] && grep -q "xykt" "$TMP_PROBE" 2>/dev/null; then
mv "$TMP_PROBE" "${INSTALL_DIR}/core/ip_probe.sh"
chmod +x "${INSTALL_DIR}/core/ip_probe.sh"
log "Updater" "INFO " "✅ 深海声呐底层探针 (ip_probe.sh) 源文件安全对齐"
else
log "Updater" "WARN " "❌ 探针源文件拉取受损或遭投毒劫持,已触发防砖机制,保留本地旧版本"
rm -f "$TMP_PROBE" 2>/dev/null
fi
# ==========================================================
# 6. 日志防满瘦身机制 (保留最近 2000 行)
# ==========================================================
if [ -f "$LOG_FILE" ]; then
tail -n 2000 "$LOG_FILE" > "${LOG_FILE}.tmp"
mv "${LOG_FILE}.tmp" "$LOG_FILE"

View File

@@ -1,200 +0,0 @@
vera wang 2026 met gala
power outage
milton fire
gws name change
mike wells
eta aquarids meteor shower
f1 news
sony playstation lawsuit
teams
jarred vanderbilt
kane cornes
peter daicos
chris phelan
diana, princess of wales
wesfarmers
anz class action lawsuit outcome
negative gearing
christian horner
craig silvey
nepal vs oman
shane flanagan
james hopes
budget
teacher
nick foot
the rookie the bandit
deine mariner
nate caddy
cairns post
rba
nyt strands hints
product recall
sharks vs tigers
siosifa talakai
sydney vs melbourne
brodie grundy
nba jayson tatum
australia world athletics relays record
kimi antonelli miami penalty
mitchell freeway crash
roosters vs broncos
bondi beach
tai tuivasa
ufc
auckland fc vs melbourne city fc
quillan salkilld
austin reaves
carlton vs st kilda
fijian drua vs highlanders
tasmania may temperature records
colorectal cancer
bulldogs vs cowboys
the sheep detectives
dolphins vs storm
airline
gta6
mike conley
home battery rebate
nba playoff bracket
rudy gobert
sam burgess
archibald prize 2026 finalists
kyle sandilands broadcasting return
dp world tour
alperen şengün
paramedic stabbed
marwan rahiki
weather perth
david allan coe
la lakers
jarome luai png chiefs
gauche
keith urban daughter instagram unfollow
sarah ferguson
one championship
parafield airport
ai bubble
tony burke
professor richard scolyer
san antonio spurs vs portland trail blazers match player stats
prince harry working royal
retirement
rebate
denver nuggets
driver's license
nuggets
jessica biel justin timberlake ultimatum
qatar
thales
destroyer
nrl news latrell mitchell
heavy snow warning
the rookie dead ringer
ducks vs oilers
ivan soldo
uae vs oman
cheryl hines
deandre ayton
real estate market
weather brisbane
raptors vs cavaliers
galatasaray
multan sultans vs islamabad united
galatasaray vs fenerbahçe
torino vs inter
hearts fc
scottish premier league
mohsin khan
angkrish raghuvanshi
psl
magic vs pistons
celtic fc
peshawar zalmi vs lahore qalandars
angers vs psg
la liga
prem
premier league table
epl fixtures
premier league games
alex de minaur
sunderland vs nottm forest
real betis vs real madrid
sai sudharsan
jannik sinner
gt vs rcb
amd stock
carey mulligan
jermaine jackson
hulk hogan
coles
elon musk
ben roberts-smith
ig
danish malewar
assassin's creed black flag resynced
sarfaraz khan
kartik sharma
instagram stories not working
meningococcal b
sundaresh menon
thunder vs suns
cade cunningham
real salt lake vs inter miami
pope francis
camera
anzac
kids news
bonds
hung cao
classroom
michael jackson biopic movie
india women vs south africa women
nato
bayern munich
barcelona vs celta vigo
bournemouth vs leeds
leverkusen vs bayern
burnley vs man city
elche vs atlético madrid
lsg vs rr
pakistan super league
kyle sandilands alleged rant jackie o
carrie bickmore
adam levine
alexandra eala
tubi
charles melton
nuclear weapon
janet jackson
justin bieber australia tour
fleche wallonne 2026
ange postecoglou
john hattie
airbus a380
real madrid vs alavés
brighton vs chelsea
woolworth
nitish rana
lyrid meteor shower
世界地球日
youth gang
earth day
crystal palace vs west ham
d4vd
mi vs gt
perth weather
elijah hollands carlton football club
fair work commission fuel
vanguard
sydney sweeney
cailee spaeny
psg vs lyon
sporting vs benfica
celtics vs 76ers
bundesliga
pl
afc cup
mars rover
bayern vs vfb stuttgart
bom radar

View File

@@ -1,200 +0,0 @@
vancouver news
bc hydro
paul mccartney
salman khan
dario amodei
randy jackson health
cape breton hiker search
angelina jolie
meteor shower 2026
national emergency alert system test
mitch marner
daisy edgar jones
jackson lacombe
nepal vs oman
naz reid
christopher nolan
jelly roll
明天的天氣
lakers vs okc
julius randle
mamata banerjee
aaj tak
star wars
oil
내일 날씨
johnston canyon
aaj tak live
mats zuccarello
paris jackson
atlas - cruz azul
cruz azul
jake paul
lafc vs san diego fc
micheal jackson
aziz ansari
downtown toronto power outage today
matt damon
seattle mariners
fraud
margot robbie
steve erceg
hacks
jabari smith jr.
ringo starr
patton oswalt
pavel talankin oscar
bmo marathon
jack della maddalena
b
adam scott
canada immigration news
bruce cassidy
nugent hopkins
nhl playoff bracket
nepal vs uae
dostal
vasily podkolzin
nh
lebron james
carter hart
rachel kerr missing
lena dunham
utah
kailer yamamoto
deandre ayton
clayton keller
jack white
keanu reeves
danielle smith
workday
jermaine jackson
prada
next oilers game
anaheim ducks coach
dhurandhar 2
bchl
from tv series
whl
shea theodore
nikola jokić
mark stone
cameron johnson
dea
dylan guenther
jamal murray
euphoria cast
mlb bo bichette
edmonton news
radko gudas
jeffrey viel
boat
joel quenneville
evan bouchard
jada wallace
oilers
boston bruins
patrick corbin
avs vs sporting
peyton krebs
elena rybakina
shane doan
ja'kobe walter
radio-canada
golf
hurricanes vs senators
al ahli
the white house
turkish airlines
fa cup games
atlético madrid vs athletic club
tyree wilson
monic néron
nvidia
aryna sabalenka
lpga leaderboard
randy travis
execution by firing squad
nelly korda
leicester city vs millwall
asteroid
sunderland vs nottm forest
real betis vs real madrid
betis real madrid
napoli vs cremonese
gta 6
japon
padres vs rockies
guide de la révolution de l'iran
casa pia vs braga
denaturalization
ocean
alberta referendum
vfb stuttgart vs sc freiburg
gpt 5.5
noah cates
pwhl scores
hank idsinga
karoline leavitt
ottawa charge
million dollar secret
white sox vs diamondbacks
suns vs thunder
stars vs wild
jaafar jackson
airport
grand theft auto vi
pentagone
etats unis
monette farms news
jose soriano
jon cooper
barcelona vs celta vigo
764
david scott
rodrigo duterte
u18 world championship
zara tindall
graham platner
lsg vs rr
nikki glaser
global news edmonton
policier
nuclear weapon
motorcycle
msc francesca
poet stock
fifa tickets
7 jours
alexandra eala
earth
zara larsson
girona vs real betis
kevyn adams
ali khamenei
inter côme
leicester city vs hull
fenerbahçe
françois bonnardel
missile
real madrid vs alavés
vrabel and russini photos
will trent
ibm
lecce vs fiorentina
celeste rivas hernandez
abhishek bachchan
national guard of the united states
triathlon
vincent trocheck
benyamin netanyahou
kings vs avalanche
crème solaire
trabzonspor vs istanbul başakşehir
indigenous rights
meghan, duchess of sussex
gwyneth paltrow
toronto gas prices
président
mets vs cubs
matt fitzpatrick

View File

@@ -1,200 +1,10 @@
novo nordisk
daimler truck
we
angelina jolie
westfalia rhynern
rosenheim24
oliver zipse
eisheiligen 2026
finanztrends
wetter lübeck
gracie abrams
dolly parton
connor storrie
wetter
wetter bamberg
wetter kassel
venus
newcastle-krankheit
wetter ulm
wetter erlangen
west bengal election 2026
gamestop
american water works company
tesla roadster
bengal election 2026
arnold schwarzenegger
star wars tag
united states army
republikanische partei
omr 2026
rezession
franz wagner
la galaxy whitecaps
kuba
frankreich
wetter mannheim
spacex
hurricanes flyers
audi in der formel 1
hornissen
lindsey vonn
spirit airlines
bruins sabres
mammoth golden knights
chiemgau24
usa donald trump
rentenbescheid24
goodbye deutschland marie heidtke
vinicius junior
gntm wer ist raus heute
atlassian aktie
vietnam
haben bäckereien am 1 mai geöffnet
1 mai veranstaltungen in der nähe
warum ist der 1 mai ein feiertag
brenntag
tagesspiegel
wild stars
maifeiertag
stefan hartung
mckinsey & company
the taste promi wer ist raus
fc bayern münchen champions league
danny ramirez
claudia major
peter wohlleben
heizungsgesetz
jerome powell
joko & klaas gegen prosieben
swr aktuell baden-württemberg
rettungshubschrauber
lebensmittelwarnung.de
julia ruhs
vw id polo
warburg
elon musk
diablo 4 warlock build
wirtschaft
фридрих мерц
zdf-fernsehgarten
halberstadt
cathie wood
fabian güstrow
spencer jones
jean alesi
hilary duff
nhl playoffs
msci
1. mai
ronnie osullivan
loris karius
koningsdag 2026
ryan reynolds
julia stiles
saïd el mala
tag der arbeit
gesundheitspolitik
der bergdoktor
bulgarien
george clooney
jork
star citizen
donau
krassnitzer harald
buxtehude
chernobyl
avs sporting
running point
darmstadt
dahoam is dahoam
أتلتيكو مدريد ضد أتلتيك بيلباو
atlético madryt ath. bilbao
portugal
erling haaland
galatasaray fenerbahce
anna carina woitschack
nord bei nordwest
wil wheaton
christian lindner
kevin costner
samu haber
gillian anderson
peggy jerofke
rafael jódar
ernie dosio
bibi heinicke
denia
der alte blaue stunde
matthias ginter
ralf schmitz
maximilian eggestein
hull city
demirovic
elton john
jeff chabot
lindt schokolade
manzambi
angelo stiller
lamine yamal verletzung
peer steinbrück
h&m
lotto 6aus49
pistons magic
chemnitzer fc erzgebirge aue
asiago
23 nisan
sternschnuppen heute lyriden
aryna sabalenka
michael douglas
herman van veen
georgina fleur
tui
trainer bayern münchen
katie holmes
prinz frederic
bayern vs
flekken
бернли манчестер сити
ard
queen camilla
clankriminalität
politik
gladbach-news
sara gündogan
krankenversicherung
jan-lennard struff
bryan lasme
thailand
robin gosens
maremma
tennis madrid
osterburg
برايتون ضد تشيلسي
sebastian hoeneß
ncis
menowin fröhlich
maren gilzer
cineplex
gina schumacher
alexander räuscher
riza kayaalp
heppenheim
ministerpräsident
robbie williams
brian littrell
saarbrücken hauptbahnhof
frauen-bundesliga
lemgo
kommissar rex
hemsbach
benjamin weber
sydney sweeney
martin schindler
robert kennedy
antoni kowalski
luna
paris-sg lyon
arte live
dominik kohr
dumbledores geheimnisse
wetter frankfurt heute
bundesliga ergebnisse
aktuelle nachrichten deutschland
restaurant in der nähe
deutsche bahn fahrplan
urlaub buchen
rezept für kartoffelsalat
dax aktueller stand
apotheke notdienst frankfurt
günstige flüge

View File

@@ -1,200 +0,0 @@
2026
bad bunny
spurs - timberwolves
anthony edwards
blake lively
heidi klum
santiago segura
knicks - 76ers
robinho
ashley graham
pogacar
wetter
dinero en efectivo
itv
gene hackman
carrera f1 miami
heraldo de aragon
alberto durán cornada
tiempo zaragoza
tiempo valencia
g20
luis zahera
despido laboral
shakira
weather
renfe
alianza lima - cd moquegua
eleccion bellea del foc alicante
nba hoy
meteocat
noticiastrabajo
meme vito quiles begoña gomez
rockets - lakers
sports
sorteo once
juana acosta
raptors - cavaliers
magic - pistons
raul ruiz torero
dia
precio de la luz
fútbol
pension
formula 1
hacienda
precio de la luz hoy
metro madrid
vivienda en españa
tiempo en zaragoza
euribor hoy
austin reaves
estafa
lakers vs rockets
cienciano - atlético mineiro
anthropic
prórroga alquileres congreso
sorteo bonoloto
el tiempo hoy
aemet valencia
aemet
tiempo
huelga gasolineras
el tiempo
nepotismo
instituto cervantes
airbus
tiempo en bilbao
el
el tiempo en granada
spencer jones
encuesta
lili pink
trail blazers - spurs
clasificacion segunda
20minutos
internacional de bogotá - boyacá chicó
el tiempo en valencia
fluminense - chapecoense
heraldo de aragón
víctor muñoz villanueva
de tapas por españa
milan
aitana sánchez gijón
clasificacion liga
palencia
milan vs juventus
marseille nice
cartagena fc
vivienda
hellas verona - lecce
marbella
alfonso vazquez mayoral fuente ymbro
bucaramanga - jaguares
toulouse - mónaco
eldense
nicolai budkov kjær
aryna sabalenka
jaqueline cristian
rafa jodar
samantha vallejo-nágera
ريال بتيس ضد الريال
nvidia
rafael jódar
jodar tenista
sunderland afc - nottingham forest
rb leipzig - fc union berlin
julián alvarez
stade brestois - lens
clasificación de primera división
javier hidalgo
cayetano martínez de irujo
llanes
vfb stuttgart freiburg
roca rey
psv - zwolle
daredevil
a que estas esperando
real oviedo - villarreal
real salt lake - inter miami
pistons - magic
barcelona sc - mushuc runa
kick
raphinha
lluvia estrellas liridas
frenkie de jong
santos - coritiba
del cerro grande
phillip cocu
cospedal
david wilcock
barcelona - celta de vigo
barcelone celta vigo
macarena gómez
luis merlo
bournemouth vs leeds
racing de estrasburgo - niza
burnley vs man city
alaska cantante
raúl gonzález blanco
marta sanchez
roberto bautista
cifras y letras
xbox game pass ultimate
horse powertrain
las hurdes
herbicida cancer colon
lluvia de barro
ripoll
manilva
steve jobs
berrettini
prizmic
laura moure
lens - toulouse
girona vs real betis
yuri berchiche
posiciones de la liga
resultados liga
lfp
umar sadiq
реал мадрид алавес
jan virgili
moreirense - estoril
downton abbey
koldo garcía izaguirre
jorge martín
mike james
carla leite
eclipse solar del 12 de agosto de 2026
crystal palace - west ham
luz valdenebro
porto - tondela
santos - fluminense
juventus
almería - málaga
punjab kings vs lucknow super giants standings
mönchengladbach mainz
victor eloy
paris-sg lyon
psg vs lyon
zamora - osasuna b
estrecho
nurburgring
la 1 directo
oyarzabal
enrique cerezo
fraude
tasa
la 1
tve directo
cuántas copas del rey tiene la real sociedad
eugenia martínez de irujo
ccoo
racing de santander
racing
baliza v16
st. pauli köln
iphone 18
st. pauli - colonia
nico paz

View File

@@ -1,200 +1,10 @@
artemis ii
6 mai
gouverneur de la banque de france
saints de glace 2026
meteo le mans
chaine meteo
gap
jaylin williams
meteo toulon
éliminé koh lanta
5 mai
bath rugby
robinho
gladiator 2
patrick antonelli
meteo 15 jours
meteo france
weather
football psg bayern munich
jours fériés mai 2026
rudy giuliani
jour ferie mai
maries au premier regard episode 11
bali
coupe du monde de vtt
meteo calais
météo france
easyjet
centre presse aveyron
vladimir poutine
wetter
marathon biarritz
hassan du maroc
corse matin
invités léa salamé quelle époque
charlene wittstock
lionel messi
association sportive de saint-étienne
stellantis
groupe adp
romain gavras
livret a
pékin express 2026 candidats
autobus
moyen-orient
cyril féraud
bill ackman
teknival
madonna
le pal
brocante 1er mai
la depeche du midi
smic
2026
steven spielberg
maud bregeon
gendarmerie
chelsea football club
annulations vols prix kérosène
lafc deportivo toluca
meteo caen
playoff nba
shannon elizabeth
sandrine rousseau
brent
bernard cazeneuve
vignoble
forest automobile
brown-forman
meteo quimper
meteo brest
charles iii
montceau news
taylor swift
meteo amiens
salle de bal
reine camilla
david hockney
jacques dutronc
franck thilliez
squamish
nasa
nba spurs portland
mourad zeghidi
maries au premier regard episode 10
tchad
meteofrance
meteo grenoble
film
meteo vannes
cnews direct
toulouse clermont
martin short
le diable s'habille en prada 2 sortie
gautier larsonneur
milan vs juventus
stanley tucci
avs sporting
lambert wilson
tochukwu nnadi
greenwood
jaqueline cristian
thomas ramos
om nice
bordeaux-bègles montpellier
drone
rochdale association football club
doctor who
c à vous c à vous
sabalenka
national 2 groupe a
lena situation
rafael jódar
mask singer
alex de minaur
oyonnax agen
lucie castets
napoli - cremonese
ligue1+
agnes lassalle
jean luc reichmann
m6
caitlyn jenner
star academy
bfm marseille provence
hunter schafer
unchosen netflix
john travolta
valence-romans brive
reem kherici
will smith
real salt lake inter miami
neymar
les traîtres
jacob elordi
pistons magic
invincible
santos coritiba
ios 18
la liga
royaume uni interdiction tabac
stephane tapie
tondelier
benjamin duhamel
loto 22 avril 2026
interdiction tabac royaume uni
lol qui rit sort
eva longoria
alain bauer
achraf hakimi
ibrahim mbaye
mma
roberto calvet
budget
coupe du monde de football 2006
plus belle la vie en avance
mateus fernandes
tour des alpes 2026
lorenzo finn
maine-et-loire
mathieu flamini
kamel daoud
vandalisme
sydney sweeney
julien odoul
france2
xavier dupont de ligonnès
elisabeth 2
antibes
girona betis
christine bravo
الريال ضد ألافيس
madonna age
margot haddad
ana riera
hinaupoko devèze
bruce toussaint
cheque energie
reid wiseman
loto 20 avril 2026
from serie
toulouse
racing 92 stade français
juventus - bologna
film une annee difficile
échouement
programme tv ce soir
porto tondela
matthieu pigasse
santos fluminense
gta 6
laetitia milot
loto 18 avril 2026
bercy
pierre lellouche
adele
adil rami
castres toulouse
angel
stéphane bern
meteo paris
actualités en direct
résultats ligue 1
pharmacie de garde
horaires sncf
recette crêpes
cac 40 en direct
acheter billet louvre
boulangerie autour de moi
carte vitale ameli

View File

@@ -1,200 +1,10 @@
麥美恩
金建希
航空
袁偉豪
thunder vs lakers
etv
雷霆 對 湖人
活塞 對 騎士
八達通
兵工廠 對 馬德里競技
龍蟠苑
飛驒山
澳元
草 蜢
kktix
spurs vs timberwolves
安東尼·愛德華茲
艾佛頓 對 曼城
何君堯
失業
世界盃2026
周殷廷
鹹田灣
投資
漢坦病毒
急性內耳迷路炎
地獄占星師
灣仔
cavaliers vs raptors
charlie puth
兵工廠 對 富勒姆
趙雅芝
coleman wong
jayson tatum
celtics vs 76ers
osasuna vs barcelona
塞爾提克 對 76人
香港人
伊朗
咖啡
c羅
raptors vs cavaliers
lakers
湖人
nba playoffs
nba live
高淑樺
暴龍 對 騎士
黃澤林
lck
黎智英
草蜢演唱會
timberwolves vs nuggets
走私
76ers vs celtics
周嘉洛
莊子璇
深圳地鐵
奧斯汀·里夫斯
國際珍奶日香港
天仁茗茶
伊朗海軍
居屋
湖人 對 火箭
陳柏宇
lakers vs rockets
異環兌換碼
洪金宝
梁嘉莹
spurs vs trail blazers
羅艷卿
weather forecast
observatory hk
尼克 對 老鷹
sfc
馬刺 對 拓荒者
粉嶺繞道
nuggets vs timberwolves
蔡卓妍
港 漂
suns vs thunder
鍾澍佳
萧正楠
金塊 對 灰狼
魔術 對 活塞
太陽 對 雷霆
港 人 北上
hsbc
何守信
謝賢
房協
rockets vs lakers
火箭 對 湖人
曾志偉
簡淑兒
北海道地震
莫 雷 拉
蔡一傑
車路士
羅志祥
自助餐
馮盈盈
無時空之戀
方力申
可嵐
切爾西 對 里茲聯
谷 婭 溦
曼城
印度
英超
利物浦
pl
arsenal vs newcastle
premier league standings
曼城 對 南安普敦
寒戰
米高積遜
jaafar jackson
nvda
吳業坤
麻疹
林盛斌
cuaca besok
明天的天氣
weather tomorrow
rthk
weather hong kong
天文台
hk observatory
observatory
csk vs mi
長沙灣
魔音女團
球迷世界
天星銀行
game
林嘉華
套餐
賈曉晨
hk weather
綠色債券
barcelona vs celta vigo
weather
7-eleven
天气
班來 對 曼城
埃爾切 對 馬德里競技
rosenior
艾納斯
liam rosenior
巴黎聖日耳曼 對 南特
chatgpt image 2
啟德醫院
李泳漢老婆
破產
繼承人
英皇群星演唱會
布浩榮
新聞
貨幣貶值
居 屋 2025
3988
李泳豪老婆
皇家馬德里 對 艾拉維斯
李泳漢
鄭欣宜
srh vs dc
鍾嘉欣
張柏芝
江美儀
全港戲院日 2026
江旻憓
陶傑
水晶宮 對 西漢姆聯
吉達艾阿里
山口智子
百佳超級市場
利息
戴祖儀
陳若思
麥當勞
首岸
中国商飞c919
bundesliga
hailey bieber
德甲
cherki
now
now tv
al nassr
洪金寶
曼聯
切爾西 對 曼聯
何沛珈
熱刺
tottenham vs brighton
熱刺 對 布萊頓
epl
司機
补贴
香港天文台天氣預報
MTR 港鐵路線圖
OpenRice 附近美食
LIHKG 討論區
恆生指數今日行情
SCMP breaking news
HKEX 港交所股價
國泰航空航班狀態
香港迪士尼樂園門票
百佳超級市場網購

View File

@@ -1,200 +1,7 @@
渋野日向子
コンサドーレ
コンサドーレ札幌
栃木sc
秋山翔吾
大分トリニータ
藤枝myfc
大阪桐蔭高等学校
鹿児島ユナイテッド
j2
変死体
ミニストップ
ゴゴスマ
韓国 ホルムズ 海峡
バンテリンドーム
松本光平
クーリエ・ジャポン
タイアニ ライン デルス
阿智村
オリックス・バファローズ
無印
kpmg
トランテックス
31
jin
スタバ
ゴンチャ
travis japan
ウォニョン
dena 対 広島
菅沼菜々
カターレ富山
北九州 対 大分
山形 対 栃木sc
平良海馬
海上自衛隊
ベナビデス
weリーグ
田中健
ミステリーウェイ
石川遼
西野七瀬
堀田真由
横浜fc 対 相模原
イラストやメーカー
薬局
g大阪 対 神戸
オコエ瑠偉
川崎
湘南 対 栃木c
バルミューダ
hikakin
東京
近畿大学
小樽
田園都市線
常磐線
東京スカイツリー
みずほ銀行 ゴールデンウィーク
力士
秋元杏月
四国電力
佐久間宣行
和田 まあ や
浅田 美代子
バトオペ2
千葉県
慶應義塾大学
パンチ
ぶ いす ぽ 活動 休止
ベガルタ仙台
サンフレッチェ広島
相模原 対 栃木c
ロッチ中岡
奈良 対 高知
福島圭音
神宮球場
オスナ ヤクルト
浦和 対 川崎f
村上宗隆
ゴー イントゥ スカイ
地球温暖化
文部科学省
カベポスター
奈良県
バナナマン日村
山本由伸
警視正
中国電力
jr九州
村田製作所
四谷大塚
外崎 修 汰
備蓄
日産 キックス 新型
ドナルド・トランプ
ニューヨーク
小谷昌太郎 イケパラ
東京エレクトロン
ミラン 対 ユヴェントス
宇連ダム 貯水率
櫻坂46
与沢翼
岩手県 大槌町 山林火災
谷原章介
端午
週間天気予報
トリノ 対 インテル
佐野海舟
アーセナル
高岡蒼佑
マンチェスター・シティfc
ゲンク 対 スタンダール
kick
chat gpt
hulu
nac 対 アヤックス
エプスタイン
arsenal đấu với newcastle
ベティス 対 rマドリード
dior
伊藤美来
フィギュア
玉置浩二
生田絵梨花
日本高野連会長辞任
anaheim
sbiグローバルアセットマネジメント
ストレンジャーシングス
石油
ios 26.4 2
ポケモンカード
シュトゥットガルト 対 フライブルク
ドラクエ スマグロ 攻略
ipl
アコム
鈴木愛理
sox指数
村上世彰
桐山 照史
マラッカ海峡
ソニック
sbi新生銀行 株価
マイクラ
川口 春奈
サンダー 対 サンズ
インフルエンサー
サンケイビル
岡村隆史
上田竜也
メタプラネット
バルセロナ 対 セルタ
三橋くん
エルニーニョ
バーンリー 対 マンc
ボーンマス 対 リーズ u
elche vs atlético madrid
レバークーゼン 対 バイエルン
ソシエダ 対 ヘタフェ
サイメモリ
b リーグ 順位
日ハム
ナダル
失点
岩瀬洋志
ファイターズ 試合
江村美咲
宝島社
井ノ原 快彦
ファイターズ
西郷隆盛
ボーダー
チェルシー
関税
ブライトン
佳子内親王
rマドリード 対 アラベス
鳥貴族
ブライトン 対 チェルシー
アシエンダ乗馬学校
ngày trái đất
加藤小夏
町田ゼルビア
モンスターハンターシリーズ
クリスタル・パレス 対 ウェストハム
吉田正尚
旭琉會
神戸
てんちむ
浜辺美波
デーブ ロバーツ
皇治
小雪
にじさんじデビュー
ちゃんよた
坂本 花織
松山 千春
リーグアン
伊勢谷友介
bayern vs vfb stuttgart
東京 天気 明日
新宿 おすすめ 居酒屋
最新のニュース 速報
ゴールド 相場 チャート
近くの静かなカフェ
地震 速報
円安 影響 生活

View File

@@ -1,200 +0,0 @@
박지원
울산항
에이 비엘 바이오
하하
삼성물산
풍력 발전
지수
수익률
라이언 와이스
사우디아라비아
nc 대 ssg
경북대학교
한화 대 kia
롯데 대 kt
키움 대 삼성
두산 대 lg
대학
여객선
고우림
안젤리나 졸리
안성재
토요타 rav4
황희찬
g7
항공 승무원
스트레티지
대한전선
나승엽
인플루언서
이재욱
삼성바이오로직스
스마일게이트
강민호
mls
장도연
이재명 정부
예방 접종
통장
lafc
소송
울산 대 포항
fc 서울 대 김천상무
차명석
붉은사막
소라와 진경
멕시코 축구 국가 대표팀
한화시스템
윤영경
월세
오타니 쇼헤이
이서진
굴리엘모 비카리오
재건축
나솔
재판
라이엇
진소리
아빠하고 나하고
mlb
박진만
중고
롯데 자이언츠
강동원
혁신도시
제로페이
체이스 인피니티
주스 아저씨
권민규
변요한
이유 비
변호사 시험
금보유고
이상화
커피
김효범
김범석
국립중앙도서관
어도어
황재균
주호민
채원빈
분식
위례신도시
박동혁
박용호
한화첨단소재
한상진
차승원
한국경제
효성중공업
최홍라
uae vs oman
부정승차
박하나
일본인
공천
한고은
우체국
sk증권
세리에 a
암호화폐
수지
새마을금고
사주
차두리
평택시 을
야닉 시너
정성호
첼시
psg
리그앙
arsenal đấu với newcastle
맨시티
man city đấu với southampton
아스널
arsenal vs newcastle
아스널 대 뉴캐슬
man city vs southampton
안보현
트와이스
s
엔비디아 주가
이경실
신발
하현상
김수희
gt vs rcb
amd 주가
왕다루
시그널
모하메드 살라
공화당
윤하정
청남대
더보이즈
노민우
서비스나우
김민지
박해미
국가유산청
삼성전자 주가
두산에너빌리티 주가
김성수
한국사
삼성전기 주가
국립중앙박물관
대우건설 주가
지방 선거
서정대학교
캔바
한국항공우주산업
디트로이트 대 올랜도
리그 1
elche vs atlético madrid
알나스르
al-nassr vs al ahli
10
로세니어
psg 대 낭트
테슬라 실적발표
루카스 모우라
9950x3d2
삼천당 제약 간담회
김재윤
k리그1 순위
유영찬
이호연
sxmb
문재인
생산직
강훈식
cnn
리그오브레전드
박환희
박지현
카토
와우넷
지구의 날
컴프야
차지연
크리스털 팰리스 대 웨스트 햄
비상계엄
연기금
배틀그라운드
제이홉
두산로보틱스
부부
미노이 우원재
danish malewar
mi vs gt
양치 승
프리미어리그
pl
bundesliga
맨체스터 시티 fc
fotmob
윤아
김영인

View File

@@ -1,161 +0,0 @@
mykad
honda city
sspn
cimb group holdings berhad
谢伊·吉尔杰斯-亚历山大
recoleta fc vs santos fc standings
teams
ucl final 2026
雷霆 - 湖人
final ucl
nubhan
economy
johor darul ta'zim
world championship snooker final
安东尼·爱德华兹
hantavirus infections cruise ship
undang luak sungai ujong
peluru berpandu
nepal vs oman
马刺 - 森林狼
central bank of malaysia
trisha
rudy giuliani
taiping
go live
perkahwinan
malaysia marathon
results.eci.gov.in 2026
dean wade
mom
jeram toi
haji
earthquake
leverkusen vs rb leipzig
凯尔特人 - 76人
tiong king sing
gaji mei 2026
palmeiras vs santos
奥萨苏纳 - 巴塞罗那
inter miami vs orlando city
lebron james
uae opec exit analysis
grab cross border taxi
menteri besar negeri sembilan
malaysia badminton thomas cup
nba live
猛龙 - 骑士
flower moon
ek din movie review
火箭 - 湖人
macbook
china
global sumud flotilla 2.0
nepal vs uae
森林狼 - 掘金
robotaxi
76人 - 凯尔特人
selamat hari buruh 2026
f1 schedule
lakers vs houston rockets
amira othman
lakers vs houston rockets match player stats
federal reserve interest rates
adidas
mohamad hasan
austin reaves
lafc vs toluca
lakers
湖人 - 火箭
marissa dania hakim
oma vs nep
ppv
mothers day
nte redeem code
skyechip
马刺 - 开拓者
one championship live
labour day
indonesia thomas cup
anggota tentera
阿sa
掘金 - 森林狼
one championship
apple iphone foldable
太阳 - 雷霆
p1p plate
nuggets vs timberwolves
electronic invoicing
malaysian meteorological department
datuk seri aminuddin harun
court
bella astillah
today wordle hints
ezi ray 01
uae vs oman
rekod dunia
mayat
milan vs juventus
osasuna vs sevilla
estrela amadora vs porto
lockheed martin
galatasaray vs fenerbahçe
polis
torino vs inter
terengganu fc
angkrish raghuvanshi
dortmund vs sc freiburg
atlético madrid vs athletic club
fa cup games
แมนซิตี พบ เซาแธมป์ตัน
benfica vs moreirense
city
valencia vs girona
man city games
bayern vs barcelona
英超积分榜
angers vs psg
sunderland vs nottm forest
real betis lwn real madrid cf
napoli vs cremonese
real betis vs real madrid
perfect crown ep 5
siti mastura mohamad
jannik sinner
sai sudharsan
yaris cross hybrid
cretaceous kraken
rayo vallecano vs espanyol
dji lito x1
levante vs sevilla
danish malewar
mukesh choudhary
lyrid meteor showers
jamie overton
piala uber
madrid open
dewald brevis
counter strike
pistons vs magic
real salt lake vs inter miami
chart gpt
asiago
liza hanim
good morning
pandikar amin mulia
勒沃库森 - 拜仁
santos vs coritiba
Malaysia
Kuala Lumpur
Bursa Malaysia
Ringgit
Maybank
CIMB
Shopee MY
Lazada Malaysia
KWSP i-Akaun
LHDN MyTax
Anwar Ibrahim
Johor Bahru
Penang
Nasi Lemak

View File

@@ -1,95 +0,0 @@
trending video
recoleta fc vs santos fc standings
ig
2026 uae eid al adha
thunder vs lakers
adams oshiomhole
pistons vs cavaliers
jamb news
2027 social security cola
10th nigeria national assembly
spurs vs timberwolves
moniepoint
knicks vs 76ers
atenas cordoba vs argentino junin
ypiranga fc rs vs ituano fc sp
birthday wishes
apple iphone 18 pro max
hantavirus infections cruise ship
ben ayade
desmond elliot
joint admissions and matriculation board
nrc
raptors vs cavaliers
f
cavaliers vs raptors
hantavirus
ol vs rennes
35th fighter wing
vinícius júnior
espanyol vs real madrid standings
liverpool news
nigeria news
40k armageddon box
palmeiras vs santos
celtics vs 76ers
inter miami vs orlando city
arsenal vs fulham premier league
alabama redistricting
barca news
barcelona news
rockets vs lakers
magic vs pistons
twitch tv
leke abejide
mallorca
living wage
noah okafor
remi tinubu
imperfect women
bbc.hausa
ekiti
china
timberwolves vs nuggets
76ers vs celtics
knicks vs hawks
hawks vs knicks
spotify
labour day
asake new album
lakers
lakers vs rockets
pistons vs magic
orlando city vs new england
ibukun awosika
xiaomi 17t anatel listing
sporting fc
alvarez
asake
arsenal vs psg
william ruto
spurs vs trail blazers
ahsoka tano replacement star wars
san lorenzo vs santos
the devil wears prada 2
king charles
house of the dragon season 3
gta 5
top scorer in champions league
nuggets vs timberwolves
suns vs thunder
bybit
jack grealish
sanwo olu
saheed balogun
man u fc
live score today
tinubu
lagos weather
super eagles
naira exchange rate
davido
wizkid
burna boy
afcon
nollywood

View File

@@ -1,200 +0,0 @@
stagflatie
adyen
weer groningen
weer utrecht
weerbericht
andes virus
stranger things
ziggo
priscilla wildeman
tanner horner
peter bosz
blue ivy
ryan reynolds
accijns
bevrijdingsdag
walvis
iptv
mark carney
prime video
roma - fiorentina
georginio wijnaldum
intercepted
ulster
rudy giuliani
weer rotterdam
weather
benzine en diesel
witsnuitdolfijn
farioli
ongeval
grand prix formule 1 van miami 2026
formule 1
uitslagen eredivisie
ontsnapte zebra
miami f1
shakira
rave
daghoroscoop
weeronline
wetter
isack hadjar
vakantiegeld aow netto
shivon zilis
china
buienradar
politie zandvoort
nl alert
oekraïne
jade kops erehaag
onweer
corinthians - peñarol
john de bever
lance stroll
mafs
nexperia
hypersonische raket
eindhoven
f1 kalender
lakers vs rockets
bultrug timmy
b&b vol liefde
vakantiegeld
martijn van der vorm rotterdam
ismaël baouf
ea sports fc 26
bauke mollema
xrp nieuws
kaaba
mathieu van der poel
een miljard
p2000
james comey
helena bonham carter
george russell
openbaar vervoer
wayne mardle
europese unie
florence pugh
concert golden earring ahoy
de telegraaf
openai
crypto insiders
stefano domenicali
brand emmeloord
loosdrecht
taylor swift
militair
emma heesters
luik-bastenaken-luik
luilakken koningsdag
rusland
car rental
112 leiden
taxi
michael
passengers
finale wie is de mol
bourtange
marseille - nice
unchosen
prinses
sylvester stallone
28 years later
programma koningsdag 2026
milan - juventus
aryna sabalenka
fortuna
curacao
atlético madrid - ath. bilbao
digid solvinity
baywatch
boy kemper
donyell malen
twente - nec
afc champions league
wesley sonck
arnold schwarzenegger
devil wears prada
jagiellonia białystok górnik zabrze
max verstappen redbull
mvv - top oss
energiecontract
real betis - real madrid
fc den bosch
maarten van rossem
jake paul
financiën
zonnepaneel
xrp
cyprus
verdachte
112 eerbeek
golden earring
sergiño dest
david wilcock
asiago
shownieuws
nijmegen
keira knightley
112 meldingen amsterdam
dierenmishandeling
112 amsterdam
freek rikkerink
poetin
atalanta - lazio
mr nobody against putin
club brugge - mechelen
frank hosmar
barcelona - celta
kees flodder
burnley - manchester city
lodewijk asscher
vallende sterren
guus meeuwis
hoofddorp
kaja kallas
politiek
stroomstoring amersfoort
solvinity digid
wout weghorst
jamie kames
bitvavo
box 3
ronde van de alpen
matthias uhl
taken film
robot
girona - real betis
real madryt deportivo alaves
tbilisi
southampton - bristol city
vittoria guazzini
oppo find x9 ultra
real madrid - alavés
الريال ضد ألافيس
lecce - fiorentina
pogoda jutro
vierhouten
weather tomorrow
over mijn lijk 2026 overleden
crystal palace - west ham
f-16 fighting falcon
klagenfurt
italië
ruud gullit
perfil falso
psg - lyon
juventus - bologna
troy parrott
az - nec opstellingen
caroline tensen
asielbeleid
philippe sandler
keerbergen
peer koopmeiners
nederlands elftal
pogoń szczecin lech poznań
stand premier league
bulgarije
chelsea - man utd

View File

@@ -1,200 +1,10 @@
housing and development board
dress code
micron technology
thunder vs lakers
pistons vs cavaliers
阿森纳 - 马德里竞技
马来西亚
hydrogen
shell
kartik sharma
dario amodei
keppel infrastructure trust
toto jackpot singapore
anthony edwards
dbs bank
补贴
ticketmaster
spurs vs timberwolves
knicks vs 76ers
新加坡博彩公司
kerala election results
toto
ndtv live
oneindia tamil
us-iran news
results.eci.gov.in 2026
tamilnadu election result date 2026
tamil nadu election results
dinamalar
tamil nadu election results date 2026
san diego fc vs lafc
citigroup
spirit airlines flights
thomson-east coast line
inter miami vs orlando city
mothers day
jet bridge
mls
celtics vs 76ers
james seah
8视界新闻
lebron james
jpmorgan chase
singapore airlines ultra-long routes
drunk driving
kwek leng beng
raptors vs cavaliers
rockets vs lakers
magic vs pistons
warren buffett
lawrence wong may day speech
paynow
cold war 1994
expo event
timberwolves vs nuggets
76ers vs celtics
gardens by the bay
weather forecast
universal studios singapore
nba scores
lorna hajdini
cancer
lakers
dbs earnings
lafc vs toluca
cyclist
lakers vs rockets
jerome powell
white house correspondents' dinner
oman vs nepal
primary 1
mapletree industrial trust
spurs vs trail blazers
knicks vs hawks
snake
marriage
san lorenzo vs santos
bankruptcy
诈骗
us-iran
flight
jeanette aw
jisoo
nuggets vs timberwolves
suns vs thunder
drug
jimmy kimmel
erika kirk
elon musk
hokkaido earthquake today
labour day
angela palmares
chernobyl disaster
tengah garden residences
torino vs inter
dortmund vs sc freiburg
angkrish raghuvanshi
mohsin khan
running man
arsenal vs lyon
genoa vs como
kkr vs lsg
bwf
chelsea vs leeds
bologna vs roma
angers vs psg
giant octopus fossil
premier league standings
apple iphone fold
arsenal vs newcastle
man city vs southampton
bundesliga
israel iran war
freddie woodman
sunderland vs nottm forest
real betis vs real madrid
anne hathaway
michael jackson
sai sudharsan
madrid open
amd
gt vs rcb
ijooz
raghav chadha
darren wang
mukesh choudhary
danish malewar
allah ghazanfar
peregrine falcon
airasia flight
arrest
hao mart singapore
real salt lake vs inter miami
pistons vs magic
krisflyer
michael jackson biopic
新加坡
atalanta vs lazio
伯恩利 - 曼城
porto vs sporting
cdl directors resign millennium copthorne
tsla
leverkusen vs bayern
burnley vs man city
elche vs atlético madrid
psg vs nantes
al-nassr vs al ahli
changi
rr vs lsg
primary school
alexandra eala
tan su shan
sundaresh menon
moulin rouge musical singapore
south korea
step
gamba osaka vs avispa fukuoka
honor 600 pro
china shipyards oil tanker orders
coe
real madrid vs alavés
brighton vs chelsea
nitish rana
earth day
michael movie
kevin warsh
srh vs dc
chinese aircraft carrier liaoning
andie chen
jesseca liu wins best actress
crystal palace vs west ham
grok
gemini
claude ai
gpt
ai
is chatgpt down
strait of hormuz news
mi vs gt
psg vs lyon
sporting vs benfica
bayern munich
pl
bangkok weather
starhub
廖子妤
曼城 - 阿森纳
bayern vs vfb stuttgart
英超
chelsea vs man united
perfect crown
ayush mhatre
sarfaraz khan
napoli vs lazio
tottenham vs brighton
abhishek sharma
tinie tempah
wrexham vs stoke city
sassuolo vs como
the straits times
singapore weather forecast
mrt map singapore
straitstimes breaking news
cpf board login
hdb bto launch updates
best chicken rice near me
public holidays sg
singpass login portal
changi airport flight status
iras tax filing

View File

@@ -1,200 +0,0 @@
宋成文
teams
軍 公教
廣達
高國豪老婆
周子 瑜
光寶科
asml
新莊淹水
金凱德
台玻
九合一選舉
頎邦
五月天
諾和諾德
星宇航空
瑞軒
0050 成分 股
亞馬遜 公司
行政專機
漢他病毒怎麼傳染
封鎖
博通
2388
陳光復
華倫·巴菲特
許常德
英特爾
00923
friday
中華民國國防部
林維恩
劉宇寧
2 奈 米 製程
淡江大橋何時通車
天母
陳盈潔
林襄
李芸
夾子園火災
黃路梓茵
五十嵐淳子
日春木瓜牛奶
總統
古林睿煬
槍決
dazn
陳芋汐
福特汽車
洋基
黃 國昌
高速鐵路
lck
og anunoby
白沙 屯 媽祖
playstation
星巴克買一送一
psy
70歲換駕照
台灣
email
林逸欣
張宇
任天堂
記憶體
ive
k spark 高雄
斑斑
粿 粿 判決書
蔡沁瑜
十銓科技
邱軍
股東會紀念品
佳必琪
勞動 節
鍾東錦
棒球
spurs vs trail blazers
8028
鄭嘉睿
spencer jones
張凌赫
山本由伸
陳德修
國巨
俠 盜 獵 車手 vi
晶豪科
無限城
謝淑薇
台中停電
公務員
停電
hito 流行音樂獎
國際珍奶日
台積電 內 鬼
日圓
佳能
聯電 股東 會 紀念品
張雪機車
航空
暴龍 對 騎士
王苡丞
遊戲
chelsea đấu với leeds
เชลซี พบ ลีดส์
聯發科技
詹姆士
田麗
token
兵工廠
魔術 對 活塞
arsenal đấu với newcastle
t.o.p.
吸血鬼爬行者
足總盃
arsenal vs newcastle
man city đấu với southampton
消費券
6187
cpo概念股
anaheim
iu
山口智子
蔡依珊
林岱安
michael jackson 電影
行動電源
地震
地震速報
宋祖兒
porter
謝京穎
德州儀器
台新綜合證券
希臘
費城半導體
mrvl
狄鶯
三星罷工
00981a
馬斯克
辛耘
宏碁股價
0056
2330
雷霆 對 太陽
0050股價
006208
景碩
女警陳芊雯
廢死聯盟
西甲
台灣積體電路製造
高頻寬 記憶 體
戴奧辛
3665
宋晟睿
黃 甘霖
劉家翔
王耿豪
王勝偉
009816
thời tiết ngày mai
明天的天氣
總部
美光科技
cpbl
中華職棒
中職
黃甘霖
6147
earth day
陳哲遠
台鐵
斯普拉遁 塗擊隊
麥可傑克森
神將彩券行
米可白
洪敬堯
華邦電子
柔美的細胞小將 3
底特律老虎
三 商 美邦
川 普
英雄聯盟
聯電adr
rklb
amd stock
宋仲基
德甲
塞爾提克 對 76人
justin bieber 演唱會
拜仁慕尼黑
何潤東
廖子妤
英超
許凱
tottenham vs brighton
長野縣
交通安全

View File

@@ -1,200 +1,10 @@
connections today
henry cavill
scottish sun
the boys season 5 finale
bolton news
recoleta fc vs santos fc standings
latest news
pizza
postcode lottery
daredevil born again
ryan reynolds
bbc radio 4
steam controllers
man utd news
connections nyt
wren kitchens
emmerdale spoilers
time
bb
ukraine russia war
kerala election result
starbucks
star wars day
who won the snooker last night
daily record
sports
eswatini
mcdonald's
election commission of india
funeral director
restaurant
southampton marathon 2026
jet2.com
lewis hamilton ferrari 2026 season
ipswich town football
on
nationwide building society
savings
nursery school
nba scores
katie price
lebron james
anne boleyn
beyond paradise kris marshall
nba schedule
superyacht sinking mike lynch
rockets vs lakers
ricky saints
treasury
inoue vs nakatani
mark allen snooker delay
accuweather
severn trent water
yorkshire water
met office weather
rangers f.c.
anglian water
edinburgh weather
united utilities
council tax
christian horner
lafc vs toluca
lakers vs houston rockets match player stats
snooker scores
snooker
housing market
bankruptcy
gina carano
weather birmingham
bbc nees
ella langley
emma grede
ted lasso season 4 teaser trailer
antidepressants recall
financial crisis
itv news
engagement rings
spurs vs trail blazers
alexey mordashov
good morning
mortgage rates
horoscope
nhl scores
nuggets vs timberwolves
liverpool weather
todays weather
playstation plus
manchester weather
wordle hint
everton f.c.
dvla
snooker results
delivery
ronnie o'sullivan
janet cleverly councillor reprimanded
criminal record
mark selby
avs vs sporting
david attenborough
juventus
elena rybakina
eric bana
roman kemp
house fire wolverhampton
paul merson
is scarlett moffatt pregnant
man city fixtures
scarlets vs bulls
monaco fc
jaqueline cristian
stock market
napoli
alex de minaur
tigers vs hull fc
edinburgh vs sharks
mark williams snooker
alex sinclair israeli police detention
st. johnstone vs raith rovers
mo farah
newcastle vs bristol
tbilisi
connor storrie
georgia
stephen bunting
great british menu 2026
ravi eastenders
salford city fc
national grid
mass effect
salford city vs bromley
real salt lake vs inter miami
provinces of the pantheon
mls
russell brand
john phelan
hung cao
pistons vs magic
jerry bruckheimer
st. george's day
asiago
framework laptop 13 pro
boro
interactive investor
mint
believe me itv
amanda bynes
strasbourg vs nice
chase bank
jak jones
chase
rodri
christopher trybus
lsg vs rr
pension
hebden bridge
sandra bullock practical magic
rolls-royce share price drop
invincible season 5
josé mourinho
chris wakelin
jimmy bullard adam thomas
aer lingus flight cancellations
sam west
oxford united
liam delap
wba
реал мадрид алавес
coppa italia
girona vs real betis
marcus rashford
الريال ضد ألافيس
supreme leader of iran
oscar isaac
xrp ledger
pablo
is tane leaving home and away
julie andrews
danny boyle
nina eastenders
john stones
amazon vega os fire tv
porto vs tondela
santos vs fluminense
martin brundle lost f1 seat
keegan bradley
antoni kowalski
kezia dugdale
car
beef netflix
juventus vs bologna
losc vs nice
david szalay
the killer
joe cole
lille fc
simon cowell
pl
frank lampard everton
nottingham forest fixtures
everton manager
london weather today
bbc news latest
premier league fixtures
tesco near me
tube map london
uk bank holidays
royal family news
how to make english tea
nhs symptom checker
property for sale in london

View File

@@ -1,200 +1,9 @@
caro claire burke
oregon state baseball
iphone 16 pro
yosemite national park
meg stalter
popeyes chicken wraps permanent menu
walt frazier
samsung stock
heather watson
los angeles angels
chris brown
nathan lane
jaafar jackson met gala 2026
rachel zegler
amanda bynes
house of the dragon season 3
sf weather
ariana grande met gala
jackson lacombe
aeromexico
nbc
suvendu adhikari
trisha
seattle weather
putin
melissa joan hart
eenadu
gavin mckenna
mortgage loan rates today
floyd mayweather
wsl
whitecaps - la galaxy
air jordan 11 space jam
julio cesar chavez
budapest
usyk
dmitry bivol
jai opetaia
ebay acquisition
henry winkler
will anderson jr
themba gorimbo
yoel romero
alex hoppe
junior tafa
colby thicknesse
jacob malkoun
nick kurtz
kailer yamamoto
alex jones
cps energy
ssi
e
hail
michael jackson movie biopic
houston weather
katarzyna kawa
usd to yen
michael jackson net worth
utah hockey
mitch marner
hawaii news now
spacex rocket launch
jack eichel
apple iphone 18 pro max
lena dunham
vegas knights
skip bayless
acura
qatar airways
charles barkley
turkish airlines
ayo edebiri
who do the spurs play next
one championship
samsung one ui 8.5 update
fabio jackson
san antonio
shea theodore
dodgers game today
munetaka murakami
dodgers score
joe ingles
owensboro weather
nhl overtime rules
kyle tucker
pete fairbanks
bank
ucla
housing prices
real estate
post malone
ducks game tonight
flor vigna
lebron james
bronny james
austin shooting
arthur rinderknech
avs vs sporting
elena rybakina
chris sale
bruins
sabres game
corinthians vs vasco
christian walker
where to watch new york yankees vs houston astros
gladiator ii
hurricanes vs senators
jalen duren
keegan akin
billy schrauth
caleb durbin
thunder vs suns
max bredeson
wednesday, season 3
demonte capehart
karoline leavitt maternity leave
alex de minaur
rafael jodar
adam levine face
howard frankland bridge
vibrio vulnificus new york waters
stade brestois - lens
moustapha thiam
us asylum seeker border reopening
sunderland vs nottm forest
leicester city vs millwall
brandon marsh
psv vs pec zwolle
daniel merida aguilar
william byron
eve plumb
mall of louisiana
real oviedo vs villarreal
real oviedo - villarreal
call of duty: black ops 7
tarik skubal
cubs game today
mike repole
okc thunder
atlanta braves
mlb scores today
braves standings
kevin mckidd
dan vladar
mls standings
dodgers - giants
jon ossoff
ozzy survivor
braves score
washington nationals
alex bregman
peter lambert
darrell sheets
ludwig kaiser
edina shooting
atalanta - lazio
barcelona vs celta vigo
rivian r2
pick 4
aoc
cleveland browns
nintendo switch gamecube games
lsg vs rr
spirit
atlanta fire
deshaun watson
good morning america
pittsburgh
strands answers
scientist
mark cuban pharmacy
inter milan
lens vs toulouse
david james
andy weir
noah kahan tiny desk concert
jennifer garner 54th birthday photos
troy baker
real madrid - alavés
girona - real betis
girona vs real betis
arc raiders
schd etf dividend yield
deportación
lecce - fiorentina
valley forge high school
betty yee
seth trimble
bill belichick
winter storm
jim parsons
kings vs avalanche
suns vs thunder
wolf
santos - fluminense
mets - cubs
alexander manninger
santos vs fluminense
disclosure day
Los Angeles weather today
S&P 500 stock chart
local coffee shops near me
latest tech news
California traffic updates
AI startups in Silicon ValleySan Jose weather this weekend
Silicon Valley tech news
best tacos in San Jose
Apple park visitor center hours

View File

@@ -1,200 +0,0 @@
dông
tập đoàn vingroup
cảnh sát
giải vđqg nhật bản
tuyên án
gyokeres
nguyễn thị kim tiến
học
bảo hiểm xã hội
thi sinh thi tốt nghiệp thpt
ngân hàng
đội tuyển bóng đá u 17 quốc gia yemen
giải bóng đá vô địch thế giới
kylie jenner
thời tiết cực đoan
vietnam airlines
xét tuyển đại học
matheus cunha
heidi klum
khóa sim
huấn luyện viên
chu châu
vụ án tây ninh
xác thực
lê khanh
doanh thu phim trùm sò
máy bay
lũ quét
ngộ độc
nvl
iphone 18 pro max
샌디에이고 fc 대 엘에이 fc
clb san diego đấu với lafc
tổng công ty khoáng sản tkv
xe
hà giang
bia
trọng tài
thu nhập cá nhân
phương oanh
thiếu tướng quân đội nhân dân việt nam
lịch nghỉ 2 9
dân việt
rockets vs lakers
tesla
giá vàng the giới
mỹ iran
ninh dương lan ngọc
thủy tiên
xabi alonso
mason mount
dự án
huỳnh hiểu minh
nhiệt độ tphcm
venezuela
vinhomes
học bổng
giáo sư
denver nuggets
dog
efootball
free fire
quang minh và hồng đào
giá gas
lakers vs rockets
đua xe đạp
đô la mỹ
hoài linh
chess
đường cao tốc
giáp
nguyễn đình bắc
avispa đấu với sanfrecce
thừa kế
hoa hậu việt nam
nguyễn xuân bắc
áp thấp nhiệt đới
tàu
nte code
bảo tín minh châu
cà phê
one ui 8.5
nguyễn huy hoàng
dự án nuôi em
đơn vị sự nghiệp công lập
nợ xấu
bộ trưởng bộ giáo dục và đào tạo việt nam
thành phố trực thuộc trung ương
âm vang tổ quốc
jennie
charlie nguyễn
nanaimoteuthis
cảng
vneid
sri lanka
công nhân
hội đồng giám mục việt nam
an ninh kinh tế
kfc
đội tuyển bóng chuyền nữ quốc gia việt nam
juventus
milan đấu với juventus
villarreal đấu với celta
osasuna vs sevilla
galatasaray
michael jackson
sevilla
polymarket
mật ngữ kỷ
osasuna đấu với sevilla
atlético madrid đấu với ath. bilbao
erling haaland
lịch thi đấu man city
toulouse đấu với monaco
mc vs
đông anh
al ahli
man city
chung cư
napoli
sunderland đấu với nottm forest
betis đấu với real madrid
napoli đấu với cremonese
leipzig đấu với union berlin
sunderland
mẫu iphone 18
oppo find x9 ultra
xem phim
andoni iraola
stuttgart đấu với freiburg
levante sevilla
giao dịch tài chính
rayo đấu với espanyol
levante đấu với sevilla
bong ma hanh phuc
aryna sabalenka
mason nguyễn
marcus rashford
hà nội
salt lake đấu với inter miami
hung cao
neymar
cầu phú mỹ
nhac
wordle
날씨
giá cà phê hôm nay
premier league standings
mls
phạm nhật vượng
cristiano roland
burnley vs man city
bayern munich
atalanta đấu với lazio
barcelona đấu với celta
psg nantes
leverkusen đấu với bayern
elche atlético madrid
bryan mbeumo
al nasr
trực tiếp bóng đá hôm nay
vtv3
vtv3 trực tiếp
tv
vtv
vtv6
360
lê khánh
ô tô
lê phương
trực tiếp bóng đá u17 hôm nay
inter milan
chelsea
girona đấu với betis
real madrid đấu với alavés
brighton vs chelsea
brighton đấu với chelsea
ath. bilbao đấu với osasuna
pep guardiola
zelvia đấu với shabab al-ahli
cầu thủ
lecce vs fiorentina
fiorentina
crystal palace đấu với west ham
afc champions league
eduardo camavinga
vissel kobe
gemi
idp
bảo hiểm y tế
crystal palace vs west ham
sporting lisbon
psg vs lyon
ca sĩ
juventus đấu với bologna
gladbach đấu với mainz
twitch
psg đấu với lyon
ligue 1
trận đấu ngoại hạng anh

View File

@@ -1,531 +1,102 @@
{
"version": "3.5.2",
"updated_at": "2026-04-19",
"continents": [
"version": "3.1.0",
"updated_at": "2026-04-11",
"countries": [
{
"id": "ASIA",
"name": "亚太战区 (Asia-Pacific)",
"countries": [
{
"id": "JP",
"name": "Japan (日本)",
"keyword_file": "kw_JP.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Tokyo",
"name": "Tokyo (东京)"
}
]
}
]
},
{
"id": "SG",
"name": "Singapore (新加坡)",
"keyword_file": "kw_SG.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Singapore",
"name": "Singapore (新加坡)"
}
]
}
]
},
{
"id": "KR",
"name": "South Korea (韩国)",
"keyword_file": "kw_KR.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Seoul",
"name": "Seoul (首尔)"
}
]
}
]
},
{
"id": "HK",
"name": "Hong Kong (香港)",
"keyword_file": "kw_HK.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "HongKong",
"name": "Hong Kong (香港)"
}
]
}
]
},
{
"id": "VN",
"name": "Vietnam (越南)",
"keyword_file": "kw_VN.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Hanoi",
"name": "Hanoi (河内)"
}
]
}
]
},
{
"id": "TW",
"name": "Taiwan (台湾)",
"keyword_file": "kw_TW.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Taipei",
"name": "Taipei (台北)"
}
]
}
]
},
{
"id": "MY",
"name": "Malaysia (马来西亚)",
"keyword_file": "kw_MY.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Kuala_Lumpur",
"name": "Kuala Lumpur (吉隆坡)"
}
]
}
]
}
]
},
{
"id": "EUROPE",
"name": "欧洲战区 (Europe)",
"countries": [
{
"id": "UK",
"name": "United Kingdom (英国)",
"keyword_file": "kw_UK.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "London",
"name": "London (伦敦)"
},
{
"id": "Coventry",
"name": "Coventry (考文垂)"
}
]
}
]
},
{
"id": "DE",
"name": "Germany (德国)",
"keyword_file": "kw_DE.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Frankfurt",
"name": "Frankfurt (法兰克福)"
}
]
},
{
"id": "SN",
"name": "Saxony (萨克森州)",
"cities": [
{
"id": "Falkenstein",
"name": "Falkenstein (法尔肯施泰因)"
}
]
},
{
"id": "BY",
"name": "Bavaria (巴伐利亚州)",
"cities": [
{
"id": "Nuremberg",
"name": "Nuremberg (纽伦堡)"
}
]
},
{
"id": "BE",
"name": "Berlin (柏林州)",
"cities": [
{
"id": "Berlin",
"name": "Berlin (柏林)"
}
]
}
]
},
{
"id": "FR",
"name": "France (法国)",
"keyword_file": "kw_FR.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Paris",
"name": "Paris (巴黎)"
}
]
}
]
},
{
"id": "NL",
"name": "Netherlands (荷兰)",
"keyword_file": "kw_NL.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Amsterdam",
"name": "Amsterdam (阿姆斯特丹)"
}
]
}
]
},
{
"id": "ES",
"name": "Spain (西班牙)",
"keyword_file": "kw_ES.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Madrid",
"name": "Madrid (马德里)"
}
]
}
]
}
]
},
{
"id": "AMERICAS",
"name": "美洲战区 (Americas)",
"countries": [
{
"id": "US",
"name": "United States (美国)",
"keyword_file": "kw_US.txt",
"states": [
{
"id": "CA",
"name": "California (加州)",
"cities": [
{
"id": "Los_Angeles",
"name": "Los Angeles (洛杉矶)"
},
{
"id": "San_Jose",
"name": "San Jose (圣何塞)"
}
]
},
{
"id": "IL",
"name": "Illinois (伊利诺伊州)",
"cities": [
{
"id": "Warrenville",
"name": "Warrenville (沃伦维尔)"
}
]
},
{
"id": "NC",
"name": "North Carolina (北卡罗来纳州)",
"cities": [
{
"id": "Charlotte",
"name": "Charlotte (夏洛特)"
}
]
},
{
"id": "NV",
"name": "Nevada (内华达州)",
"cities": [
{
"id": "Las_Vegas",
"name": "Las Vegas (拉斯维加斯)"
}
]
},
{
"id": "OR",
"name": "Oregon (俄勒冈州)",
"cities": [
{
"id": "Bend",
"name": "Bend (本德)"
}
]
},
{
"id": "UT",
"name": "Utah (犹他州)",
"cities": [
{
"id": "Salt_Lake_City",
"name": "Salt Lake City (盐湖城)"
}
]
},
{
"id": "WA",
"name": "Washington (华盛顿州)",
"cities": [
{
"id": "Seattle",
"name": "Seattle (西雅图)"
}
]
},
{
"id": "TX",
"name": "Texas (得克萨斯州)",
"cities": [
{
"id": "Dallas",
"name": "Dallas (达拉斯)"
},
{
"id": "Houston",
"name": "Houston (休斯顿)"
}
]
},
{
"id": "IA",
"name": "Iowa (爱荷华州)",
"cities": [
{
"id": "Council_Bluffs",
"name": "Council Bluffs (康瑟尔布拉夫斯)"
}
]
},
{
"id": "VA",
"name": "Virginia (弗吉尼亚州)",
"cities": [
{
"id": "Ashburn",
"name": "Ashburn (阿什本)"
}
]
},
{
"id": "OH",
"name": "Ohio (俄亥俄州)",
"cities": [
{
"id": "Columbus",
"name": "Columbus (哥伦布)"
}
]
},
{
"id": "NY",
"name": "New York (纽约州)",
"cities": [
{
"id": "New_York",
"name": "New York (纽约)"
}
]
},
{
"id": "FL",
"name": "Florida (佛罗里达州)",
"cities": [
{
"id": "Miami",
"name": "Miami (迈阿密)"
}
]
},
{
"id": "NJ",
"name": "New Jersey (新泽西州)",
"cities": [
{
"id": "Newark",
"name": "Newark (纽瓦克)"
}
]
},
{
"id": "GA",
"name": "Georgia (佐治亚州)",
"cities": [
{
"id": "Atlanta",
"name": "Atlanta (亚特兰大)"
}
]
}
]
},
"id": "US",
"name": "United States (美国)",
"keyword_file": "kw_US.txt",
"states": [
{
"id": "CA",
"name": "Canada (加拿大)",
"keyword_file": "kw_CA.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Toronto",
"name": "Toronto (多伦多)"
},
{
"id": "Montreal",
"name": "Montreal (蒙特利尔)"
}
]
}
"name": "California (加)",
"cities": [
{ "id": "Los_Angeles", "name": "Los Angeles (洛杉矶)" },
{ "id": "San_Jose", "name": "San Jose (圣何塞)" }
]
}
]
},
{
"id": "OCEANIA",
"name": "大洋洲战区 (Oceania)",
"countries": [
"id": "JP",
"name": "Japan (日本)",
"keyword_file": "kw_JP.txt",
"states": [
{
"id": "AU",
"name": "Australia (澳大利亚)",
"keyword_file": "kw_AU.txt",
"states": [
{
"id": "NSW",
"name": "New South Wales (新南威尔士州)",
"cities": [
{
"id": "Sydney",
"name": "Sydney (悉尼)"
}
]
},
{
"id": "VIC",
"name": "Victoria (维多利亚州)",
"cities": [
{
"id": "Melbourne",
"name": "Melbourne (墨尔本)"
}
]
},
{
"id": "QLD",
"name": "Queensland (昆士兰州)",
"cities": [
{
"id": "Brisbane",
"name": "Brisbane (布里斯班)"
}
]
},
{
"id": "WA",
"name": "Western Australia (西澳大利亚州)",
"cities": [
{
"id": "Perth",
"name": "Perth (珀斯)"
}
]
},
{
"id": "SA",
"name": "South Australia (南澳大利亚州)",
"cities": [
{
"id": "Adelaide",
"name": "Adelaide (阿德莱德)"
}
]
}
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "Tokyo", "name": "Tokyo (东京)" }
]
}
]
},
{
"id": "AFRICA",
"name": "非洲战区 (Africa)",
"countries": [
"id": "UK",
"name": "United Kingdom (英国)",
"keyword_file": "kw_UK.txt",
"states": [
{
"id": "NG",
"name": "Nigeria (尼日利亚)",
"keyword_file": "kw_NG.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{
"id": "Lagos",
"name": "Lagos (拉各斯)"
}
]
}
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "London", "name": "London (伦敦)" }
]
}
]
},
{
"id": "DE",
"name": "Germany (德国)",
"keyword_file": "kw_DE.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "Frankfurt", "name": "Frankfurt (法兰克福)" }
]
}
]
},
{
"id": "FR",
"name": "France (法国)",
"keyword_file": "kw_FR.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "Paris", "name": "Paris (巴黎)" }
]
}
]
},
{
"id": "SG",
"name": "Singapore (新加坡)",
"keyword_file": "kw_SG.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "Singapore", "name": "Singapore (新加坡)" }
]
}
]
},
{
"id": "HK",
"name": "Hong Kong (香港)",
"keyword_file": "kw_HK.txt",
"states": [
{
"id": "Default",
"name": "Default State",
"cities": [
{ "id": "HongKong", "name": "Hong Kong (香港)" }
]
}
]

View File

@@ -1,50 +0,0 @@
{
"region_name": "Australia - Sydney",
"google_module": {
"base_lat": -33.8697,
"base_lon": 151.2085,
"lang_params": "hl=en-AU&gl=AU",
"valid_url_suffix": "com.au"
},
"trust_module": {
"white_urls": [
"https://www.abc.net.au/news/2026-05-06/man-fighting-removal-to-nauru-loses-high-court-challenge/106646446",
"https://www.abc.net.au/news/2026-05-06/wagga-river-camp-resident-ask-for-open-mind-after-baby-death/106648194",
"https://www.abc.net.au/news/2026-05-06/tim-pictons-alleged-attacker-avoids-jail-over-separate-charge/106648008",
"https://www.abc.net.au/news/2026-05-06/adelaide-36ers-coach-mike-wells-quits/106648724",
"https://www.abc.net.au/news/2026-05-06/womens-state-of-origin-game-two-team-lists/106648716",
"https://www.abc.net.au/news/2026-05-06/commercial-fishing-ban-in-gulf-st-vincent-extends/106647212",
"https://www.realestate.com.au/",
"https://www.abc.net.au/news/2026-05-06/brisbane-river-zip-line-proposal/106647348",
"https://www.abc.net.au/news/2026-05-06/freshwater-turtles-thriving-near-broken-hill-outback-lake/106584786",
"https://www.seek.com.au/",
"https://www.coles.com.au/",
"https://www.abc.net.au/news/2026-05-06/ses-hq-wyong-central-coast-destroyed-by-fire/106647498",
"https://www.abc.net.au/news/2026-05-06/child-protection-workers-lose-their-jobs-five-year-old-girl-nt/106647714",
"https://www.abc.net.au/news/2026-05-06/jury-retires-greyhound-bruce-highway-bus-crash-trial-townsville/106642338",
"https://www.abc.net.au/news/2026-05-06/inland-rail-cancellation-reactions/106646490",
"https://www.bunnings.com.au/",
"https://www.commbank.com.au/",
"https://www.abc.net.au/news/2026-05-06/keysborough-secondary-college-teacher-principal-stabbing/106648548",
"https://www.amazon.com.au/",
"https://www.abc.net.au/news/2026-05-06/influencers-reveal-what-life-is-like-on-hantavirus-cruise/106646542",
"https://www.ato.gov.au/",
"https://www.abc.net.au/news/2026-05-06/concerns-about-victorian-road-repairs-despite-budget-funding/106445376",
"https://www.bom.gov.au/",
"https://www.woolworths.com.au/",
"https://my.gov.au/"
],
"static_urls": [
"https://my.gov.au/",
"https://www.ato.gov.au/",
"https://www.bom.gov.au/",
"https://www.commbank.com.au/",
"https://www.seek.com.au/",
"https://www.realestate.com.au/",
"https://www.woolworths.com.au/",
"https://www.coles.com.au/",
"https://www.amazon.com.au/",
"https://www.bunnings.com.au/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Australia - Brisbane",
"google_module": {
"base_lat": -27.4697,
"base_lon": 153.0252,
"lang_params": "hl=en-AU&gl=AU",
"valid_url_suffix": "com.au"
},
"trust_module": {
"white_urls": [
"https://www.bom.gov.au/",
"https://www.abc.net.au/news/2026-05-06/tim-pictons-alleged-attacker-avoids-jail-over-separate-charge/106648008",
"https://www.abc.net.au/news/2026-05-06/commercial-fishing-ban-in-gulf-st-vincent-extends/106647212",
"https://www.amazon.com.au/",
"https://www.abc.net.au/news/2026-05-06/adelaide-36ers-coach-mike-wells-quits/106648724",
"https://www.abc.net.au/news/2026-05-06/keysborough-secondary-college-teacher-principal-stabbing/106648548",
"https://www.seek.com.au/",
"https://www.commbank.com.au/",
"https://www.abc.net.au/news/2026-05-06/womens-state-of-origin-game-two-team-lists/106648716",
"https://www.abc.net.au/news/2026-05-06/jury-retires-greyhound-bruce-highway-bus-crash-trial-townsville/106642338",
"https://www.coles.com.au/",
"https://www.abc.net.au/news/2026-05-06/child-protection-workers-lose-their-jobs-five-year-old-girl-nt/106647714",
"https://www.ato.gov.au/",
"https://www.realestate.com.au/",
"https://www.abc.net.au/news/2026-05-06/inland-rail-cancellation-reactions/106646490",
"https://www.abc.net.au/news/2026-05-06/freshwater-turtles-thriving-near-broken-hill-outback-lake/106584786",
"https://www.abc.net.au/news/2026-05-06/influencers-reveal-what-life-is-like-on-hantavirus-cruise/106646542",
"https://www.abc.net.au/news/2026-05-06/man-fighting-removal-to-nauru-loses-high-court-challenge/106646446",
"https://www.abc.net.au/news/2026-05-06/ses-hq-wyong-central-coast-destroyed-by-fire/106647498",
"https://www.abc.net.au/news/2026-05-06/wagga-river-camp-resident-ask-for-open-mind-after-baby-death/106648194",
"https://www.abc.net.au/news/2026-05-06/brisbane-river-zip-line-proposal/106647348",
"https://my.gov.au/",
"https://www.abc.net.au/news/2026-05-06/concerns-about-victorian-road-repairs-despite-budget-funding/106445376",
"https://www.woolworths.com.au/",
"https://www.bunnings.com.au/"
],
"static_urls": [
"https://my.gov.au/",
"https://www.ato.gov.au/",
"https://www.bom.gov.au/",
"https://www.commbank.com.au/",
"https://www.seek.com.au/",
"https://www.realestate.com.au/",
"https://www.woolworths.com.au/",
"https://www.coles.com.au/",
"https://www.amazon.com.au/",
"https://www.bunnings.com.au/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Australia - Adelaide",
"google_module": {
"base_lat": -34.9227,
"base_lon": 138.6016,
"lang_params": "hl=en-AU&gl=AU",
"valid_url_suffix": "com.au"
},
"trust_module": {
"white_urls": [
"https://www.abc.net.au/news/2026-05-06/concerns-about-victorian-road-repairs-despite-budget-funding/106445376",
"https://www.woolworths.com.au/",
"https://www.seek.com.au/",
"https://www.coles.com.au/",
"https://www.abc.net.au/news/2026-05-06/commercial-fishing-ban-in-gulf-st-vincent-extends/106647212",
"https://www.abc.net.au/news/2026-05-06/brisbane-river-zip-line-proposal/106647348",
"https://www.amazon.com.au/",
"https://www.abc.net.au/news/2026-05-06/inland-rail-cancellation-reactions/106646490",
"https://www.abc.net.au/news/2026-05-06/wagga-river-camp-resident-ask-for-open-mind-after-baby-death/106648194",
"https://my.gov.au/",
"https://www.abc.net.au/news/2026-05-06/tim-pictons-alleged-attacker-avoids-jail-over-separate-charge/106648008",
"https://www.abc.net.au/news/2026-05-06/freshwater-turtles-thriving-near-broken-hill-outback-lake/106584786",
"https://www.abc.net.au/news/2026-05-06/adelaide-36ers-coach-mike-wells-quits/106648724",
"https://www.abc.net.au/news/2026-05-06/influencers-reveal-what-life-is-like-on-hantavirus-cruise/106646542",
"https://www.abc.net.au/news/2026-05-06/jury-retires-greyhound-bruce-highway-bus-crash-trial-townsville/106642338",
"https://www.abc.net.au/news/2026-05-06/ses-hq-wyong-central-coast-destroyed-by-fire/106647498",
"https://www.abc.net.au/news/2026-05-06/keysborough-secondary-college-teacher-principal-stabbing/106648548",
"https://www.abc.net.au/news/2026-05-06/womens-state-of-origin-game-two-team-lists/106648716",
"https://www.bunnings.com.au/",
"https://www.bom.gov.au/",
"https://www.realestate.com.au/",
"https://www.commbank.com.au/",
"https://www.abc.net.au/news/2026-05-06/man-fighting-removal-to-nauru-loses-high-court-challenge/106646446",
"https://www.ato.gov.au/",
"https://www.abc.net.au/news/2026-05-06/child-protection-workers-lose-their-jobs-five-year-old-girl-nt/106647714"
],
"static_urls": [
"https://my.gov.au/",
"https://www.ato.gov.au/",
"https://www.bom.gov.au/",
"https://www.commbank.com.au/",
"https://www.seek.com.au/",
"https://www.realestate.com.au/",
"https://www.woolworths.com.au/",
"https://www.coles.com.au/",
"https://www.amazon.com.au/",
"https://www.bunnings.com.au/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Australia - Melbourne",
"google_module": {
"base_lat": -37.8106,
"base_lon": 144.9624,
"lang_params": "hl=en-AU&gl=AU",
"valid_url_suffix": "com.au"
},
"trust_module": {
"white_urls": [
"https://www.abc.net.au/news/2026-05-06/freshwater-turtles-thriving-near-broken-hill-outback-lake/106584786",
"https://my.gov.au/",
"https://www.abc.net.au/news/2026-05-06/tim-pictons-alleged-attacker-avoids-jail-over-separate-charge/106648008",
"https://www.bom.gov.au/",
"https://www.abc.net.au/news/2026-05-06/adelaide-36ers-coach-mike-wells-quits/106648724",
"https://www.abc.net.au/news/2026-05-06/womens-state-of-origin-game-two-team-lists/106648716",
"https://www.abc.net.au/news/2026-05-06/jury-retires-greyhound-bruce-highway-bus-crash-trial-townsville/106642338",
"https://www.commbank.com.au/",
"https://www.bunnings.com.au/",
"https://www.abc.net.au/news/2026-05-06/inland-rail-cancellation-reactions/106646490",
"https://www.amazon.com.au/",
"https://www.woolworths.com.au/",
"https://www.abc.net.au/news/2026-05-06/child-protection-workers-lose-their-jobs-five-year-old-girl-nt/106647714",
"https://www.abc.net.au/news/2026-05-06/ses-hq-wyong-central-coast-destroyed-by-fire/106647498",
"https://www.coles.com.au/",
"https://www.abc.net.au/news/2026-05-06/concerns-about-victorian-road-repairs-despite-budget-funding/106445376",
"https://www.abc.net.au/news/2026-05-06/brisbane-river-zip-line-proposal/106647348",
"https://www.abc.net.au/news/2026-05-06/influencers-reveal-what-life-is-like-on-hantavirus-cruise/106646542",
"https://www.realestate.com.au/",
"https://www.abc.net.au/news/2026-05-06/man-fighting-removal-to-nauru-loses-high-court-challenge/106646446",
"https://www.abc.net.au/news/2026-05-06/keysborough-secondary-college-teacher-principal-stabbing/106648548",
"https://www.abc.net.au/news/2026-05-06/wagga-river-camp-resident-ask-for-open-mind-after-baby-death/106648194",
"https://www.abc.net.au/news/2026-05-06/commercial-fishing-ban-in-gulf-st-vincent-extends/106647212",
"https://www.seek.com.au/",
"https://www.ato.gov.au/"
],
"static_urls": [
"https://my.gov.au/",
"https://www.ato.gov.au/",
"https://www.bom.gov.au/",
"https://www.commbank.com.au/",
"https://www.seek.com.au/",
"https://www.realestate.com.au/",
"https://www.woolworths.com.au/",
"https://www.coles.com.au/",
"https://www.amazon.com.au/",
"https://www.bunnings.com.au/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Australia - Perth",
"google_module": {
"base_lat": -31.9545,
"base_lon": 115.8582,
"lang_params": "hl=en-AU&gl=AU",
"valid_url_suffix": "com.au"
},
"trust_module": {
"white_urls": [
"https://www.abc.net.au/news/2026-05-06/jury-retires-greyhound-bruce-highway-bus-crash-trial-townsville/106642338",
"https://www.abc.net.au/news/2026-05-06/concerns-about-victorian-road-repairs-despite-budget-funding/106445376",
"https://www.abc.net.au/news/2026-05-06/influencers-reveal-what-life-is-like-on-hantavirus-cruise/106646542",
"https://www.ato.gov.au/",
"https://www.amazon.com.au/",
"https://www.bom.gov.au/",
"https://www.abc.net.au/news/2026-05-06/adelaide-36ers-coach-mike-wells-quits/106648724",
"https://www.abc.net.au/news/2026-05-06/ses-hq-wyong-central-coast-destroyed-by-fire/106647498",
"https://www.abc.net.au/news/2026-05-06/womens-state-of-origin-game-two-team-lists/106648716",
"https://www.bunnings.com.au/",
"https://www.abc.net.au/news/2026-05-06/wagga-river-camp-resident-ask-for-open-mind-after-baby-death/106648194",
"https://www.seek.com.au/",
"https://www.commbank.com.au/",
"https://www.abc.net.au/news/2026-05-06/freshwater-turtles-thriving-near-broken-hill-outback-lake/106584786",
"https://www.abc.net.au/news/2026-05-06/keysborough-secondary-college-teacher-principal-stabbing/106648548",
"https://www.abc.net.au/news/2026-05-06/child-protection-workers-lose-their-jobs-five-year-old-girl-nt/106647714",
"https://www.coles.com.au/",
"https://www.abc.net.au/news/2026-05-06/inland-rail-cancellation-reactions/106646490",
"https://www.realestate.com.au/",
"https://www.abc.net.au/news/2026-05-06/man-fighting-removal-to-nauru-loses-high-court-challenge/106646446",
"https://www.abc.net.au/news/2026-05-06/tim-pictons-alleged-attacker-avoids-jail-over-separate-charge/106648008",
"https://www.woolworths.com.au/",
"https://my.gov.au/",
"https://www.abc.net.au/news/2026-05-06/commercial-fishing-ban-in-gulf-st-vincent-extends/106647212",
"https://www.abc.net.au/news/2026-05-06/brisbane-river-zip-line-proposal/106647348"
],
"static_urls": [
"https://my.gov.au/",
"https://www.ato.gov.au/",
"https://www.bom.gov.au/",
"https://www.commbank.com.au/",
"https://www.seek.com.au/",
"https://www.realestate.com.au/",
"https://www.woolworths.com.au/",
"https://www.coles.com.au/",
"https://www.amazon.com.au/",
"https://www.bunnings.com.au/"
]
}
}

View File

@@ -1,46 +0,0 @@
{
"region_name": "Canada - Montreal",
"google_module": {
"base_lat": 45.5017,
"base_lon": -73.5673,
"lang_params": "hl=en&gl=CA",
"valid_url_suffix": "ca"
},
"trust_module": {
"white_urls": [
"https://www.cbc.ca/news/world/russia-internet-vpn-9.7188353?cmp=rss",
"https://www.cbc.ca/news/politics/former-governors-general-expense-account-9.7188412?cmp=rss",
"https://www.cbc.ca/news/canada/ottawa/alto-rail-ottawa-montreal-route-property-map-9.7188144?cmp=rss",
"https://www.canada.ca/en.html",
"https://www.cbc.ca/news/entertainment/tracker-leaving-vancouver-california-tax-credit-9.7188156?cmp=rss",
"https://www.cbc.ca/radio/asithappens/wisconsin-emt-heart-attack-9.7188630?cmp=rss",
"https://www.cbc.ca/news/world/rubio-hegseth-iran-strait-hormuz-blockade-9.7188754?cmp=rss",
"https://www.cbc.ca/news/politics/louse-arbour-governor-general-carney-analysis-9.7188709?cmp=rss",
"https://www.cbc.ca/news/world/assault-charge-white-house-correspondents-dinner-suspect-9.7188774?cmp=rss",
"https://www.rbcroyalbank.com/",
"https://www.theweathernetwork.com/ca",
"https://www.cbc.ca/news/business/telecommunications-workers-restrictions-artificial-intelligence-9.7189209?cmp=rss",
"https://www.amazon.ca/",
"https://www.cbc.ca/sports/hockey/pwhl/pwhl-playoffs-montreal-victoire-minnesota-frost-may5-9.7188085?cmp=rss",
"https://www.canadapost-postescanada.ca/",
"https://www.cbc.ca/news/indigenous/red-dress-day-vigil-parliament-hill-9.7188743?cmp=rss",
"https://www.cbc.ca/news/canada/canada-c17-fleet-us-sustainment-services-9.7188694?cmp=rss",
"https://www.utoronto.ca/",
"https://www.cra-arc.gc.ca/",
"https://www.cbc.ca/news/canada/british-columbia/vancouver-bc-hot-weather-records-9.7188997?cmp=rss",
"https://www.td.com/",
"https://www.cbc.ca/news/health/hantavirus-human-transmission-9.7188555?cmp=rss",
"https://www.cbc.ca/news/canada/edmonton/elections-alberta-voter-data-centurion-project-ndp-ucp-9.7189167?cmp=rss"
],
"static_urls": [
"https://www.canada.ca/en.html",
"https://www.cra-arc.gc.ca/",
"https://www.canadapost-postescanada.ca/",
"https://www.utoronto.ca/",
"https://www.td.com/",
"https://www.rbcroyalbank.com/",
"https://www.amazon.ca/",
"https://www.theweathernetwork.com/ca"
]
}
}

View File

@@ -1,46 +0,0 @@
{
"region_name": "Canada - Toronto",
"google_module": {
"base_lat": 43.6532,
"base_lon": -79.3832,
"lang_params": "hl=en&gl=CA",
"valid_url_suffix": "ca"
},
"trust_module": {
"white_urls": [
"https://www.cra-arc.gc.ca/",
"https://www.amazon.ca/",
"https://www.canada.ca/en.html",
"https://www.cbc.ca/news/indigenous/red-dress-day-vigil-parliament-hill-9.7188743?cmp=rss",
"https://www.cbc.ca/news/politics/former-governors-general-expense-account-9.7188412?cmp=rss",
"https://www.cbc.ca/news/entertainment/tracker-leaving-vancouver-california-tax-credit-9.7188156?cmp=rss",
"https://www.canadapost-postescanada.ca/",
"https://www.utoronto.ca/",
"https://www.cbc.ca/news/world/russia-internet-vpn-9.7188353?cmp=rss",
"https://www.cbc.ca/news/politics/louse-arbour-governor-general-carney-analysis-9.7188709?cmp=rss",
"https://www.cbc.ca/news/health/hantavirus-human-transmission-9.7188555?cmp=rss",
"https://www.cbc.ca/radio/asithappens/wisconsin-emt-heart-attack-9.7188630?cmp=rss",
"https://www.rbcroyalbank.com/",
"https://www.theweathernetwork.com/ca",
"https://www.cbc.ca/news/canada/british-columbia/vancouver-bc-hot-weather-records-9.7188997?cmp=rss",
"https://www.cbc.ca/news/business/telecommunications-workers-restrictions-artificial-intelligence-9.7189209?cmp=rss",
"https://www.cbc.ca/news/world/rubio-hegseth-iran-strait-hormuz-blockade-9.7188754?cmp=rss",
"https://www.cbc.ca/news/canada/edmonton/elections-alberta-voter-data-centurion-project-ndp-ucp-9.7189167?cmp=rss",
"https://www.cbc.ca/news/world/assault-charge-white-house-correspondents-dinner-suspect-9.7188774?cmp=rss",
"https://www.cbc.ca/news/canada/ottawa/alto-rail-ottawa-montreal-route-property-map-9.7188144?cmp=rss",
"https://www.td.com/",
"https://www.cbc.ca/sports/hockey/pwhl/pwhl-playoffs-montreal-victoire-minnesota-frost-may5-9.7188085?cmp=rss",
"https://www.cbc.ca/news/canada/canada-c17-fleet-us-sustainment-services-9.7188694?cmp=rss"
],
"static_urls": [
"https://www.canada.ca/en.html",
"https://www.cra-arc.gc.ca/",
"https://www.canadapost-postescanada.ca/",
"https://www.utoronto.ca/",
"https://www.td.com/",
"https://www.rbcroyalbank.com/",
"https://www.amazon.ca/",
"https://www.theweathernetwork.com/ca"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Germany - Berlin",
"google_module": {
"base_lat": 52.52,
"base_lon": 13.405,
"lang_params": "hl=de-DE&gl=DE",
"valid_url_suffix": "de"
},
"trust_module": {
"white_urls": [
"https://www.tagesschau.de/inland/spahn-fraktionschef-union-100.html",
"https://www.tagesschau.de/wirtschaft/unternehmen/unicredit-commerzbank-uebernahme-rekordgewinn-100.html",
"https://www.arbeitsagentur.de/",
"https://www.tagesschau.de/ukraine-kriegsverlauf-gady-100.html",
"https://www.stepstone.de/",
"https://www.tagesschau.de/ausland/europa/meta-alterskontrolle-eu-100.html",
"https://www.tagesschau.de/wirtschaft/unternehmen/deutsche-post-dhl-hauptversammlung-100.html",
"https://www.edeka.de/",
"https://www.tagesschau.de/ausland/europa/rumaenien-misstrauensvotum-parlament-100.html",
"https://www.bundesregierung.de/",
"https://www.tagesschau.de/investigativ/ndr/grauer-star-behandlung-kosten-100.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/mietwucher-berlin-100.html",
"https://www.tagesschau.de/wirtschaft/finanzen/marktberichte/marktbericht-dax-dow-geldanlage-128.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/urlaub-nachzahlungen-kerosinpreise-100.html",
"https://www.tagesschau.de/wirtschaft/konjunktur/wein-krise-deutschland-100.html",
"https://www.tagesschau.de/inland/innenpolitik/ein-jahr-koalition-reaktionen-100.html",
"https://www.tagesschau.de/ausland/amerika/project-freedom-usa-hormus-iran-100.html",
"https://www.tagesschau.de/ausland/amerika/wahlkreise-zuschnitt-usa-100.html",
"https://www.sparkasse.de/",
"https://www.tagesschau.de/ausland/europa/ukraine-russland-waffenruhe-100.html",
"https://www.amazon.de/",
"https://www.rewe.de/",
"https://www.obi.de/",
"https://www.immobilienscout24.de/",
"https://www.dwd.de/"
],
"static_urls": [
"https://www.bundesregierung.de/",
"https://www.arbeitsagentur.de/",
"https://www.dwd.de/",
"https://www.sparkasse.de/",
"https://www.stepstone.de/",
"https://www.immobilienscout24.de/",
"https://www.rewe.de/",
"https://www.edeka.de/",
"https://www.amazon.de/",
"https://www.obi.de/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Germany - Bavaria (Nuremberg)",
"google_module": {
"base_lat": 49.4521,
"base_lon": 11.0767,
"lang_params": "hl=de-DE&gl=DE",
"valid_url_suffix": "de"
},
"trust_module": {
"white_urls": [
"https://www.edeka.de/",
"https://www.sparkasse.de/",
"https://www.tagesschau.de/ausland/amerika/wahlkreise-zuschnitt-usa-100.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/mietwucher-berlin-100.html",
"https://www.tagesschau.de/ausland/amerika/project-freedom-usa-hormus-iran-100.html",
"https://www.tagesschau.de/inland/spahn-fraktionschef-union-100.html",
"https://www.tagesschau.de/ausland/europa/ukraine-russland-waffenruhe-100.html",
"https://www.amazon.de/",
"https://www.immobilienscout24.de/",
"https://www.tagesschau.de/investigativ/ndr/grauer-star-behandlung-kosten-100.html",
"https://www.tagesschau.de/ukraine-kriegsverlauf-gady-100.html",
"https://www.tagesschau.de/ausland/europa/meta-alterskontrolle-eu-100.html",
"https://www.tagesschau.de/wirtschaft/unternehmen/deutsche-post-dhl-hauptversammlung-100.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/urlaub-nachzahlungen-kerosinpreise-100.html",
"https://www.tagesschau.de/inland/innenpolitik/ein-jahr-koalition-reaktionen-100.html",
"https://www.tagesschau.de/wirtschaft/unternehmen/unicredit-commerzbank-uebernahme-rekordgewinn-100.html",
"https://www.stepstone.de/",
"https://www.dwd.de/",
"https://www.tagesschau.de/wirtschaft/konjunktur/wein-krise-deutschland-100.html",
"https://www.rewe.de/",
"https://www.obi.de/",
"https://www.bundesregierung.de/",
"https://www.tagesschau.de/ausland/europa/rumaenien-misstrauensvotum-parlament-100.html",
"https://www.tagesschau.de/wirtschaft/finanzen/marktberichte/marktbericht-dax-dow-geldanlage-128.html",
"https://www.arbeitsagentur.de/"
],
"static_urls": [
"https://www.bundesregierung.de/",
"https://www.arbeitsagentur.de/",
"https://www.dwd.de/",
"https://www.sparkasse.de/",
"https://www.stepstone.de/",
"https://www.immobilienscout24.de/",
"https://www.rewe.de/",
"https://www.edeka.de/",
"https://www.amazon.de/",
"https://www.obi.de/"
]
}
}

View File

@@ -8,39 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.tagesschau.de/ausland/europa/rumaenien-misstrauensvotum-parlament-100.html",
"https://www.ebay.de/",
"https://www.tagesschau.de/wirtschaft/finanzen/marktberichte/marktbericht-dax-dow-geldanlage-128.html",
"https://www.tagesschau.de/ausland/europa/meta-alterskontrolle-eu-100.html",
"https://www.tagesschau.de/inland/spahn-fraktionschef-union-100.html",
"https://www.tagesschau.de/ausland/europa/ukraine-russland-waffenruhe-100.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/urlaub-nachzahlungen-kerosinpreise-100.html",
"https://www.tagesschau.de/investigativ/ndr/grauer-star-behandlung-kosten-100.html",
"https://www.tagesschau.de/inland/innenpolitik/ein-jahr-koalition-reaktionen-100.html",
"https://www.bundesregierung.de/",
"https://www.tum.de/",
"https://www.tagesschau.de/ausland/amerika/project-freedom-usa-hormus-iran-100.html",
"https://www.amazon.de/",
"https://www.tagesschau.de/wirtschaft/unternehmen/unicredit-commerzbank-uebernahme-rekordgewinn-100.html",
"https://www.spiegel.de/",
"https://www.tagesschau.de/ausland/amerika/wahlkreise-zuschnitt-usa-100.html",
"https://www.tagesschau.de/wirtschaft/konjunktur/wein-krise-deutschland-100.html",
"https://www.bahn.de/",
"https://www.tagesschau.de/wirtschaft/verbraucher/mietwucher-berlin-100.html",
"https://www.arbeitsagentur.de/",
"https://www.tagesschau.de/ukraine-kriegsverlauf-gady-100.html",
"https://www.sparkasse.de/",
"https://www.tagesschau.de/wirtschaft/unternehmen/deutsche-post-dhl-hauptversammlung-100.html"
],
"static_urls": [
"https://www.bundesregierung.de/",
"https://www.arbeitsagentur.de/",
"https://www.tum.de/",
"https://www.sparkasse.de/",
"https://www.bahn.de/",
"https://www.amazon.de/",
"https://www.tagesschau.de/",
"https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite",
"https://www.ebay.de/",
"https://www.spiegel.de/"
"https://www.bild.de/",
"https://www.kicker.de/"
]
}
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Germany - Saxony (Falkenstein)",
"google_module": {
"base_lat": 50.4779,
"base_lon": 12.3713,
"lang_params": "hl=de-DE&gl=DE",
"valid_url_suffix": "de"
},
"trust_module": {
"white_urls": [
"https://www.dwd.de/",
"https://www.bundesregierung.de/",
"https://www.sparkasse.de/",
"https://www.tagesschau.de/ausland/amerika/project-freedom-usa-hormus-iran-100.html",
"https://www.amazon.de/",
"https://www.tagesschau.de/wirtschaft/unternehmen/deutsche-post-dhl-hauptversammlung-100.html",
"https://www.tagesschau.de/inland/spahn-fraktionschef-union-100.html",
"https://www.tagesschau.de/wirtschaft/finanzen/marktberichte/marktbericht-dax-dow-geldanlage-128.html",
"https://www.tagesschau.de/ausland/europa/rumaenien-misstrauensvotum-parlament-100.html",
"https://www.tagesschau.de/wirtschaft/verbraucher/mietwucher-berlin-100.html",
"https://www.tagesschau.de/ausland/europa/meta-alterskontrolle-eu-100.html",
"https://www.tagesschau.de/wirtschaft/unternehmen/unicredit-commerzbank-uebernahme-rekordgewinn-100.html",
"https://www.tagesschau.de/inland/innenpolitik/ein-jahr-koalition-reaktionen-100.html",
"https://www.rewe.de/",
"https://www.tagesschau.de/ausland/europa/ukraine-russland-waffenruhe-100.html",
"https://www.tagesschau.de/ausland/amerika/wahlkreise-zuschnitt-usa-100.html",
"https://www.obi.de/",
"https://www.arbeitsagentur.de/",
"https://www.edeka.de/",
"https://www.tagesschau.de/wirtschaft/verbraucher/urlaub-nachzahlungen-kerosinpreise-100.html",
"https://www.tagesschau.de/investigativ/ndr/grauer-star-behandlung-kosten-100.html",
"https://www.tagesschau.de/ukraine-kriegsverlauf-gady-100.html",
"https://www.tagesschau.de/wirtschaft/konjunktur/wein-krise-deutschland-100.html",
"https://www.immobilienscout24.de/",
"https://www.stepstone.de/"
],
"static_urls": [
"https://www.bundesregierung.de/",
"https://www.arbeitsagentur.de/",
"https://www.dwd.de/",
"https://www.sparkasse.de/",
"https://www.stepstone.de/",
"https://www.immobilienscout24.de/",
"https://www.rewe.de/",
"https://www.edeka.de/",
"https://www.amazon.de/",
"https://www.obi.de/"
]
}
}

View File

@@ -1,44 +0,0 @@
{
"region_name": "Spain - Madrid",
"google_module": {
"base_lat": 40.4168,
"base_lon": -3.7038,
"lang_params": "hl=es&gl=ES",
"valid_url_suffix": "es"
},
"trust_module": {
"white_urls": [
"https://elpais.com/salud-y-bienestar/2026-05-05/gabriel-rabinovich-bioquimico-mi-sueno-es-no-tener-que-decirle-a-ningun-paciente-que-no-hay-nada-que-hacer.html",
"https://elpais.com/espana/madrid/2026-05-05/una-hora-de-tregua-politica-en-madrid-por-el-aniversario-de-la-muerte-de-tierno-galvan-hagamos-un-ejercicio-de-concordia.html",
"https://elpais.com/icon/2026-05-06/aitor-ruibal-no-compro-lo-de-no-me-mojo-porque-soy-futbolista-no-te-mojas-porque-no-quieres-lios.html",
"https://elpais.com/salud-y-bienestar/2026-05-06/bitacora-del-mv-hondius-de-ushuaia-a-canarias-diario-de-a-bordo-de-un-brote-de-hantavirus.html",
"https://elpais.com/sociedad/2026-05-06/que-esto-no-salga-en-los-periodicos-la-iglesia-pide-perdon-a-la-victima-que-denuncio-al-obispo-de-cadiz-y-le-exige-silencio.html",
"https://www.santander.es/",
"https://www.zara.com/es/",
"https://elpais.com/deportes/2026-05-05/jon-rahm-y-el-circuito-europeo-firman-la-paz.html",
"https://elpais.com/deportes/futbol/2026-05-06/bayern-y-psg-alcanzan-una-cumbre-insolita-en-la-champions.html",
"https://www.elcorteingles.es/",
"https://elpais.com/economia/negocios/2026-05-03/a-la-caza-del-teletrabajador-tramposo-estas-son-las-herramientas-que-usan-las-empresas-para-detectar-a-los-impostores.html",
"https://elpais.com/videos/2026-05-04/videos-de-ajedrez-korchmar-un-desconocido-inmortal-ucranio.html",
"https://elpais.com/tecnologia/2026-05-05/fin-del-misterio-la-caja-sorpresa-escondia-el-coche-de-siempre-y-el-del-futuro.html",
"https://www.agenciatributaria.es/",
"https://www.renfe.com/",
"https://elpais.com/opinion/2026-05-05/hermana-y-maestra.html",
"https://cincodias.elpais.com/companias/2026-05-06/las-electricas-rechazan-los-expedientes-sancionadores-a-las-nucleares-alegando-que-cumplian-las-normas-del-csn.html",
"https://elpais.com/ciencia/2026-05-05/en-memoria-del-tigre-del-genoma-doctor-j-c-venter-1947-2026.html",
"https://www.amazon.es/",
"https://elpais.com/sociedad/2026-05-06/sira-rego-vamos-a-ser-el-primer-pais-del-mundo-que-elimine-por-ley-el-uso-del-falso-sindrome-de-alienacion-parental.html",
"https://elpais.com/gastronomia/el-comidista/2026-05-05/marineras-la-receta-de-la-tapa-mas-redonda-de-espana.html",
"https://administracion.gob.es/"
],
"static_urls": [
"https://administracion.gob.es/",
"https://www.agenciatributaria.es/",
"https://www.santander.es/",
"https://www.renfe.com/",
"https://www.amazon.es/",
"https://www.zara.com/es/",
"https://www.elcorteingles.es/"
]
}
}

View File

@@ -8,37 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.lemonde.fr/",
"https://www.lefigaro.fr/",
"https://www.amazon.fr/",
"https://www.service-public.fr/",
"https://fr.wikipedia.org/wiki/Sp%C3%A9cial:Page_au_hasard",
"https://www.cdiscount.com/",
"https://www.sorbonne-universite.fr/",
"https://www.france24.com/fr/%C3%A9missions/sports/20260506-ligue-des-champions-arsenal-finale-premi%C3%A8re-fois-depuis-2006",
"https://www.france24.com/fr/europe/20260505-trump-attaque-nouveau-pape-l%C3%A9on-xiv-qui-lui-r%C3%A9pond-par-message-de-paix",
"https://www.amazon.fr/",
"https://www.impots.gouv.fr/",
"https://www.france24.com/fr/vid%C3%A9o/20260505-br%C3%A9sil-un-petit-avion-s-%C3%A9crase-contre-un-immeuble-faisant-trois-morts",
"https://www.credit-agricole.fr/",
"https://www.service-public.fr/",
"https://www.france24.com/fr/%C3%A9missions/dans-la-presse/20260506-biennale-de-venise-l-obsc%C3%A9nit%C3%A9-de-l-art-apolitique",
"https://www.france24.com/fr/vid%C3%A9o/20260505-alg%C3%A9rie-christophe-gleizes-renonce-%C3%A0-son-pourvoi-en-cassation-pour-une-possible-gr%C3%A2ce",
"https://www.france24.com/fr/%C3%A9missions/info-ou-intox/20260505-iran-emirats-arabes-unis-regain-de-tensions-et-d-intox",
"https://www.france24.com/fr/vid%C3%A9o/20260505-france-des-lyc%C3%A9ens-pr%C3%A9parent-un-bac-option-drones-une-premi%C3%A8re-qui-int%C3%A9resse-l-arm%C3%A9e",
"https://www.sncf.com/",
"https://www.france24.com/fr/%C3%A9missions/le-d%C3%A9bat/20260505-iran-%C3%A9tats-unis-la-tr%C3%AAve-tient-elle",
"https://www.france24.com/fr/france/20260505-rima-hassan-jeanluc-m%C3%A9lenchon-main-dans-la-main-sur-un-yacht",
"https://www.france24.com/fr/sports/20260506-ligue-des-champions-michael-olise-gaucher-providentiel-bayern-munich",
"https://www.france24.com/fr/vid%C3%A9o/20260505-arm%C3%A9nie-emmanuel-macron-interpr%C3%A8te-la-boh%C3%A8me-avec-le-premier-ministre",
"https://www.france24.com/fr/%C3%A9co-tech/20260505-rencontre-paris-ministres-g7-parlent-commerce-droits-douane-etats-unis-union-europeenne-industrie-minerais",
"https://www.france24.com/fr/%C3%A9missions/journal-de-l-afrique/20260505-tchad-l-attaque-d-une-base-militaire-attribu%C3%A9e-au-groupe-djihadiste-boko-haram",
"https://www.france24.com/fr/sports/20260505-prix-marc-vivien-foe-trois-finalistes-2026",
"https://www.france24.com/fr/info-en-continu/20260506-bouteilles-fruits-et-l%C3%A9gumes-emball%C3%A9s-le-plastique-toujours-omnipr%C3%A9sent-en-grandes-surfaces"
],
"static_urls": [
"https://www.service-public.fr/",
"https://www.impots.gouv.fr/",
"https://www.sorbonne-universite.fr/",
"https://www.credit-agricole.fr/",
"https://www.sncf.com/",
"https://www.amazon.fr/",
"https://www.cdiscount.com/"
"https://www.fnac.com/"
]
}
}
}

View File

@@ -8,37 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.hku.hk/",
"https://www.hsbc.com.hk/",
"https://hk.news.yahoo.com/%E4%B8%AD%E5%9C%8B%E7%85%99%E7%81%AB%E5%B7%A5%E5%BB%A0%E7%88%86%E7%82%B8-%E9%87%8021%E6%AD%BB61%E5%82%B7-030502985.html",
"https://hk.news.yahoo.com/%E5%BB%89%E7%BD%B2%E6%8B%98%E6%89%BF%E8%BE%A6%E5%95%86%E6%9D%B1%E4%B8%BB%E5%8F%8A%E6%B3%95%E5%9C%98%E4%B8%BB%E5%B8%AD%E7%AD%897%E4%BA%BA-%E6%B6%89%E8%B2%AA%E6%B1%A1%E5%9C%96%E5%A5%AA%E5%A4%A7%E7%B6%AD%E4%BF%AE%E5%B7%A5%E7%A8%8B-%E8%98%87%E6%95%AC%E8%8F%AF%E5%A0%B1%E9%81%93-050523997.html",
"https://hk.news.yahoo.com/%E7%89%9B%E6%B1%A0%E7%81%A3%E6%8E%83%E7%AE%A1%E7%AC%8F%E8%AA%98%E8%9A%8A%E5%99%A8%E6%8C%87%E6%95%B8%E9%AB%98%E6%96%BC10-%E9%A3%9F%E7%92%B0%E7%BD%B2-4%E6%9C%88%E5%B9%B3%E5%9D%87%E6%B0%A3%E6%BA%AB%E9%9B%A8%E9%87%8F%E9%AB%98-200000496.html",
"https://hk.news.yahoo.com/%E5%8D%B0%E5%B0%BC%E9%A6%96%E5%AD%A3%E7%B6%93%E6%BF%9F%E5%B9%B4%E5%A2%9E5-6-%E5%84%AA%E6%96%BC%E6%94%BF%E5%BA%9C%E9%A0%90%E6%9C%9F-053502708.html",
"https://yahoo-news.com.hk/BBCChineseNews/41570/?yptr=yahoo",
"https://www.gov.hk/",
"https://hk.news.yahoo.com/%E7%BE%8E%E6%93%8A%E6%B2%89%E4%BC%8A%E6%9C%97%E8%88%B9%E9%9A%BB-%E4%B8%AD%E6%9D%B1%E6%88%B0%E7%88%AD%E6%9C%80%E6%96%B0%E7%99%BC%E5%B1%95-%E6%AC%A1%E7%9C%8B-043503677.html",
"https://hk.news.yahoo.com/%E4%B8%AD%E6%9D%B1%E6%88%B0%E7%88%AD%E5%8D%87%E6%BA%AB-%E6%BE%B3%E6%B4%B2%E8%A8%AD10%E5%84%84%E5%85%AC%E5%8D%87%E7%87%83%E6%96%99%E5%84%B2%E5%82%99%E6%87%89%E5%B0%8D-032002052.html",
"https://hk.news.yahoo.com/%E4%BC%8A%E6%9C%97%E5%90%A6%E8%AA%8D%E5%87%BA%E5%8B%95%E9%A3%9B%E5%BD%88%E5%92%8C%E7%84%A1%E4%BA%BA%E6%A9%9F%E6%94%BB%E6%93%8A%E9%98%BF%E8%81%AF-215001317.html",
"https://www.police.gov.hk/",
"https://hk.news.yahoo.com/%E8%87%AA%E7%94%B1%E8%A8%88%E7%95%AB%E6%89%8D%E5%95%9F%E5%8B%95-%E5%A4%A9-%E5%B7%9D%E6%99%AE%E5%AE%A3%E5%B8%83%E6%9A%AB%E5%81%9C%E8%8D%B7%E8%8E%AB%E8%8C%B2%E6%B5%B7%E5%B3%BD%E8%AD%B7%E8%88%AA%E8%A1%8C%E5%8B%95-002005854.html",
"https://www.hko.gov.hk/",
"https://hk.news.yahoo.com/%E8%90%8A%E6%AF%94%E9%8C%AB%E6%B1%BD%E8%BB%8A%E6%92%9E%E4%BA%BA%E6%A1%882%E6%AD%BB20%E5%A4%9A%E5%82%B7-%E5%BE%B7%E5%9C%8B%E7%95%B6%E5%B1%80%E5%B1%95%E9%96%8B%E8%AA%BF%E6%9F%A5-003501152.html",
"https://www.mtr.com.hk/",
"https://hk.news.yahoo.com/%E6%B3%B0%E5%9C%8B%E6%89%B9%E5%87%86%E8%88%89%E5%82%B5122%E5%84%84%E7%BE%8E%E5%85%83-%E5%9B%A0%E6%87%89%E4%B8%AD%E6%9D%B1%E5%8D%B1%E6%A9%9F%E8%A1%9D%E6%93%8A-080501492.html",
"https://hk.news.yahoo.com/%E9%A6%99%E6%B8%AF%E5%AE%B6%E5%BA%AD%E5%B9%B8%E7%A6%8F%E6%8C%87%E6%95%B86-09%E5%88%86-%E8%BC%83%E5%85%A9%E5%B9%B4%E5%89%8D%E5%9B%9E%E5%8D%87-52%E8%90%AC%E4%BA%BA%E8%99%95-%E5%AE%B6%E5%85%A7%E5%AD%A4%E5%B3%B6-200000517.html",
"https://hk.news.yahoo.com/%E7%BE%85%E9%A6%AC%E5%B0%BC%E4%BA%9E%E8%A6%AA%E6%AD%90%E7%9B%9F%E7%B8%BD%E7%90%86-%E9%81%AD%E4%B8%8D%E4%BF%A1%E4%BB%BB%E6%A1%88%E7%BD%B7%E9%BB%9C-130502524.html",
"https://hk.news.yahoo.com/%E7%B4%85%E7%A3%A14%E8%BB%8A%E4%B8%B2%E7%87%92%E6%B3%A2%E5%8F%8A1%E8%BB%8A-%E5%8D%97%E4%BA%9E%E9%90%B5%E9%A8%8E%E5%A3%AB%E8%AE%8A%E3%80%8C%E4%B8%89%E6%96%87%E6%B2%BB%E3%80%8D-1%E5%8F%B8%E6%A9%9F%E6%B6%89%E9%85%92%E9%A7%95%E8%A2%AB%E6%8D%95-010953947.html",
"https://www.scmp.com/",
"https://www.hk01.com/",
"https://zh.wikipedia.org/wiki/Special:Random",
"https://www.hktvmall.com/",
"https://hk.news.yahoo.com/%E4%BF%84%E7%83%8F%E7%9B%B8%E7%B9%BC%E5%96%AE%E6%96%B9%E9%9D%A2%E5%AE%A3%E5%B8%83%E5%85%A9%E5%A4%A9%E5%81%9C%E7%81%AB-055003888.html"
],
"static_urls": [
"https://www.gov.hk/",
"https://www.hko.gov.hk/",
"https://www.police.gov.hk/",
"https://www.hku.hk/",
"https://www.hsbc.com.hk/",
"https://www.mtr.com.hk/",
"https://www.hktvmall.com/"
"https://www.mtr.com.hk/"
]
}
}
}

View File

@@ -4,36 +4,17 @@
"base_lat": 35.6812,
"base_lon": 139.7671,
"lang_params": "hl=ja&gl=JP",
"valid_url_suffix": "com"
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://ja.wikipedia.org/wiki/Special:Random",
"https://www.yahoo.co.jp/",
"https://www.amazon.co.jp/",
"https://www.u-tokyo.ac.jp/",
"https://news.yahoo.co.jp/pickup/6579009?source=rss",
"https://www.jreast.co.jp/",
"https://news.yahoo.co.jp/pickup/6579008?source=rss",
"https://www.rakuten.co.jp/",
"https://news.yahoo.co.jp/pickup/6578993?source=rss",
"https://www.mhlw.go.jp/",
"https://news.yahoo.co.jp/pickup/6578991?source=rss",
"https://news.yahoo.co.jp/pickup/6578987?source=rss",
"https://news.yahoo.co.jp/pickup/6578996?source=rss",
"https://news.yahoo.co.jp/pickup/6578997?source=rss",
"https://www.smbc.co.jp/",
"https://news.yahoo.co.jp/pickup/6579007?source=rss",
"https://www.japan.go.jp/"
],
"static_urls": [
"https://www.japan.go.jp/",
"https://www.mhlw.go.jp/",
"https://www.u-tokyo.ac.jp/",
"https://www.smbc.co.jp/",
"https://www.jreast.co.jp/",
"https://www.yahoo.co.jp/",
"https://www.amazon.co.jp/",
"https://www.rakuten.co.jp/"
"https://www.nhk.or.jp/",
"kakaku.com/",
"https://www.goo.ne.jp/",
"https://www.amazon.co.jp/"
]
}
}

View File

@@ -1,36 +0,0 @@
{
"region_name": "South Korea - Seoul",
"google_module": {
"base_lat": 37.5665,
"base_lon": 126.978,
"lang_params": "hl=ko&gl=KR",
"valid_url_suffix": "co.kr"
},
"trust_module": {
"white_urls": [
"https://www.naver.com/",
"https://www.yonhapnewstv.co.kr/news/AKR202605061413403Cy",
"https://www.snu.ac.kr/",
"https://www.yonhapnewstv.co.kr/news/MYH20260506144518ZSk",
"https://www.kbstar.com/",
"https://www.yonhapnewstv.co.kr/news/AKR20260506120317oou",
"https://www.yonhapnewstv.co.kr/news/MYH20260506114454137",
"https://www.korea.kr/",
"https://www.hometax.go.kr/",
"https://www.daum.net/",
"https://www.coupang.com/",
"https://www.yonhapnewstv.co.kr/news/MYH20260506120430SB5",
"https://www.kakao.com/"
],
"static_urls": [
"https://www.korea.kr/",
"https://www.hometax.go.kr/",
"https://www.snu.ac.kr/",
"https://www.kbstar.com/",
"https://www.naver.com/",
"https://www.daum.net/",
"https://www.coupang.com/",
"https://www.kakao.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Malaysia - Kuala Lumpur",
"google_module": {
"base_lat": 3.139,
"base_lon": 101.6869,
"lang_params": "hl=en-MY&gl=MY",
"valid_url_suffix": "com.my"
},
"trust_module": {
"white_urls": [
"https://www.cimbclicks.com.my/",
"https://shopee.com.my/",
"https://news.google.com/rss/articles/CBMixwFBVV95cUxNMEZHa1pQejFZZkdYMDdHWnUwR1JWX096OEJrSXV0NTNmM3NPRmtOd1dlZ1JnUjhzc2kxLUhRTkwyaGNlczFnYkNMNFpsYzk5dU95bEZxb1B2U2NRdElWMUgxRWM5MmhYQkRCMnZQc2s1aVRsSTZKODkwVkNaSWE5c0NTNjJvRmtpUkZ4Y0NqNVFManBGWVVJQ1BaZnlRQlpWU05PQ21uWWstUFNqazdzakdoem1XYk1FTHZKYVBjekt2NkhFaU93?oc=5",
"https://news.google.com/rss/articles/CBMiwgFBVV95cUxNT19xeGhodmNYNGF0dG4wNS1XYlhOanZRU290WTl0bjY0Z0Q5UmI3ZXlPbE5rc0xuZ0dTVEV4NUd1VVNpb1NNckQ1VVNLU2o1WTRQTGtZZ2IwV25ub2FCeE91TGxzaXlxcjVoeF9yTmR6ZnZvM0RYVk1MdGxHcEZlQzdURHJBMzVDTWVhMWNfU2hqU1RfWUxERjk2dUlUSWl6ekhpSDl1QjFhNEdIYmxweTkxNHVxbHhaRkZ2cUh5N1ZMQQ?oc=5",
"https://www.maybank2u.com.my/",
"https://news.google.com/rss/articles/CBMifEFVX3lxTE84djc0U2xCQnNEX2lkY3JNXzc4VkRTaW1OUGs1S0d1bTQ1U0hXdDlrZHV0ZVNydmVkMTJqWVB2ajl0aTB0N2phWFhOU3I0WERRR0w3MEVwc2VfNzlLRGZkSVNsQjlHMEtFRW51MjVDaVB0eTZNdTJRYkxLNmU?oc=5",
"https://www.lazada.com.my/",
"https://www.malaysia.gov.my/",
"https://news.google.com/rss/articles/CBMi7gFBVV95cUxPbFFXSWdnNW1jTGFGcVhCczFyLUZ6amNjQUFiUy1OdUEzRUgtVTVheEl5a3dlQ1psSTZwbmZGTU1OWnlENVpucDZEbTRhOUhSRVBBb21MZXhYM3Y2V1FEM0tzUUtxQ0ZVM3hxVUpNWEQ4RjE0b1V0dmFlQlYxUHJ4MURWVlF2R1E2VDdUSGNfUE5HSGc2RjVQcmVkdDBhSW9ZR3Q3Wm1vTWs5eTZha2ptdmRlUGF6SFYweFRMMlVZOU9ETV9MNmFaZzZVcDJiZFFrS3dBVXV5b2h5Sm1FdnhFWG12Y1BEbUU2UF9EcjhR0gHzAUFVX3lxTFBfUUpOT1RWQXNBcHJzYXlqMWZqZmFJZkVrZzdmb0t4N3hKUVFfNWstSVI2bVgyYkd6N09LbmpSdS13QWZkTGVENWloUXUzanpkTEtDMlp4ZWFoT2IxZzFwV29BbkpTOFkxcHhYMDJTVTMtX2ZvWEpjQzFuaThuOWVBVkJ5Z05HMFA4WU03UDNLYWtkclRaTGZxMlREdlFxREc5VnFIeEVNZmtMVTk4eFFnUndQTDBWUFIxYjlvMGJWa2NCVm10SjdWTWhBUkdpZVJJeEpRRnNxQ2xLSUxLTGhsQjhZeVRQX2lMSTY1bVY1V3FsOA?oc=5",
"https://news.google.com/rss/articles/CBMitAFBVV95cUxNZ2lhN0hQbElyZFNXXzVkb2FSdU5ad0ZLcDhUazFyNHMycHV6cUVZVjVicThZem9FeVhoMzNTYU93WmlsRDNmWjlrMHRqQVA1cUQ3TVNwTEV6aFlXWGltdjhFNnV3Rk9FV2dJcFl6cTZZMDVhN2xsVUV1YlZ3TlBCMGhPLW4yYzJRdVZwMndoTTVFUDgzRDNlYWd6bVJUUWEtZFVSQzBxdnM5dkJ0QjdIa3VORlQ?oc=5",
"https://news.google.com/rss/articles/CBMixgFBVV95cUxPWUtMUi1kYkRtdnVwdEt0YjFQWWxQTldhVGhGa3N1MVZpSnExVkRuZzllMzdxaHJHWHlqUWtzN2NwUlNLOUZqeVpNMURvaTZvX0tla09qNU5aT1BXekVrdmktUkJMMWJpd2oyQjV2d2pISkdUb21rS3dEaWt4cHIxbHJTbktlTGNhYS1jdUhIdTNFY1U2NjY4aFJQWUlxLXlyaURMdHV6dFJSYndfMm9QaWFGWWRIWlhwaVdRcVV0cmlZc2NYUmc?oc=5",
"https://news.google.com/rss/articles/CBMilAFBVV95cUxPQUdQbDJ3T2o5OW9PTjhDUktLWVV1ZWFiNFpnRUxXdjUxcTdQbkREbmxQLUZjTnVsMDdaRThlRnYxYV9zVGVYRTNWb1dBYlRGVlY0TUs1dDZkSzgwMGhZZHVDM1BKVkN4Vjk1ek1GQ2ZLTEdpNEo0cEc2ZFd2R2drWDNWZnZvQWJLZTY0XzZYM0NleGVJ?oc=5",
"https://news.google.com/rss/articles/CBMi-wFBVV95cUxPalE0dHo4aWNDWi1feklPaDQyVE1EN1Zzd0lVVE1nMUN4Rm5UZlNvX0FBSVZSeVpJRnk4cWltX09ERDhDdUxyX1VVZ0d4QzI2bWRQUndTRTUzRDVudkhRZTl6YjNCSkFnV1IxWHhKMzlJSHNiU1FITGlOVnVPTGtmUXlSS2VxdEY4ZkNUQzhmandIczJnRHc3dWhoc0F3Y0FhamVmMmJqbFlTeUh4R2poMDNoS2JPMnJIaVdBSGFPd294NUtMQnV2MnV2YTlDOXVvcXMzSTkzOEhxdWV0YVgwS1FOM0FwR25iQWM3dTRhR2JqMGJlcGRuSzZUYw?oc=5",
"https://news.google.com/rss/articles/CBMi3AFBVV95cUxOb19TdVhmSFgxcTh2dUFfUGdvYkRseVo2dWowWGlmamlRalFycDNRaVZvMGlVU09DbHBNdENGbmhjVTBEN2E2OE1YSFd0Qnl2Y2lhaHYwQ0JkMER5bHhqWDdWbVpfTlJjVlZZZjhKYm04cWJET0xsUXM0bS05MmdKY00xVzJraGNScERpOTYxZmlJWnlKbUluVmxuYl9wZG1ZcTNwS2NnN1BBdjNsQ252X2V4VzNaUUZMdWFVNzY1Q2RPWXJhRUUtM1lFQnFuY1QzeHBvSzBlNk9mdGNF0gHiAUFVX3lxTE1GVlZ5MHZyaUxMNjhQXzBfZ1NGME5aWlMxWVZuZS0xeUI1aGRtbzZsQ1p2eFlZRHpaRFFPMU1yWV9PUVM3aVdYNnlPdGZJajk4Q1AxRlYzX09FT1BNS2oxYndNWWlLYnpja2dOWWlQTlQ5Tk5oeWxRTm0zbDFXSlFCRF9HV2VvNUJEdERnYWZTRVNZeHBoMHk2UGxTcklQbmVIVTNzTk1HQVVlOVlQbzA4LVIxdHFrM0lkTWI5VEhNcTc3U1RhQlQ0WFJUY2xVWUtsM0ViYTlVbVlzdVlyN0h1UHc?oc=5",
"https://news.google.com/rss/articles/CBMiugFBVV95cUxQTGFveWRZYTg0RWdWYlVQTEMyV0ZsZE1wZEJnTkZaQ2sxN2tJZVdmSjVVSTV3emY0VG54bk8wUTI1c1Q2cE5nRkFSS2ZsU3NRSGxYMTdYNVhMNzN5VUxIWS1JNXc3LXpoWmszOEFsdXVCcjZ6U19YXzlfTUtlUFdGUFJmTUJfUG1TZmVESjRqUV9ZVEZjZGJtZFhMMVlsVkJLTl9jRmQyZ2c0NHFlYWhMU0FQRHUtR0ptbHc?oc=5",
"https://um.edu.my/",
"https://www.pos.com.my/",
"https://news.google.com/rss/articles/CBMirwFBVV95cUxPTUZLV1d4elRUWTgxZHEtY1NyUTBpbFMxNDVmbGFwd3RiS3ZWQnpkb3NMRU1kM0ZXWnVFYml6bG5Nb2RMNm1JUGd5bDFNTXdIMXZiVGktbVZQLTg1anQ2Q0IzazVyZVhSSnF4V2VGZHYzVUl6UjhVT011TTYycUwxSzZQWjVBNVRieGVWeGdFdnlsaDk5aGtyRVd6ZVlnS1lSdUlFdktGVFVxZXR5QnBv0gG0AUFVX3lxTE43RUM3ZG9aaEFLNGRjOEU2VkhmMzhtcUwwUXJiT0F3d2ltV0VzSTZnRVJwaVBrYTkxRHF2aXRWSHlLd3BPVGlEQ205dEdmTjJaQ0NXTTVpODd5SEdOTVhHWm9NRHZBcHNIVlg3dDRldHBUZ0tZLVVta0ZOaVVuaWd3UHFKMTdnQWhnLUtmR2pLMVNFd2JfU0dsVDB0ZE9yUG1FZ09seG5JTGlCWGlSdTdRNktpQQ?oc=5",
"https://news.google.com/rss/articles/CBMi7wFBVV95cUxNT1lSSHUyOEVtWTVGMEVPRWxWc0UwTTdldmtVM1h1Z1RSTFMza2FuOXc3c0NLU3BydlBHV0tnbGNNNUxJdFZYLWlRdDJDMkd4N3FlQWRXdGo3UEN3c1VuWkNTeW95a2hYWlRzNGRvUVdCekRLWDFaR29pakQ5T2xzTlc2aXZwOUxKU0JMMEg4MjAwdW1XTnEzTkFhblkyLVJuYjk2XzBUT3BwZU1rTDdLc1ptRmlBZUFsS05IbzdSWTdnYnh6UEJCdy0zemM5Q0J5NXVud0pCWFRDWWdnWFRqSFd3dGpVZTk3bWFrSk1tQQ?oc=5",
"https://news.google.com/rss/articles/CBMi8wFBVV95cUxOclJVVEJMVGItdzlGdlhXR0hBbjEwb3gyb0ZJVVhoWm5qV3pRRVFmcm1tSjBqcFlCZkNEQktMUFBZbU5sTnV1MnU4bmItSVhJNTdNcFI2c0tPZk40VTk0dVVTVHNyRGtmMlc0cXdCcjdaOFBxWlAzbDB1UWtSMHhoUUZWWVpfYkZQWElTRVZYQ3hFeHd1Z2puT2pDSTVBT1A5M2Y4YVF3UHY2NlJzV21NVHgzQ0JNZk95NGpZRnBOWkNzZ2l1aHJkS2hBTmtsTFBvRnFCSk1ieVVTejRnRERsTy1IbWdEaXJWV01IQzZnUFFjT1k?oc=5",
"https://www.thestar.com.my/",
"https://www.hasil.gov.my/",
"https://www.kwsp.gov.my/",
"https://news.google.com/rss/articles/CBMiYkFVX3lxTE9YcW9JZ1U4UG52RC1XVGQ3eWtVdHA2R1BPNmNRYkVMOExHZndINm5vTWkzNzZwZW9DUVBfZlZJVklESVNMU2tlLVpPZ0p6QVZCQlFjamduQ2toS3NUVFVaaGhR?oc=5",
"https://news.google.com/rss/articles/CBMiigFBVV95cUxNTHNYT1d6SkdVVGI0M1I1REQ2S09WaFNMYlNSQzNxYktVUDVZc3hYWklkakk3RUVlZjlGQVR5M2ppLS1Pd3NrUWRhSXkyNGpXRFZBVjIxTk5rU2ZiaGRTazI3WXEzYlowSGpka0NDS3hYYkV3VU5QTzBfdlUyZEJoMHUzejltYXlyZ0HSAYYBQVVfeXFMUG5lLVJFSHVNdnJqS2x5dTFCYk1yT2hhZDVCSWJJbHpzakxqNTAwTGpsX3lESE1MN1BrMjFoODJnNkNESk9qT1dXWUFpbXQ2OVBSRFVfTU5XOG8tNXNTdVBWMEUwR1dKLWFlSF9xOXhWX0pidGxkMEFZZ1c2QVI0enY2QW03TkE?oc=5"
],
"static_urls": [
"https://www.malaysia.gov.my/",
"https://www.hasil.gov.my/",
"https://www.kwsp.gov.my/",
"https://um.edu.my/",
"https://www.maybank2u.com.my/",
"https://www.cimbclicks.com.my/",
"https://www.thestar.com.my/",
"https://shopee.com.my/",
"https://www.lazada.com.my/",
"https://www.pos.com.my/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "Nigeria - Lagos",
"google_module": {
"base_lat": 6.5244,
"base_lon": 3.3792,
"lang_params": "hl=en-NG&gl=NG",
"valid_url_suffix": "com.ng"
},
"trust_module": {
"white_urls": [
"https://punchng.com/court-frees-ex-hos-oyo-ita-in-n570m-money-laundering-case/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/epl-clubs-battle-for-dele-bashiru/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/portable-challenges-davido-zlatan-after-carter-efe-defeat/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/nigerian-passport-climbs-global-ranking-slips-in-visa-free-access/?utm_source=rss.punchng.com&utm_medium=web",
"https://guardian.ng/",
"https://www.vanguardngr.com/",
"https://www.airtel.com.ng/",
"https://www.mtn.ng/",
"https://punchng.com/edun-charges-nigerian-boxers-ahead-ghana-bout/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/akpom-joins-ipswich-permanently/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/adeshina-bags-texas-tech-student-athlete-award/?utm_source=rss.punchng.com&utm_medium=web",
"https://www.konga.com/",
"https://www.punchng.com/",
"https://punchng.com/fintech-oversubscribes-debut-cp-raises-n6-89bn/?utm_source=rss.punchng.com&utm_medium=web",
"https://www.nairaland.com/",
"https://punchng.com/iran-creates-authority-to-control-strait-of-hormuz/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/11th-nass-senate-blocks-ex-govs-uzodimma-from-principal-offices/?utm_source=rss.punchng.com&utm_medium=web",
"https://www.firstbanknigeria.com/",
"https://punchng.com/unity-cup-chelle-rates-3sc-midfielder-ayobami/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/gunners-end-lookmans-ucl-dream/?utm_source=rss.punchng.com&utm_medium=web",
"https://www.gtbank.com/",
"https://punchng.com/egbunike-backs-ogazi-for-more-records/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/oyebanji-labels-oyebode-football-tourney-talent-pipeline/?utm_source=rss.punchng.com&utm_medium=web",
"https://punchng.com/leverkusen-coach-hails-tellas-quality/?utm_source=rss.punchng.com&utm_medium=web",
"https://www.jumia.com.ng/"
],
"static_urls": [
"https://www.jumia.com.ng/",
"https://www.punchng.com/",
"https://www.gtbank.com/",
"https://guardian.ng/",
"https://www.konga.com/",
"https://www.firstbanknigeria.com/",
"https://www.vanguardngr.com/",
"https://www.nairaland.com/",
"https://www.airtel.com.ng/",
"https://www.mtn.ng/"
]
}
}

View File

@@ -1,44 +0,0 @@
{
"region_name": "Netherlands - Amsterdam",
"google_module": {
"base_lat": 52.3676,
"base_lon": 4.9041,
"lang_params": "hl=nl&gl=NL",
"valid_url_suffix": "nl"
},
"trust_module": {
"white_urls": [
"https://www.belastingdienst.nl/",
"https://nos.nl/l/2613239",
"https://www.ing.nl/",
"https://nos.nl/l/2613252",
"https://nos.nl/l/2613279",
"https://www.bol.com/",
"https://nos.nl/l/2613278",
"https://nos.nl/l/2613237",
"https://nos.nl/l/2613274",
"https://nos.nl/l/2613263",
"https://nos.nl/l/2613276",
"https://www.rijksoverheid.nl/",
"https://www.marktplaats.nl/",
"https://www.buienradar.nl/",
"https://nos.nl/l/2613270",
"https://nos.nl/l/2613232",
"https://nos.nl/l/2613261",
"https://nos.nl/l/2613243",
"https://nos.nl/l/2613233",
"https://www.ns.nl/",
"https://nos.nl/l/2613272",
"https://nos.nl/l/2613275"
],
"static_urls": [
"https://www.rijksoverheid.nl/",
"https://www.belastingdienst.nl/",
"https://www.ing.nl/",
"https://www.ns.nl/",
"https://www.bol.com/",
"https://www.marktplaats.nl/",
"https://www.buienradar.nl/"
]
}
}

View File

@@ -8,39 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.channelnewsasia.com/sport/iranian-fa-chief-says-fifa-guarantees-over-irgc-respect-essential-world-cup-trip-6102951",
"https://www.cpf.gov.sg/",
"https://www.straitstimes.com/",
"https://www.channelnewsasia.com/",
"https://www.gov.sg/",
"https://www.channelnewsasia.com/sport/crunch-time-capitals-after-latest-loss-dampens-playoffs-hopes-6103226",
"https://www.singpass.gov.sg/",
"https://www.channelnewsasia.com/entertainment/rb-choudary-death-car-crash-6102861",
"https://www.channelnewsasia.com/world/australia-says-13-citizens-linked-alleged-members-returning-syria-6103061",
"https://www.channelnewsasia.com/entertainment/d23-asia-fan-event-singapore-2027-6102856",
"https://www.channelnewsasia.com/asia/aung-san-suu-kyi-asean-access-6103056",
"https://www.channelnewsasia.com/singapore/singapore-airlines-sia-a350-900-airbus-first-business-class-seats-delayed-6102836",
"https://www.channelnewsasia.com/singapore/malaysian-bank-harvesting-handler-4-million-100-bank-accounts-jail-6103041",
"https://www.shopee.sg/",
"https://shopee.sg/",
"https://en.wikipedia.org/wiki/Special:Random",
"https://www.fairprice.com.sg/",
"https://www.nus.edu.sg/",
"https://www.channelnewsasia.com/sport/australias-smith-confident-liv-will-go-after-saudi-pull-out-6102746",
"https://www.channelnewsasia.com/sport/casemiro-backs-carrick-permanent-man-united-managers-job-6102886",
"https://www.channelnewsasia.com/singapore/ai-in-schools-age-appropriate-focus-learning-not-shortcuts-desmond-lee-6103101",
"https://www.channelnewsasia.com/singapore/maid-jail-married-man-bigamy-batam-6102821",
"https://www.iras.gov.sg/",
"https://www.channelnewsasia.com/asia/cambodia-prime-minister-cousin-hun-owns-huione-scam-6103106",
"https://www.channelnewsasia.com/business/infineon-lifts-2026-outlook-ai-demand-boosts-growth-prospects-6103256",
"https://www.dbs.com.sg/",
"https://www.channelnewsasia.com/entertainment/bts-in-mexico-arirang-2026-6102721"
],
"static_urls": [
"https://www.gov.sg/",
"https://www.cpf.gov.sg/",
"https://www.iras.gov.sg/",
"https://www.singpass.gov.sg/",
"https://www.nus.edu.sg/",
"https://www.dbs.com.sg/",
"https://www.shopee.sg/",
"https://www.fairprice.com.sg/"
"https://www.dbs.com.sg/"
]
}
}
}

View File

@@ -1,48 +0,0 @@
{
"region_name": "Taiwan - Taipei",
"google_module": {
"base_lat": 25.033,
"base_lon": 121.5654,
"lang_params": "hl=zh-TW&gl=TW",
"valid_url_suffix": "com.tw"
},
"trust_module": {
"white_urls": [
"https://news.google.com/rss/articles/CBMiiANBVV95cUxOOWRvdXRJam5UWE5XODhZeXFsdTFrQk0wRE4zLWYxVXg1VWlXeTZxOXB6aE9BdUExVzJPR3BsZ1IzcFdlYi10WmMteUNUZGJhNkpydVBzQkZ6MFUyaVIzaEhpZzVWWWN1VWpfUnAxbWY4WnRtOVFxcE40Q1BRVFZMYVNaUkR6SnZSa1NfS1JjWlRnbE9XcVN2MzZERWJjaHE0RVFYMDRGNWhqQUJJME5Sc2ZucHRVVng5T21QTnNadlhYb1JuOXFUVDNiYTY1WTZLUWFBeVdEbFZFVnI5UU04ZXpMVnBYN1ZsSTROOFJRektobFJVdVhvTXhjbHVQLXc4aF8wRUw2blFkOWVPZ3BKSlNwcHBOM0VFZlZwZVZVT0tWeUVrRkh4ZTBLQ2V1RVhlandmcXY3SGIxVVBCTjZJUE9tY0toMG1mSXV2QjFCcm53U0NIeUhTUFMtZUloai1VZUZUanBkOWxfb3dfVDdHZW0wb05GTHlUX1JDVm5YalU3b085VklHRw?oc=5",
"https://news.google.com/rss/articles/CBMiXkFVX3lxTE9ENzFFTS1hQjY2Q2N0Y21TLVVQN3pfaWlpU29KOUxOS0hJekR4ZmVNTlBuVWxNWUhGRGs5aW1QcE5ZNGpBNEJVMF9ES3JqRjhkaU1keGpZb1pNeHBZSlHSAWhBVV95cUxOcndtdzNmR2J5RHBmMmVRbDFROU96MHhNeHN2MzdMNEJsSVZNX3Jpa0VkaDIzaG1wWjM4a0JyNlAybXpkUG9FZGp2dGxfdDJrUC1RbFB6NzhXMFc3aDlCczR3Vno3UzFMNA?oc=5",
"https://news.google.com/rss/articles/CBMiU0FVX3lxTE45Y0hITVNnX0laYl9xdmdvcUZWTVNoZXBzVzZYNWtrMmlxaHpHOHlCSEpKY1o2OXFZVE0zWElBVWpnRnVSWnFxeGsybmQ5NmR5NzFz?oc=5",
"https://www.pchome.com.tw/",
"https://news.google.com/rss/articles/CBMiZkFVX3lxTE54UjUydzRTaVVxOUNBSGh6TTA0elc2VmdpU2lWSDdlWDdKRVpkYlFXeXNXR1JKd29fdzdBWEwxRVRGNXJSS0NBSXFZazhqcWVadUJCRXFWZ1VNYkNVOEpucmNCd0NSUdIBa0FVX3lxTFBDaUdKVktqRzdwVk9hbjByejB6WWFYaklfMVhsV1ZhWkpDWVF6LWNlRWt0UGNZY3M2ZzVHQXpGYnNFeVMtT3BsU1ZqeDQ5MTlOdjlLS3J3UXEyN0lKR0Z2aF9FcVp4WF83NE5J?oc=5",
"https://www.cathaybk.com.tw/",
"https://news.google.com/rss/articles/CBMirwJBVV95cUxPcDN5SFo1U240N1h5RFZwMUYtMXNjLUxrRGJpUFdBcU5LeldQaVQ5b3kyamhLY2lXbTdmTl8wdEJEVjctazZtMnhvMFpaQzZMT0Q0cE5wLW1BaUhBTEhnQ19yLXg2NjhBTzY3V3pCT2VsUGlzQjRKMlRuODJYOXdhYlBrN2RTWVhWLVBUVktmaGkxS0NzMUtfdS11cmkyclVfSjFRWGVqMFhXeGZfWjRIZ2lVNXdjcm9hYW1aRDkxblp4aFFIMk9yVU43X05vWlMyTjl6bjNJejNvTHRaTVdmZ1lrUi1wS3VoLTQ1VERCZnhWTFp4d3IwV0gxX050MS1iUFJWZ2d3VlRjcVhsMHIwM1pXTURoQ2dRTlJ1Ry01WlpLOWFqY0lCdFlMNXlkUHM?oc=5",
"https://www.dcard.tw/",
"https://www.post.gov.tw/",
"https://www.momoshop.com.tw/",
"https://www.gov.tw/",
"https://news.google.com/rss/articles/CBMi1gJBVV95cUxONEF4cnpSaUtfLUFzTm13SGZicVVoOHhGUGZ2dnNaVFVWWjMwWFoxelpMclhJa2JCanN6Q0JhVTQyR3JYZzY1WVpTR1B6el9OTzlpNllOYnNSN0RKNFltRjJsTVZvLTdfcDItU3J0ZE01M0w0c2ZZRWNETzdhOTZhcjdid3FLMUk2d0pRN3pXeGtPc2NGTkQwenBlcHpMR2I4cC1jVHhxSnppSTljSkI4Vm1kVEFDZV82eWFyZklCVTJ2TS1kM2VHYlpUMWNmbDNTRTRmZEt3dTFSNmxHU0E5dGtHZS1DYjFPZFZILW9mSXY2d2J1dHJWdEV1R282TWNRNzFsSmdjTk1MY1A5aUtiWi1wTkEzZUNPYlA0RVg0b19NRnc0b1lKUGJuSVFybDRRQlhPTGVYWnlzVmhKV2pXV2RVakVzR0NCdFdFbG1zWFNtY2Y2ZGc?oc=5",
"https://www.thsrc.com.tw/",
"https://news.google.com/rss/articles/CBMiW0FVX3lxTE5XVVpkMnVBOTd2bUEyUDZIOXQ0NXpCT3dTM1h1dVhKY3dvcDFNTjc0TmJxeWhsaTZxMFBhY2pfVVVGeDJvbWFtbTltcm5UYXNyZEI1RXctc3NYdzA?oc=5",
"https://news.google.com/rss/articles/CBMi3gJBVV95cUxNS0dTcWdoVkJUdGQySXZFSzI2OUFBak16ZFFfYXhoQVhvcFZKeTF2c1QxOFdheGZ4eXBGbVpidW5TZXJwcDBjSzVtOVNBMUw3UURMMUppQ00za3JfSGI4U3BoSWYwYlRDNnNtOWJneVo0N2YyS3JDdDZ0c1F4Y1NVMlhaajJfTG12eWtHNVN3WGJnSGRNVDE2WlpzbDRWNTV5bFNjUGpVY0ZqU3oyOFkzYVVUcXRJdDhLTjRPdFhDVkE0aVh3YklEaGlnY240RGRiazVmcG9ET3hRUXplSjY2TFJSMFVOOUNjcEVmdkExUFJpcVhIOHphOWZkanNhZWlOaENWMFJ3OFFqLVJDdzkyNUhYZWZyajIwWUNpcmU0dkQxbk1TcGZCTjY3dGVaVDFXZldZX19VTzJzeVVZT09oRVYtQkhSM1h2Zm9NWFdrRzdjN25OZEJnTmhiLTB2Zw?oc=5",
"https://news.google.com/rss/articles/CBMiUEFVX3lxTE93V1hqX1VvUXp4b2J1TXlFeHFYWXdOd3hpaDI4Rms4Tnp5YkhzZ2pWVXVJN29peGM4dWk4QktKZU41R1Vab1V4RUpIeDFaeUFu0gFWQVVfeXFMUGM5bTFPQ2I5Um4yU3dwV2NnWXBSMWtkRTI1dVNPNno1SWtGOHM1Z3oyaVVaRE9yeHZIQTY2NEZOa2V1emdBcWpHWTZQVEJmU3VQWWNqbWc?oc=5",
"https://news.google.com/rss/articles/CBMi3AJBVV95cUxQU1BIU1RZUWEzcUVZQVJWaEtYSVRZeWdibVlEaUZhY1ZVZGtiMGdFZXIyWTM2cUgxazZ2UWcwQ1Bnd2JVbmVJaEk4cXptb1docVZfTVdOclRrWHNtR1FIZ3NSZ1hSTk1GcFV2bEtMbG1sc3ZqTjV6ZkREamk0UVZBNmFtZ3RURlhoOUFESk9ZMEtNZk9sMjQ0NmY2eTNTUy1hdlBoa3lyNW9IaVBmRGZhMUM3dGZoVjExaUlrUGxiZ3Q1SVM5TnhqdnZBcVFfWGFqNnJhX3hScDRhcFRaQTdDYWZCWjlpWEZCMmtvWmt4a19MaUxaR0kxMllKRERReTMtYzNadXpLZEl4dTdvMmE5bnYwRmZDbF9WUXg5ZVVTSXNtSUpvS1d6VEVjdHBwSFVNSlJrRVp6THlTeW5mX1hNQUpTYnd0ZGYyVm82MzVaUHVXdVEySm02em9ESjE?oc=5",
"https://news.google.com/rss/articles/CBMisgJBVV95cUxPSlRhdXVBOTI2X2YycE9IYUN2eGtmS2RzSkFRU2pZV01SVlg4c25Jejc3YzY1R1h1UnhFenUwTm80NW1MSTVjUGU1ZkFpWTd6aEEweF92bFozeW9kLWFhekFxVTAxamlZenl5anowdHRLTjlHcC1fV0NrUmN3eXRmZ21Zb056SVF6MzlNSEJyQ1JWekNoNVhLaGIwXzZ1V1kyY0NOdEJfWGw4ZEJzSVc2SmU5NDNtSXgxWWExRkJzZXVka0gxT2FadkRCMVpuNWtUQTFHSmNmYWdOSlh5T0N5WEFDR0lTYWtDdzJsd2NxSTR6dmVfNkdRUFFrN0FldXVzeGZtbGdIU3g3YWZCN0JkNzdmRy1LelVvblY1ZC14dWhuYmdoNk9RNndQSlU0UURucFE?oc=5",
"https://news.google.com/rss/articles/CBMiW0FVX3lxTE1SWTVMS2lwUzRBalZQTXQyVkg2dC1mbWZ5NV9GQnJvY0txOWR3cEJCdVZBZGJTeHRQSHZxYVd4bFJaN1JTTzhMTEdqZVpIdGpUYUx6bzBpaF9OQVnSAWBBVV95cUxNR05Md05fdkFTMGpXdDlRZEZWNTJiQ1BlM2FtYm1lQUVCZDdwSW5lN0gyNjA2TzRNOThzMTQ3WUtWZnhvWDhtbFI3MkpYWFJ1Z2dJV3dSbnphUExUWDFsRWo?oc=5",
"https://www.ntu.edu.tw/",
"https://news.google.com/rss/articles/CBMiTkFVX3lxTE5uRTJ0eFQyVXo3b3dVZE9iQjJZazdTV0UwYVktd0xoQkY2MmNEVDE0cWpJcWVMNTlNeEg2dUZFaDFLWUE0OFNGTXBrVk9wZw?oc=5",
"https://tw.yahoo.com/",
"https://news.google.com/rss/articles/CBMiuAFBVV95cUxOY0ZSWHJ6aTBDLXVYYlltSXktdktWaHAxM2hJUW1OSDJtWF9xdDBjVVJaalZ2NS1uWDN1V3RmNjJMay1yNHFmUldrTU9fYlptbVlmbmlaOW5HY09sZHhwOFFrel9lc0l2MFlFeE9aSlVtVnJuaWtrcUhQM25Xdmc0ckJSZVYzQ2ZDdGlkVnNzTnAwZVlqeXEwUjJDT0xWNXUtUXVQZFRKN2FpWjlZeEN4bTNiSk92c3lF?oc=5",
"https://news.google.com/rss/articles/CBMi4AJBVV95cUxNZHlMYzRTRm80UmM4QlJLaGVLRi1IbkRwdkgyX1NVLThfX09GV0xTbEV2QzkySXFPUHF0LXpXU3lWazY1QWtYZ3ZucnctZDdwcUNCQXV3UmFYWHJ3aldGajQ0YUdvaGh3Y1hTdmN3SzAzQTN2NFp4dXlaVmVzc0hzQmhiekxpWHAxb2tBNi02bFRrZDcyQjFGWk9hYVlLaHF3a190QlVIMHc4bWMtcm5NSW5DTDI5RkExVDFiMGl5cTUybWJBN2trREt4Ty1WUFl4T1JuSy1oaDBIU0tjQ3oyZ0pFNWFPckRkdDdOTVAzb0dzbUhhRENnY08tZ2RiWGZoUkhCdElHWDlkaExjVV8xeFJ5SmVpQVBaZFMwZzQzZ1lYWHNveHJmODYtbFczcFh4Z2VONlVDRlcxOHhoc3hGZG8yd2NrdTc5SGRaWWc4X0hGTXNPa2dWT21HUUxHNDEx?oc=5"
],
"static_urls": [
"https://www.gov.tw/",
"https://www.post.gov.tw/",
"https://www.ntu.edu.tw/",
"https://www.cathaybk.com.tw/",
"https://www.thsrc.com.tw/",
"https://tw.yahoo.com/",
"https://www.momoshop.com.tw/",
"https://www.pchome.com.tw/",
"https://www.dcard.tw/"
]
}
}

View File

@@ -1,46 +0,0 @@
{
"region_name": "United Kingdom - Coventry",
"google_module": {
"base_lat": 52.4068,
"base_lon": -1.5197,
"lang_params": "hl=en&gl=GB",
"valid_url_suffix": "co.uk"
},
"trust_module": {
"white_urls": [
"https://www.bbc.com/news/articles/c759z9w7z3yo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/clyp5rr0lm6o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/cz72eye5zzeo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/c893xj41zwdo?at_medium=RSS&at_campaign=rss",
"https://www.nhs.uk/",
"https://www.bbc.com/news/articles/c202652vvnjo?at_medium=RSS&at_campaign=rss",
"https://www.ebay.co.uk/",
"https://www.postoffice.co.uk/",
"https://www.bbc.com/news/articles/cdjpdzvzy41o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/ce8pypvjx1ko?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/cy82p2x86qzo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/clype7ededzo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/sport/rugby-union/articles/ckgpn3pdzr7o?at_medium=RSS&at_campaign=rss",
"https://www.ox.ac.uk/",
"https://www.bbc.com/sport/football/articles/cjep34l5qd7o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/cy82x9wve2xo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.co.uk/sounds/play/p0njf7kr?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/sport/tennis/articles/cx21klez7ppo?at_medium=RSS&at_campaign=rss",
"https://www.gov.uk/",
"https://www.barclays.co.uk/",
"https://www.amazon.co.uk/",
"https://www.nationalrail.co.uk/",
"https://www.bbc.com/news/articles/c707k90lplno?at_medium=RSS&at_campaign=rss"
],
"static_urls": [
"https://www.gov.uk/",
"https://www.nhs.uk/",
"https://www.ox.ac.uk/",
"https://www.barclays.co.uk/",
"https://www.postoffice.co.uk/",
"https://www.nationalrail.co.uk/",
"https://www.amazon.co.uk/",
"https://www.ebay.co.uk/"
]
}
}

View File

@@ -8,39 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.bbc.com/news/articles/cdjpdzvzy41o?at_medium=RSS&at_campaign=rss",
"https://www.postoffice.co.uk/",
"https://www.bbc.com/news/articles/c759z9w7z3yo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/clype7ededzo?at_medium=RSS&at_campaign=rss",
"https://www.nationalrail.co.uk/",
"https://www.bbc.com/news/articles/clyp5rr0lm6o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/sport/rugby-union/articles/ckgpn3pdzr7o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/cy82p2x86qzo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/sport/tennis/articles/cx21klez7ppo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/c893xj41zwdo?at_medium=RSS&at_campaign=rss",
"https://www.ebay.co.uk/",
"https://www.amazon.co.uk/",
"https://www.barclays.co.uk/",
"https://www.bbc.com/news/articles/c707k90lplno?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/ce8pypvjx1ko?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/sport/football/articles/cjep34l5qd7o?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/cy82x9wve2xo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.com/news/articles/c202652vvnjo?at_medium=RSS&at_campaign=rss",
"https://www.bbc.co.uk/",
"https://www.gov.uk/",
"https://www.nhs.uk/",
"https://www.bbc.com/news/articles/cz72eye5zzeo?at_medium=RSS&at_campaign=rss",
"https://www.ox.ac.uk/",
"https://www.bbc.co.uk/sounds/play/p0njf7kr?at_medium=RSS&at_campaign=rss"
],
"static_urls": [
"https://www.gov.uk/",
"https://www.nhs.uk/",
"https://www.ox.ac.uk/",
"https://www.barclays.co.uk/",
"https://www.postoffice.co.uk/",
"https://www.nationalrail.co.uk/",
"https://www.amazon.co.uk/",
"https://www.theguardian.com/uk",
"https://www.nhs.uk/",
"https://en.wikipedia.org/wiki/Special:Random",
"https://www.ebay.co.uk/"
]
}
}
}

View File

@@ -8,43 +8,13 @@
},
"trust_module": {
"white_urls": [
"https://www.irs.gov/",
"https://www.harvard.edu/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cdc.gov/",
"https://www.amazon.com/",
"https://www.chase.com/",
"https://www.usa.gov/",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.bankofamerica.com/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://en.wikipedia.org/wiki/Special:Random",
"https://www.yahoo.com/",
"https://www.target.com/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.usps.com/",
"https://www.walmart.com/",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.npr.org/",
"https://www.weather.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
"https://www.cdc.gov/"
]
}
}

View File

@@ -8,43 +8,14 @@
},
"trust_module": {
"white_urls": [
"https://www.usa.gov/",
"https://en.wikipedia.org/wiki/Special:Random",
"https://www.yahoo.com/",
"https://www.target.com/",
"https://www.bankofamerica.com/",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.npr.org/",
"https://www.weather.com/",
"https://www.amazon.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cdc.gov/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.chase.com/",
"https://www.walmart.com/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.harvard.edu/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.irs.gov/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.usps.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
"https://www.mercurynews.com/"
]
}
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Florida (Miami)",
"google_module": {
"base_lat": 25.7617,
"base_lon": -80.1918,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.amazon.com/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.irs.gov/",
"https://www.zillow.com/",
"https://www.indeed.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.walmart.com/",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.target.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.usa.gov/",
"https://www.homedepot.com/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.weather.gov/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.chase.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Georgia (Atlanta)",
"google_module": {
"base_lat": 33.749,
"base_lon": -84.388,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.weather.gov/",
"https://www.amazon.com/",
"https://www.homedepot.com/",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.usa.gov/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.zillow.com/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.irs.gov/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Iowa (Council Bluffs)",
"google_module": {
"base_lat": 41.2619,
"base_lon": -95.8608,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.indeed.com/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.usa.gov/",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.weather.gov/",
"https://www.irs.gov/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.homedepot.com/",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Warrenville",
"google_module": {
"base_lat": 41.8164,
"base_lon": -88.1748,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.amazon.com/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.usps.com/",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.harvard.edu/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.usa.gov/",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cdc.gov/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.target.com/",
"https://www.irs.gov/",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.bankofamerica.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Charlotte",
"google_module": {
"base_lat": 35.2271,
"base_lon": -80.8431,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.harvard.edu/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.irs.gov/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.bankofamerica.com/",
"https://www.usps.com/",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cdc.gov/",
"https://www.walmart.com/",
"https://www.amazon.com/",
"https://www.chase.com/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.target.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.usa.gov/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - New Jersey (Newark)",
"google_module": {
"base_lat": 40.7357,
"base_lon": -74.1724,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.usa.gov/",
"https://www.weather.gov/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.chase.com/",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.indeed.com/",
"https://www.irs.gov/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.zillow.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.homedepot.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Las Vegas",
"google_module": {
"base_lat": 36.1699,
"base_lon": -115.1398,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.usa.gov/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cdc.gov/",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.irs.gov/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.bankofamerica.com/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.harvard.edu/",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.usps.com/",
"https://www.amazon.com/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.target.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - New York",
"google_module": {
"base_lat": 40.7128,
"base_lon": -74.006,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.chase.com/",
"https://www.target.com/",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.walmart.com/",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.amazon.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.usa.gov/",
"https://www.weather.gov/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.indeed.com/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.zillow.com/",
"https://www.irs.gov/",
"https://www.homedepot.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Ohio (Columbus)",
"google_module": {
"base_lat": 39.9612,
"base_lon": -83.0007,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.walmart.com/",
"https://www.usa.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.target.com/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.homedepot.com/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.amazon.com/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.indeed.com/",
"https://www.irs.gov/",
"https://www.zillow.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Bend",
"google_module": {
"base_lat": 44.0582,
"base_lon": -121.3153,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.irs.gov/",
"https://www.walmart.com/",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.usa.gov/",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.harvard.edu/",
"https://www.usps.com/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cdc.gov/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.bankofamerica.com/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.amazon.com/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.target.com/",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Dallas",
"google_module": {
"base_lat": 32.7767,
"base_lon": -96.797,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.dallasnews.com/",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.target.com/",
"https://www.foxnews.com/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.texas.gov/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.chase.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.nytimes.com/",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.amazon.com/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.bankofamerica.com/"
],
"static_urls": [
"https://www.texas.gov/",
"https://www.dallasnews.com/",
"https://www.cnn.com/",
"https://www.foxnews.com/",
"https://www.nytimes.com/",
"https://www.amazon.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.chase.com/",
"https://www.bankofamerica.com/"
]
}
}

View File

@@ -1,40 +0,0 @@
{
"region_name": "USA - Houston",
"google_module": {
"base_lat": 29.7604,
"base_lon": -95.3698,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.houstontx.gov/",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.rice.edu/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.mdanderson.org/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.houstonchronicle.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.nasa.gov/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html"
],
"static_urls": [
"https://www.houstontx.gov/",
"https://www.houstonchronicle.com/",
"https://www.rice.edu/",
"https://www.mdanderson.org/",
"https://www.nasa.gov/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Salt Lake City",
"google_module": {
"base_lat": 40.7608,
"base_lon": -111.891,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.usps.com/",
"https://www.chase.com/",
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.harvard.edu/",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.bankofamerica.com/",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cdc.gov/",
"https://www.amazon.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Virginia (Ashburn)",
"google_module": {
"base_lat": 39.0438,
"base_lon": -77.4874,
"lang_params": "hl=en-US&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.chase.com/",
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.homedepot.com/",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.irs.gov/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.indeed.com/",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.weather.gov/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.usa.gov/",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.target.com/",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.amazon.com/"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.weather.gov/",
"https://www.chase.com/",
"https://www.indeed.com/",
"https://www.zillow.com/",
"https://www.walmart.com/",
"https://www.target.com/",
"https://www.amazon.com/",
"https://www.homedepot.com/"
]
}
}

View File

@@ -1,50 +0,0 @@
{
"region_name": "United States - Seattle",
"google_module": {
"base_lat": 47.6062,
"base_lon": -122.3321,
"lang_params": "hl=en&gl=US",
"valid_url_suffix": "com"
},
"trust_module": {
"white_urls": [
"https://www.cnn.com/2023/04/17/entertainment/jamie-foxx-remains-hospitalized/index.html",
"https://www.harvard.edu/",
"https://www.cdc.gov/",
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
"https://www.target.com/",
"https://www.cnn.com/cnn-underscored/fashion/mens-spring-fashion-style-guide?iid=CNNUnderscoredHPcontainer",
"https://www.amazon.com/",
"https://www.cnn.com/videos/travel/2023/04/18/century-old-shipwrecks-lake-superior-discovery-contd-orig-zt.cnn",
"https://www.cnn.com/cnn-underscored/travel/amazon-travel-products?iid=CNNUnderscoredHPcontainer",
"https://www.cnn.com/2023/04/18/politics/fulton-county-trump-fake-electors/index.html",
"https://www.cnn.com/2023/04/18/us/kansas-city-ralph-yarl-shooting-tuesday/index.html",
"https://www.cnn.com/audio/podcasts/the-assignment/episodes/42a2f0e2-066a-4675-82ff-afe2016a0bb5",
"https://www.bankofamerica.com/",
"https://www.irs.gov/",
"https://www.cnn.com/2023/04/18/sport/damar-hamlin-cleared-to-train-nfl-spt-intl/index.html",
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
"https://www.cnn.com/videos/travel/2023/03/17/pilot-lands-on-dubai-helipad-cprog-orig-aw-ao.cnn",
"https://www.cnn.com/videos/tech/2023/04/18/apple-store-mumbai-india-ceo-tim-cook-vedika-sud-ovn-biz-ldn-vpx.cnn",
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
"https://www.usa.gov/",
"https://www.usps.com/",
"https://www.chase.com/",
"https://www.walmart.com/",
"https://www.cnn.com/2023/04/17/business/mcdonalds-burgers/index.html",
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html"
],
"static_urls": [
"https://www.usa.gov/",
"https://www.irs.gov/",
"https://www.cdc.gov/",
"https://www.harvard.edu/",
"https://www.chase.com/",
"https://www.bankofamerica.com/",
"https://www.amazon.com/",
"https://www.target.com/",
"https://www.walmart.com/",
"https://www.usps.com/"
]
}
}

View File

@@ -1,44 +0,0 @@
{
"region_name": "Vietnam - Hanoi",
"google_module": {
"base_lat": 21.0285,
"base_lon": 105.8542,
"lang_params": "hl=vi&gl=VN",
"valid_url_suffix": "vn"
},
"trust_module": {
"white_urls": [
"https://vnu.edu.vn/",
"https://vnexpress.net/phat-hien-su-that-ve-ba-dua-con-qua-anh-vo-gui-nguoi-la-5070373.html",
"https://chinhphu.vn/",
"https://shopee.vn/",
"https://vnexpress.net/iran-tuyen-bo-du-an-tu-do-cua-my-da-that-bai-5070469.html",
"https://dichvucong.gov.vn/",
"https://vnexpress.net/cuoc-song-binh-yen-cua-nghe-si-duc-khue-5069086.html",
"https://vnexpress.net/sut-lun-tai-thu-do-mexico-nhin-tu-khong-gian-5070546.html",
"https://vnexpress.net/co-hoi-kiem-tien-o-dau-trong-quy-2-5070566.html",
"https://vnexpress.net/sao-dep-nhat-trung-quoc-gay-sot-voi-phim-chu-de-ngoai-tinh-5070451.html",
"https://vnexpress.net/cong-chua-tay-ban-nha-lai-tiem-kich-f-5-5070438.html",
"https://tiki.vn/",
"https://vnexpress.net/khoet-chop-co-tu-cung-ngan-ung-thu-5070403.html",
"https://vnexpress.net/tvs-ronin-moto-an-do-gia-73-trieu-dong-5070422.html",
"https://vnexpress.net/khoanh-khac-may-bay-lao-vao-chung-cu-o-brazil-5070413.html",
"https://vnexpress.net/",
"https://vnexpress.net/hang-loat-video-bao-luc-hoc-duong-gay-rung-dong-nhat-ban-5069717.html",
"https://vnexpress.net/hau-ve-phan-luoi-nha-va-nhan-the-do-khien-thai-lan-thua-o-u17-chau-a-5070517.html",
"https://vnexpress.net/thu-do-dau-tien-tren-the-gioi-cam-quang-cao-thit-de-bao-ve-khi-hau-5070425.html",
"https://vnexpress.net/viet-cho-thieu-nhi-so-nhat-la-sa-da-dao-ly-5070345.html",
"https://vnexpress.net/viet-nam-dua-radar-uav-va-khi-tai-hien-dai-toi-trien-lam-quoc-phong-tho-nhi-ky-5070411.html",
"https://www.vietcombank.com.vn/"
],
"static_urls": [
"https://chinhphu.vn/",
"https://dichvucong.gov.vn/",
"https://vnu.edu.vn/",
"https://www.vietcombank.com.vn/",
"https://shopee.vn/",
"https://tiki.vn/",
"https://vnexpress.net/"
]
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,115 +1,65 @@
#!/bin/bash
# ==========================================================
# 脚本名称: install_master.sh (IP-Sentinel 控制中枢部署脚本 - 动态锚点版)
# 脚本名称: install_master.sh (IP-Sentinel 控制中枢部署脚本 v3.2.2)
# 核心功能: 部署/卸载调度中枢、SQLite 资产管理、平滑热更新引擎
# ==========================================================
# ==========================================================
# 🛑 核心权限防线: 检查是否以 root 权限运行
# ==========================================================
if [ "$EUID" -ne 0 ]; then
echo -e "\033[31m❌ 权限被拒绝: 部署 IP-Sentinel 需要最高系统权限。\033[0m"
echo -e "💡 请切换到 root 用户 (执行 su root 或 sudo -i) 后重新运行指令。"
exit 1
fi
# 🟢 [防劫持沙盒] 引入司令部专属随机安全工作区
SECURE_TMP=$(mktemp -d /tmp/ips_master_install.XXXXXX)
trap 'rm -rf "$SECURE_TMP"' EXIT HUP INT QUIT TERM
# 你的 GitHub 仓库 Raw 数据直链前缀
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
# 临时改为开发地址用于测试
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
# [核心: 动态提取 Master 专属版本锚点 (KV 解析法)]
# 通过 grep 定位 MASTER_VERSION 行,再通过 cut 提取等号右侧的值
# [修复] 增加 -L 与双栈容灾 (-4),解决纯 V6 或 V6 优先机器连接 GitHub Raw 易超时的问题
TARGET_VERSION=$( (curl -sL -m 5 "${REPO_RAW_URL}/version.txt" || curl -4 -sL -m 5 "${REPO_RAW_URL}/version.txt") 2>/dev/null | grep "^MASTER_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
# 🛡️ 兜底防线:如果网络波动拉取失败,启用内置的最新兜底版本
TARGET_VERSION=${TARGET_VERSION:-"4.0.7"}
# [新增] 提取仓库直链前缀变量,方便后续在官方库和私库间一键切换
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/legacy"
# 临时改为私库地址用于测试
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
MASTER_DIR="/opt/ip_sentinel_master"
DB_FILE="${MASTER_DIR}/sentinel.db"
echo "========================================================"
# [修改] 将欢迎语改为更通用的文案,因为现在不仅能部署,还能卸载
echo " 🧠 欢迎使用 IP-Sentinel Master (控制中枢) v${TARGET_VERSION}"
echo " 🧠 欢迎使用 IP-Sentinel Master (控制中枢) v3.2.2"
echo "========================================================"
# ==========================================================
# [v3.6.1 核心] 拦截司令部静默 OTA 升级模式 (强行接管执行流)
# ==========================================================
if [ "$SILENT_MASTER_OTA" == "true" ]; then
echo -e "\n⏳ [OTA] 中枢重构指令已确认,正在剥离控制台交互..."
ACTION_CHOICE=1
UPGRADE_MODE="true"
KEEP_DB="true"
# 汲取原配置进入内存
if [ -f "${MASTER_DIR}/master.conf" ]; then
source "${MASTER_DIR}/master.conf"
# 同步新版本号至配置文件
if grep -q "^MASTER_VERSION=" "${MASTER_DIR}/master.conf"; then
sed -i "s/^MASTER_VERSION=.*/MASTER_VERSION=\"$TARGET_VERSION\"/" "${MASTER_DIR}/master.conf"
else
echo "MASTER_VERSION=\"$TARGET_VERSION\"" >> "${MASTER_DIR}/master.conf"
fi
fi
echo -e "\033[32m✅ 已激活 [中枢静默重构模式],即将无损覆写内核...\033[0m"
else
# [新增] 交互式操作菜单:支持选择部署或调用卸载程序
echo -e "\n请选择操作:"
echo " 1) 🚀 部署 Master 控制中枢"
echo " 2) 🗑️ 一键卸载 Master 中枢"
read -p "请输入选择 [1-2] (默认1): " ACTION_CHOICE
# [新增] 交互式操作菜单:支持选择部署或调用卸载程序
echo -e "\n请选择操作:"
echo " 1) 🚀 部署 Master 控制中枢"
echo " 2) 🗑️ 一键卸载 Master 中枢"
read -p "请输入选择 [1-2] (默认1): " ACTION_CHOICE
# [v3.5.2 修复] 防止用户直接回车导致变量为空,从而漏过下方的平滑升级判定被误删档
ACTION_CHOICE=${ACTION_CHOICE:-1}
if [ "$ACTION_CHOICE" == "2" ]; then
echo -e "\n⏳ 正在拉取卸载程序..."
curl -sL "${REPO_RAW_URL}/master/uninstall_master.sh" -o "${SECURE_TMP}/uninstall_master.sh"
chmod +x "${SECURE_TMP}/uninstall_master.sh"
bash "${SECURE_TMP}/uninstall_master.sh"
rm -f "/tmp/uninstall_master.sh"
exit 0
fi
# ================== [v3.2.2 新增: 平滑升级模式嗅探] ==================
UPGRADE_MODE="false"
KEEP_DB="true"
if [ "$ACTION_CHOICE" == "1" ] && [ -f "${MASTER_DIR}/master.conf" ]; then
echo -e "\n\033[33m💡 司令部雷达提示:检测到本机已部署过 Master 中枢。\033[0m"
read -p "👉 是否按原配置直接进行平滑升级?(y/n, 默认y): " UPGRADE_CHOICE
if [[ -z "$UPGRADE_CHOICE" || "$UPGRADE_CHOICE" =~ ^[Yy]$ ]]; then
UPGRADE_MODE="true"
read -p "👉 是否保留历史节点数据库 (SQLite)(y/n, 默认y): " DB_CHOICE
if [[ "$DB_CHOICE" =~ ^[Nn]$ ]]; then
KEEP_DB="false"
fi
source "${MASTER_DIR}/master.conf"
if grep -q "^MASTER_VERSION=" "${MASTER_DIR}/master.conf"; then
sed -i "s/^MASTER_VERSION=.*/MASTER_VERSION=\"$TARGET_VERSION\"/" "${MASTER_DIR}/master.conf"
else
echo "MASTER_VERSION=\"$TARGET_VERSION\"" >> "${MASTER_DIR}/master.conf"
fi
echo -e "\033[32m✅ 已激活 [平滑升级模式],版本已锚定为 v${TARGET_VERSION}...\033[0m"
else
echo -e "\033[33m🔄 您选择了重新配置,旧的中枢数据将被彻底抹除。\033[0m"
fi
fi
if [ "$ACTION_CHOICE" == "2" ]; then
echo -e "\n⏳ 正在拉取卸载程序..."
# [新增逻辑] 使用上面定义的 REPO_RAW_URL 动态拉取卸载脚本,执行后自动销毁临时文件
curl -sL "${REPO_RAW_URL}/master/uninstall_master.sh" -o "/tmp/uninstall_master.sh"
chmod +x "/tmp/uninstall_master.sh"
bash "/tmp/uninstall_master.sh"
rm -f "/tmp/uninstall_master.sh"
exit 0
fi
# ================== [v3.2.2 优化: 数据纯净度清理与保护] ==================
echo -e "\n⏳ 正在验证本地环境与数据..."
# ================== [v3.2.2 新增: 平滑升级模式嗅探] ==================
UPGRADE_MODE="false"
KEEP_DB="true"
if [ "$ACTION_CHOICE" == "1" ] && [ -f "${MASTER_DIR}/master.conf" ]; then
echo -e "\n\033[33m💡 司令部雷达提示:检测到本机已部署过 Master 中枢。\033[0m"
read -p "👉 是否按原配置直接进行平滑升级?(y/n, 默认y): " UPGRADE_CHOICE
if [[ -z "$UPGRADE_CHOICE" || "$UPGRADE_CHOICE" =~ ^[Yy]$ ]]; then
UPGRADE_MODE="true"
read -p "👉 是否保留历史节点数据库 (SQLite)(y/n, 默认y): " DB_CHOICE
if [[ "$DB_CHOICE" =~ ^[Nn]$ ]]; then
KEEP_DB="false"
fi
# 汲取原配置进入内存
source "${MASTER_DIR}/master.conf"
echo -e "\033[32m✅ 已激活 [平滑升级模式],即将跳过基础配置,直接更新核心中枢...\033[0m"
else
echo -e "\033[33m🔄 您选择了重新配置,旧的中枢数据将被彻底抹除。\033[0m"
fi
fi
# ====================================================================
# ================== [v3.2.2 优化: 安装前环境纯净度清理与数据保护] ==================
echo -e "\n⏳ 正在清理旧版 Master 守护进程..."
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
if [ "$UPGRADE_MODE" == "true" ]; then
if [ "$KEEP_DB" == "false" ]; then
@@ -118,76 +68,23 @@ if [ "$UPGRADE_MODE" == "true" ]; then
else
echo -e "📦 历史节点数据库 (SQLite) 已绝密保留。"
fi
# [防砖修复] 移除过早的旧进程抹杀与脚本物理删除,防止拉取失败导致司令部变砖失联
# 删除旧的核心脚本,准备拉取新的
rm -f "${MASTER_DIR}/tg_master.sh" 2>/dev/null
else
# 焦土政策:如果不是升级模式,直接扬了整个司令部目录
rm -rf "$MASTER_DIR" 2>/dev/null
fi
echo -e "\033[32m✅ 旧进程已肃清!\033[0m"
# =======================================================================
# 1. 依赖检查与智能安装 (v3.6.0 兼容性与优雅性升级)
echo -e "\n[1/4] 正在探测核心依赖 (curl, jq, sqlite3, crontab, pgrep, openssl)..."
REQUIRED_CMDS=("curl" "jq" "sqlite3" "crontab" "pgrep" "openssl")
MISSING_CMDS=()
# 基础探测:预检查缺失的命令
for cmd in "${REQUIRED_CMDS[@]}"; do
if ! command -v "$cmd" >/dev/null 2>&1; then
MISSING_CMDS+=("$cmd")
fi
done
# 如果有缺失,才执行包管理器拉取逻辑
if [ ${#MISSING_CMDS[@]} -gt 0 ]; then
echo "⏳ 发现缺失依赖: ${MISSING_CMDS[*]},正在尝试自动补齐..."
if command -v apt-get >/dev/null 2>&1; then
apt-get update -y >/dev/null 2>&1
# [v3.6.3 抽脂级优化] 注入 --no-install-recommends 拒绝捆绑销售
apt-get install -y --no-install-recommends curl jq sqlite3 cron procps openssl >/dev/null 2>&1
systemctl enable cron >/dev/null 2>&1 && systemctl start cron >/dev/null 2>&1
elif command -v yum >/dev/null 2>&1 || command -v dnf >/dev/null 2>&1; then
PKG_MGR="yum"
OPT_ARGS=""
if command -v dnf >/dev/null 2>&1; then
PKG_MGR="dnf"
# [v3.6.3 抽脂级优化] 强行关闭 DNF 的弱依赖拉取
OPT_ARGS="--setopt=install_weak_deps=False"
fi
$PKG_MGR install -y $OPT_ARGS curl jq sqlite cronie procps-ng openssl >/dev/null 2>&1
systemctl enable crond >/dev/null 2>&1 && systemctl start crond >/dev/null 2>&1
elif command -v apk >/dev/null 2>&1; then
echo "Alpine 探测到系统类型为 Alpine Linux正在执行轻量级安装..."
# [修复] 优先尝试 cronie若失败则回退至系统内置 cron彻底避免单点依赖拖垮全局
apk add --no-cache curl jq sqlite cronie procps bash openssl || apk add --no-cache curl jq sqlite procps bash openssl
mkdir -p /var/spool/cron/crontabs
rc-update add crond default >/dev/null 2>&1
service crond start >/dev/null 2>&1
elif command -v pacman >/dev/null 2>&1; then
pacman -Sy --noconfirm curl jq sqlite cronie procps-ng openssl >/dev/null 2>&1
mkdir -p /root/.cache/crontab 2>/dev/null
systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1
else
echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m"
echo -e "\033[33m⚠ 请手动执行以下安装命令后重新运行本脚本:\033[0m"
echo -e " Debian/Ubuntu: \033[36mapt-get update && apt-get install -y --no-install-recommends curl jq sqlite3 cron procps openssl\033[0m"
echo -e " CentOS/RHEL: \033[36myum install -y curl jq sqlite cronie procps-ng openssl\033[0m"
echo -e " Alpine Linux: \033[36mapk add --no-cache curl jq sqlite cronie procps bash openssl\033[0m"
echo -e " Arch Linux: \033[36mpacman -Sy curl jq sqlite cronie procps-ng openssl\033[0m"
exit 1
fi
# 安装后二次复检
for cmd in "${REQUIRED_CMDS[@]}"; do
if ! command -v "$cmd" >/dev/null 2>&1; then
echo -e "\033[31m❌ 致命错误:核心命令 '$cmd' 仍未找到!\033[0m"
echo -e "请手动修复您的包管理器源,或联系 VPS 供应商。"
exit 1
fi
done
# 1. 环境依赖安装
echo -e "\n[1/4] 安装核心依赖 (curl, jq, sqlite3)..."
if [ -f /etc/debian_version ]; then
apt-get update -y >/dev/null 2>&1
apt-get install -y curl jq sqlite3 procps >/dev/null 2>&1
elif [ -f /etc/redhat-release ]; then
yum install -y curl jq sqlite >/dev/null 2>&1
fi
echo -e "\033[32m✅ 基础环境检测通过。\033[0m"
mkdir -p "$MASTER_DIR"
@@ -198,58 +95,16 @@ if [ "$UPGRADE_MODE" == "false" ]; then
# 2. 交互配置机器人
echo -e "\n[2/4] 配置控制中枢机器人:"
read -p "请输入 Telegram Bot Token: " TG_TOKEN
# [v3.6.0 新增] 官方网关模式选项 (用于屏蔽全局 OTA 按钮)
echo -e "\n请选择您的部署环境身份:"
echo " 1) 🛡️ 私有独立中枢 (默认推荐,保留完整 OTA 遥控权限)"
echo " 2) ☁️ 官方公共网关 (面向大众服务,将强制物理隐藏全局 OTA 按钮防滥用)"
read -p "请输入选择 [1-2] (默认1): " GATEWAY_TYPE
GATEWAY_TYPE=${GATEWAY_TYPE:-1}
IS_OFFICIAL_GATEWAY="false"
ENABLE_MASTER_OTA="false"
if [ "$GATEWAY_TYPE" == "2" ]; then
IS_OFFICIAL_GATEWAY="true"
echo -e "\033[33m⚠ 已开启官方公共网关模式,全舰队与司令部的 OTA 将被强制屏蔽。\033[0m"
else
# [v3.6.1] 私有模式开放中枢 OTA 授权向导
echo -e "\n[2.1/4] 司令部自我进化授权"
echo -e "💡 开启后,您可以在 TG 菜单一键将中枢核心系统热更新至最新版本。"
read -p "是否允许司令部接收 OTA 重构指令?(y/n, 默认y): " M_OTA_CHOICE
if [[ "$M_OTA_CHOICE" =~ ^[Nn]$ ]]; then
ENABLE_MASTER_OTA="false"
echo -e "🛡️ \033[33m已关闭司令部 OTA 权限,中枢内核未来仅支持 SSH 升级。\033[0m"
else
ENABLE_MASTER_OTA="true"
echo -e "✅ \033[32m已开启司令部 OTA 权限,金蝉脱壳引信已挂载。\033[0m"
fi
fi
cat > "${MASTER_DIR}/master.conf" << EOF
# IP-Sentinel Master 本地固化配置 (v${TARGET_VERSION})
MASTER_VERSION="$TARGET_VERSION"
TG_TOKEN="$TG_TOKEN"
DB_FILE="$DB_FILE"
MASTER_DIR="$MASTER_DIR"
# [v3.6.0 核心] 官方网关 UI 熔断标识
IS_OFFICIAL_GATEWAY="$IS_OFFICIAL_GATEWAY"
# [v3.6.1 新增] 司令部自身 OTA 授权标识
ENABLE_MASTER_OTA="$ENABLE_MASTER_OTA"
EOF
fi
# [v3.6.1 热修复] 老司令部平滑升级时,自动补齐缺失字段
if [ "$UPGRADE_MODE" == "true" ]; then
if ! grep -q "^IS_OFFICIAL_GATEWAY=" "${MASTER_DIR}/master.conf"; then
echo "IS_OFFICIAL_GATEWAY=\"false\"" >> "${MASTER_DIR}/master.conf"
fi
if ! grep -q "^ENABLE_MASTER_OTA=" "${MASTER_DIR}/master.conf"; then
echo "ENABLE_MASTER_OTA=\"false\"" >> "${MASTER_DIR}/master.conf"
fi
fi
# 🛑 拦截块结束
# 3. 初始化 SQLite 数据库 (幂等操作,升级模式下由 tg_master.sh 负责热修补)
# 3. 初始化 SQLite 数据库 (幂等操作,升级模式下可安全修补表结构)
echo -e "\n[3/4] 正在初始化 SQLite 数据库表结构..."
sqlite3 "$DB_FILE" <<EOF
CREATE TABLE IF NOT EXISTS nodes (
@@ -258,24 +113,8 @@ CREATE TABLE IF NOT EXISTS nodes (
agent_ip TEXT,
agent_port TEXT,
last_seen DATETIME DEFAULT CURRENT_TIMESTAMP,
region TEXT DEFAULT 'UNKNOWN',
node_alias TEXT,
enable_google TEXT DEFAULT 'true',
enable_trust TEXT DEFAULT 'true',
enable_ota TEXT DEFAULT 'false',
PRIMARY KEY(chat_id, node_name)
);
-- [v4.0.0 新增, v4.0.2 扩容] 核心情报表:记录历史 IP 质量数据,用于绘制趋势图
CREATE TABLE IF NOT EXISTS ip_trend_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_name TEXT,
check_time DATETIME DEFAULT CURRENT_TIMESTAMP,
scam_score INTEGER,
goog_status TEXT,
nf_status TEXT,
gpt_status TEXT
);
EOF
echo "✅ 数据库创建成功: $DB_FILE"
@@ -284,88 +123,26 @@ chmod 600 "${MASTER_DIR}/master.conf"
chmod 600 "$DB_FILE"
# ====================================================================
# 4. 拉取核心调度代码并执行原子化交接
echo -e "\n[4/4] 正在拉取新版司令部核心引擎..."
TMP_MASTER="${SECURE_TMP}/tg_master.sh"
curl -sL "${REPO_RAW_URL}/master/tg_master.sh" -o "$TMP_MASTER"
# 🛡️ 防砖终极校验
if [ ! -s "$TMP_MASTER" ]; then
echo -e "\033[31m❌ 致命错误:中枢核心代码拉取失败!网络阻断或 GitHub Raw 异常。\033[0m"
echo "🛡️ 防砖机制触发:已中止覆盖,旧版司令部仍在安全运行中。"
rm -f "$TMP_MASTER"
exit 1
fi
# 🟢 [原子化交接核心]: 校验完美通过,新代码已备妥!
# 以雷霆手段抹杀旧版调度进程,杜绝文件覆写时的并发错乱
echo "⏳ 新引擎校验通过,正在抹杀旧版守护进程..."
if command -v systemctl >/dev/null 2>&1; then
systemctl kill --signal=SIGKILL ip-sentinel-master.service >/dev/null 2>&1 || true
systemctl stop ip-sentinel-master.service >/dev/null 2>&1 || true
fi
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
# 执行物理替换
mv "$TMP_MASTER" "${MASTER_DIR}/tg_master.sh"
# 4. 拉取核心调度代码并运行
echo -e "\n[4/4] 部署 TG 调度守护进程..."
# [修改] 剥离了写死的网址,改用顶部的 ${REPO_RAW_URL} 变量,确保与卸载脚本的数据源同源
curl -sL "${REPO_RAW_URL}/master/tg_master.sh" -o "${MASTER_DIR}/tg_master.sh"
chmod +x "${MASTER_DIR}/tg_master.sh"
if command -v systemctl >/dev/null 2>&1; then
echo "💡 检测到 Systemd 环境,正在部署原生守护服务..."
cat > /etc/systemd/system/ip-sentinel-master.service << EOF
[Unit]
Description=IP-Sentinel Master Command Center Service
After=network.target
# 写入看门狗 Cron
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_master
echo "* * * * * pgrep -f tg_master.sh >/dev/null || nohup bash ${MASTER_DIR}/tg_master.sh >/dev/null 2>&1 &" >> /tmp/cron_master
crontab /tmp/cron_master
rm -f /tmp/cron_master
[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
SyslogIdentifier=ip-sentinel
Type=simple
ExecStart=/bin/bash ${MASTER_DIR}/tg_master.sh
Restart=always
RestartSec=5
User=root
WorkingDirectory=${MASTER_DIR}
CPUSchedulingPolicy=idle
IOSchedulingClass=idle
# 立刻启动
pgrep -f tg_master.sh >/dev/null || nohup bash "${MASTER_DIR}/tg_master.sh" >/dev/null 2>&1 &
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now ip-sentinel-master.service
systemctl restart ip-sentinel-master.service
# 清理可能残留的历史 Cron (无落地内存流防劫持)
crontab -l 2>/dev/null | grep -v "tg_master.sh" | crontab - >/dev/null 2>&1 || true
else
echo "💡 未检测到 Systemd回退到 Cron 看门狗调度模式..."
crontab -l 2>/dev/null | grep -v "tg_master.sh" > "${SECURE_TMP}/cron_master" || true
echo "* * * * * pgrep -f tg_master.sh >/dev/null || nohup bash ${MASTER_DIR}/tg_master.sh >/dev/null 2>&1 &" >> "${SECURE_TMP}/cron_master"
[ -f "${SECURE_TMP}/cron_master" ] && crontab "${SECURE_TMP}/cron_master" 2>/dev/null
pgrep -f tg_master.sh >/dev/null || { nohup bash "${MASTER_DIR}/tg_master.sh" >/dev/null 2>&1 & disown 2>/dev/null; }
fi
# ================== [v3.2.2 优化 & v3.6.1 OTA捷报: 战报文案分流] ==================
# ================== [v3.2.2 优化: 战报文案分流] ==================
echo "========================================================"
if [ "$UPGRADE_MODE" == "true" ]; then
echo "🎉 Master 控制中枢平滑热更新完成!"
echo "🤖 新版中枢引擎已接管数据库,继续等待边缘节点汇报。"
# [v3.6.1 核心] 静默 OTA 完成后,由幽灵进程主动向指挥官发送捷报
if [ "$SILENT_MASTER_OTA" == "true" ] && [ -n "$OTA_CHAT_ID" ] && [ -n "$TG_TOKEN" ]; then
echo -e "\n📡 正在向指挥官发送司令部重构捷报..."
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d "chat_id=${OTA_CHAT_ID}" \
-d "parse_mode=Markdown" \
-d "text=✨ *司令部中枢热重载完成!*
🚀 当前内核已跃升至:\`v${TARGET_VERSION}\`
🤖 新版金蝉脱壳引擎已接管阵地,全舰队指控链路恢复正常。" > /dev/null
fi
else
echo "🎉 Master 控制中枢部署完成!"
echo "🤖 机器人现已开始全局接客,等待边缘节点注册。"
@@ -374,21 +151,12 @@ echo "========================================================"
# =================================================================
# ================== [v3.1.2 新增: 玻璃房透明装机统计] ==================
# [修复] 仅在全新部署时触发统计,司令部热重载时绝对不触发
if [ "$UPGRADE_MODE" == "false" ]; then
echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名不收集IP)..."
MASTER_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/master" || echo "")
echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名不收集IP)..."
MASTER_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/master" || echo "")
if [ -n "$MASTER_COUNT" ] && [[ "$MASTER_COUNT" =~ ^[0-9]+$ ]]; then
echo -e "\033[32m✅ 感谢您成为全球第 ${MASTER_COUNT} 名 IP-Sentinel 中枢管理者\033[0m"
else
echo -e "\033[32m✅ 感谢您部署 IP-Sentinel 控制中枢\033[0m"
fi
if [ -n "$MASTER_COUNT" ] && [[ "$MASTER_COUNT" =~ ^[0-9]+$ ]]; then
echo -e "\033[32m✅ 感谢您成为全球第 ${MASTER_COUNT} 名 IP-Sentinel 指挥官\033[0m"
else
echo -e "\033[32m✅ 感谢您建立 IP-Sentinel 司令部\033[0m"
fi
# ================== [新增: 安装成功高光时刻 Star 引导] ==================
echo -e "\n========================================================"
echo -e "⭐ \033[33m开源不易如果 IP-Sentinel 极大简化了您的多节点管理,请赐予我们一枚星标!\033[0m"
echo -e "💡 \033[32m您的每一颗 Star 都是我们持续迭代架构、开发 Web 视窗化控制台的动力源泉。\033[0m"
echo -e "👉 \033[36m\033[4m\033]8;;https://github.com/hotyue/IP-Sentinel\033\\[点击此处直达 GitHub 仓库点亮 Star 🌟]\033]8;;\033\\\033[0m"
echo -e "========================================================\n"
echo -e "\n"

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# ==========================================================
# 脚本名称: tg_master.sh (Master 端调度枢纽 - 动态锚点版)
# 脚本名称: tg_master.sh (Master 端调度枢纽 V3.0.4 动态签名版)
# 核心功能: 监听 TG、操作 SQLite、Webhook 精准调度、403权限拦截、僵尸节点清理
# ==========================================================
@@ -9,64 +9,30 @@ CONF="/opt/ip_sentinel_master/master.conf"
[ ! -f "$CONF" ] && exit 1
source "$CONF"
# [核心: 运行态版本继承与云通信地址]
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
# MASTER_VERSION 已经在上方的 source "$CONF" 中被载入
# 如果本地极度陈旧没有该变量,才给定一个基础兜底值,避免变量为空导致崩溃
MASTER_VERSION=${MASTER_VERSION:-"3.5.0"}
OFFSET_FILE="${MASTER_DIR}/.tg_offset"
[[ -f $OFFSET_FILE ]] || echo "0" > $OFFSET_FILE
# --- 工具函数 ---
# ================== [v4.0.3 核心: 全球全能旗帜渲染引擎] ==================
get_flag() {
local region=$(echo "$1" | tr 'a-z' 'A-Z')
local base_cc="${region%%-*}" # 提取横杠前的主国家代码 (例如 US-TX 提取为 US)
local flag="🌐"
case "$base_cc" in
US) flag="🇺🇸" ;; JP) flag="🇯🇵" ;; HK) flag="🇭🇰" ;; TW) flag="🇹🇼" ;; SG) flag="🇸🇬" ;;
UK|GB) flag="🇬🇧" ;; DE) flag="🇩🇪" ;; FR) flag="🇫🇷" ;; NL) flag="🇳🇱" ;; CA) flag="🇨🇦" ;;
AU) flag="🇦🇺" ;; KR) flag="🇰🇷" ;; IN) flag="🇮🇳" ;; BR) flag="🇧🇷" ;; RU) flag="🇷🇺" ;;
CH) flag="🇨🇭" ;; SE) flag="🇸🇪" ;; NO) flag="🇳🇴" ;; DK) flag="🇩🇰" ;; FI) flag="🇫🇮" ;;
IT) flag="🇮🇹" ;; ES) flag="🇪🇸" ;; PT) flag="🇵🇹" ;; IE) flag="🇮🇪" ;; PL) flag="🇵🇱" ;;
AT) flag="🇦🇹" ;; BE) flag="🇧🇪" ;; TR) flag="🇹🇷" ;; ZA) flag="🇿🇦" ;; AE) flag="🇦🇪" ;;
MY) flag="🇲🇾" ;; ID) flag="🇮🇩" ;; VN) flag="🇻🇳" ;; TH) flag="🇹🇭" ;; PH) flag="🇵🇭" ;;
NZ) flag="🇳🇿" ;; AR) flag="🇦🇷" ;; CL) flag="🇨🇱" ;; MX) flag="🇲🇽" ;; IL) flag="🇮🇱" ;;
SA) flag="🇸🇦" ;; EG) flag="🇪🇬" ;; NG) flag="🇳🇬" ;; KE) flag="🇰🇪" ;; RO) flag="🇷🇴" ;;
BG) flag="🇧🇬" ;; CZ) flag="🇨🇿" ;; HU) flag="🇭🇺" ;; GR) flag="🇬🇷" ;; UA) flag="🇺🇦" ;;
esac
echo "$flag"
}
send_ui() {
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"$1\",\"text\":\"$2\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$3}}" > /dev/null
}
send_msg() {
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-d "chat_id=$1" -d "text=$2" -d "parse_mode=Markdown" > /dev/null
}
# ================== [v3.0.1 新增: 消息原位刷新函数] ==================
edit_msg() {
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
-d "chat_id=$1" -d "message_id=$2" -d "text=$3" -d "parse_mode=Markdown" > /dev/null
}
# [v3.5.3 新增: 支持内联键盘的原位 UI 重绘函数]
edit_ui() {
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"$1\",\"message_id\":\"$2\",\"text\":\"$3\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$4}}" > /dev/null
}
# 数据库执行函数 (v3.6.3 终极静默版: 动用 .timeout 点命令防泄露)
# 数据库执行函数
db_exec() {
printf ".timeout 5000\n%s\n" "$1" | sqlite3 "$DB_FILE"
sqlite3 "$DB_FILE" "$1"
}
# ================== [v3.0.4 核心: 动态 HMAC 签名生成器] ==================
@@ -84,41 +50,19 @@ generate_signed_url() {
local signature=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$CHAT_ID" | awk '{print $NF}')
# 返回最终带签名的 URL
echo "https://${target_ip}:${target_port}${action_path}?t=${current_t}&sign=${signature}"
echo "http://${target_ip}:${target_port}${action_path}?t=${current_t}&sign=${signature}"
}
# ========================================================================
# ================== [v3.6.3 核心: 激活 SQLite 高并发 WAL 引擎] ==================
db_exec "PRAGMA journal_mode=WAL;" > /dev/null 2>&1
db_exec "PRAGMA synchronous=NORMAL;" > /dev/null 2>&1
# ==============================================================================
# ================== [v3.1.3-v3.6.0 核心: 数据库结构无损热升级] ==================
# 自动探测并增加缺失字段,屏蔽已存在的报错,保护老节点数据
# ================== [v3.1.3 核心: 数据库结构无损热升级] ==================
# 自动探测并增加 region 字段,屏蔽已存在的报错,保护老节点数据
db_exec "ALTER TABLE nodes ADD COLUMN region TEXT DEFAULT 'UNKNOWN';" 2>/dev/null
db_exec "ALTER TABLE nodes ADD COLUMN node_alias TEXT;" 2>/dev/null
db_exec "ALTER TABLE nodes ADD COLUMN enable_google TEXT DEFAULT 'true';" 2>/dev/null
db_exec "ALTER TABLE nodes ADD COLUMN enable_trust TEXT DEFAULT 'true';" 2>/dev/null
db_exec "ALTER TABLE nodes ADD COLUMN enable_ota TEXT DEFAULT 'false';" 2>/dev/null
# ========================================================================
# ================== [v4.0.0/v4.0.2 核心: 增加 IP 质量趋势追踪表] ==================
db_exec "CREATE TABLE IF NOT EXISTS ip_trend_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_name TEXT,
check_time DATETIME DEFAULT CURRENT_TIMESTAMP,
scam_score INTEGER,
nf_status TEXT
);" 2>/dev/null
# [v4.0.2 热更新] 动态扩容 谷歌 与 ChatGPT 状态追踪字段
db_exec "ALTER TABLE ip_trend_log ADD COLUMN goog_status TEXT DEFAULT 'Unknown';" 2>/dev/null
db_exec "ALTER TABLE ip_trend_log ADD COLUMN gpt_status TEXT DEFAULT 'Unknown';" 2>/dev/null
# ========================================================================
# --- 核心轮询循环 ---
while true; do
OFFSET=$(cat $OFFSET_FILE)
UPDATES=$(curl -s --connect-timeout 5 -m 35 "https://api.telegram.org/bot${TG_TOKEN}/getUpdates?offset=${OFFSET}&timeout=30")
UPDATES=$(curl -s "https://api.telegram.org/bot${TG_TOKEN}/getUpdates?offset=${OFFSET}&timeout=30")
COUNT=$(echo "$UPDATES" | jq -r '.result | length' 2>/dev/null)
@@ -130,77 +74,13 @@ while true; do
CHAT_ID=$(echo "$UPDATE" | jq -r '.message.chat.id // .callback_query.message.chat.id')
TEXT=$(echo "$UPDATE" | jq -r '.message.text // .callback_query.data')
# ================== [基础消息解析提取提前] ==================
# [致命 Bug 修复] 必须在 svq 入库判断前提取这俩变量,否则入库后无法重绘 UI
# ================== [v3.0.1 新增: 消除转圈圈与获取消息ID] ==================
CB_ID=$(echo "$UPDATE" | jq -r '.callback_query.id // empty')
MSG_ID=$(echo "$UPDATE" | jq -r '.callback_query.message.message_id // empty')
# ================== [v4.0.2 核心: 态势感知按钮一键入库] ==================
if [[ "$TEXT" == "svq|"* ]]; then
# 格式: svq|NODE_NAME|SCORE|GOOG|NF|GPT
IFS='|' read -r MAGIC RAW_NODE_ID RAW_SCORE RAW_GOOG_ST RAW_NF_ST RAW_GPT_ST <<< "$TEXT"
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
# 🛡️ 终极防御:彻底清洗,封死一切 SQL 注入通道
NODE_ID=$(echo "$RAW_NODE_ID" | tr -cd 'a-zA-Z0-9_.-')
SCORE=$(echo "$RAW_SCORE" | tr -cd '0-9')
GOOG_ST=$(echo "$RAW_GOOG_ST" | tr -d '"'\''\`\$\|&;<>\n\r')
NF_ST=$(echo "$RAW_NF_ST" | tr -d '"'\''\`\$\|&;<>\n\r')
GPT_ST=$(echo "$RAW_GPT_ST" | tr -d '"'\''\`\$\|&;<>\n\r')
if [ -n "$NODE_ID" ] && [ -n "$SCORE" ]; then
# 1. 写入 SQLite
db_exec "INSERT INTO ip_trend_log (node_name, scam_score, goog_status, nf_status, gpt_status) VALUES ('$NODE_ID', '$SCORE', '$GOOG_ST', '$NF_ST', '$GPT_ST');"
# [体验优化] 弹出顶部 Toast 气泡,提示入库成功
if [ -n "$CB_ID" ]; then
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/answerCallbackQuery" \
-d "callback_query_id=${CB_ID}" \
-d "text=✅ 报告已成功录入趋势库!" \
-d "show_alert=false" > /dev/null
fi
# 2. 无损修改原消息:移除入库按钮展示绿勾状态,并保留返回控制台按钮 (体验优化)
if [ -n "$MSG_ID" ]; then
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageReplyMarkup" \
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"${CHAT_ID}\",\"message_id\":\"${MSG_ID}\",\"reply_markup\":{\"inline_keyboard\":[[{\"text\":\"✅ 此报告已存档\",\"callback_data\":\"ignore\"}],[{\"text\":\"⚙️ 调出该节点控制台\",\"callback_data\":\"manage:${NODE_ID}\"}]]}}" > /dev/null
fi
else
# [异常兜底] 弹出红色警告弹窗
if [ -n "$CB_ID" ]; then
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/answerCallbackQuery" \
-d "callback_query_id=${CB_ID}" \
-d "text=❌ 数据解析失败,入库中止。" \
-d "show_alert=true" > /dev/null
fi
fi
continue
fi
# ======================================================================
REPLY_TO_TEXT=$(echo "$UPDATE" | jq -r '.message.reply_to_message.text // empty')
# ================== [v3.5.2 新增: 拦截别名修改的对话回复] ==================
if [[ "$REPLY_TO_TEXT" == *"✏️ 请回复本消息以重命名节点:"* ]]; then
# 精准提取被回复消息中的节点主键名
TARGET_NODE=$(echo "$REPLY_TO_TEXT" | grep -v "✏️" | grep -v "仅限" | tr -d '\` ' | tr -cd 'a-zA-Z0-9_.-' | head -n 1)
# [v3.5.2 热修复] 废除 Bash 原生 tr 命令的中文白名单 (不支持 Unicode 会误删中文)。
# 改用黑名单策略:仅自动转化下划线,剔除引号、特殊符号和冒号(防止破坏内部路由)
# 将完整的中文原样送入 Base64 编码,最终严格正则清洗交由 Agent 的 Python 引擎处理!
NEW_ALIAS=$(echo "$TEXT" | sed 's/_/-/g' | tr -d '"'\''\`\$\|&;<>\n\r:' | cut -c 1-30)
if [ -n "$TARGET_NODE" ] && [ -n "$NEW_ALIAS" ]; then
# 强行重写内部路由
TEXT="do_rename:${TARGET_NODE}:${NEW_ALIAS}"
fi
fi
# ================== [v3.0.1 新增: 消除转圈圈与获取消息ID] ==================
# 告诉 TG 官方“指令已收到”,立刻消除按钮上的加载圈圈 (对其他常规按钮生效)
# 告诉 TG 官方“指令已收到”,立刻消除按钮上的加载圈圈
if [ -n "$CB_ID" ]; then
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/answerCallbackQuery" -d "callback_query_id=${CB_ID}" > /dev/null
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/answerCallbackQuery" -d "callback_query_id=${CB_ID}" > /dev/null
fi
# ==========================================
@@ -209,34 +89,21 @@ while true; do
if [[ "$TEXT" == *"#REGISTER#"* ]]; then
REG_LINE=$(echo "$TEXT" | grep "#REGISTER#" | head -n 1 | tr -d '\` ')
# V3.6.0 兼容性拆包: 支持 7字段(OTA)、6字段(双轨)、5字段(单轨)、4字段(远古)
# V3.1.3 兼容性拆包: 判断是新版协议 (5个字段) 还是老版协议 (4个字段)
FIELD_COUNT=$(echo "$REG_LINE" | awk -F'|' '{print NF}')
if [ "$FIELD_COUNT" -ge 7 ]; then
IFS='|' read -r MAGIC RAW_REGION RAW_NODE RAW_IP RAW_PORT RAW_ALIAS RAW_OTA <<< "$REG_LINE"
elif [ "$FIELD_COUNT" -eq 6 ]; then
IFS='|' read -r MAGIC RAW_REGION RAW_NODE RAW_IP RAW_PORT RAW_ALIAS <<< "$REG_LINE"
RAW_OTA="false"
elif [ "$FIELD_COUNT" -eq 5 ]; then
if [ "$FIELD_COUNT" -ge 5 ]; then
IFS='|' read -r MAGIC RAW_REGION RAW_NODE RAW_IP RAW_PORT <<< "$REG_LINE"
RAW_ALIAS="$RAW_NODE"
RAW_OTA="false"
else
IFS='|' read -r MAGIC RAW_NODE RAW_IP RAW_PORT <<< "$REG_LINE"
RAW_REGION="UNKNOWN"
RAW_ALIAS="$RAW_NODE"
RAW_OTA="false"
fi
# 🛡️ 强制字符白名单过滤:保留历史特征不变
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
AGENT_REGION=$(echo "$RAW_REGION" | tr -cd 'a-zA-Z0-9' | cut -c 1-10)
AGENT_REGION=$(echo "$RAW_REGION" | tr -cd 'a-zA-Z0-9' | cut -c 1-10) # 提取国家大区
NODE_NAME=$(echo "$RAW_NODE" | tr -cd 'a-zA-Z0-9_.-' | cut -c 1-30)
AGENT_IP=$(echo "$RAW_IP" | tr -cd 'a-zA-Z0-9.:\[\]-' | cut -c 1-50)
AGENT_PORT=$(echo "$RAW_PORT" | tr -cd '0-9' | cut -c 1-5)
NODE_ALIAS=$(echo "$RAW_ALIAS" | tr -d '"'\''\`\$\|&;<>\n\r' | cut -c 1-30)
[ -z "$NODE_ALIAS" ] && NODE_ALIAS="$NODE_NAME"
AGENT_OTA=$(echo "$RAW_OTA" | tr -cd 'a-z')
[ -z "$AGENT_OTA" ] && AGENT_OTA="false"
if [[ "$AGENT_IP" =~ ^127\.|^10\.|^192\.168\.|^172\.(1[6-9]|2[0-9]|3[0-1])\.|^::1$|^localhost$ ]]; then
send_msg "$CHAT_ID" "⛔ **安全拦截**:禁止注册内网或回环 IP防止 SSRF 攻击渗透。"
@@ -248,9 +115,9 @@ while true; do
continue
fi
# [核心] 入库时追加 node_alias 与 enable_ota 字段
db_exec "INSERT INTO nodes (chat_id, node_name, agent_ip, agent_port, last_seen, region, node_alias, enable_ota) VALUES ('$CHAT_ID', '$NODE_NAME', '$AGENT_IP', '$AGENT_PORT', CURRENT_TIMESTAMP, '$AGENT_REGION', '$NODE_ALIAS', '$AGENT_OTA') ON CONFLICT(chat_id, node_name) DO UPDATE SET agent_ip='$AGENT_IP', agent_port='$AGENT_PORT', last_seen=CURRENT_TIMESTAMP, region='$AGENT_REGION', node_alias='$NODE_ALIAS', enable_ota='$AGENT_OTA';"
send_msg "$CHAT_ID" "**司令部确认 (v${MASTER_VERSION})**%0A节点 \`${NODE_ALIAS}\` 档案已录入!"
# 入库时追加 region 字段
db_exec "INSERT INTO nodes (chat_id, node_name, agent_ip, agent_port, last_seen, region) VALUES ('$CHAT_ID', '$NODE_NAME', '$AGENT_IP', '$AGENT_PORT', CURRENT_TIMESTAMP, '$AGENT_REGION') ON CONFLICT(chat_id, node_name) DO UPDATE SET agent_ip='$AGENT_IP', agent_port='$AGENT_PORT', last_seen=CURRENT_TIMESTAMP, region='$AGENT_REGION';"
send_msg "$CHAT_ID" "✅ 司令部确认!节点接入成功: \`$NODE_NAME\` ($AGENT_IP:$AGENT_PORT)"
# ================== [v3.1.3 丝滑连招: 直接呼出全球大区雷达] ==================
REGION_DATA=$(db_exec "SELECT region, COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID' GROUP BY region;")
@@ -258,7 +125,11 @@ while true; do
BTNS="["
while IFS='|' read -r REGION_NAME NODE_COUNT; do
[ -z "$REGION_NAME" ] && REGION_NAME="UNKNOWN"
FLAG=$(get_flag "$REGION_NAME")
FLAG="🌐"
case "$REGION_NAME" in
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
esac
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
done <<< "$REGION_DATA"
BTNS="${BTNS%,}]"
@@ -274,97 +145,8 @@ while true; do
# ==========================================
case "$TEXT" in
"/start"|"/menu")
# [核心: 抓取云端最新 Master 版本 (KV 解析法)]
REMOTE_VER=$(curl -s -m 2 "${REPO_RAW_URL}/version.txt" | grep "^MASTER_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
VER_INFO="当前版本: \`v${MASTER_VERSION}\`"
BTN_MASTER_OTA=""
if [ -n "$REMOTE_VER" ] && [ "$REMOTE_VER" != "$MASTER_VERSION" ]; then
VER_INFO="${VER_INFO}\n✨ **发现新版本**: \`v${REMOTE_VER}\` (可执行中枢热重载)"
# 仅当非官方网关 且 开启了中枢 OTA 权限时,才渲染升级按钮
if [ "$IS_OFFICIAL_GATEWAY" != "true" ] && [ "${ENABLE_MASTER_OTA:-false}" == "true" ]; then
BTN_MASTER_OTA="[{\"text\":\"🆙 升级控制中枢至 v${REMOTE_VER}\",\"callback_data\":\"master_ota_confirm\"}],"
fi
fi
NODE_COUNT=$(db_exec "SELECT COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID';")
[ -z "$NODE_COUNT" ] && NODE_COUNT=0
# L0 扁平化重构:升级按钮置顶,底部追加带有 url 属性的 GitHub 引流按钮
if [ "$IS_OFFICIAL_GATEWAY" != "true" ]; then
BTNS="[${BTN_MASTER_OTA}[{\"text\":\"🌍 进入全球雷达 (管理节点)\",\"callback_data\":\"list_nodes\"}], [{\"text\":\"🚀 唤醒全局巡逻\",\"callback_data\":\"all_run\"}, {\"text\":\"📊 获取全局简报\",\"callback_data\":\"all_reports\"}], [{\"text\":\"🔄 全网节点 OTA 热重载\",\"callback_data\":\"all_ota_confirm\"}], [{\"text\":\"🌟 前往 GitHub 点亮星标\",\"url\":\"https://github.com/hotyue/IP-Sentinel\"}]]"
else
BTNS="[[{\"text\":\"🌍 进入全球雷达 (管理节点)\",\"callback_data\":\"list_nodes\"}], [{\"text\":\"🚀 唤醒全局巡逻\",\"callback_data\":\"all_run\"}, {\"text\":\"📊 获取全局简报\",\"callback_data\":\"all_reports\"}], [{\"text\":\"🌟 前往 GitHub 点亮星标\",\"url\":\"https://github.com/hotyue/IP-Sentinel\"}]]"
fi
TEXT_MSG="🛡️ **IP-Sentinel 控制中枢**\n${VER_INFO}\n\n📊 节点状态: 共有 \`${NODE_COUNT}\` 台节点在线\n欢迎回来管理者。请下达系统指令"
send_ui "$CHAT_ID" "$TEXT_MSG" "$BTNS"
;;
"all_ota_confirm")
CONFIRM_BTNS="[[{\"text\":\"🚨 我已了解风险,下发核按钮指令!\",\"callback_data\":\"all_ota_execute\"}], [{\"text\":\"取消操作\",\"callback_data\":\"/start\"}]]"
WARNING_MSG="☢️ **【最高指令:全舰队 OTA 升级】**\n\n此操作将向您名下**所有开启 OTA 权限的节点**下发重组指令,强制从云端拉取最新代码并进行热重载。\n\n⚠ **核按钮风险提示**\n1. 升级过程中守护进程会短暂重启,节点可能出现临时离线。\n2. 若遇 GitHub 源屏蔽或网络极度恶劣,少数节点可能需要手动干预。\n\n**是否确定挂载并执行 OTA 指令?**"
send_ui "$CHAT_ID" "$WARNING_MSG" "$CONFIRM_BTNS"
;;
"all_ota_execute")
NODE_DATA=$(db_exec "SELECT node_name, agent_ip, agent_port FROM nodes WHERE chat_id='$CHAT_ID' AND enable_ota='true';")
if [ -z "$NODE_DATA" ]; then
send_msg "$CHAT_ID" "⚠️ 您名下暂无开启 OTA 权限的在线节点。"
else
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒全舰队执行 OTA 升级...**%0A*(节点升级成功后会主动发回新的入库确认,请注意查收)*"
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_ota")
curl -k -s -m 5 "$TARGET_URL" > /dev/null &
sleep 0.3 # 严格流量削峰
done
fi
;;
"master_ota_confirm")
CONFIRM_BTNS="[[{\"text\":\"🚨 确认重构司令部\",\"callback_data\":\"master_ota_execute\"}], [{\"text\":\"取消操作\",\"callback_data\":\"/start\"}]]"
WARNING_MSG="☢️ **【最高指令:中枢金蝉脱壳】**\n\n此操作将拉取最新源码并强行覆盖司令部核心进程。\n\n⚠ **风险提示**\n升级期间司令部将短暂失联约3-5秒。完成后会自动发送捷报。\n\n**是否确定执行司令部自我升级?**"
if [ -n "$MSG_ID" ]; then
edit_ui "$CHAT_ID" "$MSG_ID" "$WARNING_MSG" "$CONFIRM_BTNS"
else
send_ui "$CHAT_ID" "$WARNING_MSG" "$CONFIRM_BTNS"
fi
;;
"master_ota_execute")
if [ -n "$MSG_ID" ]; then
edit_msg "$CHAT_ID" "$MSG_ID" "⏳ 正在下载重构图纸,司令部即将进入静默重启..."
else
send_msg "$CHAT_ID" "⏳ 正在下载重构图纸,司令部即将进入静默重启..."
fi
# 下载最新的 master install 脚本作为幽灵进程
curl -fsSL "${REPO_RAW_URL}/master/install_master.sh" -o "/tmp/install_master.sh"
# [v3.6.3 修复] 🚀 OTA 防砖机制:严格校验脚本完整性
if ! bash -n "/tmp/install_master.sh" >/dev/null 2>&1; then
if [ -n "$MSG_ID" ]; then
edit_msg "$CHAT_ID" "$MSG_ID" "❌ OTA 传输受损:脚本下载不完整,已触发防砖熔断,升级取消!"
else
send_msg "$CHAT_ID" "❌ OTA 传输受损:脚本下载不完整,已触发防砖熔断,升级取消!"
fi
continue
fi
chmod +x "/tmp/install_master.sh"
# 抛出幽灵进程进行脱壳升级,传递静默变量与回执 ID
# [修复] 必须显式将环境变量注入到 bash -c 的指令串中,防止被 systemd-run 沙盒隔离丢弃
if command -v systemd-run >/dev/null 2>&1; then
systemd-run --quiet --no-block /bin/bash -c "export SILENT_MASTER_OTA='true'; export OTA_CHAT_ID='$CHAT_ID'; bash /tmp/install_master.sh"
else
export SILENT_MASTER_OTA="true"
export OTA_CHAT_ID="$CHAT_ID"
nohup bash /tmp/install_master.sh >/dev/null 2>&1 & disown
fi
# 当前旧进程休眠并等待被幽灵进程处决
sleep 10
BTNS="[[{\"text\":\"🖥️ 我的节点列表\",\"callback_data\":\"list_nodes\"}], [{\"text\":\"🚀 全节点日报汇总\",\"callback_data\":\"all_reports\"}], [{\"text\":\"🛠️ 全节点一键维护\",\"callback_data\":\"all_run\"}]]"
send_ui "$CHAT_ID" "🛡️ **IP-Sentinel 司令部**\n欢迎回来长官。请下达指令" "$BTNS"
;;
"all_reports")
@@ -372,13 +154,11 @@ while true; do
if [ -z "$NODE_DATA" ]; then
send_msg "$CHAT_ID" "⚠️ 您名下暂无在线节点。"
else
# [文案优化] 提前告知指挥官需要排队等待
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在召唤所有哨兵回传简报...**%0A*(为防止触发 TG 官方限流,简报将排队依次送达,请耐心等待)*"
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在召唤所有哨兵回传简报...**"
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
# 🛡️ [v3.0.4] 动态签名防重放批量下发
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_report")
curl -k -s -m 5 "$TARGET_URL" > /dev/null &
# [致命修复] 强行休眠 2 秒!错开 TG 官方 1条/秒 的发信红线
sleep 2
curl -s -m 5 "$TARGET_URL" > /dev/null &
done
fi
;;
@@ -391,96 +171,14 @@ while true; do
else
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒所有哨兵执行系统维护...**"
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
# 🛡️ [v3.0.4] 动态签名防重放批量下发 (维护模块)
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_run")
curl -k -s -m 5 "$TARGET_URL" > /dev/null &
sleep 0.2 # [新增] 流量削峰:防止瞬间 fork 导致句柄耗尽
curl -s -m 5 "$TARGET_URL" > /dev/null &
done
fi
;;
# ====================================================================
# ------------------- 🚨 请将下面这段代码插入在这里 -------------------
# ================== [v4.0.0 新增: 文本指令直接控制通道] ==================
"/quality"|"/quality@"*)
TARGET_NODE=$(echo "$TEXT" | awk '{print $2}')
if [ -z "$TARGET_NODE" ]; then
send_msg "$CHAT_ID" "⚠️ 请指定目标节点。例如: \`/quality HK-1\`%0A或通过雷达面板进行选择操作。"
else
TARGET_NODE=$(echo "$TARGET_NODE" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
# [加密通讯逻辑]
AGENT_INFO=$(db_exec "SELECT agent_ip, agent_port FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
AGENT_IP=$(echo "$AGENT_INFO" | cut -d'|' -f1)
AGENT_PORT=$(echo "$AGENT_INFO" | cut -d'|' -f2)
if [ -n "$AGENT_IP" ] && [ -n "$AGENT_PORT" ]; then
send_msg "$CHAT_ID" "⏳ 正在向 \`$TARGET_NODE\` ($AGENT_IP) 下发 [quality] 指令,请稍候..."
# 动态 HMAC 签名防篡改
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_quality")
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
# 结果判定
if [ "$RESPONSE" == "FAILED" ]; then
send_msg "$CHAT_ID" "❌ 指令下发超时或失败!请检查节点公网 IP 或防火墙端口 ($AGENT_PORT) 是否放行。"
elif [[ "$RESPONSE" == *"403"* ]]; then
send_msg "$CHAT_ID" "⚠️ **拒绝执行**:该节点未在本地开启此模块,请检查安装时的配置!"
else
send_msg "$CHAT_ID" "✅ 节点 \`$TARGET_NODE\` 回应: 🔍 深海声呐已投放!请等待异步战报回传。"
fi
else
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
fi
fi
;;
"/trend"|"/trend@"*)
TARGET_NODE=$(echo "$TEXT" | awk '{print $2}')
if [ -z "$TARGET_NODE" ]; then
send_msg "$CHAT_ID" "⚠️ 请指定目标节点。例如: \`/trend HK-1\`%0A或通过雷达面板进行选择操作。"
else
TARGET_NODE=$(echo "$TARGET_NODE" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
TREND_DATA=$(db_exec "SELECT datetime(check_time, 'localtime'), scam_score, goog_status, nf_status, gpt_status FROM ip_trend_log WHERE node_name='$TARGET_NODE' ORDER BY check_time DESC LIMIT 15;")
if [ -z "$TREND_DATA" ]; then
send_msg "$CHAT_ID" "⚠️ 节点 \`$TARGET_NODE\` 暂无历史体检档案。请先执行 /quality 投放声呐进行探测。"
else
TARGET_ALIAS=$(db_exec "SELECT IFNULL(node_alias, node_name) FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
[ -z "$TARGET_ALIAS" ] && TARGET_ALIAS="$TARGET_NODE"
TEXT_RES="📈 *[${TARGET_ALIAS}] 历史态势感知 (近15次)*\n\n"
TEXT_RES+="时间(本地) | 风险 | 谷歌 | NF | GPT\n"
TEXT_RES+="-----------------------------------------\n"
while IFS='|' read -r c_time score goog nf gpt; do
[ -z "$score" ] && score="0"
[ -z "$goog" ] && goog="未知"
[ -z "$nf" ] && nf="未知"
[ -z "$gpt" ] && gpt="未知"
short_time=$(echo "$c_time" | cut -c 6-16)
if [ "$score" -le 20 ]; then SCORE_EMJ="🟢"
elif [ "$score" -le 60 ]; then SCORE_EMJ="🟡"
else SCORE_EMJ="🔴"
fi
TEXT_RES+="\`${short_time}\` | ${SCORE_EMJ}\`${score}\` | \`${goog}\` | \`${nf}\` | \`${gpt}\`\n"
done <<< "$TREND_DATA"
TEXT_RES+="\n_💡 提示:🔴风险分 >60 极易触发网页验证码拦截;谷歌显示 CN 即为高危送中。_"
# [v4.0.3 体验升级] 注入交互式控制台按钮
BTNS="[[{\"text\":\"⚙️ 调出该节点控制台\",\"callback_data\":\"manage:$TARGET_NODE\"}]]"
send_ui "$CHAT_ID" "$TEXT_RES" "$BTNS"
fi
fi
;;
# ------------------- 🚨 插入代码到此结束 -------------------
"list_nodes")
# 【V3.1.3】一级菜单:大区聚合并列出数量
REGION_DATA=$(db_exec "SELECT region, COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID' GROUP BY region;")
@@ -490,12 +188,15 @@ while true; do
BTNS="["
while IFS='|' read -r REGION_NAME NODE_COUNT; do
[ -z "$REGION_NAME" ] && REGION_NAME="UNKNOWN"
FLAG=$(get_flag "$REGION_NAME")
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
FLAG="🌐"
case "$REGION_NAME" in
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
esac
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
done <<< "$REGION_DATA"
# L1 追加返回中枢逃生舱
BTNS="$BTNS[{\"text\":\"🏠 回到司令部\",\"callback_data\":\"/start\"}]]"
send_ui "$CHAT_ID" "🌍 **全视界战略雷达**\n已为您聚合当前舰队的部署大区请选择要检阅的战区" "$BTNS"
BTNS="${BTNS%,}]"
send_ui "$CHAT_ID" "🌍 **全视界战略雷达**\n请选择要检阅的战区" "$BTNS"
fi
;;
@@ -504,17 +205,15 @@ while true; do
TARGET_REGION=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
# [v3.5.2] 提取物理主键和展示别名
NODE_LIST=$(db_exec "SELECT node_name, IFNULL(node_alias, node_name) FROM nodes WHERE chat_id='$CHAT_ID' AND region='$TARGET_REGION';")
NODE_LIST=$(db_exec "SELECT node_name FROM nodes WHERE chat_id='$CHAT_ID' AND region='$TARGET_REGION';")
if [ -z "$NODE_LIST" ]; then
send_msg "$CHAT_ID" "⚠️ 该战区下暂无可用节点。"
else
BTNS="["
COL=0
ROW_STR="["
while IFS='|' read -r N_NAME N_ALIAS; do
[ -z "$N_NAME" ] && continue
ROW_STR="$ROW_STR{\"text\":\"🖥️ $N_ALIAS\",\"callback_data\":\"manage:$N_NAME\"},"
for N in $NODE_LIST; do
ROW_STR="$ROW_STR{\"text\":\"🖥️ $N\",\"callback_data\":\"manage:$N\"},"
COL=$((COL+1))
if [ $COL -eq 2 ]; then
ROW_STR="${ROW_STR%,}]"
@@ -522,119 +221,24 @@ while true; do
COL=0
ROW_STR="["
fi
done <<< "$NODE_LIST"
done
# 如果是奇数,补齐最后的尾巴
if [ $COL -eq 1 ]; then
ROW_STR="${ROW_STR%,}]"
BTNS="$BTNS$ROW_STR,"
fi
# L2 追加双重逃生舱
BTNS="$BTNS[{\"text\":\"⬅️ 返回战区地图\",\"callback_data\":\"list_nodes\"}, {\"text\":\"🏠 回到司令部\",\"callback_data\":\"/start\"}]]"
send_ui "$CHAT_ID" "📍 **[$TARGET_REGION] 战区哨兵矩阵**\n请锁定要执行战术动作的具体目标" "$BTNS"
# 添加返回上级大区雷达的按钮
BTNS="$BTNS[{\"text\":\"⬅️ 返回全球战区分布\",\"callback_data\":\"list_nodes\"}]]"
send_ui "$CHAT_ID" "📍 **[$TARGET_REGION] 战区哨兵矩阵**\n请下达控制指令" "$BTNS"
fi
;;
manage:*)
# 🛡️ 强制过滤节点名,防止面板渲染时发生 XSS 或注入
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
TARGET_ALIAS=$(db_exec "SELECT IFNULL(node_alias, node_name) FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
[ -z "$TARGET_ALIAS" ] && TARGET_ALIAS="$TARGET_NODE"
# 抓取节点全景元数据
TOGGLE_INFO=$(db_exec "SELECT enable_google, enable_trust, enable_ota, agent_ip, IFNULL(last_seen, '未知') FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
ST_GOOGLE=$(echo "$TOGGLE_INFO" | cut -d'|' -f1)
ST_TRUST=$(echo "$TOGGLE_INFO" | cut -d'|' -f2)
ST_OTA=$(echo "$TOGGLE_INFO" | cut -d'|' -f3)
A_IP=$(echo "$TOGGLE_INFO" | cut -d'|' -f4)
LAST_SEEN=$(echo "$TOGGLE_INFO" | cut -d'|' -f5)
# 动态渲染状态文字
[ "$ST_GOOGLE" == "true" ] && BTN_G="🟢 Google巡逻: 已开" && ACT_G="false" || { BTN_G="🔴 Google巡逻: 已停"; ACT_G="true"; }
[ "$ST_TRUST" == "true" ] && BTN_T="🟢 信用净化: 已开" && ACT_T="false" || { BTN_T="🔴 信用净化: 已停"; ACT_T="true"; }
# 模块一:即时战术动作 (V4.0.0 引入深海声呐与趋势面板)
BTN_ACTION="[{\"text\":\"📍 触发 Google 纠偏\",\"callback_data\":\"google:$TARGET_NODE\"}, {\"text\":\"🛡️ 触发信用净化\",\"callback_data\":\"trust:$TARGET_NODE\"}], [{\"text\":\"🔍 投放深海声呐 (查IP质量)\",\"callback_data\":\"quality:$TARGET_NODE\"}, {\"text\":\"📈 查看 IP 污染趋势图\",\"callback_data\":\"trend:$TARGET_NODE\"}], [{\"text\":\"📜 提取终端实时日志\",\"callback_data\":\"log:$TARGET_NODE\"}, {\"text\":\"📊 生成单机战报\",\"callback_data\":\"report:$TARGET_NODE\"}]"
# 模块二:养护状态启停
BTN_TOGGLE="[{\"text\":\"$BTN_G\",\"callback_data\":\"toggle:google:$TARGET_NODE:$ACT_G\"}, {\"text\":\"$BTN_T\",\"callback_data\":\"toggle:trust:$TARGET_NODE:$ACT_T\"}]"
# 模块三:深度配置管理 (结合 UI 熔断)
if [ "$IS_OFFICIAL_GATEWAY" != "true" ] && [ "$ST_OTA" == "true" ]; then
BTN_CONFIG="[{\"text\":\"✏️ 更改终端展示代号\",\"callback_data\":\"rename:$TARGET_NODE\"}, {\"text\":\"🆙 OTA 静默升级\",\"callback_data\":\"ota_confirm:$TARGET_NODE\"}]"
else
BTN_CONFIG="[{\"text\":\"✏️ 更改终端展示代号\",\"callback_data\":\"rename:$TARGET_NODE\"}]"
fi
# 模块四:危险区与逃生舱
BTN_DANGER="[{\"text\":\"🗑️ 从中枢销毁该档案\",\"callback_data\":\"del:$TARGET_NODE\"}, {\"text\":\"⬅️ 返回战区列表\",\"callback_data\":\"list_nodes\"}]"
# 组合终极矩阵
BTNS="[$BTN_ACTION, $BTN_TOGGLE, $BTN_CONFIG, $BTN_DANGER]"
TEXT_MSG="⚙️ **目标锁定**: \`$TARGET_ALIAS\`\n(底层标识: \`$TARGET_NODE\`)\n🌐 IP 坐标: \`$A_IP\`\n🕒 最后通讯: \`$LAST_SEEN\`\n\n请下达精确控制指令"
if [ -n "$MSG_ID" ]; then
edit_ui "$CHAT_ID" "$MSG_ID" "$TEXT_MSG" "$BTNS"
else
send_ui "$CHAT_ID" "$TEXT_MSG" "$BTNS"
fi
;;
toggle:*)
# [动态启停通信闭环]
IFS=':' read -r CMD MOD_NAME TARGET_NODE TARGET_STATE <<< "$TEXT"
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
AGENT_INFO=$(db_exec "SELECT agent_ip, agent_port FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
AGENT_IP=$(echo "$AGENT_INFO" | cut -d'|' -f1)
AGENT_PORT=$(echo "$AGENT_INFO" | cut -d'|' -f2)
if [ -n "$AGENT_IP" ] && [ -n "$AGENT_PORT" ]; then
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_toggle")
TARGET_URL="${TARGET_URL}&mod=${MOD_NAME}&state=${TARGET_STATE}"
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
if [[ "$RESPONSE" == *"Action Accepted"* ]]; then
# 下发成功,更新 DB原位重绘
db_exec "UPDATE nodes SET enable_${MOD_NAME}='$TARGET_STATE' WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
TOGGLE_INFO=$(db_exec "SELECT enable_google, enable_trust FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
ST_GOOGLE=$(echo "$TOGGLE_INFO" | cut -d'|' -f1)
ST_TRUST=$(echo "$TOGGLE_INFO" | cut -d'|' -f2)
[ "$ST_GOOGLE" == "true" ] && BTN_G="🔴 停用 Google 纠偏" && ACT_G="false" || { BTN_G="🟢 启用 Google 纠偏"; ACT_G="true"; }
[ "$ST_TRUST" == "true" ] && BTN_T="🔴 停用信用净化" && ACT_T="false" || { BTN_T="🟢 启用信用净化"; ACT_T="true"; }
# 切换后直接复用扁平化 L3 面板的重绘逻辑
TOGGLE_INFO=$(db_exec "SELECT enable_google, enable_trust, enable_ota, agent_ip, IFNULL(last_seen, '未知') FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
ST_GOOGLE=$(echo "$TOGGLE_INFO" | cut -d'|' -f1)
ST_TRUST=$(echo "$TOGGLE_INFO" | cut -d'|' -f2)
ST_OTA=$(echo "$TOGGLE_INFO" | cut -d'|' -f3)
A_IP=$(echo "$TOGGLE_INFO" | cut -d'|' -f4)
LAST_SEEN=$(echo "$TOGGLE_INFO" | cut -d'|' -f5)
[ "$ST_GOOGLE" == "true" ] && BTN_G="🟢 Google巡逻: 已开" && ACT_G="false" || { BTN_G="🔴 Google巡逻: 已停"; ACT_G="true"; }
[ "$ST_TRUST" == "true" ] && BTN_T="🟢 信用净化: 已开" && ACT_T="false" || { BTN_T="🔴 信用净化: 已停"; ACT_T="true"; }
# 模块一:即时战术动作 (V4.0.0 引入深海声呐与趋势面板)
BTN_ACTION="[{\"text\":\"📍 触发 Google 纠偏\",\"callback_data\":\"google:$TARGET_NODE\"}, {\"text\":\"🛡️ 触发信用净化\",\"callback_data\":\"trust:$TARGET_NODE\"}], [{\"text\":\"🔍 投放深海声呐 (查IP质量)\",\"callback_data\":\"quality:$TARGET_NODE\"}, {\"text\":\"📈 查看 IP 污染趋势图\",\"callback_data\":\"trend:$TARGET_NODE\"}], [{\"text\":\"📜 提取终端实时日志\",\"callback_data\":\"log:$TARGET_NODE\"}, {\"text\":\"📊 生成单机战报\",\"callback_data\":\"report:$TARGET_NODE\"}]"
BTN_TOGGLE="[{\"text\":\"$BTN_G\",\"callback_data\":\"toggle:google:$TARGET_NODE:$ACT_G\"}, {\"text\":\"$BTN_T\",\"callback_data\":\"toggle:trust:$TARGET_NODE:$ACT_T\"}]"
if [ "$IS_OFFICIAL_GATEWAY" != "true" ] && [ "$ST_OTA" == "true" ]; then
BTN_CONFIG="[{\"text\":\"✏️ 更改终端展示代号\",\"callback_data\":\"rename:$TARGET_NODE\"}, {\"text\":\"🆙 OTA 静默升级\",\"callback_data\":\"ota_confirm:$TARGET_NODE\"}]"
else
BTN_CONFIG="[{\"text\":\"✏️ 更改终端展示代号\",\"callback_data\":\"rename:$TARGET_NODE\"}]"
fi
BTN_DANGER="[{\"text\":\"🗑️ 从中枢销毁该档案\",\"callback_data\":\"del:$TARGET_NODE\"}, {\"text\":\"⬅️ 返回战区列表\",\"callback_data\":\"list_nodes\"}]"
BTNS="[$BTN_ACTION, $BTN_TOGGLE, $BTN_CONFIG, $BTN_DANGER]"
TARGET_ALIAS=$(db_exec "SELECT IFNULL(node_alias, node_name) FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
TEXT_MSG="⚙️ **目标锁定**: \`$TARGET_ALIAS\`\n(底层标识: \`$TARGET_NODE\`)\n🌐 IP 坐标: \`$A_IP\`\n🕒 最后通讯: \`$LAST_SEEN\`\n\n✅ **执行成功**: 模块 [$MOD_NAME] 状态已切换为 $TARGET_STATE"
edit_ui "$CHAT_ID" "$MSG_ID" "$TEXT_MSG" "$BTNS"
else
send_msg "$CHAT_ID" "❌ 指令下发失败,安全策略禁止降级重试。"
fi
fi
# 【核心升级】拆分下发按钮,精准对应 Google 与 Trust 两个模块,并排版为 3 行 2 列
BTNS="[[{\"text\":\"📍 Google 纠偏\",\"callback_data\":\"google:$TARGET_NODE\"}, {\"text\":\"🛡️ 信用净化\",\"callback_data\":\"trust:$TARGET_NODE\"}], [{\"text\":\"📜 实时日志\",\"callback_data\":\"log:$TARGET_NODE\"}, {\"text\":\"📊 统计战报\",\"callback_data\":\"report:$TARGET_NODE\"}], [{\"text\":\"🗑️ 剔除失联节点\",\"callback_data\":\"del:$TARGET_NODE\"}, {\"text\":\"⬅️ 返回大区目录\",\"callback_data\":\"list_nodes\"}]]"
send_ui "$CHAT_ID" "⚙️ **目标锁定**: \`$TARGET_NODE\`\n请选择战术动作" "$BTNS"
;;
del:*)
@@ -642,19 +246,8 @@ while true; do
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
# 🛡️ [终极防线: 防越权横向打击] 先校验该节点是否真实属于当前操作者!
# 因为趋势库中没有 Chat_ID 标识,不校验直接删会给黑客伪造回调清空他人数据的机会!
VALID_OWNER=$(db_exec "SELECT 1 FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
if [ "$VALID_OWNER" == "1" ]; then
# 验权通过,执行原子化级联销毁:同时抹除主配置与历史污染趋势
db_exec "DELETE FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
db_exec "DELETE FROM ip_trend_log WHERE node_name='$TARGET_NODE';"
send_msg "$CHAT_ID" "🗑️ 节点 \`$TARGET_NODE\` 的档案及历史污染趋势已从司令部彻底销毁!"
else
send_msg "$CHAT_ID" "⛔ **安全拦截**:销毁失败。目标节点不存在或您无权越权操作!"
continue
fi
db_exec "DELETE FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
send_msg "$CHAT_ID" "🗑️ 节点 \`$TARGET_NODE\` 的档案已从司令部彻底销毁!"
# 剔除后直接返回上级一级雷达菜单
REGION_DATA=$(db_exec "SELECT region, COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID' GROUP BY region;")
@@ -664,7 +257,11 @@ while true; do
BTNS="["
while IFS='|' read -r REGION_NAME NODE_COUNT; do
[ -z "$REGION_NAME" ] && REGION_NAME="UNKNOWN"
FLAG=$(get_flag "$REGION_NAME")
FLAG="🌐"
case "$REGION_NAME" in
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
esac
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
done <<< "$REGION_DATA"
BTNS="${BTNS%,}]"
@@ -672,97 +269,10 @@ while true; do
fi
;;
rename:*)
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
# [v3.5.2] 发送 ForceReply 引导用户回复
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
-H "Content-Type: application/json" \
-d "{\"chat_id\":\"$CHAT_ID\",\"text\":\"✏️ 请回复本消息以重命名节点:\n\`$TARGET_NODE\`\n(仅限中英文、数字最长20字符)\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"force_reply\":true}}" > /dev/null
;;
do_rename:*)
# [v3.5.2] 内部重命名路由 (已被第2处的代码拦截并格式化)
IFS=':' read -r CMD TARGET_NODE NEW_ALIAS <<< "$TEXT"
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
AGENT_INFO=$(db_exec "SELECT agent_ip, agent_port FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
AGENT_IP=$(echo "$AGENT_INFO" | cut -d'|' -f1)
AGENT_PORT=$(echo "$AGENT_INFO" | cut -d'|' -f2)
if [ -n "$AGENT_IP" ] && [ -n "$AGENT_PORT" ]; then
send_msg "$CHAT_ID" "⏳ 正在向 \`$TARGET_NODE\` 下发重命名指令,正在建立加密隧道..."
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_rename")
# [绝密防线: Base64 编码绕过一切传输限制与 WAF 拦截]
ALIAS_B64=$(echo -n "$NEW_ALIAS" | base64 | tr -d '\n' | tr '+/' '-_')
TARGET_URL="${TARGET_URL}&b64=${ALIAS_B64}"
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
if [ "$RESPONSE" == "FAILED" ]; then
send_msg "$CHAT_ID" "❌ 指令下发超时!为防范劫持风险,已终止请求。"
elif [[ "$RESPONSE" == *"Action Accepted"* ]]; then
# [v3.5.2 极致丝滑] 确认 Agent 修改成功后Master 立即自动同步本地 SQLite 数据库!
db_exec "UPDATE nodes SET node_alias='$NEW_ALIAS' WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
send_msg "$CHAT_ID" "✅ 通讯成功!节点别名已下发: \`$NEW_ALIAS\`%0A*(司令部档案已自动刷新,雷达面板已同步)*"
else
# 增加输出 RESPONSE 调试信息,排查任何拦截死因
send_msg "$CHAT_ID" "⚠️ 节点拒绝了请求,请确保 Agent 已更新至 v3.5.2%0A(回传信息: \`${RESPONSE}\`)"
fi
else
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
fi
;;
ota_confirm:*)
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
# 将取消动作引导回 manage因为 adv 已经被删除了
CONFIRM_BTNS="[[{\"text\":\"🚨 确认执行远程升级\",\"callback_data\":\"ota_execute:$TARGET_NODE\"}], [{\"text\":\"取消\",\"callback_data\":\"manage:$TARGET_NODE\"}]]"
send_ui "$CHAT_ID" "☢️ **操作确认**:即将向 \`$TARGET_NODE\` 下发 OTA 热更新指令。\n节点更新完成后会自动发送包含新版本号的注册回执确定执行" "$CONFIRM_BTNS"
;;
ota_execute:*)
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
AGENT_INFO=$(db_exec "SELECT agent_ip, agent_port FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
AGENT_IP=$(echo "$AGENT_INFO" | cut -d'|' -f1)
AGENT_PORT=$(echo "$AGENT_INFO" | cut -d'|' -f2)
if [ -n "$AGENT_IP" ] && [ -n "$AGENT_PORT" ]; then
if [ -n "$MSG_ID" ]; then
edit_msg "$CHAT_ID" "$MSG_ID" "⏳ 正在向 \`$TARGET_NODE\` 发送 OTA 触发报文..."
else
send_msg "$CHAT_ID" "⏳ 正在向 \`$TARGET_NODE\` 发送 OTA 触发报文..."
fi
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_ota")
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
if [ "$RESPONSE" == "FAILED" ]; then
TEXT_RES="❌ OTA 指令下发彻底失败!链路异常或严禁使用 HTTP 降级通讯。"
elif [[ "$RESPONSE" == *"403"* ]]; then
TEXT_RES="⚠️ **节点拒绝执行**:该节点本地未开启 OTA 权限或运行在官方网关下!"
else
TEXT_RES="✅ OTA (TLS加密) 触发成功!节点正在后台执行拉取重构..."
fi
if [ -n "$MSG_ID" ]; then
edit_msg "$CHAT_ID" "$MSG_ID" "$TEXT_RES"
else
send_msg "$CHAT_ID" "$TEXT_RES"
fi
else
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
fi
;;
# 【核心升级 v4.0.0】增加拦截规则,支持 quality 前缀
google:*|trust:*|run:*|report:*|log:*|quality:*)
# 【核心升级】增加拦截规则,支持 google 和 trust 前缀
google:*|trust:*|run:*|report:*|log:*)
# 🛡️ 提取并强制过滤动作参数、节点名与 CHAT_ID
ACTION_TYPE=$(echo "$TEXT" | cut -d':' -f1)
ACTION_TYPE=$(echo "$TEXT" | cut -d':' -f1 | tr -cd 'a-z')
TARGET_NODE=$(echo "$TEXT" | cut -d':' -f2 | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
@@ -780,11 +290,11 @@ while true; do
# 🛡️ [v3.0.4] 动态签名生成与触发 (防重放与防篡改)
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_${ACTION_TYPE}")
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
RESPONSE=$(curl -s -m 5 "$TARGET_URL" || echo "FAILED")
# 结果判定
if [ "$RESPONSE" == "FAILED" ]; then
TEXT_RES="❌ 指令下发超时或失败!为保护链路安全,已终止通信 (严禁降级为 HTTP)。"
TEXT_RES="❌ 指令下发超时或失败!请检查节点公网 IP 或防火墙端口 ($AGENT_PORT) 是否放行。"
elif [[ "$RESPONSE" == *"403"* ]]; then
TEXT_RES="⚠️ **拒绝执行**:该节点未在本地开启此模块,请检查安装时的配置!"
else
@@ -792,8 +302,6 @@ while true; do
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 📍 Google 纠偏程序启动。"
elif [ "$ACTION_TYPE" == "trust" ]; then
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 🛡️ IP 信用净化程序启动。"
elif [ "$ACTION_TYPE" == "quality" ]; then
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 🔍 深海声呐已投放!请等待异步战报回传。"
elif [ "$ACTION_TYPE" == "log" ]; then
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 正在抓取日志..."
else
@@ -811,55 +319,6 @@ while true; do
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
fi
;;
trend:*)
# [v4.0.2 优化: 扩容 15 次追踪并引入 GOOG/GPT 状态]
TARGET_NODE=$(echo "${TEXT#*:}" | tr -cd 'a-zA-Z0-9_.-')
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
TREND_DATA=$(db_exec "SELECT datetime(check_time, 'localtime'), scam_score, goog_status, nf_status, gpt_status FROM ip_trend_log WHERE node_name='$TARGET_NODE' ORDER BY check_time DESC LIMIT 15;")
if [ -z "$TREND_DATA" ]; then
TEXT_RES="⚠️ 节点 \`$TARGET_NODE\` 暂无历史体检档案。请先执行 [🔍 投放深海声呐] 进行探测。"
else
TARGET_ALIAS=$(db_exec "SELECT IFNULL(node_alias, node_name) FROM nodes WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE' LIMIT 1;")
[ -z "$TARGET_ALIAS" ] && TARGET_ALIAS="$TARGET_NODE"
TEXT_RES="📈 *[${TARGET_ALIAS}] 历史态势感知 (近15次)*\n\n"
TEXT_RES+="时间(本地) | 风险 | 谷歌 | NF | GPT\n"
TEXT_RES+="-----------------------------------------\n"
while IFS='|' read -r c_time score goog nf gpt; do
[ -z "$score" ] && score="0"
[ -z "$goog" ] && goog="未知"
[ -z "$nf" ] && nf="未知"
[ -z "$gpt" ] && gpt="未知"
# 时间做极简切割 (截取 04-24 20:52) 节省横向空间
short_time=$(echo "$c_time" | cut -c 6-16)
if [ "$score" -le 20 ]; then SCORE_EMJ="🟢"
elif [ "$score" -le 60 ]; then SCORE_EMJ="🟡"
else SCORE_EMJ="🔴"
fi
# 拼接紧凑排版
TEXT_RES+="\`${short_time}\` | ${SCORE_EMJ}\`${score}\` | \`${goog}\` | \`${nf}\` | \`${gpt}\`\n"
done <<< "$TREND_DATA"
TEXT_RES+="\n_💡 提示:🔴风险分 >60 极易触发网页验证码拦截;谷歌显示 CN 即为高危送中。_"
fi
# [v4.0.3 体验升级] 注入交互式控制台按钮,并调用原生 UI 重绘函数
BTNS="[[{\"text\":\"⚙️ 调出该节点控制台\",\"callback_data\":\"manage:$TARGET_NODE\"}]]"
if [ -n "$MSG_ID" ]; then
edit_ui "$CHAT_ID" "$MSG_ID" "$TEXT_RES" "$BTNS"
else
send_ui "$CHAT_ID" "$TEXT_RES" "$BTNS"
fi
;;
esac
done
fi

View File

@@ -1,30 +1,14 @@
#!/bin/bash
# ==========================================================
# 脚本名称: uninstall_master.sh (IP-Sentinel Master 一键卸载脚本 - 动态锚点版)
# 脚本名称: uninstall_master.sh (IP-Sentinel Master 一键卸载脚本)
# 核心功能: 终止调度进程、清理看门狗定时任务、抹除数据库与配置
# ==========================================================
# ==========================================================
# 🛑 核心权限防线: 检查是否以 root 权限运行
# ==========================================================
if [ "$EUID" -ne 0 ]; then
echo -e "\033[31m❌ 权限被拒绝: 卸载 IP-Sentinel 需要最高系统权限。\033[0m"
echo -e "💡 请切换到 root 用户 (执行 su root 或 sudo -i) 后重新运行指令。"
exit 1
fi
MASTER_DIR="/opt/ip_sentinel_master"
CONF_FILE="${MASTER_DIR}/master.conf"
echo "========================================================"
echo " 🗑️ 准备卸载 IP-Sentinel Master (控制中枢)"
# [v3.4.0 优化] 卸载前读取并播报中枢版本号
if [ -f "$CONF_FILE" ]; then
MASTER_VER=$(grep "^MASTER_VERSION=" "$CONF_FILE" | cut -d'"' -f2)
[ -n "$MASTER_VER" ] && echo " 📍 目标版本: v${MASTER_VER}"
fi
echo "========================================================"
echo -e "\n⚠ 警告: 此操作将永久删除包含所有节点档案的 SQLite 数据库!"
@@ -34,31 +18,18 @@ if [[ ! "$CONFIRM_DEL" =~ ^[Yy]$ ]]; then
exit 0
fi
# 1. 停止并删除 Systemd 服务 (适配新架构)
echo "[1/4] 正在停止并删除 Systemd 服务..."
if command -v systemctl >/dev/null 2>&1; then
echo "💡 检测到 Systemd 环境,正在抹除 Systemd 服务单元..."
# [防死锁修复] 先发送 SIGKILL 瞬间抹杀,防止卡死
systemctl kill --signal=SIGKILL ip-sentinel-master.service >/dev/null 2>&1 || true
systemctl disable --now ip-sentinel-master.service >/dev/null 2>&1
rm -f /etc/systemd/system/ip-sentinel-master.service
systemctl daemon-reload
systemctl reset-failed
else
echo "💡 未检测到 Systemd跳过此步骤..."
fi
# 1. 停止运行中的 Master 守护进程
echo "[1/3] 正在终止后台中枢调度进程..."
pgrep -f tg_master.sh | xargs -r kill -9 >/dev/null 2>&1
# 2. 停止运行中的 Master 守护进程 (兜底清理老版进程)
echo "[2/4] 正在终止后台中枢调度进程..."
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
# 2. 清除看门狗定时任务 (Cron)
echo "[2/3] 正在清理系统定时任务 (Cron)..."
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_backup
crontab /tmp/cron_backup
rm -f /tmp/cron_backup
# 3. 清除看门狗定时任务 (Cron)
echo "[3/4] 正在清理系统定时任务 (Cron)..."
# [终极防御] 内存管道流过滤,绝不写硬盘
crontab -l 2>/dev/null | grep -v "tg_master.sh" | crontab - >/dev/null 2>&1 || true
# 4. 删除所有文件、配置与数据库
echo "[4/4] 正在抹除核心程序、配置文件与 SQLite 数据库..."
# 3. 删除所有文件、配置与数据库
echo "[3/3] 正在抹除核心程序、配置文件与 SQLite 数据库..."
if [ -d "$MASTER_DIR" ]; then
rm -rf "$MASTER_DIR"
fi

View File

@@ -1,83 +0,0 @@
import urllib.request
import xml.etree.ElementTree as ET
import os
import json
import re
# ================== [路径防弹装甲] ==================
# 无论在哪里执行该脚本,都能精准反推项目根目录
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_ROOT = os.path.dirname(SCRIPT_DIR)
MAP_JSON_PATH = os.path.join(PROJECT_ROOT, "data", "map.json")
DATA_DIR = os.path.join(PROJECT_ROOT, "data", "keywords")
# ====================================================
# 特殊战区代码映射 (Google Trends RSS 要求)
GEO_FIX = {'UK': 'GB'}
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
def get_active_regions():
"""动态提取 map.json 中的战区 (适配 v3.5.0 大洲战区降维架构)"""
try:
with open(MAP_JSON_PATH, 'r', encoding='utf-8') as f:
data = json.load(f)
regions = []
# 第一层穿透:遍历所有大洲战区 (continents)
for continent in data.get('continents', []):
# 第二层穿透:遍历大洲下的所有国家 (countries)
for country in continent.get('countries', []):
if 'id' in country:
regions.append(country['id'])
return regions
except Exception as e:
print(f"❌ [读取地图失败]: {e}")
return []
def fetch_trends(region_code):
"""从 Google Trends 抓取当日热搜"""
geo = GEO_FIX.get(region_code, region_code)
url = f"https://trends.google.com/trending/rss?geo={geo}"
try:
req = urllib.request.Request(url, headers=HEADERS)
with urllib.request.urlopen(req, timeout=10) as response:
xml_data = response.read()
root = ET.fromstring(xml_data)
return [re.sub(r'[\n\r\t]', ' ', item.find('title').text).strip()
for item in root.findall('./channel/item')
if item.find('title') is not None]
except Exception as e:
print(f"⚠️ {region_code} 抓取异常: {e}")
return []
def update_file(region, new_words):
"""滑动窗口更新,保留 200 条最热记录"""
os.makedirs(DATA_DIR, exist_ok=True)
file_path = os.path.join(DATA_DIR, f"kw_{region}.txt")
old_words = []
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
old_words = [l.strip() for l in f if l.strip()]
# 新词排在最前面,去重
combined = new_words + [w for w in old_words if w not in new_words]
final_list = combined[:200]
with open(file_path, 'w', encoding='utf-8') as f:
f.write('\n'.join(final_list) + '\n')
print(f"✅ [同步完成] {region}: 注入 {len(new_words)} 条新热点")
if __name__ == '__main__':
regions = get_active_regions()
if not regions:
print("🛑 未发现活跃战区,请检查 map.json")
exit(1)
for r in regions:
print(f"📡 正在拉取 {r} 战区情报...")
words = fetch_trends(r)
if words:
update_file(r, words)

View File

@@ -1,104 +0,0 @@
import urllib.request
import xml.etree.ElementTree as ET
import os
import json
import random
# ================== [路径防弹装甲] ==================
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
PROJECT_ROOT = os.path.dirname(SCRIPT_DIR)
REGIONS_DIR = os.path.join(PROJECT_ROOT, "data", "regions")
# ====================================================
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 全球骨干新闻 RSS 监听矩阵
RSS_FEEDS = {
"US": ["http://rss.cnn.com/rss/cnn_topstories.rss", "https://feeds.npr.org/1001/rss.xml"],
"UK": ["http://feeds.bbci.co.uk/news/rss.xml"],
"AU": ["https://www.abc.net.au/news/feed/51120/rss.xml"],
"CA": ["https://www.cbc.ca/cmlink/rss-topstories"],
"DE": ["https://www.tagesschau.de/xml/rss2"],
"FR": ["https://www.france24.com/fr/rss"],
"ES": ["https://feeds.elpais.com/mrss-s/pages/ep/site/elpais.com/portada"],
"JP": ["https://news.yahoo.co.jp/rss/topics/top-picks.xml"],
"HK": ["https://hk.news.yahoo.com/rss/hong-kong"],
"TW": ["https://news.google.com/rss?hl=zh-TW&gl=TW&ceid=TW:zh-Hant"],
"KR": ["https://www.yonhapnewstv.co.kr/category/news/headline/feed/"],
"SG": ["https://www.channelnewsasia.com/api/v1/rss-outbound-feed?_format=xml"],
"NL": ["https://feeds.nos.nl/nosnieuwsalgemeen"],
"VN": ["https://vnexpress.net/rss/tin-moi-nhat.rss"],
"MY": ["https://news.google.com/rss?hl=en-MY&gl=MY&ceid=MY:en"],
"NG": ["https://punchng.com/feed/", "https://guardian.ng/feed/"]
}
def fetch_rss_links(region_code, max_items=15):
"""抓取该战区最新的 RSS 新闻链接"""
feeds = RSS_FEEDS.get(region_code, [])
if not feeds:
return []
links = []
for url in feeds:
try:
req = urllib.request.Request(url, headers=HEADERS)
with urllib.request.urlopen(req, timeout=10) as response:
xml_data = response.read()
root = ET.fromstring(xml_data)
for item in root.findall('.//item'):
link = item.find('link')
if link is not None and link.text:
clean_link = link.text.strip()
if clean_link.startswith('http'):
links.append(clean_link)
except Exception as e:
print(f"⚠️ [{region_code}] RSS 抓取异常 ({url}): {e}")
# 去重并截取最新
return list(set(links))[:max_items]
def process_json_file(file_path, region_code):
"""融合静态基石与动态新闻"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
trust_mod = data.get("trust_module", {})
if not trust_mod or "static_urls" not in trust_mod:
return
static_urls = trust_mod.get("static_urls", [])
# 抓取今日该战区的活体新闻流
daily_news_urls = fetch_rss_links(region_code)
# 战术混合:基石(保证高权重) + 新闻(保证活体动态)
combined_urls = static_urls + daily_news_urls
# 深度洗牌,打破机械顺序特征
combined_urls = list(set(combined_urls))
random.shuffle(combined_urls)
# 覆写回供 Agent 拉取的 white_urls
trust_mod["white_urls"] = combined_urls
data["trust_module"] = trust_mod
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"✅ [信用融合] {os.path.basename(file_path)}: 骨干 {len(static_urls)} 条 + 活体 {len(daily_news_urls)}")
except Exception as e:
print(f"❌ [处理失败] {file_path}: {e}")
if __name__ == '__main__':
print("========== 启动 IP-Sentinel 活体新闻流融合引擎 ==========")
for root_dir, _, files in os.walk(REGIONS_DIR):
for file in files:
if file.endswith(".json"):
file_path = os.path.join(root_dir, file)
region_code = os.path.relpath(file_path, REGIONS_DIR).split(os.sep)[0]
process_json_file(file_path, region_code)
print("========== 融合引擎执行完毕 ==========")

View File

@@ -1,2 +0,0 @@
MASTER_VERSION=4.0.8
AGENT_VERSION=4.0.8