mirror of
https://github.com/hotyue/IP-Sentinel.git
synced 2026-05-11 23:09:46 +08:00
Compare commits
104 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3fbed4a94 | ||
|
|
71fe3bde51 | ||
|
|
c739f58cc5 | ||
|
|
2c50c72fcb | ||
|
|
8d16c549fc | ||
|
|
d74d6d8775 | ||
|
|
853e6c09e1 | ||
|
|
1f21ac9a7e | ||
|
|
28fd94eff5 | ||
|
|
7460935acc | ||
|
|
109ae6f319 | ||
|
|
6b3acf5787 | ||
|
|
b1ecbd4f9a | ||
|
|
4d091e4dd9 | ||
|
|
ae6559c850 | ||
|
|
5cfaebceab | ||
|
|
88f55cbab9 | ||
|
|
1204336612 | ||
|
|
49a65a5f11 | ||
|
|
7e5b836a49 | ||
|
|
18f80400ef | ||
|
|
eca4b41da4 | ||
|
|
a24a533165 | ||
|
|
d2b575fe85 | ||
|
|
cb0aa2049e | ||
|
|
981b9e4859 | ||
|
|
eeee1b6811 | ||
|
|
e6852d0c9d | ||
|
|
23ea08f981 | ||
|
|
580a3d7fd5 | ||
|
|
6eabb60c28 | ||
|
|
7fd432ffee | ||
|
|
351143e59d | ||
|
|
725e8ae8c9 | ||
|
|
1e9de46fc5 | ||
|
|
543ab5c8bd | ||
|
|
972cd02874 | ||
|
|
9c37cb9df3 | ||
|
|
2a8a6b6fa7 | ||
|
|
e4b4c747eb | ||
|
|
eabd33e6b2 | ||
|
|
233af7181f | ||
|
|
62fb19f0c5 | ||
|
|
54178ddcf1 | ||
|
|
92a65d8308 | ||
|
|
eaaa7dabf0 | ||
|
|
e797c8203f | ||
|
|
9ecf50c153 | ||
|
|
c02b7eecc9 | ||
|
|
6af8b6b25d | ||
|
|
7081aa77cc | ||
|
|
5e48edb030 | ||
|
|
5f0f677f59 | ||
|
|
7f0c3e3e29 | ||
|
|
c03f6ca9ba | ||
|
|
66f3ba7d06 | ||
|
|
511ba90378 | ||
|
|
01806d20dd | ||
|
|
049278c458 | ||
|
|
0aaa2d44a0 | ||
|
|
3f139a593e | ||
|
|
bee6fef69c | ||
|
|
f283a8a4c6 | ||
|
|
0d2433d850 | ||
|
|
a6b01bd8d5 | ||
|
|
8f2279b7e2 | ||
|
|
d37d26708d | ||
|
|
6234d7c49a | ||
|
|
f9a7bba32a | ||
|
|
068734da16 | ||
|
|
09a4108bcc | ||
|
|
a7f08ec7a7 | ||
|
|
f075fcce36 | ||
|
|
0bb96169e5 | ||
|
|
34320b2385 | ||
|
|
aeed9f0e57 | ||
|
|
c04a4c41e4 | ||
|
|
3b28ead0e4 | ||
|
|
d0ea5d09b1 | ||
|
|
a119973ec0 | ||
|
|
b8b91ac17e | ||
|
|
34f2c7e123 | ||
|
|
172f1e0209 | ||
|
|
1d5ed5d0cb | ||
|
|
1e150f26f1 | ||
|
|
03e735a44b | ||
|
|
011c1faad4 | ||
|
|
2325a8abdf | ||
|
|
201df489db | ||
|
|
2d680c5fc7 | ||
|
|
e77b7c0319 | ||
|
|
2283da7421 | ||
|
|
4a28f7f395 | ||
|
|
9a38fb62d0 | ||
|
|
fefd5dc60c | ||
|
|
89aa1ead33 | ||
|
|
a5f2fb53ed | ||
|
|
bd26f1011d | ||
|
|
cfaf156e03 | ||
|
|
75cf50ce0c | ||
|
|
e2b6bbc347 | ||
|
|
cd5160d1ea | ||
|
|
040827aa27 | ||
|
|
d00317a645 |
24
.github/workflows/daily_keywords.yml
vendored
24
.github/workflows/daily_keywords.yml
vendored
@@ -1,16 +1,19 @@
|
|||||||
name: Daily Trends Factory
|
name: Daily Data Factory
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
# 每天 UTC 18:00 运行 (北京时间凌晨 02:00)
|
# 每天 UTC 18:00 (北京时间凌晨 02:00) 执行,赶在节点凌晨3点更新前造好子弹
|
||||||
- cron: '0 18 * * *'
|
- cron: '0 18 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
env:
|
||||||
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-trends:
|
update-data:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Code
|
- name: Checkout Code
|
||||||
@@ -23,15 +26,20 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.10'
|
||||||
|
|
||||||
- name: Execute Trends Engine
|
- name: Execute Trends Engine (搜索词库)
|
||||||
run: python scripts/fetch_trends.py
|
run: python scripts/fetch_trends.py
|
||||||
|
|
||||||
- name: Commit and Push
|
- name: Execute Trust URL Engine (活体新闻流融合)
|
||||||
|
run: python scripts/fetch_trust_urls.py
|
||||||
|
|
||||||
|
- name: Commit and Push All Data
|
||||||
run: |
|
run: |
|
||||||
git config --global user.name "github-actions[bot]"
|
git config --global user.name "github-actions[bot]"
|
||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
|
||||||
|
# 一揽子添加搜索词库和地区白名单的变化
|
||||||
git add data/keywords/
|
git add data/keywords/
|
||||||
|
git add data/regions/
|
||||||
|
|
||||||
# 防御机制:如果没有新数据,就静默退出,不产生空提交
|
# 防御机制:如果没有新数据,就静默退出,不产生空提交
|
||||||
if git diff --staged --quiet; then
|
if git diff --staged --quiet; then
|
||||||
@@ -39,6 +47,6 @@ jobs:
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 策略:放弃危险的 amend 强制覆盖,采用带日期的标准安全提交
|
# 策略:将两路数据的更新合并为一个原子提交
|
||||||
git commit -m "chore(data): 🤖 自动机兵:刷新全战区热点词库 [$(date +'%Y-%m-%d')]"
|
git commit -m "chore(data): 🤖 自动机兵:同步全战区热点词库与活体新闻流 [$(date +'%Y-%m-%d')]"
|
||||||
git push origin main
|
git push origin main
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -12,6 +12,9 @@
|
|||||||
|
|
||||||
## ✨ 核心极客特性 (Core Architecture)
|
## ✨ 核心极客特性 (Core Architecture)
|
||||||
|
|
||||||
|
- 📊 **深海声呐全维探针 (Deep Sea Sonar v4.0)**:内嵌强效正则清洗的 JSON 提取引擎,异步生成情报级 IP 质量战报。聚合 Scamalytics、AbuseIPDB 等五大权威防欺诈库,精准嗅探代理/VPN特征、25端口封堵情况及原生流媒体(Netflix/Disney+/TikTok等)解锁状态,并自带 Google “送中”高危预警与基于 SQLite 的历史污染趋势追踪图谱。
|
||||||
|
- ⚡ **无损高并发引擎 (WAL Concurrency)**:司令部 SQLite 数据库全面激活 `WAL` (Write-Ahead Logging) 模式与毫秒级排队削峰算法。即使您同时对 500 台边缘节点发起全军总攻,也能完美规避 `database is locked` 与 Telegram `429` 频率拦截,实现 100% 战报送达。
|
||||||
|
- 🪶 **抽脂级极简部署 (Zero-Bloat Native)**:全栈剔除 `pip`、`flask` 等臃肿第三方依赖,完全基于 Python3 原生标准库运行。安装底层强制注入 `--no-install-recommends` 防捆绑参数。无论是 128MB 内存的极简 NAT 小鸡,还是 Alpine/Arch Linux 特种系统,均可如丝般顺滑运行。
|
||||||
- 🎛️ **扁平化指挥矩阵 (Flat Command Matrix)**:[v3.6.1 重构] 引入扁平化 L0-L3 四级战区降维视图与双轨身份制。深度定制 Inline Keyboard 逃生舱交互,支持在统一哨兵终端进行原位丝滑重绘 (In-place UI Edit),实现毫秒级模块热启停与日志抓取,彻底告别刷屏烦恼。
|
- 🎛️ **扁平化指挥矩阵 (Flat Command Matrix)**:[v3.6.1 重构] 引入扁平化 L0-L3 四级战区降维视图与双轨身份制。深度定制 Inline Keyboard 逃生舱交互,支持在统一哨兵终端进行原位丝滑重绘 (In-place UI Edit),实现毫秒级模块热启停与日志抓取,彻底告别刷屏烦恼。
|
||||||
- 🔄 **全栈零信任 OTA 引擎 (Zero-Trust OTA Upgrade)**:首创双端物理熔断机制。长官可通过私有中枢,一键向全舰队下发静默热重载指令;更支持**「司令部金蝉脱壳」**,中枢大脑可在此面板自我抛出幽灵进程进行免交互直装覆盖,实现真正的全栈去 SSH 化运维。
|
- 🔄 **全栈零信任 OTA 引擎 (Zero-Trust OTA Upgrade)**:首创双端物理熔断机制。长官可通过私有中枢,一键向全舰队下发静默热重载指令;更支持**「司令部金蝉脱壳」**,中枢大脑可在此面板自我抛出幽灵进程进行免交互直装覆盖,实现真正的全栈去 SSH 化运维。
|
||||||
- 🛡️ **SSOT 溯源与热更新装甲 (Smooth Upgrade Engine)**:全系脚本彻底消灭硬编码,部署时动态抓取云端版本信标。自带状态机嗅探逻辑与防撞甲探测,即使是手动在终端运行安装,也仅需回车瞬间完成配置继承、数据同步与无损换代。
|
- 🛡️ **SSOT 溯源与热更新装甲 (Smooth Upgrade Engine)**:全系脚本彻底消灭硬编码,部署时动态抓取云端版本信标。自带状态机嗅探逻辑与防撞甲探测,即使是手动在终端运行安装,也仅需回车瞬间完成配置继承、数据同步与无损换代。
|
||||||
@@ -32,8 +35,8 @@
|
|||||||
```text
|
```text
|
||||||
📦 IP-Sentinel
|
📦 IP-Sentinel
|
||||||
┣ 📂 .github/workflows/ # 🏭 自动化兵工厂:每月定时触发指纹生成的 CI/CD 流水线
|
┣ 📂 .github/workflows/ # 🏭 自动化兵工厂:每月定时触发指纹生成的 CI/CD 流水线
|
||||||
┣ 📂 master/ # 🧠 司令部:SQLite 存储、TG 监听与 Webhook 调度中心
|
┣ 📂 master/ # 🧠 司令部:SQLite 存储 (含 ip_trend_log 趋势跟踪表)、TG 监听与 Webhook 调度
|
||||||
┣ 📂 core/ # 🛡️ 边缘哨兵:Webhook 被动监听、哈希锚定执行引擎
|
┣ 📂 core/ # 🛡️ 边缘哨兵:Webhook 被动监听、哈希锚定执行引擎 (集成深海声呐探测模块)
|
||||||
┣ 📂 scripts/ # 🐍 兵工厂引擎:基于 Python 的多物理分区 UA 生成器
|
┣ 📂 scripts/ # 🐍 兵工厂引擎:基于 Python 的多物理分区 UA 生成器
|
||||||
┣ 📂 data/ # 🗂️ 全球数据规则库 (动态拓扑)
|
┣ 📂 data/ # 🗂️ 全球数据规则库 (动态拓扑)
|
||||||
┃ ┣ 📜 map.json # 🌍 全球区域大脑 (v3.5.0 大洲战区拓扑)
|
┃ ┣ 📜 map.json # 🌍 全球区域大脑 (v3.5.0 大洲战区拓扑)
|
||||||
@@ -45,6 +48,7 @@
|
|||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 极速部署 (Quick Start)
|
## 🚀 极速部署 (Quick Start)
|
||||||
|
> 🛡️ **跨平台装甲支持**:Debian / Ubuntu / CentOS / RHEL / Alpine Linux / Arch Linux
|
||||||
系统现提供两种接入模式,请根据您的战术需求选择:
|
系统现提供两种接入模式,请根据您的战术需求选择:
|
||||||
|
|
||||||
### 🔹 模式 A:私有独立模式 (全自主、强烈推荐)
|
### 🔹 模式 A:私有独立模式 (全自主、强烈推荐)
|
||||||
@@ -54,12 +58,12 @@
|
|||||||
|
|
||||||
- **部署 Master (中枢大脑)**:找一台 VPS 作为司令部(仅需部署一台),执行:
|
- **部署 Master (中枢大脑)**:找一台 VPS 作为司令部(仅需部署一台),执行:
|
||||||
```bash
|
```bash
|
||||||
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/master/install_master.sh)
|
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) :
|
- 部署 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) :
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh)
|
curl -fsSL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh -o /tmp/ins_agent.sh && sudo bash /tmp/ins_agent.sh
|
||||||
```
|
```
|
||||||
- 激活节点:安装完成后,您的手机会收到一条 #REGISTER# 注册暗号,将其转发给您自己的机器人即可完成编队入库。
|
- 激活节点:安装完成后,您的手机会收到一条 #REGISTER# 注册暗号,将其转发给您自己的机器人即可完成编队入库。
|
||||||
|
|
||||||
@@ -71,7 +75,7 @@ bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/i
|
|||||||
- 部署 Agent:在目标 VPS 上执行以下指令,安装过程中选择官方公共网关,并输入您的 Chat ID:
|
- 部署 Agent:在目标 VPS 上执行以下指令,安装过程中选择官方公共网关,并输入您的 Chat ID:
|
||||||
|
|
||||||
```Bash
|
```Bash
|
||||||
bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh)
|
curl -fsSL https://raw.githubusercontent.com/hotyue/IP-Sentinel/main/core/install.sh -o /tmp/ins_agent.sh && sudo bash /tmp/ins_agent.sh
|
||||||
```
|
```
|
||||||
- 激活节点:同上,将收到的暗号转发给官方机器人即可。
|
- 激活节点:同上,将收到的暗号转发给官方机器人即可。
|
||||||
|
|
||||||
@@ -114,12 +118,17 @@ bash <(curl -sL https://raw.githubusercontent.com/hotyue/IP-Sentinel/legacy/core
|
|||||||
如果你在使用过程中遇到任何疑难杂症,或者想围观大佬们的养护战报,欢迎加入我们的基地:
|
如果你在使用过程中遇到任何疑难杂症,或者想围观大佬们的养护战报,欢迎加入我们的基地:
|
||||||
- Telegram 频道: [@IP_Sentinel_Matrix](https://t.me/IP_Sentinel_Matrix)
|
- Telegram 频道: [@IP_Sentinel_Matrix](https://t.me/IP_Sentinel_Matrix)
|
||||||
|
|
||||||
## 🤝 参与贡献
|
## 🤝 参与贡献 (Contributors)
|
||||||
|
|
||||||
如果你想为项目增加新的节点区域(例如德国、英国、新加坡等),或者提供更丰富的本土化搜索词库,非常欢迎提交 Pull Request!
|
**🌟 感谢以下所有为 IP-Sentinel 添砖加瓦的指挥官们!** 你们的每一次 PR 都在让这艘战舰的全球雷达覆盖得更广。
|
||||||
|
|
||||||
## **v3.0 全球节点贡献规范:**
|
<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!
|
||||||
|
|
||||||
|
**💡 全球节点贡献规范:**
|
||||||
1. 在 `data/regions/国家代码/省州代码/` 目录下新增对应城市的配置 `.json`。
|
1. 在 `data/regions/国家代码/省州代码/` 目录下新增对应城市的配置 `.json`。
|
||||||
2. 在 `data/keywords/` 目录下新增或完善配套国家的词库 `kw_XX.txt`。
|
2. 在 `data/keywords/` 目录下新增或完善配套国家的词库 `kw_XX.txt`。
|
||||||
3. **最重要的一步:** 在 `data/map.json` 中登记你的国家、省州与城市信息。安装脚本将自动读取地图,在全球雷达中点亮你的节点!
|
3. **最重要的一步:** 在 `data/map.json` 中登记你的国家、省州与城市信息。安装脚本将自动读取地图,在全球雷达中点亮你的节点!
|
||||||
|
|||||||
@@ -24,10 +24,6 @@ if [ -z "$NODE_NAME" ]; then
|
|||||||
fi
|
fi
|
||||||
NODE_ALIAS="${NODE_ALIAS:-$NODE_NAME}"
|
NODE_ALIAS="${NODE_ALIAS:-$NODE_NAME}"
|
||||||
|
|
||||||
# --- [重点升级 1: 守护进程防冲突自检] ---
|
|
||||||
if pgrep -f "webhook.py $AGENT_PORT" > /dev/null; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 1. 尝试获取实时公网 IP
|
# 1. 尝试获取实时公网 IP
|
||||||
RAW_IP=$(curl -${IP_PREF:-4} -s -m 5 api.ip.sb/ip | tr -d '[:space:]')
|
RAW_IP=$(curl -${IP_PREF:-4} -s -m 5 api.ip.sb/ip | tr -d '[:space:]')
|
||||||
@@ -50,8 +46,8 @@ if [ -n "$AGENT_IP" ]; then
|
|||||||
|
|
||||||
# 只有当这是第一次运行,或者公网 IP 发生变动时,才发送 Telegram 申请
|
# 只有当这是第一次运行,或者公网 IP 发生变动时,才发送 Telegram 申请
|
||||||
if [ "$AGENT_IP" != "$LAST_IP" ]; then
|
if [ "$AGENT_IP" != "$LAST_IP" ]; then
|
||||||
# [v3.5.2 核心] 携带 6 字段双轨身份发起注册申请 (展示别名,暗号尾部追加 NODE_ALIAS)
|
# [v3.6.0 核心修复] 携带 7 字段身份发起注册申请 (追加 ENABLE_OTA,防止 IP 变动重新注册时丢失 OTA 权限)
|
||||||
REG_MSG="👋 **[边缘节点接入申请]**%0A大区: \`${REGION_CODE}\`%0A节点: \`${NODE_ALIAS}\`%0A地址: \`${AGENT_IP}:${AGENT_PORT}\`%0A%0A⚠️ **安全验证**: 为防止非法节点接入,请长按复制下方代码,并**发送给我**以完成最终授权录入:%0A%0A\`#REGISTER#|${REGION_CODE}|${NODE_NAME}|${AGENT_IP}|${AGENT_PORT}|${NODE_ALIAS}\`"
|
REG_MSG="👋 **[边缘节点接入申请]**%0A大区: \`${REGION_CODE}\`%0A节点: \`${NODE_ALIAS}\`%0A地址: \`${AGENT_IP}:${AGENT_PORT}\`%0A%0A⚠️ **安全验证**: 为防止非法节点接入,请长按复制下方代码,并**发送给我**以完成最终授权录入:%0A%0A\`#REGISTER#|${REGION_CODE}|${NODE_NAME}|${AGENT_IP}|${AGENT_PORT}|${NODE_ALIAS}|${ENABLE_OTA:-false}\`"
|
||||||
|
|
||||||
curl -s -m 5 -X POST "${TG_API_URL}" \
|
curl -s -m 5 -X POST "${TG_API_URL}" \
|
||||||
-d "chat_id=${CHAT_ID}" \
|
-d "chat_id=${CHAT_ID}" \
|
||||||
@@ -65,6 +61,18 @@ if [ -n "$AGENT_IP" ]; then
|
|||||||
fi
|
fi
|
||||||
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 签名防重放)
|
# 3. 启动轻量级 Python3 Webhook 监听服务 (v3.0.4 动态 HMAC 签名防重放)
|
||||||
cat > "${INSTALL_DIR}/core/webhook.py" << 'EOF'
|
cat > "${INSTALL_DIR}/core/webhook.py" << 'EOF'
|
||||||
import http.server
|
import http.server
|
||||||
@@ -75,7 +83,7 @@ import os
|
|||||||
import html
|
import html
|
||||||
# ================== [v3.0.4 新增密码学与解析依赖] ==================
|
# ================== [v3.0.4 新增密码学与解析依赖] ==================
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
import urllib.request # [修复] 提升至全局作用域,防止局部变量遮蔽
|
import urllib.request
|
||||||
import hmac
|
import hmac
|
||||||
import hashlib
|
import hashlib
|
||||||
import time
|
import time
|
||||||
@@ -83,6 +91,15 @@ import time
|
|||||||
|
|
||||||
PORT = int(sys.argv[1])
|
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 预共享密钥)
|
# 🛡️ 提取全局鉴权 Token (利用 CHAT_ID 作为 PSK 预共享密钥)
|
||||||
AUTH_TOKEN = ""
|
AUTH_TOKEN = ""
|
||||||
if os.path.exists('/opt/ip_sentinel/config.conf'):
|
if os.path.exists('/opt/ip_sentinel/config.conf'):
|
||||||
@@ -112,8 +129,9 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
return
|
return
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
current_time = int(time.time())
|
||||||
# 校验 2:时间戳防重放 (误差 ±60秒 内有效,拒绝隔夜抓包重放)
|
# 校验 2:时间戳防重放 (误差 ±60秒 内有效,拒绝隔夜抓包重放)
|
||||||
if abs(int(time.time()) - int(req_t)) > 60:
|
if abs(current_time - int(req_t)) > 60:
|
||||||
self.send_response(401)
|
self.send_response(401)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"401 Unauthorized: Request Expired\n")
|
self.wfile.write(b"401 Unauthorized: Request Expired\n")
|
||||||
@@ -122,6 +140,14 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_response(401)
|
self.send_response(401)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
return
|
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
|
||||||
|
|
||||||
# 校验 3:HMAC 数据完整性与身份合法性校验
|
# 校验 3:HMAC 数据完整性与身份合法性校验
|
||||||
msg = f"{req_path}:{req_t}".encode('utf-8')
|
msg = f"{req_path}:{req_t}".encode('utf-8')
|
||||||
@@ -133,17 +159,20 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"401 Unauthorized: Signature Mismatch\n")
|
self.wfile.write(b"401 Unauthorized: Signature Mismatch\n")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# 鉴权通过,记录该签名至防重放内存池
|
||||||
|
USED_SIGNS[req_sign] = current_time
|
||||||
|
|
||||||
# ================== 路由分发 (恢复为安全的精确匹配) ==================
|
# ================== 路由分发 (恢复为安全的精确匹配) ==================
|
||||||
|
|
||||||
# 路由 0: 全局统筹调度 (处理 /trigger_run 一键全节点维护)
|
# 路由 0: 全局统筹调度
|
||||||
if req_path == '/trigger_run':
|
if req_path == '/trigger_run':
|
||||||
if os.path.exists('/opt/ip_sentinel/core/runner.sh'):
|
if os.path.exists('/opt/ip_sentinel/core/runner.sh'):
|
||||||
self.send_response(200)
|
self.send_response(200)
|
||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"Action Accepted: runner\n")
|
self.wfile.write(b"Action Accepted: runner\n")
|
||||||
subprocess.Popen(['bash', '/opt/ip_sentinel/core/runner.sh'])
|
os.system("nohup bash /opt/ip_sentinel/core/runner.sh >/dev/null 2>&1 &")
|
||||||
else:
|
else:
|
||||||
self.send_response(404)
|
self.send_response(404)
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
@@ -155,7 +184,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"Action Accepted: mod_google\n")
|
self.wfile.write(b"Action Accepted: mod_google\n")
|
||||||
subprocess.Popen(['bash', '/opt/ip_sentinel/core/mod_google.sh'])
|
os.system("nohup bash /opt/ip_sentinel/core/mod_google.sh >/dev/null 2>&1 &")
|
||||||
else:
|
else:
|
||||||
self.send_response(403)
|
self.send_response(403)
|
||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
@@ -169,7 +198,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"Action Accepted: mod_trust\n")
|
self.wfile.write(b"Action Accepted: mod_trust\n")
|
||||||
subprocess.Popen(['bash', '/opt/ip_sentinel/core/mod_trust.sh'])
|
os.system("nohup bash /opt/ip_sentinel/core/mod_trust.sh >/dev/null 2>&1 &")
|
||||||
else:
|
else:
|
||||||
self.send_response(403)
|
self.send_response(403)
|
||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
@@ -182,7 +211,7 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.send_header("Content-type", "text/plain")
|
self.send_header("Content-type", "text/plain")
|
||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"Action Accepted: tg_report\n")
|
self.wfile.write(b"Action Accepted: tg_report\n")
|
||||||
subprocess.Popen(['bash', '/opt/ip_sentinel/core/tg_report.sh'])
|
os.system("nohup bash /opt/ip_sentinel/core/tg_report.sh >/dev/null 2>&1 &")
|
||||||
|
|
||||||
# 路由 4: 抓取并回传实时日志
|
# 路由 4: 抓取并回传实时日志
|
||||||
elif req_path == '/trigger_log':
|
elif req_path == '/trigger_log':
|
||||||
@@ -232,6 +261,18 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Log transmission failed: {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")
|
||||||
|
|
||||||
|
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 终极防御版)
|
# 路由 5: 节点重命名展示别名同步接口 (Base64 终极防御版)
|
||||||
elif req_path == '/trigger_rename':
|
elif req_path == '/trigger_rename':
|
||||||
b64_alias = query.get('b64', [''])[0]
|
b64_alias = query.get('b64', [''])[0]
|
||||||
@@ -374,11 +415,48 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
self.end_headers()
|
self.end_headers()
|
||||||
self.wfile.write(b"Action Accepted: trigger_ota\n")
|
self.wfile.write(b"Action Accepted: trigger_ota\n")
|
||||||
|
|
||||||
# 挂起异步升级进程 (注入 SILENT_OTA 旁路变量跳过所有 read -p 交互)
|
# [修复] 逃逸 Systemd Cgroup,并引入 bash -n 语法树校验防砖机制
|
||||||
# 注意:这里我们写死拉取 dev-v3.6.0 分支的安装脚本进行覆盖测试,未来正式版上线时会改回 main
|
import shutil
|
||||||
repo_url = "https://raw.githubusercontent.com/hotyue/IP-Sentinel/dev-v3.6.0"
|
import base64
|
||||||
ota_cmd = f"export SILENT_OTA='true'; curl -sL {repo_url}/core/install.sh | bash > /opt/ip_sentinel/logs/ota_upgrade.log 2>&1 &"
|
# 动态提取部署时的源地址,废除强制写死 main 分支,保障隔离测试环境
|
||||||
subprocess.Popen(['bash', '-c', ota_cmd])
|
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:
|
except Exception as e:
|
||||||
self.send_response(500)
|
self.send_response(500)
|
||||||
@@ -394,21 +472,49 @@ class AgentHandler(http.server.BaseHTTPRequestHandler):
|
|||||||
|
|
||||||
import socket
|
import socket
|
||||||
# ================== [v3.0.3 变更: 引入多线程模型抵抗 Slowloris 攻击] ==================
|
# ================== [v3.0.3 变更: 引入多线程模型抵抗 Slowloris 攻击] ==================
|
||||||
class ThreadedDualStackServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
class ThreadedServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
||||||
allow_reuse_address = True # 开启端口复用,防止热重启时端口冲突
|
allow_reuse_address = True # 开启端口复用,防止热重启时端口冲突
|
||||||
address_family = socket.AF_INET6 if socket.has_ipv6 else socket.AF_INET
|
|
||||||
|
# [核心修复] 显式关闭 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()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bind_addr = "::" if socket.has_ipv6 else ""
|
# 1. 优先尝试监听双栈/IPv6
|
||||||
with ThreadedDualStackServer((bind_addr, PORT), AgentHandler) as httpd:
|
ThreadedServer.address_family = socket.AF_INET6
|
||||||
httpd.serve_forever()
|
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()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
# ====================================================================================
|
# ====================================================================================
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# --- [重点升级 3: 真正的静默后台启动] ---
|
# --- [重点升级 3: 移交系统级守护进程接管 (阻塞模式)] ---
|
||||||
echo "🚀 [Agent] 正在后台启动 Webhook 监听服务 (端口: $AGENT_PORT)..."
|
echo "🚀 [Agent] 正在启动 Webhook 监听服务 (端口: $AGENT_PORT)..."
|
||||||
nohup python3 "${INSTALL_DIR}/core/webhook.py" "$AGENT_PORT" > /dev/null 2>&1 &
|
exec python3 "${INSTALL_DIR}/core/webhook.py" "$AGENT_PORT"
|
||||||
disown 2>/dev/null || true
|
|
||||||
echo "✅ [Agent] 守护进程启动完毕,可安全关闭终端。"
|
|
||||||
290
core/install.sh
290
core/install.sh
@@ -5,17 +5,27 @@
|
|||||||
# 核心功能: 战区分组菜单、模块按需开启、官方机器人一键配置、版本状态机路由
|
# 核心功能: 战区分组菜单、模块按需开启、官方机器人一键配置、版本状态机路由
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
|
# ==========================================================
|
||||||
|
# 🛑 核心权限防线: 检查是否以 root 权限运行
|
||||||
|
# ==========================================================
|
||||||
|
if [ "$EUID" -ne 0 ]; then
|
||||||
|
echo -e "\033[31m❌ 权限被拒绝: 部署 IP-Sentinel 需要最高系统权限。\033[0m"
|
||||||
|
echo -e "💡 请切换到 root 用户 (执行 su root 或 sudo -i) 后重新运行指令。"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# 你的 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/main"
|
||||||
# 临时改为开发地址用于测试
|
# 临时改为开发地址用于测试
|
||||||
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/dev-v3.6.0"
|
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
|
||||||
INSTALL_DIR="/opt/ip_sentinel"
|
INSTALL_DIR="/opt/ip_sentinel"
|
||||||
CONFIG_FILE="${INSTALL_DIR}/config.conf"
|
CONFIG_FILE="${INSTALL_DIR}/config.conf"
|
||||||
|
|
||||||
# [核心: 动态提取 Agent 专属版本锚点 (KV 解析法)]
|
# [核心: 动态提取 Agent 专属版本锚点 (KV 解析法)]
|
||||||
TARGET_VERSION=$(curl -s -m 3 "${REPO_RAW_URL}/version.txt" | grep "^AGENT_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
|
# [修复] 增加 -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 "^AGENT_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
|
||||||
# 🛡️ 兜底防线:如果网络波动拉取失败,启用内置的安全兜底版本
|
# 🛡️ 兜底防线:如果网络波动拉取失败,启用内置的安全兜底版本
|
||||||
TARGET_VERSION=${TARGET_VERSION:-"3.5.1"}
|
TARGET_VERSION=${TARGET_VERSION:-"4.0.0"}
|
||||||
|
|
||||||
# 轻量级版本号比对函数 (例如: version_lt "3.3.1" "3.4.0" 返回 true)
|
# 轻量级版本号比对函数 (例如: version_lt "3.3.1" "3.4.0" 返回 true)
|
||||||
version_lt() {
|
version_lt() {
|
||||||
@@ -26,7 +36,7 @@ version_lt() {
|
|||||||
echo -e "\n[1/7] 正在探测并安装基础环境依赖 (curl, jq, cron, procps, python3)..."
|
echo -e "\n[1/7] 正在探测并安装基础环境依赖 (curl, jq, cron, procps, python3)..."
|
||||||
|
|
||||||
# 定义必须检测的核心命令
|
# 定义必须检测的核心命令
|
||||||
REQUIRED_CMDS=("curl" "jq" "crontab" "pgrep" "python3")
|
REQUIRED_CMDS=("curl" "jq" "crontab" "pgrep" "python3" "openssl")
|
||||||
MISSING_CMDS=()
|
MISSING_CMDS=()
|
||||||
|
|
||||||
# 基础探测:预检查缺失的命令
|
# 基础探测:预检查缺失的命令
|
||||||
@@ -44,40 +54,45 @@ if [ ${#MISSING_CMDS[@]} -gt 0 ]; then
|
|||||||
if command -v apt-get >/dev/null 2>&1; then
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
# Debian / Ubuntu 系列
|
# Debian / Ubuntu 系列
|
||||||
apt-get update -y >/dev/null 2>&1
|
apt-get update -y >/dev/null 2>&1
|
||||||
apt-get install -y curl jq cron procps python3 >/dev/null 2>&1
|
# [v3.6.3 抽脂级优化] 注入 --no-install-recommends 拒绝捆绑销售,大幅节省磁盘与内存
|
||||||
|
apt-get install -y --no-install-recommends curl jq cron procps python3 openssl >/dev/null 2>&1
|
||||||
systemctl enable cron >/dev/null 2>&1 && systemctl start cron >/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
|
elif command -v yum >/dev/null 2>&1 || command -v dnf >/dev/null 2>&1; then
|
||||||
# RHEL / CentOS / AlmaLinux 系列
|
# RHEL / CentOS / AlmaLinux 系列
|
||||||
PKG_MGR="yum"
|
PKG_MGR="yum"
|
||||||
command -v dnf >/dev/null 2>&1 && PKG_MGR="dnf"
|
OPT_ARGS=""
|
||||||
$PKG_MGR install -y curl jq cronie procps-ng python3 >/dev/null 2>&1
|
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 cronie procps-ng python3 openssl >/dev/null 2>&1
|
||||||
systemctl enable crond >/dev/null 2>&1 && systemctl start crond >/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
|
elif command -v apk >/dev/null 2>&1; then
|
||||||
# [核心修复 Issue #21] Alpine Linux 系列
|
# Alpine 本身就是极致精简,无需特殊参数
|
||||||
echo "Alpine 探测到系统类型为 Alpine Linux,正在执行轻量级安装..."
|
echo "Alpine 探测到系统类型为 Alpine Linux,正在执行轻量级安装..."
|
||||||
apk add --no-cache curl jq dcron procps python3 bash >/dev/null 2>&1
|
# [修复] 新版 Alpine 已废弃 dcron。优先尝试 cronie,若失败则信任自带 busybox-cron,并移除屏蔽以便暴露报错
|
||||||
# Alpine 下必须手动创建 cron spool 目录并启动 crond
|
apk add --no-cache curl jq cronie procps python3 bash openssl || apk add --no-cache curl jq procps python3 bash openssl
|
||||||
mkdir -p /var/spool/cron/crontabs
|
mkdir -p /var/spool/cron/crontabs
|
||||||
rc-update add crond default >/dev/null 2>&1
|
rc-update add crond default >/dev/null 2>&1
|
||||||
service crond start >/dev/null 2>&1
|
service crond start >/dev/null 2>&1
|
||||||
|
|
||||||
elif command -v pacman >/dev/null 2>&1; then
|
elif command -v pacman >/dev/null 2>&1; then
|
||||||
# [核心修复 Issue #250] Arch Linux 系列
|
# Arch Linux 系列
|
||||||
pacman -Sy --noconfirm curl jq cronie procps-ng python >/dev/null 2>&1
|
pacman -Sy --noconfirm curl jq cronie procps-ng python openssl >/dev/null 2>&1
|
||||||
# Arch 下某些 cronie 实现可能缺少 /root/.cache 权限,做个兼容保障
|
|
||||||
mkdir -p /root/.cache/crontab 2>/dev/null
|
mkdir -p /root/.cache/crontab 2>/dev/null
|
||||||
systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1
|
systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1
|
||||||
|
|
||||||
else
|
else
|
||||||
# 无法识别的系统:退出并给出清晰的引导信息
|
# 无法识别的系统:退出并给出清晰的引导信息 (同步更新防捆绑参数)
|
||||||
echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m"
|
echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m"
|
||||||
echo -e "\033[33m⚠️ 请根据您的操作系统,手动执行以下安装命令后重新运行本脚本:\033[0m"
|
echo -e "\033[33m⚠️ 请根据您的操作系统,手动执行以下安装命令后重新运行本脚本:\033[0m"
|
||||||
echo -e " Debian/Ubuntu: \033[36mapt-get update && apt-get install -y curl jq cron procps python3\033[0m"
|
echo -e " Debian/Ubuntu: \033[36mapt-get update && apt-get install -y --no-install-recommends curl jq cron procps python3 openssl\033[0m"
|
||||||
echo -e " CentOS/RHEL: \033[36myum install -y curl jq cronie procps-ng python3\033[0m"
|
echo -e " CentOS/RHEL: \033[36myum install -y curl jq cronie procps-ng python3 openssl\033[0m"
|
||||||
echo -e " Alpine Linux: \033[36mapk add --no-cache curl jq dcron procps python3 bash\033[0m"
|
echo -e " Alpine Linux: \033[36mapk add --no-cache curl jq cronie procps python3 bash openssl\033[0m"
|
||||||
echo -e " Arch Linux: \033[36mpacman -Sy curl jq cronie procps-ng python\033[0m"
|
echo -e " Arch Linux: \033[36mpacman -Sy curl jq cronie procps-ng python openssl\033[0m"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -155,6 +170,11 @@ fi
|
|||||||
|
|
||||||
# ================== [v3.1.1/v3.2.2 优化: 安装前环境纯净度清理] ==================
|
# ================== [v3.1.1/v3.2.2 优化: 安装前环境纯净度清理] ==================
|
||||||
echo -e "\n⏳ 正在清理旧版守护进程与冗余任务..."
|
echo -e "\n⏳ 正在清理旧版守护进程与冗余任务..."
|
||||||
|
# [新增] 优雅停止 Systemd 服务,防止代码替换时引发无限复活风暴
|
||||||
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
|
systemctl stop ip-sentinel-runner.timer ip-sentinel-updater.timer ip-sentinel-report.timer ip-sentinel-agent-daemon.service >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
|
|
||||||
# 1. 强制超度可能存活的 Webhook 及各类看门狗进程,释放端口
|
# 1. 强制超度可能存活的 Webhook 及各类看门狗进程,释放端口
|
||||||
pkill -9 -f "webhook.py" >/dev/null 2>&1 || true
|
pkill -9 -f "webhook.py" >/dev/null 2>&1 || true
|
||||||
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1 || true
|
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1 || true
|
||||||
@@ -167,8 +187,7 @@ rm -f /tmp/cron_clean
|
|||||||
|
|
||||||
# 3. 抹除旧版核心代码,杜绝代码冲突 (根据模式分流)
|
# 3. 抹除旧版核心代码,杜绝代码冲突 (根据模式分流)
|
||||||
if [ "$UPGRADE_MODE" == "true" ]; then
|
if [ "$UPGRADE_MODE" == "true" ]; then
|
||||||
# 升级模式:仅销毁核心引擎,严格保留 config 与 data
|
# [修复] 升级模式:不再提前销毁核心引擎,改为后续下载成功后的原子化替换,彻底防止断网变砖!
|
||||||
rm -rf "${INSTALL_DIR}/core" 2>/dev/null
|
|
||||||
if [ "$KEEP_LOGS" == "false" ]; then
|
if [ "$KEEP_LOGS" == "false" ]; then
|
||||||
rm -rf "${INSTALL_DIR}/logs" 2>/dev/null
|
rm -rf "${INSTALL_DIR}/logs" 2>/dev/null
|
||||||
echo -e "🗑️ 历史日志已按指令清空。"
|
echo -e "🗑️ 历史日志已按指令清空。"
|
||||||
@@ -249,15 +268,17 @@ if [ "$UPGRADE_MODE" == "false" ]; then
|
|||||||
IFS="|" read -r CITY_ID CITY_NAME < /tmp/cities.txt
|
IFS="|" read -r CITY_ID CITY_NAME < /tmp/cities.txt
|
||||||
echo -e "\033[32m💡 该区域下仅有单一城市 [$CITY_NAME],已自动锁定。\033[0m"
|
echo -e "\033[32m💡 该区域下仅有单一城市 [$CITY_NAME],已自动锁定。\033[0m"
|
||||||
else
|
else
|
||||||
i=1; CITY_MAP=()
|
i=1; CITY_MAP=(); CITY_NAME_MAP=()
|
||||||
while IFS="|" read -r c_id c_name; do
|
while IFS="|" read -r c_id c_name; do
|
||||||
echo " $i) $c_name"
|
echo " $i) $c_name"
|
||||||
CITY_MAP[$i]="$c_id"
|
CITY_MAP[$i]="$c_id"
|
||||||
|
CITY_NAME_MAP[$i]="$c_name"
|
||||||
((i++))
|
((i++))
|
||||||
done < /tmp/cities.txt
|
done < /tmp/cities.txt
|
||||||
read -p "请输入选择 [1-$((i-1))] (默认1): " CI_SEL
|
read -p "请输入选择 [1-$((i-1))] (默认1): " CI_SEL
|
||||||
CI_SEL=${CI_SEL:-1}
|
CI_SEL=${CI_SEL:-1}
|
||||||
CITY_ID="${CITY_MAP[$CI_SEL]}"
|
CITY_ID="${CITY_MAP[$CI_SEL]}"
|
||||||
|
CITY_NAME="${CITY_NAME_MAP[$CI_SEL]}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 清理临时文件 (增加清理 continents.txt)
|
# 清理临时文件 (增加清理 continents.txt)
|
||||||
@@ -589,70 +610,180 @@ if [ "$UPGRADE_MODE" == "true" ]; then
|
|||||||
fi
|
fi
|
||||||
# ========================================================================
|
# ========================================================================
|
||||||
|
|
||||||
# 6. 拉取全套组件 (按需下载,绝不浪费空间)
|
# 6. 拉取全套组件 (原子化升级,防断网变砖)
|
||||||
echo -e "\n[6/7] 正在根据模块开关部署核心引擎与热数据..."
|
echo -e "\n[6/7] 正在部署核心引擎与热数据..."
|
||||||
# 确保目录在升级模式下也能被正确建立
|
|
||||||
mkdir -p "${INSTALL_DIR}/core"
|
|
||||||
mkdir -p "${INSTALL_DIR}/data/keywords"
|
mkdir -p "${INSTALL_DIR}/data/keywords"
|
||||||
|
|
||||||
# 基础公共组件
|
# [核心修复] 开辟临时下载区,确保下载 100% 成功后再替换旧核心
|
||||||
curl -sL "${REPO_RAW_URL}/core/runner.sh" -o "${INSTALL_DIR}/core/runner.sh"
|
TMP_CORE="/tmp/ip_sentinel_core_$$"
|
||||||
curl -sL "${REPO_RAW_URL}/core/updater.sh" -o "${INSTALL_DIR}/core/updater.sh"
|
mkdir -p "$TMP_CORE"
|
||||||
curl -sL "${REPO_RAW_URL}/core/tg_report.sh" -o "${INSTALL_DIR}/core/tg_report.sh"
|
|
||||||
curl -sL "${REPO_RAW_URL}/core/agent_daemon.sh" -o "${INSTALL_DIR}/core/agent_daemon.sh"
|
|
||||||
curl -sL "${REPO_RAW_URL}/core/uninstall.sh" -o "${INSTALL_DIR}/core/uninstall.sh"
|
|
||||||
curl -sL "${REPO_RAW_URL}/data/user_agents.txt" -o "${INSTALL_DIR}/data/user_agents.txt"
|
|
||||||
|
|
||||||
# 动态按需组件
|
# 拉取核心代码至临时区
|
||||||
if [ "$ENABLE_GOOGLE" == "true" ]; then
|
curl -sL "${REPO_RAW_URL}/core/runner.sh" -o "${TMP_CORE}/runner.sh"
|
||||||
curl -sL "${REPO_RAW_URL}/core/mod_google.sh" -o "${INSTALL_DIR}/core/mod_google.sh"
|
curl -sL "${REPO_RAW_URL}/core/updater.sh" -o "${TMP_CORE}/updater.sh"
|
||||||
# [v3.2.2 修复] 动态匹配词库下载逻辑
|
curl -sL "${REPO_RAW_URL}/core/tg_report.sh" -o "${TMP_CORE}/tg_report.sh"
|
||||||
if [ "$UPGRADE_MODE" == "false" ]; then
|
curl -sL "${REPO_RAW_URL}/core/agent_daemon.sh" -o "${TMP_CORE}/agent_daemon.sh"
|
||||||
curl -sL "${REPO_RAW_URL}/data/keywords/${KEYWORD_FILE}" -o "${INSTALL_DIR}/data/keywords/${KEYWORD_FILE}"
|
curl -sL "${REPO_RAW_URL}/core/uninstall.sh" -o "${TMP_CORE}/uninstall.sh"
|
||||||
else
|
curl -sL "${REPO_RAW_URL}/core/mod_google.sh" -o "${TMP_CORE}/mod_google.sh"
|
||||||
# 升级模式:利用已有的 REGION_CODE 更新通用词库
|
curl -sL "${REPO_RAW_URL}/core/mod_trust.sh" -o "${TMP_CORE}/mod_trust.sh"
|
||||||
curl -sL "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "${INSTALL_DIR}/data/keywords/kw_${REGION_CODE}.txt" 2>/dev/null || true
|
curl -sL "${REPO_RAW_URL}/core/mod_quality.sh" -o "${TMP_CORE}/mod_quality.sh"
|
||||||
fi
|
|
||||||
fi
|
# 🛡️ 防砖终极校验:检查关键文件是否真实存在且不为空
|
||||||
|
if [ ! -s "${TMP_CORE}/runner.sh" ] || [ ! -s "${TMP_CORE}/agent_daemon.sh" ]; then
|
||||||
if [ "$ENABLE_TRUST" == "true" ]; then
|
echo -e "\033[31m❌ 致命错误:核心代码拉取失败!网络阻断或 GitHub Raw 异常。\033[0m"
|
||||||
curl -sL "${REPO_RAW_URL}/core/mod_trust.sh" -o "${INSTALL_DIR}/core/mod_trust.sh"
|
echo "🛡️ 防砖机制触发:已中止覆盖,旧版哨兵引擎仍安全存活中。"
|
||||||
|
rm -rf "$TMP_CORE"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 校验完美通过,执行原子化交接
|
||||||
|
rm -rf "${INSTALL_DIR}/core" 2>/dev/null
|
||||||
|
mv "$TMP_CORE" "${INSTALL_DIR}/core"
|
||||||
chmod +x ${INSTALL_DIR}/core/*.sh
|
chmod +x ${INSTALL_DIR}/core/*.sh
|
||||||
|
|
||||||
# 7. 配置系统定时任务 (高频调度与看门狗)
|
# 拉取热数据与词库
|
||||||
echo -e "\n[7/7] 正在注入系统定时任务与看门狗进程..."
|
curl -sL "${REPO_RAW_URL}/data/user_agents.txt" -o "${INSTALL_DIR}/data/user_agents.txt"
|
||||||
crontab -l 2>/dev/null | grep -v "ip_sentinel" > /tmp/cron_backup || true
|
if [ "$UPGRADE_MODE" == "false" ]; then
|
||||||
|
curl -sL "${REPO_RAW_URL}/data/keywords/${KEYWORD_FILE}" -o "${INSTALL_DIR}/data/keywords/${KEYWORD_FILE}"
|
||||||
|
else
|
||||||
|
# 升级模式:利用已有的 REGION_CODE 更新通用词库
|
||||||
|
curl -sL "${REPO_RAW_URL}/data/keywords/kw_${REGION_CODE}.txt" -o "${INSTALL_DIR}/data/keywords/kw_${REGION_CODE}.txt" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
# 核心养护模块: 每 30 分钟触发一次
|
# 7. 配置系统定时任务 (高频调度与看门狗)
|
||||||
echo "*/30 * * * * ${INSTALL_DIR}/core/runner.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
echo -e "\n[7/7] 正在注入系统守护进程与调度器..."
|
||||||
# 养料更新模块: (v3.3.0升级) 每天凌晨 3 点触发,由中枢自动进行分频调度
|
|
||||||
echo "0 3 * * * ${INSTALL_DIR}/core/updater.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
|
||||||
|
|
||||||
# [v3.3.0 新增] 初始化 UA 指纹库更新时间戳,确立 30 天滚动周期的计算锚点
|
# [v3.3.0 新增] 初始化 UA 指纹库更新时间戳,确立 30 天滚动周期的计算锚点
|
||||||
echo $(date +%s) > "${INSTALL_DIR}/core/.ua_last_update"
|
echo $(date +%s) > "${INSTALL_DIR}/core/.ua_last_update"
|
||||||
|
|
||||||
# 如果配置了联控,启动 Webhook 与战报任务
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
|
echo "💡 检测到 Systemd 环境,正在部署原生守护服务..."
|
||||||
# 每天早上 8 点发送昨天的统计战报
|
|
||||||
echo "0 8 * * * ${INSTALL_DIR}/core/tg_report.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
|
||||||
|
|
||||||
# [v3.0.1新增修改 3: 删除原来的 curl 取 IP,直接使用我们上方锁定的 BIND_IP]
|
# 1. Runner 核心养护模块服务与定时器
|
||||||
# 并提前写入 IP 缓存,彻底阻断 agent_daemon 首次启动时的重复推送
|
cat > /etc/systemd/system/ip-sentinel-runner.service << EOF
|
||||||
# [修复竞态]: 提前写入公网 IP 缓存,彻底阻断 agent_daemon 首次启动时的抢跑推送
|
[Unit]
|
||||||
echo "$SAFE_PUBLIC_IP" > "${INSTALL_DIR}/core/.last_ip"
|
Description=IP-Sentinel Runner Service
|
||||||
|
After=network.target
|
||||||
# 双保险守护进程看门狗
|
[Service]
|
||||||
echo "@reboot nohup bash ${INSTALL_DIR}/core/agent_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup
|
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
echo "* * * * * nohup bash ${INSTALL_DIR}/core/agent_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup
|
SyslogIdentifier=ip-sentinel
|
||||||
|
Type=oneshot
|
||||||
# 安装时立刻启动一次边缘守护进程
|
ExecStart=/bin/bash ${INSTALL_DIR}/core/runner.sh
|
||||||
nohup bash "${INSTALL_DIR}/core/agent_daemon.sh" >/dev/null 2>&1 &
|
User=root
|
||||||
fi
|
CPUSchedulingPolicy=idle
|
||||||
|
IOSchedulingClass=idle
|
||||||
|
EOF
|
||||||
|
|
||||||
[ -f /tmp/cron_backup ] && crontab /tmp/cron_backup 2>/dev/null
|
cat > /etc/systemd/system/ip-sentinel-runner.timer << EOF
|
||||||
rm -f /tmp/cron_backup
|
[Unit]
|
||||||
|
Description=Timer for IP-Sentinel Runner Service
|
||||||
|
[Timer]
|
||||||
|
OnActiveSec=10s
|
||||||
|
OnUnitActiveSec=30min
|
||||||
|
RandomizedDelaySec=180
|
||||||
|
Persistent=true
|
||||||
|
Unit=ip-sentinel-runner.service
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 2. Updater 养料更新模块服务与定时器
|
||||||
|
cat > /etc/systemd/system/ip-sentinel-updater.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=IP-Sentinel Updater Service
|
||||||
|
After=network.target
|
||||||
|
[Service]
|
||||||
|
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
SyslogIdentifier=ip-sentinel
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/bin/bash ${INSTALL_DIR}/core/updater.sh
|
||||||
|
User=root
|
||||||
|
CPUSchedulingPolicy=idle
|
||||||
|
IOSchedulingClass=idle
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/ip-sentinel-updater.timer << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Timer for IP-Sentinel Updater Service
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* 03:00:00
|
||||||
|
Persistent=true
|
||||||
|
Unit=ip-sentinel-updater.service
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now ip-sentinel-runner.timer ip-sentinel-updater.timer
|
||||||
|
|
||||||
|
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
|
||||||
|
# 3. TG 战报服务与定时器
|
||||||
|
cat > /etc/systemd/system/ip-sentinel-report.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=IP-Sentinel Telegram Report Service
|
||||||
|
After=network.target
|
||||||
|
[Service]
|
||||||
|
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
SyslogIdentifier=ip-sentinel
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/bin/bash ${INSTALL_DIR}/core/tg_report.sh
|
||||||
|
User=root
|
||||||
|
CPUSchedulingPolicy=idle
|
||||||
|
IOSchedulingClass=idle
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/ip-sentinel-report.timer << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Timer for IP-Sentinel Telegram Report Service
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=*-*-* 08:00:00
|
||||||
|
Unit=ip-sentinel-report.service
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4. [排雷修复] Agent Daemon Webhook 监听守护服务 (Type=simple, 常驻执行)
|
||||||
|
cat > /etc/systemd/system/ip-sentinel-agent-daemon.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=IP-Sentinel Agent Daemon Service
|
||||||
|
After=network.target
|
||||||
|
[Service]
|
||||||
|
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
||||||
|
SyslogIdentifier=ip-sentinel
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/bin/bash ${INSTALL_DIR}/core/agent_daemon.sh
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
User=root
|
||||||
|
CPUSchedulingPolicy=idle
|
||||||
|
IOSchedulingClass=idle
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# [修复竞态]: 提前写入公网 IP 缓存,阻断重复推送
|
||||||
|
echo "$SAFE_PUBLIC_IP" > "${INSTALL_DIR}/core/.last_ip"
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now ip-sentinel-report.timer
|
||||||
|
systemctl enable --now ip-sentinel-agent-daemon.service
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "💡 未检测到 Systemd (可能是 Alpine Linux),回退到 Cron 调度模式..."
|
||||||
|
crontab -l 2>/dev/null | grep -v "ip_sentinel" > /tmp/cron_backup || true
|
||||||
|
echo "*/30 * * * * ${INSTALL_DIR}/core/runner.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
||||||
|
echo "0 3 * * * ${INSTALL_DIR}/core/updater.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
||||||
|
|
||||||
|
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
|
||||||
|
echo "0 8 * * * ${INSTALL_DIR}/core/tg_report.sh >/dev/null 2>&1" >> /tmp/cron_backup
|
||||||
|
echo "$SAFE_PUBLIC_IP" > "${INSTALL_DIR}/core/.last_ip"
|
||||||
|
echo "@reboot nohup bash ${INSTALL_DIR}/core/agent_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup
|
||||||
|
echo "* * * * * nohup bash ${INSTALL_DIR}/core/agent_daemon.sh >/dev/null 2>&1 &" >> /tmp/cron_backup
|
||||||
|
nohup bash "${INSTALL_DIR}/core/agent_daemon.sh" >/dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
[ -f /tmp/cron_backup ] && crontab /tmp/cron_backup 2>/dev/null
|
||||||
|
rm -f /tmp/cron_backup
|
||||||
|
fi
|
||||||
|
|
||||||
# ================== [v3.4.0 核心: 状态机驱动的热更新路由] ==================
|
# ================== [v3.4.0 核心: 状态机驱动的热更新路由] ==================
|
||||||
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
|
if [[ -n "$TG_TOKEN" ]] && [[ -n "$CHAT_ID" ]]; then
|
||||||
@@ -762,12 +893,15 @@ echo "🗑️ 若未来需卸载,可重新运行本脚本选择[2]或执行: b
|
|||||||
echo "========================================================"
|
echo "========================================================"
|
||||||
|
|
||||||
# ================== [v3.1.2 新增: 玻璃房透明装机统计] ==================
|
# ================== [v3.1.2 新增: 玻璃房透明装机统计] ==================
|
||||||
echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名,不收集IP)..."
|
# [修复] 仅在全新部署时触发统计,平滑升级/OTA 时绝对不触发,防止配额耗尽与数据注水
|
||||||
AGENT_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/agent" || echo "")
|
if [ "$UPGRADE_MODE" == "false" ]; then
|
||||||
|
echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名,不收集IP)..."
|
||||||
|
AGENT_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/agent" || echo "")
|
||||||
|
|
||||||
if [ -n "$AGENT_COUNT" ] && [[ "$AGENT_COUNT" =~ ^[0-9]+$ ]]; then
|
if [ -n "$AGENT_COUNT" ] && [[ "$AGENT_COUNT" =~ ^[0-9]+$ ]]; then
|
||||||
echo -e "\033[32m✅ 感谢您成为全球第 ${AGENT_COUNT} 名 IP-Sentinel 哨兵!\033[0m"
|
echo -e "\033[32m✅ 感谢您成为全球第 ${AGENT_COUNT} 名 IP-Sentinel 哨兵!\033[0m"
|
||||||
else
|
else
|
||||||
echo -e "\033[32m✅ 感谢您加入 IP-Sentinel 哨兵阵列!\033[0m"
|
echo -e "\033[32m✅ 感谢您加入 IP-Sentinel 哨兵阵列!\033[0m"
|
||||||
|
fi
|
||||||
|
echo -e "\n"
|
||||||
fi
|
fi
|
||||||
echo -e "\n"
|
|
||||||
@@ -22,9 +22,20 @@ if ! type log >/dev/null 2>&1; then
|
|||||||
# [v3.4.0 核心] 提取当前配置中的版本锚点
|
# [v3.4.0 核心] 提取当前配置中的版本锚点
|
||||||
local local_ver="${AGENT_VERSION:-未知}"
|
local local_ver="${AGENT_VERSION:-未知}"
|
||||||
|
|
||||||
|
# 保证日志目录存在
|
||||||
mkdir -p "${INSTALL_DIR}/logs"
|
mkdir -p "${INSTALL_DIR}/logs"
|
||||||
# 统一日志格式,注入 [版本号] 追踪标识
|
|
||||||
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [v%-5s] [%-5s] [%-7s] [%s] %s\n" "$local_ver" "$2" "$1" "$REGION_CODE" "$3" >> "${INSTALL_DIR}/logs/sentinel.log"
|
# 日志格式注入 [版本号] 追踪标识
|
||||||
|
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$2" "$1" "$REGION_CODE" "$3")
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $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
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -97,14 +108,21 @@ CURL_BIND_OPT=""
|
|||||||
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
|
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
|
||||||
|
|
||||||
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
||||||
CURL_BIND_OPT="--interface $BIND_IP"
|
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
|
||||||
# 智能探测:带冒号为 V6,带点号为 V4
|
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
|
||||||
if [[ "$BIND_IP" == *":"* ]]; then
|
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
|
||||||
DYNAMIC_IP_PREF="-6"
|
log "$MODULE_NAME" "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
|
||||||
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
|
CURL_BIND_OPT=""
|
||||||
elif [[ "$BIND_IP" == *"."* ]]; then
|
else
|
||||||
DYNAMIC_IP_PREF="-4"
|
CURL_BIND_OPT="--interface $BIND_IP"
|
||||||
log "$MODULE_NAME" "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($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
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
139
core/mod_quality.sh
Executable file
139
core/mod_quality.sh
Executable file
@@ -0,0 +1,139 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ==========================================================
|
||||||
|
# IP-Sentinel: 深海声呐 (IP 质量全维异步检测模块 v4.0.0)
|
||||||
|
# ==========================================================
|
||||||
|
|
||||||
|
source /opt/ip_sentinel/config.conf
|
||||||
|
|
||||||
|
TARGET_IP=$(echo "${BIND_IP:-$PUBLIC_IP}" | tr -d '[]')
|
||||||
|
IP_PROTO="${IP_PREF:-4}"
|
||||||
|
|
||||||
|
# 1. 静默拉取原始数据 (消除短链接 RCE 劫持风险,收编为本地固化执行)
|
||||||
|
PROBE_SCRIPT="/opt/ip_sentinel/core/ip_probe.sh"
|
||||||
|
if [ ! -x "$PROBE_SCRIPT" ]; then
|
||||||
|
# 若本地探针尚未就绪,直接从 GitHub 官方主干拉取底层源码,绕过未知域名
|
||||||
|
curl -sL "https://raw.githubusercontent.com/xykt/IPQuality/main/ip.sh" -o "$PROBE_SCRIPT" 2>/dev/null
|
||||||
|
chmod +x "$PROBE_SCRIPT" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 采用本地执行,彻底封死运行时的外部投毒通道
|
||||||
|
RAW_OUTPUT=$(timeout 180 bash "$PROBE_SCRIPT" -y -j -${IP_PROTO} -i "${TARGET_IP}" 2>/dev/null)
|
||||||
|
|
||||||
|
# 2. 极致截取 JSON (无视开头的赞助商广告与不可见字符,精准提取)
|
||||||
|
JSON_DATA="{${RAW_OUTPUT#*\{}"
|
||||||
|
|
||||||
|
# 2. 提取基础物理定位与身份特征 (兼作合法性校验)
|
||||||
|
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
|
||||||
|
|
||||||
|
[ -z "$IP_ADDR" ] && IP_ADDR="$PUBLIC_IP"
|
||||||
|
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)
|
||||||
|
|
||||||
|
# 代理/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" == *"失败"* ]]; then
|
||||||
|
echo "🔴 屏蔽"
|
||||||
|
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=""
|
||||||
|
if [[ "$RAW_YT_REG" == *"[CN]"* ]] || [[ "$RAW_YT_STAT" == *"China"* ]]; then
|
||||||
|
WARNING_MSG="%0A🚨 **[高危] 该节点已被 Google 判定为中国大陆 (送中)!**%0A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. 组装情报级 Markdown 战报
|
||||||
|
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\`
|
||||||
|
• **IPQuality:** \`${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/${TARGET_IP})_
|
||||||
|
|
||||||
|
\`[SYSTEM_REPORT]|QUALITY|${NODE_NAME}|${SCAM_SCORE}|${RAW_NF_STAT}\`"
|
||||||
|
|
||||||
|
# 8. 直送指挥部
|
||||||
|
curl -s -X POST "${TG_API_URL}" \
|
||||||
|
-d "chat_id=${CHAT_ID}" \
|
||||||
|
-d "parse_mode=Markdown" \
|
||||||
|
-d "disable_web_page_preview=true" \
|
||||||
|
-d "text=${REPORT}" >/dev/null
|
||||||
@@ -11,7 +11,7 @@ UA_FILE="${INSTALL_DIR}/data/user_agents.txt"
|
|||||||
# 你的 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/main"
|
||||||
# 临时改为私库地址用于测试
|
# 临时改为私库地址用于测试
|
||||||
# REPO_RAW_URL="https://git.94211762.xyz/hotyue/IP-Sentinel/raw/branch/main"
|
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
|
||||||
|
|
||||||
# 1. 基础环境校验
|
# 1. 基础环境校验
|
||||||
[ ! -f "$CONFIG_FILE" ] && exit 1
|
[ ! -f "$CONFIG_FILE" ] && exit 1
|
||||||
@@ -99,14 +99,21 @@ CURL_BIND_OPT=""
|
|||||||
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
|
DYNAMIC_IP_PREF="-${IP_PREF:-4}" # 默认提取用户配置
|
||||||
|
|
||||||
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
||||||
CURL_BIND_OPT="--interface $BIND_IP"
|
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
|
||||||
# 智能探测:带冒号为 V6,带点号为 V4
|
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
|
||||||
if [[ "$BIND_IP" == *":"* ]]; then
|
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
|
||||||
DYNAMIC_IP_PREF="-6"
|
log_msg "WARN " "检测到配置的出口 IP ($RAW_BIND_IP) 已丢失,自动降级为系统默认路由出网!"
|
||||||
log_msg "INFO " "底层路由锁定: 绑定 IPv6 出口及协议 ($BIND_IP)"
|
CURL_BIND_OPT=""
|
||||||
elif [[ "$BIND_IP" == *"."* ]]; then
|
else
|
||||||
DYNAMIC_IP_PREF="-4"
|
CURL_BIND_OPT="--interface $BIND_IP"
|
||||||
log_msg "INFO " "底层路由锁定: 绑定 IPv4 出口及协议 ($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
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -33,8 +33,18 @@ log() {
|
|||||||
|
|
||||||
# 保证日志目录存在
|
# 保证日志目录存在
|
||||||
mkdir -p "${INSTALL_DIR}/logs"
|
mkdir -p "${INSTALL_DIR}/logs"
|
||||||
|
|
||||||
# 日志格式注入 [版本号] 追踪标识
|
# 日志格式注入 [版本号] 追踪标识
|
||||||
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [v%-5s] [%-5s] [%-7s] [%s] %s\n" "$local_ver" "$level" "$module" "$REGION_CODE" "$msg" >> "$LOG_FILE"
|
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$level" "$module" "$REGION_CODE" "$msg")
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $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
|
||||||
}
|
}
|
||||||
export -f log
|
export -f log
|
||||||
export CONFIG_FILE INSTALL_DIR
|
export CONFIG_FILE INSTALL_DIR
|
||||||
@@ -81,7 +91,8 @@ fi
|
|||||||
if [ -n "$TARGET_MOD" ] && [ -x "${INSTALL_DIR}/core/${TARGET_MOD}" ]; then
|
if [ -n "$TARGET_MOD" ] && [ -x "${INSTALL_DIR}/core/${TARGET_MOD}" ]; then
|
||||||
log "SYSTEM" "INFO" "命中触发条件,加载并执行子模块: ${MOD_NAME}"
|
log "SYSTEM" "INFO" "命中触发条件,加载并执行子模块: ${MOD_NAME}"
|
||||||
# 核心降耗逻辑:使用 nice -n 19 赋予进程最低 CPU 优先级,绝不抢占 VPS 正常业务的资源
|
# 核心降耗逻辑:使用 nice -n 19 赋予进程最低 CPU 优先级,绝不抢占 VPS 正常业务的资源
|
||||||
nice -n 19 bash "${INSTALL_DIR}/core/${TARGET_MOD}"
|
# [安全修复] 注入 200>&-,强行关闭子进程对排他锁的继承权!防止子进程假死导致全局死锁
|
||||||
|
nice -n 19 bash "${INSTALL_DIR}/core/${TARGET_MOD}" 200>&-
|
||||||
else
|
else
|
||||||
log "SYSTEM" "ERROR" "配置了模块 ${MOD_NAME},但未找到对应的可执行脚本: ${TARGET_MOD}"
|
log "SYSTEM" "ERROR" "配置了模块 ${MOD_NAME},但未找到对应的可执行脚本: ${TARGET_MOD}"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -31,11 +31,17 @@ CURL_BIND_OPT=""
|
|||||||
DYNAMIC_IP_PREF="-${IP_PREF:-4}"
|
DYNAMIC_IP_PREF="-${IP_PREF:-4}"
|
||||||
|
|
||||||
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
if [[ -n "$BIND_IP" && "$BIND_IP" =~ ^[0-9a-fA-F:\.]+$ ]]; then
|
||||||
CURL_BIND_OPT="--interface $BIND_IP"
|
# [v3.6.3 容错层补丁] 探测物理网卡/虚拟 IP 存活状态
|
||||||
if [[ "$BIND_IP" == *":"* ]]; then
|
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
|
||||||
DYNAMIC_IP_PREF="-6"
|
if ! ip addr show 2>/dev/null | grep -qw "$RAW_BIND_IP"; then
|
||||||
elif [[ "$BIND_IP" == *"."* ]]; then
|
CURL_BIND_OPT=""
|
||||||
DYNAMIC_IP_PREF="-4"
|
else
|
||||||
|
CURL_BIND_OPT="--interface $BIND_IP"
|
||||||
|
if [[ "$BIND_IP" == *":"* ]]; then
|
||||||
|
DYNAMIC_IP_PREF="-6"
|
||||||
|
elif [[ "$BIND_IP" == *"."* ]]; then
|
||||||
|
DYNAMIC_IP_PREF="-4"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -86,6 +92,7 @@ case "$REGION_CODE" in
|
|||||||
"SG") FLAG="🇸🇬" ;;
|
"SG") FLAG="🇸🇬" ;;
|
||||||
"HK") FLAG="🇭🇰" ;;
|
"HK") FLAG="🇭🇰" ;;
|
||||||
"GB"|"UK") FLAG="🇬🇧" ;;
|
"GB"|"UK") FLAG="🇬🇧" ;;
|
||||||
|
"AU") FLAG="🇦🇺" ;;
|
||||||
*) FLAG="🌐" ;;
|
*) FLAG="🌐" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# ==========================================================
|
|
||||||
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 - 动态锚点版)
|
# 脚本名称: uninstall.sh (IP-Sentinel 一键卸载脚本 - 动态锚点版)
|
||||||
# 核心功能: 无痕清理守护进程、定时任务、运行目录及临时缓存
|
# 核心功能: 无痕清理守护进程、定时任务、运行目录及临时缓存
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
|
# ==========================================================
|
||||||
|
# 🛑 核心权限防线: 检查是否以 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"
|
INSTALL_DIR="/opt/ip_sentinel"
|
||||||
|
|
||||||
echo "========================================================"
|
echo "========================================================"
|
||||||
@@ -18,13 +26,31 @@ if [ -f "$CONFIG_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
echo "========================================================"
|
echo "========================================================"
|
||||||
|
|
||||||
# 1. 停止运行中的守护进程与主控模块 (涵盖所有历史版本进程)
|
# 1. 停止并删除 Systemd 服务 (适配新架构)
|
||||||
echo "[1/3] 正在终止后台守护进程与所有养护任务..."
|
echo "[1/4] 正在停止并删除 Systemd 服务..."
|
||||||
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
|
echo "💡 检测到 Systemd 环境,正在抹除 Systemd 服务单元..."
|
||||||
|
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
|
||||||
|
|
||||||
# 使用 pkill 替代传统的 pgrep | xargs,指令更短、容错率更高
|
# 2. 停止运行中的守护进程与主控模块 (兜底清理老版进程)
|
||||||
|
echo "[2/4] 正在终止后台守护进程与所有养护任务..."
|
||||||
pkill -9 -f "tg_daemon.sh" >/dev/null 2>&1
|
pkill -9 -f "tg_daemon.sh" >/dev/null 2>&1
|
||||||
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1
|
pkill -9 -f "agent_daemon.sh" >/dev/null 2>&1
|
||||||
# [v3.4.0 优化] 确保清理所有 python3 调起的 Webhook 实例
|
|
||||||
pkill -9 -f "python3.*webhook.py" >/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 "webhook.py" >/dev/null 2>&1
|
||||||
pkill -9 -f "runner.sh" >/dev/null 2>&1
|
pkill -9 -f "runner.sh" >/dev/null 2>&1
|
||||||
@@ -33,16 +59,16 @@ pkill -9 -f "tg_report.sh" >/dev/null 2>&1
|
|||||||
pkill -9 -f "mod_google.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 "mod_trust.sh" >/dev/null 2>&1
|
||||||
|
|
||||||
# 2. 清除系统定时任务 (Cron)
|
# 3. 清除系统定时任务 (Cron)
|
||||||
echo "[2/3] 正在清理系统定时任务 (Cron)..."
|
echo "[3/4] 正在清理系统定时任务 (Cron)..."
|
||||||
if crontab -l >/dev/null 2>&1; then
|
if crontab -l >/dev/null 2>&1; then
|
||||||
crontab -l | grep -v "ip_sentinel" > /tmp/cron_backup
|
crontab -l | grep -v "ip_sentinel" > /tmp/cron_backup
|
||||||
crontab /tmp/cron_backup
|
crontab /tmp/cron_backup
|
||||||
rm -f /tmp/cron_backup
|
rm -f /tmp/cron_backup
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. 删除所有文件、日志与临时缓存
|
# 4. 删除所有文件、日志与临时缓存
|
||||||
echo "[3/3] 正在抹除核心程序、配置文件与系统痕迹..."
|
echo "[4/4] 正在抹除核心程序、配置文件与系统痕迹..."
|
||||||
if [ -d "$INSTALL_DIR" ]; then
|
if [ -d "$INSTALL_DIR" ]; then
|
||||||
rm -rf "$INSTALL_DIR"
|
rm -rf "$INSTALL_DIR"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ 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/main"
|
||||||
# 临时改为开发地址用于测试
|
# 临时改为开发地址用于测试
|
||||||
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/dev-v3.6.0"
|
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
|
||||||
|
|
||||||
# 1. 加载本地冷数据配置
|
# 1. 加载本地冷数据配置
|
||||||
if [ ! -f "$CONFIG_FILE" ]; then
|
if [ ! -f "$CONFIG_FILE" ]; then
|
||||||
@@ -25,9 +25,20 @@ log() {
|
|||||||
# [v3.4.0 核心] 提取当前配置中的版本锚点
|
# [v3.4.0 核心] 提取当前配置中的版本锚点
|
||||||
local local_ver="${AGENT_VERSION:-未知}"
|
local local_ver="${AGENT_VERSION:-未知}"
|
||||||
|
|
||||||
|
# 保证日志目录存在
|
||||||
mkdir -p "${INSTALL_DIR}/logs"
|
mkdir -p "${INSTALL_DIR}/logs"
|
||||||
|
|
||||||
# 日志格式注入 [版本号] 追踪标识
|
# 日志格式注入 [版本号] 追踪标识
|
||||||
printf "[$(date '+%Y-%m-%d %H:%M:%S')] [v%-5s] [%-5s] [%-7s] [%s] %s\n" "$local_ver" "$2" "$1" "$REGION_CODE" "$3" >> "$LOG_FILE"
|
local core_msg=$(printf "[v%-5s] [%-5s] [%-7s] [%s] %s" "$local_ver" "$2" "$1" "$REGION_CODE" "$3")
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $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
|
||||||
}
|
}
|
||||||
|
|
||||||
log "Updater" "INFO " "========== 触发后台静默 OTA 热数据更新 =========="
|
log "Updater" "INFO " "========== 触发后台静默 OTA 热数据更新 =========="
|
||||||
@@ -42,7 +53,12 @@ CURL_CMD="curl -${IP_PREF:-4} -sL"
|
|||||||
if [ -n "$BIND_IP" ]; then
|
if [ -n "$BIND_IP" ]; then
|
||||||
# curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳
|
# curl 的 --interface 参数不支持带方括号的 IPv6 地址,必须强行脱壳
|
||||||
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
|
RAW_BIND_IP=$(echo "$BIND_IP" | tr -d '[]')
|
||||||
CURL_CMD="$CURL_CMD --interface $RAW_BIND_IP"
|
# [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
|
fi
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
@@ -117,6 +133,17 @@ if [ -n "$REGION_JSON_FILE" ] && [ -f "$REGION_JSON_FILE" ]; then
|
|||||||
fi
|
fi
|
||||||
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"
|
||||||
|
if [ -s "$TMP_PROBE" ]; then
|
||||||
|
mv "$TMP_PROBE" "${INSTALL_DIR}/core/ip_probe.sh"
|
||||||
|
chmod +x "${INSTALL_DIR}/core/ip_probe.sh"
|
||||||
|
log "Updater" "INFO " "✅ 深海声呐底层探针 (ip_probe.sh) 源文件安全对齐"
|
||||||
|
fi
|
||||||
|
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
# 6. 日志防满瘦身机制 (保留最近 2000 行)
|
# 6. 日志防满瘦身机制 (保留最近 2000 行)
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|||||||
200
data/keywords/kw_AU.txt
Normal file
200
data/keywords/kw_AU.txt
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
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
|
||||||
|
teams
|
||||||
|
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
|
||||||
|
psl
|
||||||
|
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
|
||||||
|
celtic fc
|
||||||
|
bayern vs vfb stuttgart
|
||||||
|
bom radar
|
||||||
|
sydney weather
|
||||||
|
melbourne weather
|
||||||
|
brisbane weather
|
||||||
|
adelaide weather
|
||||||
|
myGov login
|
||||||
|
news.com.au
|
||||||
|
abc news
|
||||||
|
nrl ladder
|
||||||
|
afl scores
|
||||||
|
afl fixture
|
||||||
|
matildas
|
||||||
|
sam kerr
|
||||||
|
bunnings opening hours
|
||||||
|
coles catalogue
|
||||||
|
woolies specials
|
||||||
|
qantas
|
||||||
|
virgin australia
|
||||||
|
jetstar flights
|
||||||
|
commbank
|
||||||
|
asx 200
|
||||||
|
sydney morning herald
|
||||||
|
the age
|
||||||
|
ticketek
|
||||||
|
ticketmaster
|
||||||
|
opal card top up
|
||||||
|
myki top up
|
||||||
|
translink timetable
|
||||||
|
transperth journey planner
|
||||||
|
adelaide metro
|
||||||
|
adelaide 500
|
||||||
|
adelaide crows
|
||||||
|
port adelaide
|
||||||
|
penrith panthers
|
||||||
|
brisbane broncos
|
||||||
|
collingwood fc
|
||||||
|
sydney swans
|
||||||
|
west coast eagles
|
||||||
|
fremantle dockers
|
||||||
|
canberra raiders
|
||||||
|
mcg events
|
||||||
|
optus stadium
|
||||||
|
the gabba
|
||||||
|
state of origin
|
||||||
|
australian open
|
||||||
|
melbourne cup
|
||||||
|
masterchef australia
|
||||||
|
mafs australia
|
||||||
|
petrol prices near me
|
||||||
|
australia post tracking
|
||||||
|
service nsw login
|
||||||
|
vicroads
|
||||||
|
queensland health
|
||||||
|
medicare
|
||||||
|
ato
|
||||||
|
jb hi-fi
|
||||||
|
kmart
|
||||||
|
amazon.com.au
|
||||||
|
vivid sydney
|
||||||
|
mona hobart
|
||||||
|
dark mofo
|
||||||
|
floriade canberra
|
||||||
|
rottnest island ferry
|
||||||
|
sydney airport arrivals
|
||||||
|
rba interest rate
|
||||||
|
nsw school holidays
|
||||||
|
qld school holidays
|
||||||
|
wa school holidays
|
||||||
|
m4 traffic updates
|
||||||
|
west gate tunnel updates
|
||||||
|
bruce highway traffic
|
||||||
|
taylor swift
|
||||||
|
netflix
|
||||||
|
gemini
|
||||||
|
chatgpt
|
||||||
|
margot robbie
|
||||||
|
oscar piastri
|
||||||
|
formula 1
|
||||||
|
supercars championship
|
||||||
|
ufc
|
||||||
|
optus sport
|
||||||
|
telstra outage
|
||||||
|
kayo sports
|
||||||
|
domain real estate
|
||||||
|
realestate.com.au
|
||||||
|
seek jobs
|
||||||
|
gumtree
|
||||||
|
westpac login
|
||||||
|
anz internet banking
|
||||||
|
nab login
|
||||||
|
aldi catalogue
|
||||||
|
big w
|
||||||
|
target australia
|
||||||
|
the good guys
|
||||||
|
officeworks
|
||||||
|
dan murphys
|
||||||
|
bws
|
||||||
|
chemist warehouse
|
||||||
|
priceline
|
||||||
|
uber eats
|
||||||
|
menulog
|
||||||
|
dominos
|
||||||
|
centrelink login
|
||||||
|
medicare online
|
||||||
|
passport renewal
|
||||||
|
aec enrolment
|
||||||
|
agl energy
|
||||||
|
origin energy
|
||||||
|
stan
|
||||||
|
binge
|
||||||
|
9now
|
||||||
|
7plus
|
||||||
|
abc iview
|
||||||
|
hoyts cinemas
|
||||||
|
event cinemas
|
||||||
|
big bash league
|
||||||
|
the ashes
|
||||||
|
socceroos
|
||||||
|
bathurst 1000
|
||||||
|
booking.com
|
||||||
|
airbnb
|
||||||
|
webjet
|
||||||
|
bali weather
|
||||||
|
smartraveller
|
||||||
|
lotto results
|
||||||
|
powerball results
|
||||||
|
oz lotto
|
||||||
@@ -1,3 +1,89 @@
|
|||||||
|
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
|
||||||
|
sénateurs – hurricanes
|
||||||
|
senators vs hurricanes
|
||||||
|
man utd
|
||||||
|
spurs
|
||||||
|
evan mobley
|
||||||
|
chelsea vs man united
|
||||||
|
atlético madrid vs real sociedad
|
||||||
|
roma vs atalanta
|
||||||
|
cf montreal
|
||||||
|
jakob poeltl
|
||||||
ukraine
|
ukraine
|
||||||
contrôle routier québec
|
contrôle routier québec
|
||||||
bachelorette 2026
|
bachelorette 2026
|
||||||
|
|||||||
@@ -1,3 +1,87 @@
|
|||||||
|
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
|
||||||
|
republikanische partei
|
||||||
|
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
|
||||||
|
kampf der realitystars
|
||||||
|
kerner
|
||||||
|
tennessee
|
||||||
|
billy idol
|
||||||
|
kfc uerdingen
|
||||||
|
bastian pastewka
|
||||||
|
gnabry
|
||||||
|
lok leipzig heute live ticker
|
||||||
|
true lies wahre lügen
|
||||||
|
челси – манчестер юнайтед
|
||||||
|
nurburgring
|
||||||
fortnite server status
|
fortnite server status
|
||||||
süperlig
|
süperlig
|
||||||
ronaldinho
|
ronaldinho
|
||||||
@@ -55,7 +139,6 @@ jeff bezos
|
|||||||
dan brown
|
dan brown
|
||||||
паспорт громадянина україни для виїзду за кордон
|
паспорт громадянина україни для виїзду за кордон
|
||||||
serena williams
|
serena williams
|
||||||
kampf der realitystars
|
|
||||||
манчестер юнайтед – лидс
|
манчестер юнайтед – лидс
|
||||||
catherine deneuve
|
catherine deneuve
|
||||||
bobzin
|
bobzin
|
||||||
|
|||||||
@@ -1,3 +1,88 @@
|
|||||||
|
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
|
||||||
|
rafael jódar
|
||||||
|
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
|
||||||
|
clasificacion liga
|
||||||
|
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
|
eugenia martínez de irujo
|
||||||
ccoo
|
ccoo
|
||||||
racing de santander
|
racing de santander
|
||||||
|
|||||||
@@ -1,8 +1,87 @@
|
|||||||
|
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
|
||||||
|
anne claire coudray
|
||||||
pmu résultat
|
pmu résultat
|
||||||
laury thilleman et paul mirabel
|
laury thilleman et paul mirabel
|
||||||
quinté du jour
|
quinté du jour
|
||||||
euromillions 17 avril 2026
|
euromillions 17 avril 2026
|
||||||
alain bauer
|
|
||||||
uson
|
uson
|
||||||
guillaume meurice
|
guillaume meurice
|
||||||
pmu
|
pmu
|
||||||
@@ -54,7 +133,6 @@ loto du 13 avril 2026
|
|||||||
juan arbeláez
|
juan arbeláez
|
||||||
hbo
|
hbo
|
||||||
katy perry justin trudeau
|
katy perry justin trudeau
|
||||||
jacob elordi
|
|
||||||
tondela – gil vicente
|
tondela – gil vicente
|
||||||
le rugbynistère
|
le rugbynistère
|
||||||
epstein
|
epstein
|
||||||
|
|||||||
@@ -1,8 +1,85 @@
|
|||||||
|
weather hong kong
|
||||||
|
天文台
|
||||||
|
hk observatory
|
||||||
|
observatory
|
||||||
|
csk vs mi
|
||||||
|
長沙灣
|
||||||
|
魔音女團
|
||||||
|
明天的天氣
|
||||||
|
球迷世界
|
||||||
|
天星銀行
|
||||||
|
game
|
||||||
|
林嘉華
|
||||||
|
套餐
|
||||||
|
賈曉晨
|
||||||
|
hk weather
|
||||||
|
綠色債券
|
||||||
|
barcelona vs celta vigo
|
||||||
|
weather
|
||||||
|
7-eleven
|
||||||
|
天气
|
||||||
|
班來 對 曼城
|
||||||
|
埃爾切 對 馬德里競技
|
||||||
|
rosenior
|
||||||
|
jaafar jackson
|
||||||
|
艾納斯
|
||||||
|
liam rosenior
|
||||||
|
巴黎聖日耳曼 對 南特
|
||||||
|
chatgpt image 2
|
||||||
|
啟德醫院
|
||||||
|
李泳漢老婆
|
||||||
|
破產
|
||||||
|
weather tomorrow
|
||||||
|
繼承人
|
||||||
|
英皇群星演唱會
|
||||||
|
布浩榮
|
||||||
|
新聞
|
||||||
|
貨幣貶值
|
||||||
|
居 屋 2025
|
||||||
|
3988
|
||||||
|
李泳豪老婆
|
||||||
|
皇家馬德里 對 艾拉維斯
|
||||||
|
李泳漢
|
||||||
|
鄭欣宜
|
||||||
|
srh vs dc
|
||||||
|
鍾嘉欣
|
||||||
|
張柏芝
|
||||||
|
江美儀
|
||||||
|
全港戲院日 2026
|
||||||
|
江旻憓
|
||||||
|
陶傑
|
||||||
|
水晶宮 對 西漢姆聯
|
||||||
|
吉達艾阿里
|
||||||
|
山口智子
|
||||||
|
百佳超級市場
|
||||||
|
利息
|
||||||
|
戴祖儀
|
||||||
|
陳若思
|
||||||
|
麥當勞
|
||||||
|
首岸
|
||||||
|
中国商飞c919
|
||||||
|
pl
|
||||||
|
bundesliga
|
||||||
|
hailey bieber
|
||||||
|
德甲
|
||||||
|
cherki
|
||||||
|
now
|
||||||
|
曼城
|
||||||
|
now tv
|
||||||
|
al nassr
|
||||||
|
洪金寶
|
||||||
|
曼聯
|
||||||
|
車路士
|
||||||
|
切爾西 對 曼聯
|
||||||
|
英超
|
||||||
|
何沛珈
|
||||||
|
熱刺
|
||||||
|
tottenham vs brighton
|
||||||
|
熱刺 對 布萊頓
|
||||||
|
epl
|
||||||
司機
|
司機
|
||||||
补贴
|
补贴
|
||||||
華富邨
|
華富邨
|
||||||
江美儀
|
|
||||||
戴祖儀
|
|
||||||
零售
|
零售
|
||||||
藍莓
|
藍莓
|
||||||
商湯科技
|
商湯科技
|
||||||
|
|||||||
@@ -1,3 +1,86 @@
|
|||||||
|
石油
|
||||||
|
ios 26.4 2
|
||||||
|
ポケモンカード
|
||||||
|
シュトゥットガルト 対 フライブルク
|
||||||
|
ドラクエ スマグロ 攻略
|
||||||
|
ipl
|
||||||
|
kick
|
||||||
|
アコム
|
||||||
|
鈴木愛理
|
||||||
|
sox指数
|
||||||
|
村上世彰
|
||||||
|
桐山 照史
|
||||||
|
マラッカ海峡
|
||||||
|
ソニック
|
||||||
|
sbi新生銀行 株価
|
||||||
|
マイクラ
|
||||||
|
川口 春奈
|
||||||
|
サンダー 対 サンズ
|
||||||
|
インフルエンサー
|
||||||
|
サンケイビル
|
||||||
|
岡村隆史
|
||||||
|
上田竜也
|
||||||
|
メタプラネット
|
||||||
|
バルセロナ 対 セルタ
|
||||||
|
三橋くん
|
||||||
|
エルニーニョ
|
||||||
|
バーンリー 対 マンc
|
||||||
|
ボーンマス 対 リーズ u
|
||||||
|
elche vs atlético madrid
|
||||||
|
レバークーゼン 対 バイエルン
|
||||||
|
dior
|
||||||
|
ソシエダ 対 ヘタフェ
|
||||||
|
サイメモリ
|
||||||
|
b リーグ 順位
|
||||||
|
日ハム
|
||||||
|
ナダル
|
||||||
|
失点
|
||||||
|
岩瀬洋志
|
||||||
|
ファイターズ 試合
|
||||||
|
江村美咲
|
||||||
|
宝島社
|
||||||
|
井ノ原 快彦
|
||||||
|
ファイターズ
|
||||||
|
西郷隆盛
|
||||||
|
ボーダー
|
||||||
|
チェルシー
|
||||||
|
関税
|
||||||
|
ブライトン
|
||||||
|
佳子内親王
|
||||||
|
rマドリード 対 アラベス
|
||||||
|
鳥貴族
|
||||||
|
ブライトン 対 チェルシー
|
||||||
|
アシエンダ乗馬学校
|
||||||
|
ngày trái đất
|
||||||
|
加藤小夏
|
||||||
|
町田ゼルビア
|
||||||
|
モンスターハンターシリーズ
|
||||||
|
クリスタル・パレス 対 ウェストハム
|
||||||
|
吉田正尚
|
||||||
|
旭琉會
|
||||||
|
神戸
|
||||||
|
てんちむ
|
||||||
|
浜辺美波
|
||||||
|
デーブ ロバーツ
|
||||||
|
皇治
|
||||||
|
小雪
|
||||||
|
にじさんじデビュー
|
||||||
|
ちゃんよた
|
||||||
|
坂本 花織
|
||||||
|
松山 千春
|
||||||
|
リーグアン
|
||||||
|
伊勢谷友介
|
||||||
|
bayern vs vfb stuttgart
|
||||||
|
chelsea vs man united
|
||||||
|
唐田えりか
|
||||||
|
102回目のプロポーズ
|
||||||
|
デゼルビ
|
||||||
|
アトレティコ 対 ソシエダ
|
||||||
|
チェルシー 対 マンu
|
||||||
|
スパーズ
|
||||||
|
清春
|
||||||
|
ディエゴ・ゴメス
|
||||||
|
ps5
|
||||||
ハイウェイ の 堕 天使 興行 収入
|
ハイウェイ の 堕 天使 興行 収入
|
||||||
カブス 対 メッツ
|
カブス 対 メッツ
|
||||||
dazn
|
dazn
|
||||||
@@ -14,7 +97,6 @@ afc u20女子アジアカップ
|
|||||||
ネオジオ
|
ネオジオ
|
||||||
uefaヨーロッパリーグ
|
uefaヨーロッパリーグ
|
||||||
加藤史帆
|
加藤史帆
|
||||||
町田ゼルビア
|
|
||||||
志田未来
|
志田未来
|
||||||
伊藤英明
|
伊藤英明
|
||||||
島田麻央
|
島田麻央
|
||||||
@@ -31,7 +113,6 @@ wowow
|
|||||||
小泉進次郎
|
小泉進次郎
|
||||||
政権
|
政権
|
||||||
ミキティ
|
ミキティ
|
||||||
ソニック
|
|
||||||
今日のドジャースの結果
|
今日のドジャースの結果
|
||||||
新名神高速道路
|
新名神高速道路
|
||||||
わたせせいぞう
|
わたせせいぞう
|
||||||
@@ -40,7 +121,6 @@ wowow
|
|||||||
アレックス・ベシア
|
アレックス・ベシア
|
||||||
リバプール
|
リバプール
|
||||||
champions league
|
champions league
|
||||||
エルニーニョ
|
|
||||||
アトレティコ 対 バルセロナ
|
アトレティコ 対 バルセロナ
|
||||||
オープンワールド
|
オープンワールド
|
||||||
atlético madrid vs barcelona
|
atlético madrid vs barcelona
|
||||||
|
|||||||
100
data/keywords/kw_KR.txt
Normal file
100
data/keywords/kw_KR.txt
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
왕다루
|
||||||
|
시그널
|
||||||
|
모하메드 살라
|
||||||
|
공화당
|
||||||
|
윤하정
|
||||||
|
청남대
|
||||||
|
더보이즈
|
||||||
|
노민우
|
||||||
|
서비스나우
|
||||||
|
김민지
|
||||||
|
박해미
|
||||||
|
국가유산청
|
||||||
|
삼성전자 주가
|
||||||
|
두산에너빌리티 주가
|
||||||
|
김성수
|
||||||
|
한국사
|
||||||
|
삼성전기 주가
|
||||||
|
국립중앙박물관
|
||||||
|
대우건설 주가
|
||||||
|
지방 선거
|
||||||
|
서정대학교
|
||||||
|
캔바
|
||||||
|
한국항공우주산업
|
||||||
|
디트로이트 대 올랜도
|
||||||
|
리그 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
|
||||||
|
윤아
|
||||||
|
김영인
|
||||||
|
манчестер сити – арсенал
|
||||||
|
케이뱅크
|
||||||
|
날씨
|
||||||
|
환율
|
||||||
|
손흥민
|
||||||
|
토트넘 경기 일정
|
||||||
|
넷플릭스
|
||||||
|
국민은행
|
||||||
|
네이버웹툰
|
||||||
|
로또 당첨번호
|
||||||
|
쿠팡
|
||||||
|
KBO 리그
|
||||||
|
프로야구 순위
|
||||||
|
아이폰 15
|
||||||
|
챗gpt
|
||||||
|
인스타그램
|
||||||
|
유튜브 밴스드
|
||||||
|
이강인
|
||||||
|
김민재
|
||||||
|
LCK 일정
|
||||||
|
T1
|
||||||
|
페이커
|
||||||
|
무빙
|
||||||
|
카카오톡 PC버전
|
||||||
|
당근마켓
|
||||||
|
배달의민족
|
||||||
|
올리브영
|
||||||
|
메이플스토리
|
||||||
34
data/keywords/kw_MY.txt
Normal file
34
data/keywords/kw_MY.txt
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
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
|
||||||
@@ -1,3 +1,84 @@
|
|||||||
|
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
|
||||||
|
atlético madrid - real sociedad
|
||||||
|
xavi simons
|
||||||
|
ayase ueda
|
||||||
|
roma - atalanta
|
||||||
|
rtv noord
|
||||||
paraguay
|
paraguay
|
||||||
sergio herman
|
sergio herman
|
||||||
fed
|
fed
|
||||||
|
|||||||
@@ -1,3 +1,82 @@
|
|||||||
|
darren wang
|
||||||
|
mukesh choudhary
|
||||||
|
danish malewar
|
||||||
|
tamil nadu election results
|
||||||
|
allah ghazanfar
|
||||||
|
peregrine falcon
|
||||||
|
airasia flight
|
||||||
|
arrest
|
||||||
|
hao mart singapore
|
||||||
|
kartik sharma
|
||||||
|
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
|
||||||
|
michael jackson
|
||||||
|
al-nassr vs al ahli
|
||||||
|
mohsin khan
|
||||||
|
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
|
||||||
|
lebron james
|
||||||
|
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
|
sassuolo vs como
|
||||||
the straits times
|
the straits times
|
||||||
india women vs south africa women
|
india women vs south africa women
|
||||||
|
|||||||
@@ -1,6 +1,86 @@
|
|||||||
|
宋祖兒
|
||||||
|
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
|
||||||
|
長野縣
|
||||||
|
交通安全
|
||||||
|
朋友收集夢想生活
|
||||||
|
麥克傑克森
|
||||||
|
王濛
|
||||||
|
騎士 對 暴龍
|
||||||
|
熱刺 對 布萊頓
|
||||||
|
iem rio 2026
|
||||||
garret anderson
|
garret anderson
|
||||||
墓乃伊
|
墓乃伊
|
||||||
iem rio 2026
|
|
||||||
曹格
|
曹格
|
||||||
claude design
|
claude design
|
||||||
柯文哲
|
柯文哲
|
||||||
@@ -15,7 +95,6 @@ claude design
|
|||||||
東光路
|
東光路
|
||||||
货币
|
货币
|
||||||
amd
|
amd
|
||||||
rklb
|
|
||||||
航空母艦
|
航空母艦
|
||||||
axti
|
axti
|
||||||
Yahoo奇摩
|
Yahoo奇摩
|
||||||
|
|||||||
@@ -1,3 +1,84 @@
|
|||||||
|
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
|
||||||
|
david attenborough
|
||||||
|
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
|
||||||
dragons vs bulls
|
dragons vs bulls
|
||||||
suede
|
suede
|
||||||
lahore
|
lahore
|
||||||
|
|||||||
@@ -1,3 +1,88 @@
|
|||||||
|
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
|
||||||
|
rafael jodar
|
||||||
|
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
|
||||||
|
tobias myers
|
||||||
|
vladimir putin
|
||||||
|
knicks game
|
||||||
|
ben rice
|
||||||
|
prem
|
||||||
|
timberwolves vs nuggets
|
||||||
|
cody bellinger
|
||||||
|
nik khamenia
|
||||||
|
real sociedad
|
||||||
|
nurburgring crash
|
||||||
|
atlético madrid - real sociedad
|
||||||
ruke orhorhoro
|
ruke orhorhoro
|
||||||
radar
|
radar
|
||||||
the weather channel
|
the weather channel
|
||||||
|
|||||||
@@ -1,3 +1,86 @@
|
|||||||
|
stuttgart đấu với freiburg
|
||||||
|
levante – sevilla
|
||||||
|
giao dịch tài chính
|
||||||
|
sevilla
|
||||||
|
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
|
||||||
|
mc vs
|
||||||
|
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
|
||||||
|
juventus
|
||||||
|
ligue 1
|
||||||
|
trận đấu ngoại hạng anh
|
||||||
|
chelsea đấu với man utd
|
||||||
|
atlético madrid đấu với real sociedad
|
||||||
|
roma đấu với atalanta
|
||||||
|
epl
|
||||||
|
iem rio 2026
|
||||||
|
tot
|
||||||
|
tập đoàn gelex
|
||||||
|
napoli
|
||||||
|
đường ray
|
||||||
inter
|
inter
|
||||||
inter đấu với cagliari
|
inter đấu với cagliari
|
||||||
sassuolo vs como
|
sassuolo vs como
|
||||||
@@ -37,7 +120,6 @@ sun group
|
|||||||
hưng yên
|
hưng yên
|
||||||
nvl
|
nvl
|
||||||
américa đấu với nashville
|
américa đấu với nashville
|
||||||
neymar
|
|
||||||
VnExpress
|
VnExpress
|
||||||
Zing News
|
Zing News
|
||||||
Thời tiết Hà Nội
|
Thời tiết Hà Nội
|
||||||
|
|||||||
260
data/map.json
260
data/map.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": "3.5.2",
|
"version": "3.5.2",
|
||||||
"updated_at": "2026-04-16",
|
"updated_at": "2026-04-19",
|
||||||
"continents": [
|
"continents": [
|
||||||
{
|
{
|
||||||
"id": "ASIA",
|
"id": "ASIA",
|
||||||
@@ -11,7 +11,16 @@
|
|||||||
"name": "Japan (日本)",
|
"name": "Japan (日本)",
|
||||||
"keyword_file": "kw_JP.txt",
|
"keyword_file": "kw_JP.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Tokyo", "name": "Tokyo (东京)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Tokyo",
|
||||||
|
"name": "Tokyo (东京)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -19,7 +28,33 @@
|
|||||||
"name": "Singapore (新加坡)",
|
"name": "Singapore (新加坡)",
|
||||||
"keyword_file": "kw_SG.txt",
|
"keyword_file": "kw_SG.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Singapore", "name": "Singapore (新加坡)" } ] }
|
{
|
||||||
|
"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 (首尔)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -27,7 +62,16 @@
|
|||||||
"name": "Hong Kong (香港)",
|
"name": "Hong Kong (香港)",
|
||||||
"keyword_file": "kw_HK.txt",
|
"keyword_file": "kw_HK.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "HongKong", "name": "Hong Kong (香港)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "HongKong",
|
||||||
|
"name": "Hong Kong (香港)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -35,7 +79,16 @@
|
|||||||
"name": "Vietnam (越南)",
|
"name": "Vietnam (越南)",
|
||||||
"keyword_file": "kw_VN.txt",
|
"keyword_file": "kw_VN.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Hanoi", "name": "Hanoi (河内)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Hanoi",
|
||||||
|
"name": "Hanoi (河内)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -43,7 +96,33 @@
|
|||||||
"name": "Taiwan (台湾)",
|
"name": "Taiwan (台湾)",
|
||||||
"keyword_file": "kw_TW.txt",
|
"keyword_file": "kw_TW.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Taipei", "name": "Taipei (台北)" } ] }
|
{
|
||||||
|
"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 (吉隆坡)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -61,8 +140,14 @@
|
|||||||
"id": "Default",
|
"id": "Default",
|
||||||
"name": "Default State",
|
"name": "Default State",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "London", "name": "London (伦敦)" },
|
{
|
||||||
{ "id": "Coventry", "name": "Coventry (考文垂)" }
|
"id": "London",
|
||||||
|
"name": "London (伦敦)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Coventry",
|
||||||
|
"name": "Coventry (考文垂)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -72,7 +157,16 @@
|
|||||||
"name": "Germany (德国)",
|
"name": "Germany (德国)",
|
||||||
"keyword_file": "kw_DE.txt",
|
"keyword_file": "kw_DE.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Frankfurt", "name": "Frankfurt (法兰克福)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Frankfurt",
|
||||||
|
"name": "Frankfurt (法兰克福)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -80,7 +174,16 @@
|
|||||||
"name": "France (法国)",
|
"name": "France (法国)",
|
||||||
"keyword_file": "kw_FR.txt",
|
"keyword_file": "kw_FR.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Paris", "name": "Paris (巴黎)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Paris",
|
||||||
|
"name": "Paris (巴黎)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -88,7 +191,16 @@
|
|||||||
"name": "Netherlands (荷兰)",
|
"name": "Netherlands (荷兰)",
|
||||||
"keyword_file": "kw_NL.txt",
|
"keyword_file": "kw_NL.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Amsterdam", "name": "Amsterdam (阿姆斯特丹)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Amsterdam",
|
||||||
|
"name": "Amsterdam (阿姆斯特丹)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -96,7 +208,16 @@
|
|||||||
"name": "Spain (西班牙)",
|
"name": "Spain (西班牙)",
|
||||||
"keyword_file": "kw_ES.txt",
|
"keyword_file": "kw_ES.txt",
|
||||||
"states": [
|
"states": [
|
||||||
{ "id": "Default", "name": "Default State", "cities": [ { "id": "Madrid", "name": "Madrid (马德里)" } ] }
|
{
|
||||||
|
"id": "Default",
|
||||||
|
"name": "Default State",
|
||||||
|
"cities": [
|
||||||
|
{
|
||||||
|
"id": "Madrid",
|
||||||
|
"name": "Madrid (马德里)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -114,50 +235,74 @@
|
|||||||
"id": "CA",
|
"id": "CA",
|
||||||
"name": "California (加州)",
|
"name": "California (加州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Los_Angeles", "name": "Los Angeles (洛杉矶)" },
|
{
|
||||||
{ "id": "San_Jose", "name": "San Jose (圣何塞)" }
|
"id": "Los_Angeles",
|
||||||
|
"name": "Los Angeles (洛杉矶)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "San_Jose",
|
||||||
|
"name": "San Jose (圣何塞)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "IL",
|
"id": "IL",
|
||||||
"name": "Illinois (伊利诺伊州)",
|
"name": "Illinois (伊利诺伊州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Warrenville", "name": "Warrenville (沃伦维尔)" }
|
{
|
||||||
|
"id": "Warrenville",
|
||||||
|
"name": "Warrenville (沃伦维尔)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "NC",
|
"id": "NC",
|
||||||
"name": "North Carolina (北卡罗来纳州)",
|
"name": "North Carolina (北卡罗来纳州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Charlotte", "name": "Charlotte (夏洛特)" }
|
{
|
||||||
|
"id": "Charlotte",
|
||||||
|
"name": "Charlotte (夏洛特)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "NV",
|
"id": "NV",
|
||||||
"name": "Nevada (内华达州)",
|
"name": "Nevada (内华达州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Las_Vegas", "name": "Las Vegas (拉斯维加斯)" }
|
{
|
||||||
|
"id": "Las_Vegas",
|
||||||
|
"name": "Las Vegas (拉斯维加斯)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "OR",
|
"id": "OR",
|
||||||
"name": "Oregon (俄勒冈州)",
|
"name": "Oregon (俄勒冈州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Bend", "name": "Bend (本德)" }
|
{
|
||||||
|
"id": "Bend",
|
||||||
|
"name": "Bend (本德)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "UT",
|
"id": "UT",
|
||||||
"name": "Utah (犹他州)",
|
"name": "Utah (犹他州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Salt_Lake_City", "name": "Salt Lake City (盐湖城)" }
|
{
|
||||||
|
"id": "Salt_Lake_City",
|
||||||
|
"name": "Salt Lake City (盐湖城)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "WA",
|
"id": "WA",
|
||||||
"name": "Washington (华盛顿州)",
|
"name": "Washington (华盛顿州)",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Seattle", "name": "Seattle (西雅图)" }
|
{
|
||||||
|
"id": "Seattle",
|
||||||
|
"name": "Seattle (西雅图)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -171,8 +316,77 @@
|
|||||||
"id": "Default",
|
"id": "Default",
|
||||||
"name": "Default State",
|
"name": "Default State",
|
||||||
"cities": [
|
"cities": [
|
||||||
{ "id": "Toronto", "name": "Toronto (多伦多)" },
|
{
|
||||||
{ "id": "Montreal", "name": "Montreal (蒙特利尔)" }
|
"id": "Toronto",
|
||||||
|
"name": "Toronto (多伦多)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Montreal",
|
||||||
|
"name": "Montreal (蒙特利尔)"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "OCEANIA",
|
||||||
|
"name": "大洋洲战区 (Oceania)",
|
||||||
|
"countries": [
|
||||||
|
{
|
||||||
|
"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 (阿德莱德)"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -180,4 +394,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
50
data/regions/AU/NSW/Sydney.json
Normal file
50
data/regions/AU/NSW/Sydney.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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.bunnings.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/abc-weekly-news-quiz-april-24/106596462",
|
||||||
|
"https://www.realestate.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/ndis-participants-community-support-fears-government-changes/106596958",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/uk-braces-for-prospect-of-sixth-pm-in-seven-years/106599990",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/the-legacy-of-sikh-soldiers-anzac-day/106593346",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/tasmania-police-sergeant-used-internal-system-to-monitor-wife/106593204",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/jane-fonda-importance-in-developing-fitness-industry/106535102",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/viva-energy-boss-tell-alan-kohler-need-more-oil-refineries-fuel/106596864",
|
||||||
|
"https://www.commbank.com.au/",
|
||||||
|
"https://www.amazon.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/iran-war-live-updates-us-shoot-kill-hormuz/106598082",
|
||||||
|
"https://www.bom.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/power-price-warning-over-proposed-changes-to-tax-laws/106587928",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/charts-paint-worrying-picture-global-fertiliser-prices/106590152",
|
||||||
|
"https://www.coles.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/south-china-sea-state-funded-fishing-boat-militia/106570054",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/baby-boomers-labor-generational-inequality-federal-budget-ndis/106582640",
|
||||||
|
"https://www.woolworths.com.au/",
|
||||||
|
"https://www.ato.gov.au/",
|
||||||
|
"https://my.gov.au/",
|
||||||
|
"https://www.seek.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/fuel-price-supply-explainer/106593698",
|
||||||
|
"https://www.abc.net.au/news/2026-04-23/nt-inquest-woman-darwin-dv-shelter-death-police-child-safety/106595670",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/anzac-day-2026-public-holiday-australia-states/106583304"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
50
data/regions/AU/QLD/Brisbane.json
Normal file
50
data/regions/AU/QLD/Brisbane.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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.bunnings.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/power-price-warning-over-proposed-changes-to-tax-laws/106587928",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/jane-fonda-importance-in-developing-fitness-industry/106535102",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/abc-weekly-news-quiz-april-24/106596462",
|
||||||
|
"https://www.amazon.com.au/",
|
||||||
|
"https://www.ato.gov.au/",
|
||||||
|
"https://www.seek.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/tasmania-police-sergeant-used-internal-system-to-monitor-wife/106593204",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/the-legacy-of-sikh-soldiers-anzac-day/106593346",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/fuel-price-supply-explainer/106593698",
|
||||||
|
"https://www.abc.net.au/news/2026-04-23/nt-inquest-woman-darwin-dv-shelter-death-police-child-safety/106595670",
|
||||||
|
"https://www.woolworths.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/anzac-day-2026-public-holiday-australia-states/106583304",
|
||||||
|
"https://my.gov.au/",
|
||||||
|
"https://www.realestate.com.au/",
|
||||||
|
"https://www.commbank.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/ndis-participants-community-support-fears-government-changes/106596958",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/iran-war-live-updates-us-shoot-kill-hormuz/106598082",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/baby-boomers-labor-generational-inequality-federal-budget-ndis/106582640",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/viva-energy-boss-tell-alan-kohler-need-more-oil-refineries-fuel/106596864",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/south-china-sea-state-funded-fishing-boat-militia/106570054",
|
||||||
|
"https://www.bom.gov.au/",
|
||||||
|
"https://www.coles.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/uk-braces-for-prospect-of-sixth-pm-in-seven-years/106599990",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/charts-paint-worrying-picture-global-fertiliser-prices/106590152"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
50
data/regions/AU/SA/Adelaide.json
Normal file
50
data/regions/AU/SA/Adelaide.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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-04-24/baby-boomers-labor-generational-inequality-federal-budget-ndis/106582640",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/tasmania-police-sergeant-used-internal-system-to-monitor-wife/106593204",
|
||||||
|
"https://www.realestate.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/iran-war-live-updates-us-shoot-kill-hormuz/106598082",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/ndis-participants-community-support-fears-government-changes/106596958",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/charts-paint-worrying-picture-global-fertiliser-prices/106590152",
|
||||||
|
"https://www.ato.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/the-legacy-of-sikh-soldiers-anzac-day/106593346",
|
||||||
|
"https://www.bom.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/jane-fonda-importance-in-developing-fitness-industry/106535102",
|
||||||
|
"https://www.commbank.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/viva-energy-boss-tell-alan-kohler-need-more-oil-refineries-fuel/106596864",
|
||||||
|
"https://www.coles.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/fuel-price-supply-explainer/106593698",
|
||||||
|
"https://www.woolworths.com.au/",
|
||||||
|
"https://www.amazon.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/anzac-day-2026-public-holiday-australia-states/106583304",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/power-price-warning-over-proposed-changes-to-tax-laws/106587928",
|
||||||
|
"https://www.abc.net.au/news/2026-04-23/nt-inquest-woman-darwin-dv-shelter-death-police-child-safety/106595670",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/abc-weekly-news-quiz-april-24/106596462",
|
||||||
|
"https://my.gov.au/",
|
||||||
|
"https://www.seek.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/south-china-sea-state-funded-fishing-boat-militia/106570054",
|
||||||
|
"https://www.bunnings.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/uk-braces-for-prospect-of-sixth-pm-in-seven-years/106599990"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
50
data/regions/AU/VIC/Melbourne.json
Normal file
50
data/regions/AU/VIC/Melbourne.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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.woolworths.com.au/",
|
||||||
|
"https://www.seek.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/viva-energy-boss-tell-alan-kohler-need-more-oil-refineries-fuel/106596864",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/south-china-sea-state-funded-fishing-boat-militia/106570054",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/ndis-participants-community-support-fears-government-changes/106596958",
|
||||||
|
"https://www.abc.net.au/news/2026-04-23/nt-inquest-woman-darwin-dv-shelter-death-police-child-safety/106595670",
|
||||||
|
"https://my.gov.au/",
|
||||||
|
"https://www.ato.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/power-price-warning-over-proposed-changes-to-tax-laws/106587928",
|
||||||
|
"https://www.realestate.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/abc-weekly-news-quiz-april-24/106596462",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/uk-braces-for-prospect-of-sixth-pm-in-seven-years/106599990",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/anzac-day-2026-public-holiday-australia-states/106583304",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/jane-fonda-importance-in-developing-fitness-industry/106535102",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/fuel-price-supply-explainer/106593698",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/the-legacy-of-sikh-soldiers-anzac-day/106593346",
|
||||||
|
"https://www.bom.gov.au/",
|
||||||
|
"https://www.bunnings.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/baby-boomers-labor-generational-inequality-federal-budget-ndis/106582640",
|
||||||
|
"https://www.amazon.com.au/",
|
||||||
|
"https://www.commbank.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/charts-paint-worrying-picture-global-fertiliser-prices/106590152",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/tasmania-police-sergeant-used-internal-system-to-monitor-wife/106593204",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/iran-war-live-updates-us-shoot-kill-hormuz/106598082",
|
||||||
|
"https://www.coles.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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
50
data/regions/AU/WA/Perth.json
Normal file
50
data/regions/AU/WA/Perth.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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-04-24/ndis-participants-community-support-fears-government-changes/106596958",
|
||||||
|
"https://my.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/power-price-warning-over-proposed-changes-to-tax-laws/106587928",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/viva-energy-boss-tell-alan-kohler-need-more-oil-refineries-fuel/106596864",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/baby-boomers-labor-generational-inequality-federal-budget-ndis/106582640",
|
||||||
|
"https://www.amazon.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/charts-paint-worrying-picture-global-fertiliser-prices/106590152",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/tasmania-police-sergeant-used-internal-system-to-monitor-wife/106593204",
|
||||||
|
"https://www.realestate.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/abc-weekly-news-quiz-april-24/106596462",
|
||||||
|
"https://www.seek.com.au/",
|
||||||
|
"https://www.coles.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/south-china-sea-state-funded-fishing-boat-militia/106570054",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/jane-fonda-importance-in-developing-fitness-industry/106535102",
|
||||||
|
"https://www.woolworths.com.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/anzac-day-2026-public-holiday-australia-states/106583304",
|
||||||
|
"https://www.abc.net.au/news/2026-04-23/nt-inquest-woman-darwin-dv-shelter-death-police-child-safety/106595670",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/fuel-price-supply-explainer/106593698",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/uk-braces-for-prospect-of-sixth-pm-in-seven-years/106599990",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/the-legacy-of-sikh-soldiers-anzac-day/106593346",
|
||||||
|
"https://www.bom.gov.au/",
|
||||||
|
"https://www.abc.net.au/news/2026-04-24/iran-war-live-updates-us-shoot-kill-hormuz/106598082",
|
||||||
|
"https://www.ato.gov.au/",
|
||||||
|
"https://www.bunnings.com.au/",
|
||||||
|
"https://www.commbank.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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,10 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.cbc.ca/news/canada/vegetable-prices-canada-9.7173027?cmp=rss",
|
||||||
"https://www.cbc.ca/",
|
"https://www.rbcroyalbank.com/",
|
||||||
|
"https://www.theweathernetwork.com/ca",
|
||||||
|
"https://www.canada.ca/en.html",
|
||||||
|
"https://www.cbc.ca/news/entertainment/the-devil-wears-prada-2-photo-scroller-9.7174459?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/ottawa/4-day-office-return-for-global-affairs-canada-workers-delayed-due-to-space-issues-9.7174828?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/manitoba/blizzard-warning-freezing-rain-storm-manitoba-9.7174365?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/world/ntsb-laguardia-crash-preliminary-report-fire-truck-stop-stop-stop-9.7175074?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/flight-cancellations-strait-of-hormuz-9.7173742?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/politics/cbc-president-marie-philippe-bouchard-committee-9.7174302?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/world/lebanon-paramedics-strike-9.7173448?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/newfoundland-labrador/andrea-barbour-bullying-9.7174865?cmp=rss",
|
||||||
|
"https://www.utoronto.ca/",
|
||||||
|
"https://www.amazon.ca/",
|
||||||
|
"https://www.cbc.ca/news/politics/carney-u-s-ambassador-wiseman-9.7174897?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/politics/mark-carney-ethics-blind-trust-9.7174747?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/entertainment/heated-rivalry-peabody-9.7174978?cmp=rss",
|
||||||
|
"https://www.canadapost-postescanada.ca/",
|
||||||
|
"https://www.td.com/",
|
||||||
|
"https://www.cbc.ca/news/politics/carney-liquor-ban-9.7174723?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/montreal/smell-montreal-fire-9.7174378?cmp=rss",
|
||||||
|
"https://www.cra-arc.gc.ca/",
|
||||||
|
"https://www.cbc.ca/news/canada/nova-scotia/nova-scotia-mental-health-crisis-9.7171701?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.amazon.ca/",
|
||||||
"https://www.theweathernetwork.com/ca"
|
"https://www.theweathernetwork.com/ca"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.cbc.ca/news/canada/nova-scotia/nova-scotia-mental-health-crisis-9.7171701?cmp=rss",
|
||||||
|
"https://www.utoronto.ca/",
|
||||||
|
"https://www.amazon.ca/",
|
||||||
|
"https://www.cbc.ca/news/politics/mark-carney-ethics-blind-trust-9.7174747?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/flight-cancellations-strait-of-hormuz-9.7173742?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/entertainment/the-devil-wears-prada-2-photo-scroller-9.7174459?cmp=rss",
|
||||||
|
"https://www.rbcroyalbank.com/",
|
||||||
|
"https://www.cbc.ca/news/canada/montreal/smell-montreal-fire-9.7174378?cmp=rss",
|
||||||
"https://www.canada.ca/en.html",
|
"https://www.canada.ca/en.html",
|
||||||
"https://www.cbc.ca/",
|
"https://www.cra-arc.gc.ca/",
|
||||||
"https://www.thestar.com/",
|
"https://www.cbc.ca/news/canada/manitoba/blizzard-warning-freezing-rain-storm-manitoba-9.7174365?cmp=rss",
|
||||||
"https://www.ctvnews.ca/",
|
"https://www.cbc.ca/news/politics/cbc-president-marie-philippe-bouchard-committee-9.7174302?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/politics/carney-liquor-ban-9.7174723?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/world/ntsb-laguardia-crash-preliminary-report-fire-truck-stop-stop-stop-9.7175074?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/ottawa/4-day-office-return-for-global-affairs-canada-workers-delayed-due-to-space-issues-9.7174828?cmp=rss",
|
||||||
|
"https://www.td.com/",
|
||||||
|
"https://www.cbc.ca/news/canada/vegetable-prices-canada-9.7173027?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/world/lebanon-paramedics-strike-9.7173448?cmp=rss",
|
||||||
|
"https://www.theweathernetwork.com/ca",
|
||||||
"https://www.canadapost-postescanada.ca/",
|
"https://www.canadapost-postescanada.ca/",
|
||||||
"https://www.td.com/"
|
"https://www.cbc.ca/news/politics/carney-u-s-ambassador-wiseman-9.7174897?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/canada/newfoundland-labrador/andrea-barbour-bullying-9.7174865?cmp=rss",
|
||||||
|
"https://www.cbc.ca/news/entertainment/heated-rivalry-peabody-9.7174978?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"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
|
"https://www.tagesschau.de/wirtschaft/finanzen/infineon-chips-halbleiter-100.html",
|
||||||
|
"https://www.tagesschau.de/ausland/europa/ukraine-regierung-parlament-100.html",
|
||||||
|
"https://www.tagesschau.de/ausland/europa/tuerkei-socialmedia-verbot-100.html",
|
||||||
|
"https://www.tagesschau.de/ausland/asien/iran-regime-100.html",
|
||||||
|
"https://www.tagesschau.de/inland/gesellschaft/70-jahre-bundesnachrichtendienst-100.html",
|
||||||
"https://www.amazon.de/",
|
"https://www.amazon.de/",
|
||||||
"https://www.spiegel.de/",
|
"https://www.tagesschau.de/wissen/forschung/nasa-teleskop-102.html",
|
||||||
"https://www.tagesschau.de/",
|
"https://www.tagesschau.de/ausland/europa/eugh-asylrecht-italien-albanien-100.html",
|
||||||
"https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite",
|
"https://www.bundesregierung.de/",
|
||||||
|
"https://www.tagesschau.de/ausland/europa/ukraine-russland-angriffe-152.html",
|
||||||
|
"https://www.tagesschau.de/inland/regional/hessen/gesetzentwurf-existenzrecht-israel-100.html",
|
||||||
"https://www.ebay.de/",
|
"https://www.ebay.de/",
|
||||||
"https://www.bild.de/",
|
"https://www.spiegel.de/",
|
||||||
"https://www.kicker.de/"
|
"https://www.tagesschau.de/wirtschaft/adac-pannenstatistik-e-autos-100.html",
|
||||||
|
"https://www.tagesschau.de/inland/gesellschaft/pahlavi-berlin-100.html",
|
||||||
|
"https://www.tagesschau.de/ausland/amerika/trump-droht-iran-hormus-100.html",
|
||||||
|
"https://www.arbeitsagentur.de/",
|
||||||
|
"https://www.tum.de/",
|
||||||
|
"https://www.bahn.de/",
|
||||||
|
"https://www.tagesschau.de/ausland/europa/daenemark-zugunglueck-102.html",
|
||||||
|
"https://www.tagesschau.de/ausland/asien/libanon-israel-verhandlungen-100.html",
|
||||||
|
"https://www.sparkasse.de/",
|
||||||
|
"https://www.tagesschau.de/newsticker/liveblog-iran-donnerstag-112.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.ebay.de/",
|
||||||
|
"https://www.spiegel.de/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,37 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://es.wikipedia.org/wiki/Especial:Aleatoria",
|
"https://elpais.com/opinion/2026-04-23/el-tipo-mas-idiota-de-internet-condenado-a-seis-meses-de-carcel.html",
|
||||||
"https://www.elmundo.es/",
|
"https://www.agenciatributaria.es/",
|
||||||
"https://www.elpais.com/",
|
"https://elpais.com/internacional/2026-04-23/el-tribunal-penal-internacional-juzgara-al-expresidente-filipino-duterte-por-crimenes-contra-la-humanidad.html",
|
||||||
"https://www.marca.com/",
|
"https://elpais.com/deportes/futbol/2026-04-23/lamine-yamal-con-una-lesion-muscular-le-dice-adios-a-la-temporada-pero-no-al-mundial.html",
|
||||||
"https://www.rtve.es/",
|
"https://elpais.com/babelia/2026-04-23/luc-delahaye-una-realidad-entre-el-documento-y-la-ficcion.html",
|
||||||
|
"https://administracion.gob.es/",
|
||||||
|
"https://cincodias.elpais.com/mercados-financieros/2026-04-23/digi-aplaza-su-salida-a-bolsa-ante-la-volatilidad-del-mercado-por-la-guerra-de-iran.html",
|
||||||
|
"https://www.renfe.com/",
|
||||||
|
"https://elpais.com/deportes/futbol/2026-04-22/el-elche-se-oxigena-y-derrota-a-un-atletico-de-bolo-veraniego.html",
|
||||||
|
"https://elpais.com/gente/2026-04-23/enrique-de-inglaterra-pide-no-olvidar-la-guerra-de-ucrania-en-su-tercera-visita-al-pais.html",
|
||||||
|
"https://www.amazon.es/",
|
||||||
|
"https://elpais.com/espana/2026-04-23/el-rapto-de-los-90-minutos-en-miercoles-santo-resuelven-el-secuestro-del-gerente-de-un-salon-de-juegos-en-malaga.html",
|
||||||
|
"https://www.elcorteingles.es/",
|
||||||
|
"https://elpais.com/espana/catalunya/2026-04-23/sant-jordi-sigue-creciendo-en-barcelona-con-buen-tiempo-colas-y-lluvia-de-polen.html",
|
||||||
|
"https://elpais.com/tecnologia/2026-04-22/pedro-sanchez-alerta-del-colonialismo-silencioso-de-la-ia-y-pide-una-respuesta-global-ante-expertos-de-la-onu.html",
|
||||||
|
"https://www.zara.com/es/",
|
||||||
|
"https://elpais.com/cultura/2026-04-23/cultura-estudia-hacer-obligatorios-los-gastos-de-envio-de-grandes-plataformas-online.html",
|
||||||
|
"https://elpais.com/clima-y-medio-ambiente/2026-04-22/mas-alla-de-los-combustibles-fosiles-una-coalicion-dispuesta-a-avanzar.html",
|
||||||
|
"https://elpais.com/salud-y-bienestar/el-medico-de-cerca/2026-04-22/sobrevivir-a-un-infarto-en-las-mejores-condiciones.html",
|
||||||
|
"https://elpais.com/economia/2026-04-23/cuerpo-asegura-que-el-fondo-soberano-espana-crece-estara-listo-antes-de-julio.html",
|
||||||
|
"https://www.santander.es/",
|
||||||
|
"https://elpais.com/internacional/2026-04-23/ultima-hora-de-la-guerra-de-estados-unidos-e-israel-contra-iran-en-directo.html"
|
||||||
|
],
|
||||||
|
"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.zara.com/es/",
|
||||||
"https://www.elcorteingles.es/"
|
"https://www.elcorteingles.es/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,37 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://www.lemonde.fr/",
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-derri%C3%A8re-l-image-en-rdc-les-veuves-de-soldats-dans-la-pr%C3%A9carit%C3%A9",
|
||||||
"https://www.lefigaro.fr/",
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-guerre-en-ukraine-un-pr%C3%AAt-de-90-milliards-d-euros-pr%C3%AAt-%C3%A0-%C3%AAtre-d%C3%A9bloqu%C3%A9",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-%C3%A9tats-unis-le-secr%C3%A9taire-%C3%A0-la-marine-limog%C3%A9-en-plein-conflit-avec-l-iran",
|
||||||
|
"https://www.sorbonne-universite.fr/",
|
||||||
"https://www.amazon.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.cdiscount.com/",
|
||||||
"https://www.fnac.com/"
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-l-iran-maintient-son-emprise-sur-ormuz-incertitudes-sur-la-tr%C3%AAve",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-ukraine-un-pr%C3%AAt-quasi-d%C3%A9bloqu%C3%A9-zelensky-retrouve-les-dirigeants-europ%C3%A9ens-%C3%A0-chypre",
|
||||||
|
"https://www.france24.com/fr/france/20260423-liban-isra%C3%ABl-les-pays-r%C3%A9gion-moyen-orient-doivent-participer-n%C3%A9gociations-plaide-macron-%C3%A9tats-unis-washington",
|
||||||
|
"https://www.france24.com/fr/%C3%A9missions/politique/20260423-guerre-au-moyen-orient-la-fin-du-quoiqu-il-en-co%C3%BBte",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-liban-quels-sont-les-pouvoirs-et-les-limites-de-la-finul",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-le-b%C3%A9nin-mise-sur-son-histoire-pour-d%C3%A9velopper-le-tourisme",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-%C3%A0-montauban-hommage-national-%C3%A0-florian-montorio-casque-bleu-fran%C3%A7ais-tu%C3%A9-au-liban",
|
||||||
|
"https://www.france24.com/fr/%C3%A9missions/le-d%C3%A9bat/20260423-orban-hors-jeu-zelensky-gagnant",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-gaza-des-familles-pleurent-leurs-proches-tu%C3%A9s-dans-une-frappe-nocturne",
|
||||||
|
"https://www.impots.gouv.fr/",
|
||||||
|
"https://www.france24.com/fr/moyen-orient/20260423-crise-alimentaire-pourquoi-le-plan-de-l-onu-pour-un-corridor-%C3%A0-ormuz-pi%C3%A9tine-s%C3%A9curit%C3%A9-engrais-iran",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-amal-khalil-tu%C3%A9e-dans-une-frappe-isra%C3%A9lienne-dans-le-sud-du-liban",
|
||||||
|
"https://www.service-public.fr/",
|
||||||
|
"https://www.sncf.com/",
|
||||||
|
"https://www.credit-agricole.fr/",
|
||||||
|
"https://www.france24.com/fr/vid%C3%A9o/20260423-paris-le-l%C3%A9gendaire-orient-express-%C3%A0-l-honneur-au-mus%C3%A9e-des-arts-d%C3%A9coratifs"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,37 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
|
"https://hk.news.yahoo.com/%E5%8F%8D%E4%BF%AE%E4%BE%8B%E8%A2%AB%E6%8D%95%E8%80%85%E6%93%9A%E5%A0%B1%E8%B5%B4%E8%A1%9B%E8%A9%A9%E9%9B%85%E5%88%86%E4%BA%AB%E6%9C%83%E5%BE%8C%E7%8D%B2%E6%92%A4%E6%8E%A7-%E4%BF%9D%E5%AE%89%E5%B1%80-%E8%A1%8C%E5%8B%95%E7%B4%B0%E7%AF%80%E4%B8%8D%E4%BE%BF%E5%85%AC%E9%96%8B-%E6%9B%B4%E6%96%B0-042322551.html",
|
||||||
|
"https://www.hko.gov.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E4%BC%8A%E6%9C%97%E5%AE%A3%E7%A8%B1%E4%B8%8D%E6%9C%83%E9%96%8B%E6%94%BE%E8%8D%B7%E8%8E%AB%E8%8C%B2%E6%B5%B7%E5%B3%BD-%E9%99%A4%E9%9D%9E%E7%BE%8E%E5%9C%8B%E5%81%9C%E6%AD%A2%E5%B0%81%E9%8E%96-042002100.html",
|
||||||
|
"https://hk.news.yahoo.com/%E6%B6%88%E9%98%B2%E6%8A%AB%E9%9C%B2eas%E7%99%BC%E8%AD%A6%E7%A4%BA%E9%A0%88%E6%99%821%E5%8F%A5%E9%90%98-%E5%B0%8D%E6%80%A5%E9%80%9F%E6%83%A1%E5%8C%96%E7%81%AB%E5%8B%A2%E4%B8%8D%E9%81%A9%E5%90%88-094323720.html",
|
||||||
|
"https://hk.news.yahoo.com/%E4%BC%8A%E6%9C%97%E9%9D%A9%E5%91%BD%E8%A1%9B%E9%9A%8A%E7%82%AE%E8%89%87%E8%A5%B2%E6%93%8A%E9%98%BF%E6%9B%BC%E5%A4%96%E6%B5%B7%E8%B2%A8%E6%AB%83%E8%BC%AA-133503559.html",
|
||||||
|
"https://hk.news.yahoo.com/%E5%85%A5%E5%A2%83%E8%99%95%E6%89%93%E6%93%8A%E9%BB%91%E5%B7%A5%E5%A4%96%E8%B3%A3%E5%93%A1%E6%8B%9812%E4%BA%BA-%E5%8C%85%E6%8B%AC4%E6%B8%AF%E4%BA%BA%E6%B6%89%E5%87%BA%E7%A7%9F%E5%B8%B3%E8%99%9F%E6%88%96-%E6%B4%BE%E5%96%AE-%E8%AC%80%E5%88%A9-072553084.html",
|
||||||
|
"https://www.hktvmall.com/",
|
||||||
|
"https://www.gov.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E5%9D%A6%E5%B0%9A%E5%B0%BC%E4%BA%9E2025%E5%B9%B4%E9%81%B8%E8%88%89%E6%9A%B4%E5%8A%9B%E9%A0%BB%E5%82%B3-%E6%94%BF%E5%BA%9C%E8%AA%BF%E6%9F%A5%E7%A8%B1518%E6%AD%BB-140504774.html",
|
||||||
|
"https://hk.news.yahoo.com/%E8%B3%B4%E7%B8%BD%E7%B5%B1%E5%87%BA%E8%A8%AA%E5%8F%97%E9%98%BB-%E7%BE%8E%E6%89%B9%E4%B8%AD%E5%9C%8B%E6%81%90%E5%9A%87%E9%9D%9E%E6%B4%B2%E5%9C%8B%E5%AE%B6-072003045.html",
|
||||||
|
"https://hk.news.yahoo.com/%E4%BC%8A%E6%9C%97%E5%96%8A%E8%A9%B1-%E7%BE%8E%E5%9C%8B%E4%B8%8D%E8%A7%A3%E5%B0%81%E9%8E%96%E5%B0%B1%E4%B8%8D%E9%96%8B%E8%8D%B7%E8%8E%AB%E8%8C%B2%E6%B5%B7%E5%B3%BD-055002739.html",
|
||||||
|
"https://www.police.gov.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E4%BB%A5%E9%BB%8E%E8%8F%AF%E5%BA%9C%E5%86%8D%E6%9C%83%E8%AB%87-%E8%B2%9D%E9%AD%AF%E7%89%B9%E7%9B%BC%E5%BB%B6%E5%81%9C%E7%81%AB%E5%8D%94%E8%AD%B0-060502345.html",
|
||||||
|
"https://www.hku.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E7%BE%8E%E5%9C%8B%E8%B2%A1%E9%95%B7%E8%B2%9D%E6%A3%AE%E7%89%B9%E7%82%BA%E5%BB%B6%E9%95%B7%E4%BF%84%E7%BE%85%E6%96%AF%E7%9F%B3%E6%B2%B9%E5%88%B6%E8%A3%81%E8%B1%81%E5%85%8D%E8%BE%AF%E8%AD%B7-040502929.html",
|
||||||
|
"https://www.mtr.com.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E6%88%BF%E5%A7%94%E6%9C%83%E9%A6%96%E6%AC%A1%E5%90%8C%E6%AD%A5%E6%8E%A8%E5%B1%85%E5%B1%8B-%E7%B6%A0%E7%BD%AE%E5%B1%85-%E7%99%BD%E5%B1%85%E4%BA%8C-4-30%E8%B5%B7%E6%8E%A5%E5%8F%97%E7%94%B3%E8%AB%8B-200000762.html",
|
||||||
|
"https://hk.news.yahoo.com/%E8%8B%B1%E5%9C%8B%E6%94%BF%E5%BA%9C%E7%B8%AE%E6%B8%9B%E8%B5%A4%E5%AD%97%E6%9C%89%E6%88%90%E6%95%88-%E5%B0%88%E5%AE%B6%E8%AD%A6%E5%91%8A%E4%B8%AD%E6%9D%B1%E6%88%B0%E7%88%AD%E6%81%90%E6%8E%A8%E5%8D%87%E8%88%89%E5%82%B5%E6%88%90%E6%9C%AC-132005020.html",
|
||||||
|
"https://www.hsbc.com.hk/",
|
||||||
|
"https://hk.news.yahoo.com/%E6%B6%89%E4%BB%A5%E8%AA%A4%E5%B0%8E%E6%89%8B%E6%B3%95%E9%8A%B7%E5%94%AE%E4%B8%AD%E8%97%A5%E6%9D%90-39%E6%AD%B2%E6%97%BA%E8%A7%92-%E8%97%A5%E6%88%BF%E5%BA%97%E5%93%A1%E8%A2%AB%E6%8D%95-200000849.html",
|
||||||
|
"https://hk.news.yahoo.com/%E4%BC%8A%E6%9C%97%E5%AE%98%E5%93%A1-%E8%8D%B7%E8%8E%AB%E8%8C%B2%E6%B5%B7%E5%B3%BD%E9%A6%96%E6%89%B9%E9%81%8E%E8%B7%AF%E8%B2%BB%E6%94%B6%E5%85%A5%E5%B7%B2%E5%85%A5%E5%BA%AB-115003587.html",
|
||||||
|
"https://hk.news.yahoo.com/%E7%BE%8E%E5%9C%8B%E4%B8%8D%E8%A7%A3%E5%B0%81%E4%BC%8A%E6%9C%97%E4%B8%8D%E9%96%8B%E6%94%BE%E8%8D%B7%E8%8E%AB%E8%8C%B2-%E4%B8%AD%E6%9D%B1%E6%9C%80%E6%96%B0%E6%88%B0%E6%B3%81-%E6%AC%A1%E7%9C%8B-065002298.html"
|
||||||
|
],
|
||||||
|
"static_urls": [
|
||||||
"https://www.gov.hk/",
|
"https://www.gov.hk/",
|
||||||
"https://www.hko.gov.hk/",
|
"https://www.hko.gov.hk/",
|
||||||
"https://www.scmp.com/",
|
"https://www.police.gov.hk/",
|
||||||
"https://www.hk01.com/",
|
"https://www.hku.hk/",
|
||||||
"https://zh.wikipedia.org/wiki/Special:Random",
|
"https://www.hsbc.com.hk/",
|
||||||
"https://www.hktvmall.com/",
|
"https://www.mtr.com.hk/",
|
||||||
"https://www.mtr.com.hk/"
|
"https://www.hktvmall.com/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,17 +4,36 @@
|
|||||||
"base_lat": 35.6812,
|
"base_lat": 35.6812,
|
||||||
"base_lon": 139.7671,
|
"base_lon": 139.7671,
|
||||||
"lang_params": "hl=ja&gl=JP",
|
"lang_params": "hl=ja&gl=JP",
|
||||||
"valid_url_suffix": "com"
|
"valid_url_suffix": "com"
|
||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://ja.wikipedia.org/wiki/Special:Random",
|
|
||||||
"https://www.yahoo.co.jp/",
|
|
||||||
"https://www.rakuten.co.jp/",
|
"https://www.rakuten.co.jp/",
|
||||||
"https://www.nhk.or.jp/",
|
"https://www.smbc.co.jp/",
|
||||||
"kakaku.com/",
|
"https://www.jreast.co.jp/",
|
||||||
"https://www.goo.ne.jp/",
|
"https://www.mhlw.go.jp/",
|
||||||
"https://www.amazon.co.jp/"
|
"https://www.u-tokyo.ac.jp/",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577376?source=rss",
|
||||||
|
"https://www.amazon.co.jp/",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577374?source=rss",
|
||||||
|
"https://www.japan.go.jp/",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577369?source=rss",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577372?source=rss",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577377?source=rss",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577363?source=rss",
|
||||||
|
"https://www.yahoo.co.jp/",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577375?source=rss",
|
||||||
|
"https://news.yahoo.co.jp/pickup/6577370?source=rss"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
36
data/regions/KR/Default/Seoul.json
Normal file
36
data/regions/KR/Default/Seoul.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"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.kakao.com/",
|
||||||
|
"https://www.yonhapnewstv.co.kr/news/MYH20260423204515tFg",
|
||||||
|
"https://www.coupang.com/",
|
||||||
|
"https://www.korea.kr/",
|
||||||
|
"https://www.hometax.go.kr/",
|
||||||
|
"https://www.yonhapnewstv.co.kr/news/MYH20260423205121tTD",
|
||||||
|
"https://www.daum.net/",
|
||||||
|
"https://www.kbstar.com/",
|
||||||
|
"https://www.yonhapnewstv.co.kr/news/MYH20260423231345ZaH",
|
||||||
|
"https://www.yonhapnewstv.co.kr/news/MYH20260423235458edp",
|
||||||
|
"https://www.snu.ac.kr/",
|
||||||
|
"https://www.yonhapnewstv.co.kr/news/MYH20260423211941Xe0",
|
||||||
|
"https://www.naver.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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
50
data/regions/MY/Default/Kuala_Lumpur.json
Normal file
50
data/regions/MY/Default/Kuala_Lumpur.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"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://news.google.com/rss/articles/CBMiwAFBVV95cUxOc1FQTHJHTkRtLVM2aWNhRm1oSHY0WHJOMFI3N1l0S0FBSEVQaXFDNUxEcmUwUmlMMWtBMThiMGhVdjItdzltUUJNRUx4RDBQSDFBZmtfaVZ0YXFRWlp1ZmtWQlR6amFZeDByZEhtMmMwZVV3ZHFqZG9JQy1QWHF2dEZlRTFmZFVFd3kydnpZajlVOXRMcFRUZGxlRmxQU2puZnU1TTVRdE80blB3OG1SSDd2MXZjNDdJZWZWel92YTQ?oc=5",
|
||||||
|
"https://www.maybank2u.com.my/",
|
||||||
|
"https://www.lazada.com.my/",
|
||||||
|
"https://www.kwsp.gov.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMipgFBVV95cUxOT3Z4R043SjdaTTY4blQzTGZxOUFQRmJldmhTaFAxc2M4TC1tMmFSeHFMWGNfWk1jQW9FcWk2cmRsUUg0S3ItTmJ6VTdMTEcxWVhxejI5eDk2elBiN25TanRWVFBlNkswQUNhSk9WS19MVDBjbldRQ1FiX2NKeXEzdVZnUVY3YkxncjNYWGgwUE1VbFN1Z2FSNG53UkJ3SHQwNTkzSU1R0gGrAUFVX3lxTE4xVlVPRFJYZkFYUUx6cGVuVi1lZEhHLWZVdnFlS2ZCNk9WbXNlVkp5RlZBdmF4dmhGWXBLbnJzV0E5eUY5d3c1dDZzT1pQMURZRzZUd3NnYWNHOGVLWk1UV2RTR0kxZkd2bEt2WGFOVlBnSzhBdDhuTE5IY1F1S0oyNFdEaFNmTGtEd3JZVXJXUkpkNFRGMmJvZFdsNnFlNmo4Q3UyM1BxRlJ6dw?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMinAFBVV95cUxQc0puNXJDNjJvaWRLSjRjSXUzQk1WVlVTRGZsOEVhSnlCQWI3U29hdGJVSXZySmRKbm9pR3h3cUtmUmxPVWV3bG81YUtZSUlQel9rUzFITFZTZkhfV1hOcExIdmdXMzQ1aXdfamlxUmFFeXJrMDJVVEN3RmQ1VlEtSlU4WDRneHZJcTBVNWtPV1d5UC14UjJSaUJrd1PSAaIBQVVfeXFMUHRqS2VRMVktbGtuQWlOeWxZQUdKRWtjdGZINms3M0VvUnYyYUtTVVdpN2c3UkZ0V19oVVNCY3RyZk11d2pxb3BxUWZRVXcwVzBLUWM0V1gxVUtMMFNlRjRJcG9HYmZlcGhHU2dJMG5xQzRzdjRaMVpGbEFSU2tNaTcyaUE2SlkwMHRlM3Y1NEFsRkJQRWhmbUlBbE85MnBFMzV3?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMi1AFBVV95cUxQcWFCUXVGSUhfVHFUUXpTeDNrUm5yYWpPZXlzMUZtSzFDX0ZJdzNyWmlnbmZ2bUpLSXFHUHcyOFRHbkJMSzB6bjJYWDYyd2s5U285X1JIakRzYWxvNGJpSk5Deld3Q3NuZTdjTGJObmV1X2M0TW1GM19Nb0ZIWndDbHc1bHU3S3FtdmhMQ1k3MG5rSFRFRVA2TkZzOWNxczdvb3plMDN2dS1jWEw5Z09TeXZmZ1dtMGxtX1pvMkVDWWFrM25lVG5zNmZ5Y0lEN2VSaXhSYw?oc=5",
|
||||||
|
"https://www.pos.com.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiqgFBVV95cUxPZnVfanlkc0NjNWNyU2lCSGhPY2tZMmJLMklhdlBuc1JRY3I3ZlE3TWhqdkVxclFzX0tSa2xHZ1Y3WUlCdzdaR05SX2VScWFkaFFwT0ZXMjRRUkM4OVlQSXNfbkV1Y01wRVNVckVHZmY5UGNCdm13YlBzQkdsQ3ZJb3BMN1YxaXdsWlhaXzBaSUdfbzhQQ3NoRzNUbkRueDh1QjlKbU1NaEFUQQ?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMi7wFBVV95cUxQSERSOUhUWHFZeTZVQ2JsMlpta0dVWjRGR2xkVFN4M1pYMzExTndtLVllZVVxMTVTTkRhMnB1Qm50TFRxcEVMTXYxejMyZi1jckZwYTJ0MERIY0diR3J5aTBWbE11SXZILTFhc2EtaE93Q25INlptQUpGT3lFaXE5c1g3UHhxX0JSTjdOSHhoUFFvdUJfclNwZnpJOFB3VG5UU2lrN3pJeTFzWmRVS0hRWVN3dk5KRGhBTER3MU1ySVJNeDRaTmJtODJqdkhGWl9iUE5aVk5vX0RNZ2NoOHRjeE9aR3l0SEZta0pDVERnSQ?oc=5",
|
||||||
|
"https://shopee.com.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMimgFBVV95cUxNM0Fha3pYTVVEblg0dUJNYmtIZGdJdGFwa20tbUttRHNFNUMtQ0doMVJDZU5GYm0wLUkwaVpkMzZzM2lhcDNkaXlOMm5UckJvQjUyQ25URl9aMC1idm5pNDJCSm5xN3FKMXloREV6azNVZmt6WXg3TkQxa2JoaWdhSy1ZcU1ac251Ukt3TlE3SVpPVWxOSnJIMkpn0gGfAUFVX3lxTE9uT1dydUxaa1NWQk9rUFlGRTVZZFRSM0NqNURDMzRXRnJCTkZFTEZCdXkwd1lDdkVJaWo2M0dIVnprZ2ZjOTEzU3VneE8xV0pIMWZTOVlLSFo3N2UtZ19JMVZCWFVhRW5PeFFSNHI4MWNGXzJLOWRxRVY3WkREaENGeEVhM1dYVnViYU50WS1SQzB6Z3VzaEpHU0tzbVphWQ?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMirAFBVV95cUxNN1N5S3h1ZmlMcl9Zd01BYmRFd0N1Vi1aX1BUTFprR1pvSHF5VDZqWk9PUWJEYllScHFyX25qNnFWMFJfTmZoNjNwSTdUYmlDWnJPN2dsajJMbjhfam1WdGZ2bW45V1gxeGRpdTlFQ1RqdE5tbmU0ZVRibVE4S0JqRndVQmlvX3o5QkRDdFpfMXRsQ2hUQ2tmWm5QRnh1d0ZacWl2TlBKR19ybEVQ?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiZ0FVX3lxTE04VkZwSllHVjZXNWRvOW8zU3dCVVMzQUJ6OEJpY2NmdFZaRlhJTzhQWDYxNFZhMnVyVE9GMlZPOTFtbzZfd0g0el8zQkNEdU9BT3lQcmc3TldKTk5rYjEtdF9ZNG45WU0?oc=5",
|
||||||
|
"https://www.cimbclicks.com.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiwAFBVV95cUxQd2tyWHRaY180eklwZHNXdXdZY0dfcnZGQ3ZTbktEVldDeE9KaGRHMHRlRUhXdXhUZzdNVlNjaXgzZTBHUW54Z1RqNnZKcGF2V21nTFhyTFdFS0Z6cVUzWDNrLXU5UmRZR2QxYjAzVjJ4QkhCZUUwZ2lzQVlNMkxxNGs0REkzVmFNSFNvczY3S25TN0hpV1JjYmptVGlxckIxeFRkNUp5ZnBraEh1SUNKTUVCRGx0TXcwa1AxVFkyY3M?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMifkFVX3lxTE5EOXcwZDBtWEZhNUdjUDczVGRXU2VVdUNsUGtVUl9hSHBTU21pNkI5YnlJWXVkOW5NaVgzWUJFUktxS2dKbk9CU2xqLWl1bnlCalJRUWFwLU1QTUVDMXBqM2o0dVJOMF9fWjcxTGZ1RlNlcWpxb0ljMVBYZ2tKZw?oc=5",
|
||||||
|
"https://www.malaysia.gov.my/",
|
||||||
|
"https://www.thestar.com.my/",
|
||||||
|
"https://um.edu.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiqAFBVV95cUxQQjNRaVEwbkJuRUpEU1AyaTB3Y01QQm5TWFhLb0hyZVU2c0g4Y0huTnBuS0FtLVI0RnZKZ0J6aTdaSElFaFhUbDJ1NmZsUFYzTTU1TGNTRFh6T3l4VXVkWHdNSmt2aWtyYTlXem9HNDRwVVRqSHVXNVdJN3A5bTlTWHRONXJlczJSaExVb1ZURXlTWGVQOFE5a3NLMEtabkY5ZDFYeVR3UU4?oc=5",
|
||||||
|
"https://www.hasil.gov.my/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiugFBVV95cUxOdDFsd1RzdXlQSGVNTThONWdKaDROUzZwN0paQVNQNHN1Z20zd1lpUlVneVo0dUNfRDcyTEdXOFgzb3JCck0xT3JEMVFybXc5Ync1TFdHLXFvVlM4Si16ckk3RHF6U1BDOTh2LU1COC1paUcxWkgtTE9ZYnBPM0xMYnU4VlVoSTBPLVVSZ0Vwdi04V093d0NTeUUwT1FlNmxjcWZvWGZfdzdhcE5aTGNqbHdYUkZrQTdJM2c?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiywFBVV95cUxQQWJxZjduYVFWMk45SDdGX3Frc3ItZURydjE2a3NBTkh3YXU4S2FzUG9MV3dnSXY5STM5SjlKTk5JQXFWLXl2RXYyQVdiZjd3U1hhSk1xUzNscWJrUUczc1U1MHNrQzYwMDlkU2k1WFFhSG5uUnl2YlVEcWcyVHZKeTFqRkMxaE1HU296aTBNdGt0Q1BvOVN1b0NuX3RKOFczeDJXWE1USGJkU0xaOUFMMVNieng1dDlkMnhhVTNFY0dHNXhQbXNZMXJvNA?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMirgFBVV95cUxORXNSSDhJeXhuZ0Z0ZlM1ZGpwdlhJaWhiR0xObFljZ0NTV0tYUWp4S3VXZ0EtOWpSQ1dlb3RRcVdyWGl4NUxzWGRSbmREd1RGbDg1aFpmeHlhVVIxLTh6d09KWnFBVk9ER0MxSmN6MW9DZ1ZsMndRajNzMzBkV3hCbVdwbEZ0ZFBRLXdMbXZDLTZFdTZZeGNfQW9hNGhlc0R0ekpZek1qbmNST0pYRkHSAbMBQVVfeXFMTks1eWhUZngyTXFCSzFuYzhNZkFlcWhGUkEtbHhSLV9CV3BvTm1hdWJhUGF6UjJFNFRHZ3U5MDd2NU54b29LVUJsM0lrN2FocUI4OFFmXy03ajZfbk45aHZucFVUSUpSTXZRQjlVTWFWR2FaV25TQXAydV85Z3QwaFd2b2tJOWxnbGZrSDlFVU1TREFfUWRFaUZEVHlqUXJPMllYRzRCVHJPd1pyTkhZSGpZUUk?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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,13 +8,37 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://nl.wikipedia.org/wiki/Speciaal:Willekeurig",
|
"https://www.belastingdienst.nl/",
|
||||||
"https://www.rijksoverheid.nl/",
|
"https://nos.nl/l/2611728",
|
||||||
"https://www.nos.nl/",
|
"https://www.ns.nl/",
|
||||||
"https://www.bol.com/",
|
"https://nos.nl/l/2611737",
|
||||||
"https://www.nu.nl/",
|
"https://nos.nl/l/2611716",
|
||||||
|
"https://nos.nl/l/2611732",
|
||||||
"https://www.buienradar.nl/",
|
"https://www.buienradar.nl/",
|
||||||
"https://www.telegraaf.nl/"
|
"https://nos.nl/l/2611731",
|
||||||
|
"https://www.marktplaats.nl/",
|
||||||
|
"https://nos.nl/l/2611710",
|
||||||
|
"https://www.ing.nl/",
|
||||||
|
"https://nos.nl/l/2611745",
|
||||||
|
"https://nos.nl/l/2611729",
|
||||||
|
"https://nos.nl/l/2611696",
|
||||||
|
"https://nos.nl/l/2611744",
|
||||||
|
"https://nos.nl/l/2611738",
|
||||||
|
"https://nos.nl/l/2611694",
|
||||||
|
"https://www.rijksoverheid.nl/",
|
||||||
|
"https://www.bol.com/",
|
||||||
|
"https://nos.nl/l/2611719",
|
||||||
|
"https://nos.nl/l/2611725",
|
||||||
|
"https://nos.nl/l/2611703"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://www.straitstimes.com/",
|
"https://www.nus.edu.sg/",
|
||||||
"https://www.channelnewsasia.com/",
|
"https://www.channelnewsasia.com/sport/shanto-rahman-fire-bangladesh-seal-2-1-odi-series-win-over-new-zealand-6076636",
|
||||||
|
"https://www.shopee.sg/",
|
||||||
|
"https://www.channelnewsasia.com/business/electrolux-plans-about-1-billion-share-issue-tie-up-midea-in-north-america-shake-up-ops-6077066",
|
||||||
|
"https://www.channelnewsasia.com/business/milan-tech-firm-bending-spoons-picks-banks-20-billion-us-listing-sources-say-6076741",
|
||||||
|
"https://www.cpf.gov.sg/",
|
||||||
|
"https://www.channelnewsasia.com/business/us-sets-preliminary-antidumping-duties-solar-imports-india-indonesia-and-laos-6077106",
|
||||||
|
"https://www.channelnewsasia.com/world/trump-administration-marijuana-drug-medical-use-6076856",
|
||||||
|
"https://www.channelnewsasia.com/business/microsoft-plans-first-voluntary-employee-buyout-cnbc-reports-6076806",
|
||||||
"https://www.gov.sg/",
|
"https://www.gov.sg/",
|
||||||
"https://shopee.sg/",
|
"https://www.channelnewsasia.com/business/warner-bros-shareholders-back-us110-billion-merger-paramount-skydance-6076681",
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.channelnewsasia.com/asia/indonesia-not-impose-tariffs-strait-malacca-foreign-minister-sugiono-6076516",
|
||||||
|
"https://www.channelnewsasia.com/business/in-two-amazon-units-builder-replaces-traditional-job-titles-6076801",
|
||||||
|
"https://www.channelnewsasia.com/business/stocks-retreat-us-iran-peace-talks-stall-6076641",
|
||||||
|
"https://www.dbs.com.sg/",
|
||||||
|
"https://www.iras.gov.sg/",
|
||||||
|
"https://www.channelnewsasia.com/world/ukraine-russia-war-european-union-loan-hungary-pipeline-6076921",
|
||||||
|
"https://www.channelnewsasia.com/sport/miami-grand-prix-practice-extended-after-rule-changes-race-cancellations-6076656",
|
||||||
|
"https://www.singpass.gov.sg/",
|
||||||
"https://www.fairprice.com.sg/",
|
"https://www.fairprice.com.sg/",
|
||||||
"https://www.dbs.com.sg/"
|
"https://www.channelnewsasia.com/sport/coventry-chairman-king-shrugs-reports-linking-lampard-chelsea-return-6076911",
|
||||||
|
"https://www.channelnewsasia.com/business/cretaceous-kraken-prowled-seas-during-age-dinosaurs-6077036",
|
||||||
|
"https://www.channelnewsasia.com/sport/mclaren-will-have-completely-new-car-miami-gp-6076976"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,48 @@
|
|||||||
{
|
{
|
||||||
"region_name": "Taiwan - Taipei",
|
"region_name": "Taiwan - Taipei",
|
||||||
"google_module": {
|
"google_module": {
|
||||||
"base_lat": 25.0330,
|
"base_lat": 25.033,
|
||||||
"base_lon": 121.5654,
|
"base_lon": 121.5654,
|
||||||
"lang_params": "hl=zh-TW&gl=TW",
|
"lang_params": "hl=zh-TW&gl=TW",
|
||||||
"valid_url_suffix": "com.tw"
|
"valid_url_suffix": "com.tw"
|
||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://zh.wikipedia.org/wiki/Special:Random",
|
"https://www.post.gov.tw/",
|
||||||
"https://tw.yahoo.com/",
|
"https://news.google.com/rss/articles/CBMi0gFBVV95cUxPZUdJQVZpMVdsS1ZIYzd2TkhpQkRPOUJmd3lIRC1PSWRpbDJZNHUxNlpwM2RMVHBUYjZWSzNNcTQtbEFhNHozTTBacWp3Mzl4d09YeGFha0ZxRkN0U01OZG5FeklFbUtEb0l1TW5SWWRNQ0JzcFp3TEVqUFdlRi01QnRQVlBLbEV3SVNyYWFBbGllTGdfcGc3VjYzNERGX0RpZFFZUkxtX09KMFM5TmZVeklPX0dMa3EydDgwUV9yUFgxaGZzM0JzNGQtWl9vRUpqWFE?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiZkFVX3lxTE1kdU8yNlI0c2NKSzFjdGlWNHk4MmFHQVZXRUJocGhQTlZrc2ZXTkVKYXBWUUZSUF9nNnhyeUE2ZV9IY3NvRWdLRDJrc1E0eWRrQXVaLW9MYzN3eTIzX2VjWEZQc1NCQdIBa0FVX3lxTFB4WWVBdXV0NjdZY2xfam5PLUQ4VDBZaUlwOTFlZ19fcG53dW9VbjVGakNUcGNkaUJnYjZpejBkd0hSQm1HcnYyUmpXUFg1V2E4cTYta093Z1AtSHY2S0s1VUFqRS12S3JKMU9Z?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiUkFVX3lxTE0yNkVPWlVSczlIUFRZMlBtVkNUMUJzb2FXVDFVQll4ajhFdlBjMlRWUk9MaE5hRWxlanVMaGtCM2tTYTZtYS0ybzE4ZlQ3bUVRalE?oc=5",
|
||||||
"https://www.pchome.com.tw/",
|
"https://www.pchome.com.tw/",
|
||||||
|
"https://www.cathaybk.com.tw/",
|
||||||
|
"https://www.gov.tw/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiswNBVV95cUxPcDZmUHpyYmlLUkZSaGtGaW1qa1JBd2N6bnY0RTJBblg5WXlxVDYwYm9yQ0J3Zi1YV25RRmk0V1hyVmhTWUpWQ09sY2tJVkZ4azdnZml0SG9yRnZodWVZMHhHV3U2dmN0OEp4dk9PSWpOVEhjYmFBRVg4cU1xaVZiTU05dVBRRzJROG1HR1BtRmFFck1sWDd0TXhvZHRLT0lGZVk0QUJQUTBUVHJJeWxWWjBNaXg3MEUxUW54RkRxVlhmbkhPZmxNdkJqbkczeWJ1c3ZEVURmMDk0d1RYSlZqckNxSnFaMUVNbmstc0N2clhoTjBocmM5bmk4eUhuRVpsbnpyaEI2UEF1WDkxcTRUNy14YXdvVmpqVGtJQ3ZHUXhWdFF2aEQxQS1IU1h2N2dyWUxZU0h6ZXJfeDBsN09aY3YydUVTODlIV2N1Z3loSjNBVkRSWVVBS281TTVDTi00UlZYZ1RENFBPdFh4YTdsWUJPUmVKdUJodTlIUTR0Mm03Z3YzODN0dUgzbmZWY1U3RE5qZWdMOHdFTXRjY29SZXJUME5vTFVNdXRmQTZMSmVOZlk?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiUEFVX3lxTE0xdUpUQlNCUEdEeVdVYTg0ck1LYUw5Yll4OW5vTEZNTjRkQm5ROHlNMTJOdWE0czBLUjBxamlvNXIwMTdVei05M2hzY19BTk1M0gFWQVVfeXFMT1hVZEEyeWs4aHRTSzNKUGdfOUNqbUxYazJUMDN6RTJHYmhkU21fNTNnREliSG5WM3V3b0N0S3dkSTl2UGZ2Y19JUmRwWHJ3bGV0MzIyVmc?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMibkFVX3lxTFBHTmprcGlaR3I3TFlyUUhzZmFKQzZRYUFQXzhzR2dBVzJuQ1ZzU3c0T1ZMR2FRc3lkcTBFaThTdl92bWdhY3NBbFhOc01ZQ2pZc3l2bHUxT3BOOWcwMndYVFlZd0xYLU96bjVJOEdn?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiUEFVX3lxTE8wLWdBbXA4QVRlc2V2WE5rVTR2RE4zZVQweGZRSjdPNnBCclFoV1h0YkJZdkhkRElZdUtDQ0tBWVpPSzdvbjdqRXpuaTVET3ND?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiogFBVV95cUxOODRIaHhSWWx2UzBMMW83LUNid29ZTmFuYXgtZktVUWtJUFlzaWpOdTN2ZGZXTldlRUllTHJleGR2RFc0NjN1YVVyRC1VT0FuQjRIYmNreTFDdk0yaURzdHJ1SmdFRllCZEo0RWFWTkxzM2pDdWVDWDlETzBhRWRnVGlTT3hOUFo4MjYzaGRwb3cyeHJ2c3E1MHVrS0hTclBkWVE?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiWEFVX3lxTFBSWHMtZE5Ha1N0SGVMbWE0eHdFaV9aWktDNVpwWWZ2NmZYNU02N1RGVks5MXFYSWE2Yl9ZSkttRkZ6QWJ3azgzZl9LYzk2Ymx3bWpTRmFrZDA?oc=5",
|
||||||
"https://www.momoshop.com.tw/",
|
"https://www.momoshop.com.tw/",
|
||||||
"https://www.ruten.com.tw/",
|
"https://www.dcard.tw/",
|
||||||
"https://www.mobile01.com/",
|
"https://www.thsrc.com.tw/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiZkFVX3lxTE1xSXBsR2pKWXBZc0x4bUJxZWFEak04S25qaFI0Y3BLTnozc2Q3MzRHbWFCNUlZbVZDY0JzUVROTHJrWC1od2V0THVSb251bFdQeE15anltRnZ0NGNpc3MyVS1WeUlMd9IBa0FVX3lxTE1KWjRfMVBZN25ISHJLWGFLZGg1Rm1EMVFBMTZiMndKcmpSelVNSzJWU2NVazFMZnJHNmhxUWVzVkdNMDE2c05pb0RmZ2ZSUFZIbTNnbHNjYzU0eGZJbkRXOVRucHIxYnduazFz?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiYEFVX3lxTE11eVZ2Rlk5SEthZmRtanVXWmRrWXhGYXRVbEpmSTBfSjluLTBNSlpCV3BZQUhoXzVYSzd5OTh2V2lFV3dtSWlXUG9IS2NwZHFPREwxdnNJVkVzVDZfZDlUV9IBZkFVX3lxTE5xWG9UNHJiLVhqem1td1JvbEkzR1Zpc1ItMDNGOTNvZFhiYURBR2ZtREp6aFdqWUxCUHpKUWZmTlVYQ3M3bzdJUWhnLUhrNFBBdlMxQk9faHRGWkh6eU9TRjljV1Y0UQ?oc=5",
|
||||||
|
"https://www.ntu.edu.tw/",
|
||||||
|
"https://news.google.com/rss/articles/CBMi1wJBVV95cUxPREFTbWloRmVNY0lyQXlHMkZ6QmtCM2M1RGdzbk8zQXNmMzhlRTJ5UkxKNHBIZjZBS0Z4akkzN3NmRkRiaTB4cUUxQ0pOa3lzdG1rNXJsaHhnSFcxX2Y1SXhoRkU3di1LZ29GVEFraEtOLVpWSURtZlRyX0licU81VkhHdVBMckNTeDNZNFdsVTlQbC14cGthN3VER0JtZk13VDF4ZlhON1dZZFBqcHNxdkpycmFBc1d1ZTRWWV82S2RzQzE3SzhuMUFCb3UwMFZfWTBIU1JpXzRORS1PVEpCMzlmTmRfZVY0b2Rtelo1Znk1UkJ4VUhySzdOQjBjaDJaR3ppZkR2NGlrdzdtMDZqU0Mta0tuLXBzRk1YbG1jR3Vxd0loWlJ3YmhEdGYxMzk3WWtjWi1BN0NFMXhSTUltRHFrMll4N3hwWFpBWmxCLWhiUmhkTnBn?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiU0FVX3lxTFBDS2JaR3M3cjRLTHlMR1Y4U1IzNkkxM0I1aWY0S3B1ZDFkdUZWQlc3VC1nZndhQkUzRkJmZERvS1lsSG5lUXRUc3BqaTRPQVVFeG5v0gFYQVVfeXFMT2dUMTFLVHZpWWg0SE9XMWFwQnZhZ2lBLWUwbHhNTlhNbTZfc3ZUUF92QUlLTEpzTGlwS2t3Qi1WZmpHdWdMcG5zaHFmTmRPTmlpMDhQeS1wXw?oc=5",
|
||||||
|
"https://tw.yahoo.com/",
|
||||||
|
"https://news.google.com/rss/articles/CBMiZEFVX3lxTE9udVJJTVBBT1Z0ZFlmZXNpZFBnTDM3RmU0NkhVZnNNMEg5MHBrSHR4N2phUlZGNmhNQ1hubEM0MjljUmZrZkpyTDVNa1RDQ1YtY1Zha0diV29wUjhEbGdOeUhBMm7SAWpBVV95cUxQSlNFcy13NWd4Y2Nlck41Y0ZTTGhrWnlkalRCWm1RUm9ndkxkLUdUM1NHcFI4ZnZwWFdiR3RqNjVvVVM4UnkzbXJXbUhBRjl2UUVaNUFibGwwRTk1ZHhaSUx0aWVoLVNvc3hn?oc=5",
|
||||||
|
"https://news.google.com/rss/articles/CBMiT0FVX3lxTE1WNGN4MEFiTjdScmQ0NDZxaDN5cUxQbmpFbnF1eHVJaXBfSlc0ekZTOUxrYkJzVVJVWUstRGI2ekVjajEzVU8zeUdVUjRBSUU?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/"
|
"https://www.dcard.tw/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,10 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.nhs.uk/",
|
||||||
"https://www.bbc.co.uk/",
|
"https://www.ox.ac.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/cdrm8k7lzmko?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cgj09ny0dq6o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cp3lge56zxwo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/clyxlnzrq41o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/cy813gy08v2o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/c20qrg4dyr3o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/videos/c0q9k3lekn3o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/c98kz9pe01po?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/c86ezy3qvjno?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cr41yel6v4eo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/cly60l1e6nxo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cvgkwk9525zo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.ebay.co.uk/",
|
||||||
|
"https://www.gov.uk/",
|
||||||
|
"https://www.bbc.co.uk/iplayer/episode/m002t4vt?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.barclays.co.uk/",
|
||||||
|
"https://www.nationalrail.co.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/c5ywjn9zpyjo?at_medium=RSS&at_campaign=rss",
|
||||||
"https://www.amazon.co.uk/",
|
"https://www.amazon.co.uk/",
|
||||||
"https://www.theguardian.com/uk"
|
"https://www.bbc.com/news/articles/c3r3pz82g58o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.postoffice.co.uk/"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,39 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://www.bbc.co.uk/",
|
"https://www.bbc.com/news/articles/cp3lge56zxwo?at_medium=RSS&at_campaign=rss",
|
||||||
"https://www.gov.uk/",
|
"https://www.barclays.co.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/c20qrg4dyr3o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/videos/c0q9k3lekn3o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/clyxlnzrq41o?at_medium=RSS&at_campaign=rss",
|
||||||
"https://www.amazon.co.uk/",
|
"https://www.amazon.co.uk/",
|
||||||
"https://www.theguardian.com/uk",
|
"https://www.postoffice.co.uk/",
|
||||||
|
"https://www.ox.ac.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/c5ywjn9zpyjo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/c3r3pz82g58o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cgj09ny0dq6o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/cr41yel6v4eo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.gov.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/cdrm8k7lzmko?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/c98kz9pe01po?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/cly60l1e6nxo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/sport/football/articles/cy813gy08v2o?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.nationalrail.co.uk/",
|
||||||
|
"https://www.bbc.co.uk/iplayer/episode/m002t4vt?at_medium=RSS&at_campaign=rss",
|
||||||
"https://www.nhs.uk/",
|
"https://www.nhs.uk/",
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.ebay.co.uk/",
|
||||||
|
"https://www.bbc.com/news/articles/cvgkwk9525zo?at_medium=RSS&at_campaign=rss",
|
||||||
|
"https://www.bbc.com/news/articles/c86ezy3qvjno?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/"
|
"https://www.ebay.co.uk/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,13 +8,43 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
"https://www.harvard.edu/",
|
||||||
"https://www.yahoo.com/",
|
"https://www.usa.gov/",
|
||||||
"https://www.target.com/",
|
"https://www.chase.com/",
|
||||||
"https://www.npr.org/",
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
"https://www.weather.com/",
|
"https://www.walmart.com/",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
"https://www.amazon.com/",
|
"https://www.amazon.com/",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
"https://www.cdc.gov/"
|
"https://www.cdc.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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,14 +8,43 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://en.wikipedia.org/wiki/Special:Random",
|
|
||||||
"https://www.yahoo.com/",
|
|
||||||
"https://www.target.com/",
|
|
||||||
"https://www.npr.org/",
|
|
||||||
"https://www.weather.com/",
|
|
||||||
"https://www.amazon.com/",
|
"https://www.amazon.com/",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
"https://www.cdc.gov/",
|
"https://www.cdc.gov/",
|
||||||
"https://www.mercurynews.com/"
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Warrenville",
|
"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" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"base_lat": 41.8164,
|
||||||
}
|
"base_lon": -88.1748,
|
||||||
|
"lang_params": "hl=en&gl=US",
|
||||||
|
"valid_url_suffix": "com"
|
||||||
|
},
|
||||||
|
"trust_module": {
|
||||||
|
"white_urls": [
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"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.walmart.com/",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"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/index.html",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.target.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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Charlotte",
|
"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" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"base_lat": 35.2271,
|
||||||
}
|
"base_lon": -80.8431,
|
||||||
|
"lang_params": "hl=en&gl=US",
|
||||||
|
"valid_url_suffix": "com"
|
||||||
|
},
|
||||||
|
"trust_module": {
|
||||||
|
"white_urls": [
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Las Vegas",
|
"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" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"base_lat": 36.1699,
|
||||||
}
|
"base_lon": -115.1398,
|
||||||
|
"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/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-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/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.target.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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Bend",
|
"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" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"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/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.usps.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.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman"
|
||||||
|
],
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Salt Lake City",
|
"region_name": "United States - Salt Lake City",
|
||||||
"google_module": { "base_lat": 40.7608, "base_lon": -111.8910, "lang_params": "hl=en&gl=US", "valid_url_suffix": "com" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"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/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.usa.gov/",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,50 @@
|
|||||||
{
|
{
|
||||||
"region_name": "United States - Seattle",
|
"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" },
|
"google_module": {
|
||||||
"trust_module": { "white_urls": [ "https://en.wikipedia.org/wiki/Special:Random", "https://www.yahoo.com/", "https://www.target.com/", "https://www.npr.org/", "https://www.weather.com/", "https://www.amazon.com/", "https://www.cdc.gov/" ] }
|
"base_lat": 47.6062,
|
||||||
}
|
"base_lon": -122.3321,
|
||||||
|
"lang_params": "hl=en&gl=US",
|
||||||
|
"valid_url_suffix": "com"
|
||||||
|
},
|
||||||
|
"trust_module": {
|
||||||
|
"white_urls": [
|
||||||
|
"https://www.usps.com/",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/h_8d51e3ae2714edaa0dace837305d03b8",
|
||||||
|
"https://www.amazon.com/",
|
||||||
|
"https://www.irs.gov/",
|
||||||
|
"https://www.bankofamerica.com/",
|
||||||
|
"https://www.cnn.com/europe/live-news/russia-ukraine-war-news-04-18-23/index.html",
|
||||||
|
"https://www.target.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/schumer-senate-feinstein-vote-cardin/index.html",
|
||||||
|
"https://www.npr.org/2026/04/23/nx-s1-5795829/peace-talks-between-us-and-iran-at-a-standstill-as-trump-extends-ceasefire",
|
||||||
|
"https://www.harvard.edu/",
|
||||||
|
"https://www.npr.org/2026/04/23/g-s1-118440/up-first-newsletter-us-iran-john-phelan-trump-republican-democrat-midterm-fundraising-budget-reconciliation-ice",
|
||||||
|
"https://www.cnn.com/business/live-news/fox-news-dominion-trial-04-18-23/index.html",
|
||||||
|
"https://www.chase.com/",
|
||||||
|
"https://www.cnn.com/videos/politics/2023/04/18/jake-tapper-dominion-lawsuit-settlement-fox-news-statement-lead-vpx.cnn",
|
||||||
|
"https://www.cnn.com/2023/04/18/us/benadryl-tiktok-challenge-teen-death-wellness/index.html",
|
||||||
|
"https://www.cnn.com/travel/article/worlds-longest-cycling-tunnel/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/14/entertainment/yellowjackets-90s-music/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/17/health/rise-type-2-diabetes-global-wellness/index.html",
|
||||||
|
"https://www.cdc.gov/",
|
||||||
|
"https://www.walmart.com/",
|
||||||
|
"https://www.cnn.com/2023/04/18/politics/mccarthy-biden-debt-ceiling/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/health/teen-misuse-adhd-meds-wellness/index.html",
|
||||||
|
"https://www.cnn.com/2023/04/18/opinions/2024-presidential-election-alternative-voters-lieberman",
|
||||||
|
"https://www.cnn.com/cnn-underscored/reviews/mmmat-silicone-mats?iid=CNNUnderscoredHPcontainer",
|
||||||
|
"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/"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,13 +8,37 @@
|
|||||||
},
|
},
|
||||||
"trust_module": {
|
"trust_module": {
|
||||||
"white_urls": [
|
"white_urls": [
|
||||||
"https://vi.wikipedia.org/wiki/Đặc_biệt:Ngẫu_nhiên",
|
|
||||||
"https://chinhphu.vn/",
|
|
||||||
"https://vnexpress.net/",
|
"https://vnexpress.net/",
|
||||||
"https://tuoitre.vn/",
|
"https://vnexpress.net/to-hop-hoa-dau-long-son-dung-hoat-dong-5066377.html",
|
||||||
"https://vtv.vn/",
|
"https://vnexpress.net/vo-dat-idol-len-tren-chong-con-5066192.html",
|
||||||
|
"https://vnexpress.net/ong-trump-ra-lenh-huy-diet-tau-iran-rai-thuy-loi-o-hormuz-5066396.html",
|
||||||
|
"https://vnexpress.net/nha-ga-duong-sat-toc-do-cao-bac-nam-se-nhu-thanh-pho-nho-5066403.html",
|
||||||
|
"https://vnu.edu.vn/",
|
||||||
|
"https://www.vietcombank.com.vn/",
|
||||||
|
"https://vnexpress.net/lich-va-huong-dan-dang-ky-thi-tot-nghiep-thpt-nam-2026-cac-buoc-chi-tiet-nhat-5066107.html",
|
||||||
|
"https://vnexpress.net/dpm-dat-loi-nhuan-515-ty-dong-quy-i-5066398.html",
|
||||||
|
"https://vnexpress.net/gia-chung-cu-ha-noi-gia-chung-cu-tp-hcm-chung-cu-cat-lo-80-trieu-mot-m2-khien-toi-chet-dung-5066312.html",
|
||||||
|
"https://dichvucong.gov.vn/",
|
||||||
|
"https://vnexpress.net/auspacific-investment-viet-nam-ra-mat-voi-hoat-dong-tu-van-tai-san-5066110.html",
|
||||||
|
"https://vnexpress.net/ukraine-lo-thieu-hut-ten-lua-patriot-do-xung-dot-trung-dong-5066373.html",
|
||||||
|
"https://tiki.vn/",
|
||||||
|
"https://vnexpress.net/phu-nhan-tong-thong-han-quoc-xem-mua-roi-nuoc-lam-banh-tai-ha-noi-5066355.html",
|
||||||
"https://shopee.vn/",
|
"https://shopee.vn/",
|
||||||
"https://tiki.vn/"
|
"https://vnexpress.net/ha-noi-mien-phi-xe-buyt-va-metro-trong-7-ngay-nghi-le-5066419.html",
|
||||||
|
"https://vnexpress.net/tong-thong-han-quoc-va-phu-nhan-an-kem-dao-ho-guom-5066408.html",
|
||||||
|
"https://vnexpress.net/italy-bi-xuc-pham-boi-de-xuat-thay-iran-du-world-cup-2026-5066405.html",
|
||||||
|
"https://vnexpress.net/dong-nai-co-them-khu-cong-nghiep-xanh-1-800-ty-dong-5066343.html",
|
||||||
|
"https://vnexpress.net/tp-hcm-se-mo-13-tuyen-buyt-ket-noi-san-bay-long-thanh-5066209.html",
|
||||||
|
"https://chinhphu.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/"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,17 +5,27 @@
|
|||||||
# 核心功能: 部署/卸载调度中枢、SQLite 资产管理、平滑热更新引擎
|
# 核心功能: 部署/卸载调度中枢、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
|
||||||
|
|
||||||
# 你的 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/main"
|
||||||
# 临时改为开发地址用于测试
|
# 临时改为开发地址用于测试
|
||||||
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/dev-v3.6.1"
|
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
|
||||||
|
|
||||||
# [核心: 动态提取 Master 专属版本锚点 (KV 解析法)]
|
# [核心: 动态提取 Master 专属版本锚点 (KV 解析法)]
|
||||||
# 通过 grep 定位 MASTER_VERSION 行,再通过 cut 提取等号右侧的值
|
# 通过 grep 定位 MASTER_VERSION 行,再通过 cut 提取等号右侧的值
|
||||||
TARGET_VERSION=$(curl -s -m 3 "${REPO_RAW_URL}/version.txt" | grep "^MASTER_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]')
|
# [修复] 增加 -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:-"3.5.0"}
|
TARGET_VERSION=${TARGET_VERSION:-"4.0.0"}
|
||||||
|
|
||||||
MASTER_DIR="/opt/ip_sentinel_master"
|
MASTER_DIR="/opt/ip_sentinel_master"
|
||||||
DB_FILE="${MASTER_DIR}/sentinel.db"
|
DB_FILE="${MASTER_DIR}/sentinel.db"
|
||||||
@@ -96,6 +106,10 @@ fi
|
|||||||
|
|
||||||
# ================== [v3.2.2 优化: 安装前环境纯净度清理与数据保护] ==================
|
# ================== [v3.2.2 优化: 安装前环境纯净度清理与数据保护] ==================
|
||||||
echo -e "\n⏳ 正在清理旧版 Master 守护进程..."
|
echo -e "\n⏳ 正在清理旧版 Master 守护进程..."
|
||||||
|
# [新增] 优雅停止 Systemd 服务,防止代码替换时引发无限复活风暴
|
||||||
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
|
systemctl stop ip-sentinel-master.service >/dev/null 2>&1 || true
|
||||||
|
fi
|
||||||
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
|
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
if [ "$UPGRADE_MODE" == "true" ]; then
|
if [ "$UPGRADE_MODE" == "true" ]; then
|
||||||
@@ -115,9 +129,9 @@ echo -e "\033[32m✅ 旧进程已肃清!\033[0m"
|
|||||||
# =======================================================================
|
# =======================================================================
|
||||||
|
|
||||||
# 1. 依赖检查与智能安装 (v3.6.0 兼容性与优雅性升级)
|
# 1. 依赖检查与智能安装 (v3.6.0 兼容性与优雅性升级)
|
||||||
echo -e "\n[1/4] 正在探测核心依赖 (curl, jq, sqlite3, crontab, pgrep)..."
|
echo -e "\n[1/4] 正在探测核心依赖 (curl, jq, sqlite3, crontab, pgrep, openssl)..."
|
||||||
|
|
||||||
REQUIRED_CMDS=("curl" "jq" "sqlite3" "crontab" "pgrep")
|
REQUIRED_CMDS=("curl" "jq" "sqlite3" "crontab" "pgrep" "openssl")
|
||||||
MISSING_CMDS=()
|
MISSING_CMDS=()
|
||||||
|
|
||||||
# 基础探测:预检查缺失的命令
|
# 基础探测:预检查缺失的命令
|
||||||
@@ -133,29 +147,37 @@ if [ ${#MISSING_CMDS[@]} -gt 0 ]; then
|
|||||||
|
|
||||||
if command -v apt-get >/dev/null 2>&1; then
|
if command -v apt-get >/dev/null 2>&1; then
|
||||||
apt-get update -y >/dev/null 2>&1
|
apt-get update -y >/dev/null 2>&1
|
||||||
apt-get install -y curl jq sqlite3 cron procps >/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
|
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
|
elif command -v yum >/dev/null 2>&1 || command -v dnf >/dev/null 2>&1; then
|
||||||
PKG_MGR="yum"
|
PKG_MGR="yum"
|
||||||
command -v dnf >/dev/null 2>&1 && PKG_MGR="dnf"
|
OPT_ARGS=""
|
||||||
$PKG_MGR install -y curl jq sqlite cronie procps-ng >/dev/null 2>&1
|
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
|
systemctl enable crond >/dev/null 2>&1 && systemctl start crond >/dev/null 2>&1
|
||||||
elif command -v apk >/dev/null 2>&1; then
|
elif command -v apk >/dev/null 2>&1; then
|
||||||
echo "Alpine 探测到系统类型为 Alpine Linux,正在执行轻量级安装..."
|
echo "Alpine 探测到系统类型为 Alpine Linux,正在执行轻量级安装..."
|
||||||
apk add --no-cache curl jq sqlite dcron procps bash >/dev/null 2>&1
|
# [修复] 优先尝试 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
|
mkdir -p /var/spool/cron/crontabs
|
||||||
rc-update add crond default >/dev/null 2>&1
|
rc-update add crond default >/dev/null 2>&1
|
||||||
service crond start >/dev/null 2>&1
|
service crond start >/dev/null 2>&1
|
||||||
elif command -v pacman >/dev/null 2>&1; then
|
elif command -v pacman >/dev/null 2>&1; then
|
||||||
pacman -Sy --noconfirm curl jq sqlite cronie procps-ng >/dev/null 2>&1
|
pacman -Sy --noconfirm curl jq sqlite cronie procps-ng openssl >/dev/null 2>&1
|
||||||
mkdir -p /root/.cache/crontab 2>/dev/null
|
mkdir -p /root/.cache/crontab 2>/dev/null
|
||||||
systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1
|
systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1
|
||||||
else
|
else
|
||||||
echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m"
|
echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m"
|
||||||
echo -e "\033[33m⚠️ 请手动执行以下安装命令后重新运行本脚本:\033[0m"
|
echo -e "\033[33m⚠️ 请手动执行以下安装命令后重新运行本脚本:\033[0m"
|
||||||
echo -e " Debian/Ubuntu: \033[36mapt-get update && apt-get install -y curl jq sqlite3 cron procps\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\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 dcron procps bash\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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -246,6 +268,15 @@ CREATE TABLE IF NOT EXISTS nodes (
|
|||||||
enable_ota TEXT DEFAULT 'false',
|
enable_ota TEXT DEFAULT 'false',
|
||||||
PRIMARY KEY(chat_id, node_name)
|
PRIMARY KEY(chat_id, node_name)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- [v4.0.0 新增] 核心情报表:记录历史 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,
|
||||||
|
nf_status TEXT
|
||||||
|
);
|
||||||
EOF
|
EOF
|
||||||
echo "✅ 数据库创建成功: $DB_FILE"
|
echo "✅ 数据库创建成功: $DB_FILE"
|
||||||
|
|
||||||
@@ -260,14 +291,47 @@ echo -e "\n[4/4] 部署 TG 调度守护进程..."
|
|||||||
curl -sL "${REPO_RAW_URL}/master/tg_master.sh" -o "${MASTER_DIR}/tg_master.sh"
|
curl -sL "${REPO_RAW_URL}/master/tg_master.sh" -o "${MASTER_DIR}/tg_master.sh"
|
||||||
chmod +x "${MASTER_DIR}/tg_master.sh"
|
chmod +x "${MASTER_DIR}/tg_master.sh"
|
||||||
|
|
||||||
# 写入看门狗 Cron (容错版)
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_master || true
|
echo "💡 检测到 Systemd 环境,正在部署原生守护服务..."
|
||||||
echo "* * * * * pgrep -f tg_master.sh >/dev/null || nohup bash ${MASTER_DIR}/tg_master.sh >/dev/null 2>&1 &" >> /tmp/cron_master
|
|
||||||
[ -f /tmp/cron_master ] && crontab /tmp/cron_master 2>/dev/null
|
cat > /etc/systemd/system/ip-sentinel-master.service << EOF
|
||||||
rm -f /tmp/cron_master
|
[Unit]
|
||||||
|
Description=IP-Sentinel Master Command Center Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
# 立刻启动 (追加 disown 彻底脱离终端管控,实现绝对静默)
|
[Service]
|
||||||
pgrep -f tg_master.sh >/dev/null || { nohup bash "${MASTER_DIR}/tg_master.sh" >/dev/null 2>&1 & disown 2>/dev/null; }
|
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
|
||||||
|
|
||||||
|
[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" > /tmp/cron_master || true
|
||||||
|
[ -f /tmp/cron_master ] && crontab /tmp/cron_master 2>/dev/null
|
||||||
|
rm -f /tmp/cron_master
|
||||||
|
else
|
||||||
|
echo "💡 未检测到 Systemd,回退到 Cron 看门狗调度模式..."
|
||||||
|
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_master || true
|
||||||
|
echo "* * * * * pgrep -f tg_master.sh >/dev/null || nohup bash ${MASTER_DIR}/tg_master.sh >/dev/null 2>&1 &" >> /tmp/cron_master
|
||||||
|
[ -f /tmp/cron_master ] && crontab /tmp/cron_master 2>/dev/null
|
||||||
|
rm -f /tmp/cron_master
|
||||||
|
|
||||||
|
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 优化 & v3.6.1 OTA捷报: 战报文案分流] ==================
|
||||||
echo "========================================================"
|
echo "========================================================"
|
||||||
@@ -293,12 +357,15 @@ echo "========================================================"
|
|||||||
# =================================================================
|
# =================================================================
|
||||||
|
|
||||||
# ================== [v3.1.2 新增: 玻璃房透明装机统计] ==================
|
# ================== [v3.1.2 新增: 玻璃房透明装机统计] ==================
|
||||||
echo -e "\n📡 正在向开源社区汇报装机量 (完全匿名,不收集IP)..."
|
# [修复] 仅在全新部署时触发统计,司令部热重载时绝对不触发
|
||||||
MASTER_COUNT=$(curl -s -m 3 "https://ip-sentinel-count.samanthaestime296.workers.dev/ping/master" || echo "")
|
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 "")
|
||||||
|
|
||||||
if [ -n "$MASTER_COUNT" ] && [[ "$MASTER_COUNT" =~ ^[0-9]+$ ]]; then
|
if [ -n "$MASTER_COUNT" ] && [[ "$MASTER_COUNT" =~ ^[0-9]+$ ]]; then
|
||||||
echo -e "\033[32m✅ 感谢您成为全球第 ${MASTER_COUNT} 名 IP-Sentinel 指挥官!\033[0m"
|
echo -e "\033[32m✅ 感谢您成为全球第 ${MASTER_COUNT} 名 IP-Sentinel 指挥官!\033[0m"
|
||||||
else
|
else
|
||||||
echo -e "\033[32m✅ 感谢您建立 IP-Sentinel 司令部!\033[0m"
|
echo -e "\033[32m✅ 感谢您建立 IP-Sentinel 司令部!\033[0m"
|
||||||
|
fi
|
||||||
|
echo -e "\n"
|
||||||
fi
|
fi
|
||||||
echo -e "\n"
|
|
||||||
@@ -12,7 +12,7 @@ source "$CONF"
|
|||||||
# [核心: 运行态版本继承与云通信地址]
|
# [核心: 运行态版本继承与云通信地址]
|
||||||
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
|
REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/main"
|
||||||
# 临时改为开发地址用于测试
|
# 临时改为开发地址用于测试
|
||||||
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/dev-v3.6.1"
|
# REPO_RAW_URL="https://raw.githubusercontent.com/hotyue/IP-Sentinel/v3.6.2-rc"
|
||||||
# MASTER_VERSION 已经在上方的 source "$CONF" 中被载入
|
# MASTER_VERSION 已经在上方的 source "$CONF" 中被载入
|
||||||
# 如果本地极度陈旧没有该变量,才给定一个基础兜底值,避免变量为空导致崩溃
|
# 如果本地极度陈旧没有该变量,才给定一个基础兜底值,避免变量为空导致崩溃
|
||||||
MASTER_VERSION=${MASTER_VERSION:-"3.5.0"}
|
MASTER_VERSION=${MASTER_VERSION:-"3.5.0"}
|
||||||
@@ -22,32 +22,32 @@ OFFSET_FILE="${MASTER_DIR}/.tg_offset"
|
|||||||
|
|
||||||
# --- 工具函数 ---
|
# --- 工具函数 ---
|
||||||
send_ui() {
|
send_ui() {
|
||||||
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "{\"chat_id\":\"$1\",\"text\":\"$2\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$3}}" > /dev/null
|
-d "{\"chat_id\":\"$1\",\"text\":\"$2\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$3}}" > /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
send_msg() {
|
send_msg() {
|
||||||
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
|
||||||
-d "chat_id=$1" -d "text=$2" -d "parse_mode=Markdown" > /dev/null
|
-d "chat_id=$1" -d "text=$2" -d "parse_mode=Markdown" > /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
# ================== [v3.0.1 新增: 消息原位刷新函数] ==================
|
# ================== [v3.0.1 新增: 消息原位刷新函数] ==================
|
||||||
edit_msg() {
|
edit_msg() {
|
||||||
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
|
curl -s --connect-timeout 5 -m 10 -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
|
-d "chat_id=$1" -d "message_id=$2" -d "text=$3" -d "parse_mode=Markdown" > /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
# [v3.5.3 新增: 支持内联键盘的原位 UI 重绘函数]
|
# [v3.5.3 新增: 支持内联键盘的原位 UI 重绘函数]
|
||||||
edit_ui() {
|
edit_ui() {
|
||||||
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
|
curl -s --connect-timeout 5 -m 10 -X POST "https://api.telegram.org/bot${TG_TOKEN}/editMessageText" \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d "{\"chat_id\":\"$1\",\"message_id\":\"$2\",\"text\":\"$3\",\"parse_mode\":\"Markdown\",\"reply_markup\":{\"inline_keyboard\":$4}}" > /dev/null
|
-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() {
|
db_exec() {
|
||||||
sqlite3 "$DB_FILE" "$1"
|
printf ".timeout 5000\n%s\n" "$1" | sqlite3 "$DB_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ================== [v3.0.4 核心: 动态 HMAC 签名生成器] ==================
|
# ================== [v3.0.4 核心: 动态 HMAC 签名生成器] ==================
|
||||||
@@ -65,10 +65,15 @@ generate_signed_url() {
|
|||||||
local signature=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$CHAT_ID" | awk '{print $NF}')
|
local signature=$(echo -n "$payload" | openssl dgst -sha256 -hmac "$CHAT_ID" | awk '{print $NF}')
|
||||||
|
|
||||||
# 返回最终带签名的 URL
|
# 返回最终带签名的 URL
|
||||||
echo "http://${target_ip}:${target_port}${action_path}?t=${current_t}&sign=${signature}"
|
echo "https://${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-v3.6.0 核心: 数据库结构无损热升级] ==================
|
||||||
# 自动探测并增加缺失字段,屏蔽已存在的报错,保护老节点数据
|
# 自动探测并增加缺失字段,屏蔽已存在的报错,保护老节点数据
|
||||||
db_exec "ALTER TABLE nodes ADD COLUMN region TEXT DEFAULT 'UNKNOWN';" 2>/dev/null
|
db_exec "ALTER TABLE nodes ADD COLUMN region TEXT DEFAULT 'UNKNOWN';" 2>/dev/null
|
||||||
@@ -78,10 +83,20 @@ db_exec "ALTER TABLE nodes ADD COLUMN enable_trust TEXT DEFAULT 'true';" 2>/dev/
|
|||||||
db_exec "ALTER TABLE nodes ADD COLUMN enable_ota TEXT DEFAULT 'false';" 2>/dev/null
|
db_exec "ALTER TABLE nodes ADD COLUMN enable_ota TEXT DEFAULT 'false';" 2>/dev/null
|
||||||
# ========================================================================
|
# ========================================================================
|
||||||
|
|
||||||
|
# ================== [v4.0.0 核心: 增加 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
|
||||||
|
# ========================================================================
|
||||||
|
|
||||||
# --- 核心轮询循环 ---
|
# --- 核心轮询循环 ---
|
||||||
while true; do
|
while true; do
|
||||||
OFFSET=$(cat $OFFSET_FILE)
|
OFFSET=$(cat $OFFSET_FILE)
|
||||||
UPDATES=$(curl -s "https://api.telegram.org/bot${TG_TOKEN}/getUpdates?offset=${OFFSET}&timeout=30")
|
UPDATES=$(curl -s --connect-timeout 5 -m 35 "https://api.telegram.org/bot${TG_TOKEN}/getUpdates?offset=${OFFSET}&timeout=30")
|
||||||
|
|
||||||
COUNT=$(echo "$UPDATES" | jq -r '.result | length' 2>/dev/null)
|
COUNT=$(echo "$UPDATES" | jq -r '.result | length' 2>/dev/null)
|
||||||
|
|
||||||
@@ -92,6 +107,23 @@ while true; do
|
|||||||
|
|
||||||
CHAT_ID=$(echo "$UPDATE" | jq -r '.message.chat.id // .callback_query.message.chat.id')
|
CHAT_ID=$(echo "$UPDATE" | jq -r '.message.chat.id // .callback_query.message.chat.id')
|
||||||
TEXT=$(echo "$UPDATE" | jq -r '.message.text // .callback_query.data')
|
TEXT=$(echo "$UPDATE" | jq -r '.message.text // .callback_query.data')
|
||||||
|
|
||||||
|
# ================== [v4.0.0 新增: 深海声呐暗号拦截与落盘] ==================
|
||||||
|
if [[ "$TEXT" == *"[SYSTEM_REPORT]|QUALITY|"* ]]; then
|
||||||
|
# 截获系统隐写报告,提取分数并存库 (格式: [SYSTEM_REPORT]|QUALITY|NODE_NAME|SCORE|NF_STAT)
|
||||||
|
REPORT_DATA=$(echo "$TEXT" | grep -o "\[SYSTEM_REPORT\].*")
|
||||||
|
NODE_ID=$(echo "$REPORT_DATA" | cut -d'|' -f3 | tr -cd 'a-zA-Z0-9_.-')
|
||||||
|
SCORE=$(echo "$REPORT_DATA" | cut -d'|' -f4 | tr -cd '0-9')
|
||||||
|
NF_ST=$(echo "$REPORT_DATA" | cut -d'|' -f5 | tr -cd 'a-zA-Z0-9_-')
|
||||||
|
|
||||||
|
if [ -n "$NODE_ID" ] && [ -n "$SCORE" ]; then
|
||||||
|
db_exec "INSERT INTO ip_trend_log (node_name, scam_score, nf_status) VALUES ('$NODE_ID', '$SCORE', '$NF_ST');"
|
||||||
|
fi
|
||||||
|
# 无需回复用户,因为 Agent 原战报已发在群中
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# ======================================================================
|
||||||
|
|
||||||
REPLY_TO_TEXT=$(echo "$UPDATE" | jq -r '.message.reply_to_message.text // empty')
|
REPLY_TO_TEXT=$(echo "$UPDATE" | jq -r '.message.reply_to_message.text // empty')
|
||||||
|
|
||||||
# ================== [v3.5.2 新增: 拦截别名修改的对话回复] ==================
|
# ================== [v3.5.2 新增: 拦截别名修改的对话回复] ==================
|
||||||
@@ -116,7 +148,7 @@ while true; do
|
|||||||
|
|
||||||
# 告诉 TG 官方“指令已收到”,立刻消除按钮上的加载圈圈
|
# 告诉 TG 官方“指令已收到”,立刻消除按钮上的加载圈圈
|
||||||
if [ -n "$CB_ID" ]; then
|
if [ -n "$CB_ID" ]; then
|
||||||
curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/answerCallbackQuery" -d "callback_query_id=${CB_ID}" > /dev/null
|
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
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
@@ -178,7 +210,8 @@ while true; do
|
|||||||
case "$REGION_NAME" in
|
case "$REGION_NAME" in
|
||||||
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
||||||
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
||||||
"CA") FLAG="🇨🇦" ;; "AU") FLAG="🇦🇺" ;; "KR") FLAG="🇰🇷" ;; "NL") FLAG="🇳🇱" ;; "BR") FLAG="🇧🇷" ;; "IN") FLAG="🇮🇳" ;; "TW") FLAG="🇹🇼" ;;
|
"CA") FLAG="🇨🇦" ;; "AU") FLAG="🇦🇺" ;; "KR") FLAG="🇰🇷" ;; "NL") FLAG="🇳🇱" ;;
|
||||||
|
"BR") FLAG="🇧🇷" ;; "IN") FLAG="🇮🇳" ;; "TW") FLAG="🇹🇼" ;;
|
||||||
esac
|
esac
|
||||||
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
||||||
done <<< "$REGION_DATA"
|
done <<< "$REGION_DATA"
|
||||||
@@ -236,7 +269,8 @@ while true; do
|
|||||||
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒全舰队执行 OTA 升级...**%0A*(节点升级成功后会主动发回新的入库确认,请注意查收)*"
|
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒全舰队执行 OTA 升级...**%0A*(节点升级成功后会主动发回新的入库确认,请注意查收)*"
|
||||||
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
||||||
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_ota")
|
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_ota")
|
||||||
curl -s -m 5 "$TARGET_URL" > /dev/null &
|
# [灾难救援通道] 仅针对 OTA 允许一次明文回退,抢救缺失证书的老节点
|
||||||
|
{ curl -k -s -m 5 "$TARGET_URL" || curl -s -m 5 "${TARGET_URL/https:\/\//http:\/\/}"; } > /dev/null &
|
||||||
sleep 0.3 # 严格流量削峰
|
sleep 0.3 # 严格流量削峰
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -260,13 +294,29 @@ while true; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 下载最新的 master install 脚本作为幽灵进程
|
# 下载最新的 master install 脚本作为幽灵进程
|
||||||
curl -sL "${REPO_RAW_URL}/master/install_master.sh" -o "/tmp/install_master.sh"
|
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"
|
chmod +x "/tmp/install_master.sh"
|
||||||
|
|
||||||
# 抛出幽灵进程进行脱壳升级,传递静默变量与回执 ID
|
# 抛出幽灵进程进行脱壳升级,传递静默变量与回执 ID
|
||||||
export SILENT_MASTER_OTA="true"
|
# [修复] 必须显式将环境变量注入到 bash -c 的指令串中,防止被 systemd-run 沙盒隔离丢弃
|
||||||
export OTA_CHAT_ID="$CHAT_ID"
|
if command -v systemd-run >/dev/null 2>&1; then
|
||||||
nohup bash /tmp/install_master.sh >/dev/null 2>&1 & disown
|
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
|
sleep 10
|
||||||
@@ -277,11 +327,13 @@ while true; do
|
|||||||
if [ -z "$NODE_DATA" ]; then
|
if [ -z "$NODE_DATA" ]; then
|
||||||
send_msg "$CHAT_ID" "⚠️ 您名下暂无在线节点。"
|
send_msg "$CHAT_ID" "⚠️ 您名下暂无在线节点。"
|
||||||
else
|
else
|
||||||
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在召唤所有哨兵回传简报...**"
|
# [文案优化] 提前告知指挥官需要排队等待
|
||||||
|
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在召唤所有哨兵回传简报...**%0A*(为防止触发 TG 官方限流,简报将排队依次送达,请耐心等待)*"
|
||||||
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
||||||
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_report")
|
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_report")
|
||||||
curl -s -m 5 "$TARGET_URL" > /dev/null &
|
curl -k -s -m 5 "$TARGET_URL" > /dev/null &
|
||||||
sleep 0.2 # [新增] 流量削峰:每秒最多并发下发 5 个,保护 Master 网络栈
|
# [致命修复] 强行休眠 2 秒!错开 TG 官方 1条/秒 的发信红线
|
||||||
|
sleep 2
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -295,13 +347,91 @@ while true; do
|
|||||||
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒所有哨兵执行系统维护...**"
|
send_msg "$CHAT_ID" "📢 **司令部指令下达:正在唤醒所有哨兵执行系统维护...**"
|
||||||
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
echo "$NODE_DATA" | while IFS='|' read -r NNAME AIP APORT; do
|
||||||
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_run")
|
TARGET_URL=$(generate_signed_url "$AIP" "$APORT" "/trigger_run")
|
||||||
curl -s -m 5 "$TARGET_URL" > /dev/null &
|
curl -k -s -m 5 "$TARGET_URL" > /dev/null &
|
||||||
sleep 0.2 # [新增] 流量削峰:防止瞬间 fork 导致句柄耗尽
|
sleep 0.2 # [新增] 流量削峰:防止瞬间 fork 导致句柄耗尽
|
||||||
done
|
done
|
||||||
fi
|
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\`\n或通过雷达面板进行选择操作。"
|
||||||
|
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" ] || [ -z "$RESPONSE" ]; then
|
||||||
|
TARGET_URL_HTTP="${TARGET_URL/https:\/\//http:\/\/}"
|
||||||
|
RESPONSE=$(curl -s -m 5 "$TARGET_URL_HTTP" || echo "FAILED")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 结果判定
|
||||||
|
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\`\n或通过雷达面板进行选择操作。"
|
||||||
|
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, nf_status FROM ip_trend_log WHERE node_name='$TARGET_NODE' ORDER BY check_time DESC LIMIT 10;")
|
||||||
|
|
||||||
|
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}] IP 污染趋势图谱*\n\n"
|
||||||
|
TEXT_RES+="时间 (本地) | 风险分 | NF解锁\n"
|
||||||
|
TEXT_RES+="------------------------------------\n"
|
||||||
|
|
||||||
|
while IFS='|' read -r c_time score nf; do
|
||||||
|
[ -z "$score" ] && score="0"
|
||||||
|
[ -z "$nf" ] && nf="Unknown"
|
||||||
|
if [ "$score" -le 20 ]; then SCORE_EMJ="🟢"
|
||||||
|
elif [ "$score" -le 60 ]; then SCORE_EMJ="🟡"
|
||||||
|
else SCORE_EMJ="🔴"
|
||||||
|
fi
|
||||||
|
TEXT_RES+="\`${c_time}\` | ${SCORE_EMJ} \`${score}\` | \`${nf}\`\n"
|
||||||
|
done <<< "$TREND_DATA"
|
||||||
|
TEXT_RES+="\n_💡 提示:高危风险分 (🔴 >60) 极易触发 Google 验证码及 Cloudflare 5秒盾拦截。_"
|
||||||
|
|
||||||
|
send_msg "$CHAT_ID" "$TEXT_RES"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
# ------------------- 🚨 插入代码到此结束 -------------------
|
||||||
|
|
||||||
"list_nodes")
|
"list_nodes")
|
||||||
# 【V3.1.3】一级菜单:大区聚合并列出数量
|
# 【V3.1.3】一级菜单:大区聚合并列出数量
|
||||||
REGION_DATA=$(db_exec "SELECT region, COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID' GROUP BY region;")
|
REGION_DATA=$(db_exec "SELECT region, COUNT(*) FROM nodes WHERE chat_id='$CHAT_ID' GROUP BY region;")
|
||||||
@@ -313,9 +443,10 @@ while true; do
|
|||||||
[ -z "$REGION_NAME" ] && REGION_NAME="UNKNOWN"
|
[ -z "$REGION_NAME" ] && REGION_NAME="UNKNOWN"
|
||||||
FLAG="🌐"
|
FLAG="🌐"
|
||||||
case "$REGION_NAME" in
|
case "$REGION_NAME" in
|
||||||
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
||||||
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
||||||
"CA") FLAG="🇨🇦" ;; "AU") FLAG="🇦🇺" ;; "KR") FLAG="🇰🇷" ;; "NL") FLAG="🇳🇱" ;; "BR") FLAG="🇧🇷" ;; "IN") FLAG="🇮🇳" ;; "TW") FLAG="🇹🇼" ;;
|
"CA") FLAG="🇨🇦" ;; "AU") FLAG="🇦🇺" ;; "KR") FLAG="🇰🇷" ;; "NL") FLAG="🇳🇱" ;;
|
||||||
|
"BR") FLAG="🇧🇷" ;; "IN") FLAG="🇮🇳" ;; "TW") FLAG="🇹🇼" ;;
|
||||||
esac
|
esac
|
||||||
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
||||||
done <<< "$REGION_DATA"
|
done <<< "$REGION_DATA"
|
||||||
@@ -377,8 +508,8 @@ while true; do
|
|||||||
[ "$ST_GOOGLE" == "true" ] && BTN_G="🟢 Google巡逻: 已开" && ACT_G="false" || { BTN_G="🔴 Google巡逻: 已停"; ACT_G="true"; }
|
[ "$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"; }
|
[ "$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\":\"📜 提取终端实时日志\",\"callback_data\":\"log:$TARGET_NODE\"}, {\"text\":\"📊 生成单机战报\",\"callback_data\":\"report:$TARGET_NODE\"}]"
|
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\"}]"
|
BTN_TOGGLE="[{\"text\":\"$BTN_G\",\"callback_data\":\"toggle:google:$TARGET_NODE:$ACT_G\"}, {\"text\":\"$BTN_T\",\"callback_data\":\"toggle:trust:$TARGET_NODE:$ACT_T\"}]"
|
||||||
@@ -418,7 +549,8 @@ while true; do
|
|||||||
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_toggle")
|
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_toggle")
|
||||||
TARGET_URL="${TARGET_URL}&mod=${MOD_NAME}&state=${TARGET_STATE}"
|
TARGET_URL="${TARGET_URL}&mod=${MOD_NAME}&state=${TARGET_STATE}"
|
||||||
|
|
||||||
RESPONSE=$(curl -s -m 5 "$TARGET_URL" || echo "FAILED")
|
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
|
||||||
|
|
||||||
if [[ "$RESPONSE" == *"Action Accepted"* ]]; then
|
if [[ "$RESPONSE" == *"Action Accepted"* ]]; then
|
||||||
# 下发成功,更新 DB,原位重绘
|
# 下发成功,更新 DB,原位重绘
|
||||||
db_exec "UPDATE nodes SET enable_${MOD_NAME}='$TARGET_STATE' WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
|
db_exec "UPDATE nodes SET enable_${MOD_NAME}='$TARGET_STATE' WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
|
||||||
@@ -440,7 +572,8 @@ while true; do
|
|||||||
[ "$ST_GOOGLE" == "true" ] && BTN_G="🟢 Google巡逻: 已开" && ACT_G="false" || { BTN_G="🔴 Google巡逻: 已停"; ACT_G="true"; }
|
[ "$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"; }
|
[ "$ST_TRUST" == "true" ] && BTN_T="🟢 信用净化: 已开" && ACT_T="false" || { BTN_T="🔴 信用净化: 已停"; ACT_T="true"; }
|
||||||
|
|
||||||
BTN_ACTION="[{\"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\"}]"
|
# 模块一:即时战术动作 (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\"}]"
|
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
|
if [ "$IS_OFFICIAL_GATEWAY" != "true" ] && [ "$ST_OTA" == "true" ]; then
|
||||||
@@ -456,7 +589,7 @@ while true; do
|
|||||||
TEXT_MSG="⚙️ **目标锁定**: \`$TARGET_ALIAS\`\n(底层标识: \`$TARGET_NODE\`)\n🌐 IP 坐标: \`$A_IP\`\n🕒 最后通讯: \`$LAST_SEEN\`\n\n✅ **执行成功**: 模块 [$MOD_NAME] 状态已切换为 $TARGET_STATE!"
|
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"
|
edit_ui "$CHAT_ID" "$MSG_ID" "$TEXT_MSG" "$BTNS"
|
||||||
else
|
else
|
||||||
send_msg "$CHAT_ID" "❌ 指令下发失败,节点可能离线或未更新至 v3.5.3。"
|
send_msg "$CHAT_ID" "❌ 指令下发失败,安全策略禁止降级重试。"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
@@ -481,6 +614,8 @@ while true; do
|
|||||||
case "$REGION_NAME" in
|
case "$REGION_NAME" in
|
||||||
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
"US") FLAG="🇺🇸" ;; "JP") FLAG="🇯🇵" ;; "HK") FLAG="🇭🇰" ;;
|
||||||
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
"SG") FLAG="🇸🇬" ;; "UK"|"GB") FLAG="🇬🇧" ;; "DE") FLAG="🇩🇪" ;; "FR") FLAG="🇫🇷" ;;
|
||||||
|
"CA") FLAG="🇨🇦" ;; "AU") FLAG="🇦🇺" ;; "KR") FLAG="🇰🇷" ;; "NL") FLAG="🇳🇱" ;;
|
||||||
|
"BR") FLAG="🇧🇷" ;; "IN") FLAG="🇮🇳" ;; "TW") FLAG="🇹🇼" ;;
|
||||||
esac
|
esac
|
||||||
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
BTNS="$BTNS[{\"text\":\"$FLAG $REGION_NAME ($NODE_COUNT 台)\",\"callback_data\":\"region:$REGION_NAME\"}],"
|
||||||
done <<< "$REGION_DATA"
|
done <<< "$REGION_DATA"
|
||||||
@@ -516,10 +651,10 @@ while true; do
|
|||||||
ALIAS_B64=$(echo -n "$NEW_ALIAS" | base64 | tr -d '\n' | tr '+/' '-_')
|
ALIAS_B64=$(echo -n "$NEW_ALIAS" | base64 | tr -d '\n' | tr '+/' '-_')
|
||||||
TARGET_URL="${TARGET_URL}&b64=${ALIAS_B64}"
|
TARGET_URL="${TARGET_URL}&b64=${ALIAS_B64}"
|
||||||
|
|
||||||
RESPONSE=$(curl -s -m 5 "$TARGET_URL" || echo "FAILED")
|
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
|
||||||
|
|
||||||
if [ "$RESPONSE" == "FAILED" ]; then
|
if [ "$RESPONSE" == "FAILED" ]; then
|
||||||
send_msg "$CHAT_ID" "❌ 指令下发超时!请检查节点连通性。"
|
send_msg "$CHAT_ID" "❌ 指令下发超时!为防范劫持风险,已终止请求。"
|
||||||
elif [[ "$RESPONSE" == *"Action Accepted"* ]]; then
|
elif [[ "$RESPONSE" == *"Action Accepted"* ]]; then
|
||||||
# [v3.5.2 极致丝滑] 确认 Agent 修改成功后,Master 立即自动同步本地 SQLite 数据库!
|
# [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';"
|
db_exec "UPDATE nodes SET node_alias='$NEW_ALIAS' WHERE chat_id='$CHAT_ID' AND node_name='$TARGET_NODE';"
|
||||||
@@ -556,14 +691,22 @@ while true; do
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_ota")
|
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_ota")
|
||||||
RESPONSE=$(curl -s -m 5 "$TARGET_URL" || echo "FAILED")
|
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
|
||||||
|
|
||||||
|
# [灾难救援通道] 仅针对 OTA 开放一次性明文降级,用于抢救缺失 openssl 证书的老节点
|
||||||
if [ "$RESPONSE" == "FAILED" ]; then
|
if [ "$RESPONSE" == "FAILED" ]; then
|
||||||
TEXT_RES="❌ OTA 指令下发超时!请检查节点公网连通性。"
|
TARGET_URL_HTTP="${TARGET_URL/https:\/\//http:\/\/}"
|
||||||
|
RESPONSE=$(curl -s -m 5 "$TARGET_URL_HTTP" || echo "FAILED")
|
||||||
|
|
||||||
|
if [[ "$RESPONSE" == *"Action Accepted"* ]]; then
|
||||||
|
TEXT_RES="⚠️ **明文救援成功**:该节点因缺失证书处于 HTTP 裸奔状态!已强行下发 OTA 抢救指令,请等待其重构 TLS 装甲。"
|
||||||
|
else
|
||||||
|
TEXT_RES="❌ OTA 指令下发彻底失败!节点已失联或网络阻断。"
|
||||||
|
fi
|
||||||
elif [[ "$RESPONSE" == *"403"* ]]; then
|
elif [[ "$RESPONSE" == *"403"* ]]; then
|
||||||
TEXT_RES="⚠️ **节点拒绝执行**:该节点本地未开启 OTA 权限或运行在官方网关下!"
|
TEXT_RES="⚠️ **节点拒绝执行**:该节点本地未开启 OTA 权限或运行在官方网关下!"
|
||||||
else
|
else
|
||||||
TEXT_RES="✅ OTA 触发成功!节点正在后台执行拉取重构,请等待其发送更新完成的回执消息。"
|
TEXT_RES="✅ OTA (TLS加密) 触发成功!节点正在后台执行拉取重构..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$MSG_ID" ]; then
|
if [ -n "$MSG_ID" ]; then
|
||||||
@@ -576,10 +719,10 @@ while true; do
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# 【核心升级】增加拦截规则,支持 google 和 trust 前缀
|
# 【核心升级 v4.0.0】增加拦截规则,支持 quality 前缀
|
||||||
google:*|trust:*|run:*|report:*|log:*)
|
google:*|trust:*|run:*|report:*|log:*|quality:*)
|
||||||
# 🛡️ 提取并强制过滤动作参数、节点名与 CHAT_ID
|
# 🛡️ 提取并强制过滤动作参数、节点名与 CHAT_ID
|
||||||
ACTION_TYPE=$(echo "$TEXT" | cut -d':' -f1 | tr -cd 'a-z')
|
ACTION_TYPE=$(echo "$TEXT" | cut -d':' -f1)
|
||||||
TARGET_NODE=$(echo "$TEXT" | cut -d':' -f2 | tr -cd 'a-zA-Z0-9_.-')
|
TARGET_NODE=$(echo "$TEXT" | cut -d':' -f2 | tr -cd 'a-zA-Z0-9_.-')
|
||||||
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
|
CHAT_ID=$(echo "$CHAT_ID" | tr -cd '0-9-')
|
||||||
|
|
||||||
@@ -597,11 +740,11 @@ while true; do
|
|||||||
|
|
||||||
# 🛡️ [v3.0.4] 动态签名生成与触发 (防重放与防篡改)
|
# 🛡️ [v3.0.4] 动态签名生成与触发 (防重放与防篡改)
|
||||||
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_${ACTION_TYPE}")
|
TARGET_URL=$(generate_signed_url "$AGENT_IP" "$AGENT_PORT" "/trigger_${ACTION_TYPE}")
|
||||||
RESPONSE=$(curl -s -m 5 "$TARGET_URL" || echo "FAILED")
|
RESPONSE=$(curl -k -s -m 5 "$TARGET_URL" || echo "FAILED")
|
||||||
|
|
||||||
# 结果判定
|
# 结果判定
|
||||||
if [ "$RESPONSE" == "FAILED" ]; then
|
if [ "$RESPONSE" == "FAILED" ]; then
|
||||||
TEXT_RES="❌ 指令下发超时或失败!请检查节点公网 IP 或防火墙端口 ($AGENT_PORT) 是否放行。"
|
TEXT_RES="❌ 指令下发超时或失败!为保护链路安全,已终止通信 (严禁降级为 HTTP)。"
|
||||||
elif [[ "$RESPONSE" == *"403"* ]]; then
|
elif [[ "$RESPONSE" == *"403"* ]]; then
|
||||||
TEXT_RES="⚠️ **拒绝执行**:该节点未在本地开启此模块,请检查安装时的配置!"
|
TEXT_RES="⚠️ **拒绝执行**:该节点未在本地开启此模块,请检查安装时的配置!"
|
||||||
else
|
else
|
||||||
@@ -609,6 +752,8 @@ while true; do
|
|||||||
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 📍 Google 纠偏程序启动。"
|
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 📍 Google 纠偏程序启动。"
|
||||||
elif [ "$ACTION_TYPE" == "trust" ]; then
|
elif [ "$ACTION_TYPE" == "trust" ]; then
|
||||||
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 🛡️ IP 信用净化程序启动。"
|
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 🛡️ IP 信用净化程序启动。"
|
||||||
|
elif [ "$ACTION_TYPE" == "quality" ]; then
|
||||||
|
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 回应: 🔍 深海声呐已投放!请等待异步战报回传。"
|
||||||
elif [ "$ACTION_TYPE" == "log" ]; then
|
elif [ "$ACTION_TYPE" == "log" ]; then
|
||||||
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 正在抓取日志..."
|
TEXT_RES="✅ 节点 \`$TARGET_NODE\` 正在抓取日志..."
|
||||||
else
|
else
|
||||||
@@ -626,6 +771,46 @@ while true; do
|
|||||||
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
|
send_msg "$CHAT_ID" "❌ 数据库中未找到该节点的通讯地址。"
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
|
||||||
|
trend:*)
|
||||||
|
# [v4.0.0 新增: 生成 IP 质量趋势图]
|
||||||
|
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, nf_status FROM ip_trend_log WHERE node_name='$TARGET_NODE' ORDER BY check_time DESC LIMIT 10;")
|
||||||
|
|
||||||
|
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}] IP 污染趋势图谱*\n\n"
|
||||||
|
TEXT_RES+="时间 (本地) | 风险分 | NF解锁\n"
|
||||||
|
TEXT_RES+="------------------------------------\n"
|
||||||
|
|
||||||
|
while IFS='|' read -r c_time score nf; do
|
||||||
|
# 清洗数据防空
|
||||||
|
[ -z "$score" ] && score="0"
|
||||||
|
[ -z "$nf" ] && nf="Unknown"
|
||||||
|
|
||||||
|
if [ "$score" -le 20 ]; then SCORE_EMJ="🟢"
|
||||||
|
elif [ "$score" -le 60 ]; then SCORE_EMJ="🟡"
|
||||||
|
else SCORE_EMJ="🔴"
|
||||||
|
fi
|
||||||
|
TEXT_RES+="\`${c_time}\` | ${SCORE_EMJ} \`${score}\` | \`${nf}\`\n"
|
||||||
|
done <<< "$TREND_DATA"
|
||||||
|
TEXT_RES+="\n_💡 提示:高危风险分 (🔴 >60) 极易触发 Google 验证码及 Cloudflare 5秒盾拦截。_"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$MSG_ID" ]; then
|
||||||
|
edit_msg "$CHAT_ID" "$MSG_ID" "$TEXT_RES"
|
||||||
|
else
|
||||||
|
send_msg "$CHAT_ID" "$TEXT_RES"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -5,6 +5,15 @@
|
|||||||
# 核心功能: 终止调度进程、清理看门狗定时任务、抹除数据库与配置
|
# 核心功能: 终止调度进程、清理看门狗定时任务、抹除数据库与配置
|
||||||
# ==========================================================
|
# ==========================================================
|
||||||
|
|
||||||
|
# ==========================================================
|
||||||
|
# 🛑 核心权限防线: 检查是否以 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"
|
MASTER_DIR="/opt/ip_sentinel_master"
|
||||||
CONF_FILE="${MASTER_DIR}/master.conf"
|
CONF_FILE="${MASTER_DIR}/master.conf"
|
||||||
|
|
||||||
@@ -25,19 +34,30 @@ if [[ ! "$CONFIRM_DEL" =~ ^[Yy]$ ]]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 1. 停止运行中的 Master 守护进程
|
# 1. 停止并删除 Systemd 服务 (适配新架构)
|
||||||
echo "[1/3] 正在终止后台中枢调度进程..."
|
echo "[1/4] 正在停止并删除 Systemd 服务..."
|
||||||
# [优化] 使用 pkill 替代 pgrep | xargs,指令更短、容错率更高
|
if command -v systemctl >/dev/null 2>&1; then
|
||||||
|
echo "💡 检测到 Systemd 环境,正在抹除 Systemd 服务单元..."
|
||||||
|
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
|
||||||
|
|
||||||
|
# 2. 停止运行中的 Master 守护进程 (兜底清理老版进程)
|
||||||
|
echo "[2/4] 正在终止后台中枢调度进程..."
|
||||||
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
|
pkill -9 -f "tg_master.sh" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
# 2. 清除看门狗定时任务 (Cron)
|
# 3. 清除看门狗定时任务 (Cron)
|
||||||
echo "[2/3] 正在清理系统定时任务 (Cron)..."
|
echo "[3/4] 正在清理系统定时任务 (Cron)..."
|
||||||
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_backup
|
crontab -l 2>/dev/null | grep -v "tg_master.sh" > /tmp/cron_backup
|
||||||
crontab /tmp/cron_backup
|
crontab /tmp/cron_backup
|
||||||
rm -f /tmp/cron_backup
|
rm -f /tmp/cron_backup
|
||||||
|
|
||||||
# 3. 删除所有文件、配置与数据库
|
# 4. 删除所有文件、配置与数据库
|
||||||
echo "[3/3] 正在抹除核心程序、配置文件与 SQLite 数据库..."
|
echo "[4/4] 正在抹除核心程序、配置文件与 SQLite 数据库..."
|
||||||
if [ -d "$MASTER_DIR" ]; then
|
if [ -d "$MASTER_DIR" ]; then
|
||||||
rm -rf "$MASTER_DIR"
|
rm -rf "$MASTER_DIR"
|
||||||
fi
|
fi
|
||||||
|
|||||||
103
scripts/fetch_trust_urls.py
Normal file
103
scripts/fetch_trust_urls.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
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"]
|
||||||
|
}
|
||||||
|
|
||||||
|
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("========== 融合引擎执行完毕 ==========")
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
AGENT_VERSION=3.6.1
|
MASTER_VERSION=4.0.1
|
||||||
MASTER_VERSION=3.6.1
|
AGENT_VERSION=4.0.1
|
||||||
|
|||||||
Reference in New Issue
Block a user