快速更新加强版geodata文件到最新版本。
在上一篇文章中,介绍了如何集成加强版的geodata文件到openwrt。
但是这个加强版的geodata每日更新。按之前的办法,要去github查看新版本的信息,手动更新。太麻烦了……
这里面提供一个python脚本,可以方便的自动更新Makefile文件到最新版本。
使用方法将脚本的内容保存成文件。比如up_geodata.sh
文件。
然后运行脚本,指定要更新的Makefiel文件路径:
python3 up_geodata.sh -b Makefile
参数-b
表示备份旧的文件,不想备份可以不加。
mac或者linux,还可以直接添加可执行权限,当成应用来运行:
chmod +x up_geodata.sh
以下是脚本内容:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import re
import argparse
import shutil
import os
from datetime import datetime
# GitHub API URL
GITHUB_API_URL = "https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest"
# 需要下载的 SHA256 文件
FILES = {"geoip": "geoip.dat.sha256sum", "geosite": "geosite.dat.sha256sum"}
def get_latest_version():
"""获取 GitHub 最新 Release 版本号"""
response = requests.get(GITHUB_API_URL)
if response.status_code == 200:
release_data = response.json()
return release_data['tag_name'] # 获取最新版本号
else:
raise Exception("Failed to fetch release data from GitHub API")
def download_sha256sum_file(version, file_key):
"""下载 SHA256 校验文件"""
file_name = FILES[file_key]
url = f"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/{version}/{file_name}"
response = requests.get(url)
if response.status_code == 200:
return response.text.strip() # 直接返回文本内容
else:
raise Exception(
f"Failed to download {file_name} for version {version}")
def extract_hash(file_content):
"""解析 SHA256 文件中的哈希值"""
return file_content.split()[0] # 取第一列的哈希值
def backup_makefile(makefile_path):
"""备份 Makefile"""
if os.path.exists(makefile_path):
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
backup_path = f"{makefile_path}.bak_{timestamp}"
shutil.copy(makefile_path, backup_path)
print(f"✅ 备份已创建: {backup_path}")
else:
raise FileNotFoundError(f"❌ 未找到 Makefile: {makefile_path}")
def update_makefile(makefile_path, version, geoip_hash, geosite_hash):
"""修改 Makefile,更新版本号和哈希值"""
with open(makefile_path, "r") as file:
makefile_content = file.read()
# **修正版本号**
makefile_content = re.sub(r"(GEODATA_VER:=)\d+", r"\g<1>" + version,
makefile_content)
# **修正 geoip.dat 的 HASH**
makefile_content = re.sub(
r"(define Download/geoip\s+.*?\n\s+HASH:=)[a-f0-9]+",
r"\g<1>" + geoip_hash,
makefile_content,
flags=re.DOTALL)
# **修正 geosite.dat 的 HASH**
makefile_content = re.sub(
r"(define Download/geosite\s+.*?\n\s+HASH:=)[a-f0-9]+",
r"\g<1>" + geosite_hash,
makefile_content,
flags=re.DOTALL)
with open(makefile_path, "w") as file:
file.write(makefile_content)
print(
f"✅ Makefile 已成功更新: 版本 {version}, GeoIP Hash: {geoip_hash}, Geosite Hash: {geosite_hash}"
)
def main():
parser = argparse.ArgumentParser(
description="更新 Makefile 中的 v2ray-geodata 版本号和 HASH")
parser.add_argument("makefile", help="需要更新的 Makefile 路径")
parser.add_argument("-b",
"--backup",
action="store_true",
help="是否备份 Makefile")
args = parser.parse_args()
makefile_path = args.makefile
try:
# **只有在使用 -b 时才进行备份**
if args.backup:
backup_makefile(makefile_path)
# **获取最新版本号**
version = get_latest_version()
print(f"📌 最新版本号: {version}")
# **获取 SHA256 哈希值**
geoip_hash = extract_hash(download_sha256sum_file(version, "geoip"))
geosite_hash = extract_hash(download_sha256sum_file(
version, "geosite"))
print(f"📌 GeoIP Hash: {geoip_hash}")
print(f"📌 Geosite Hash: {geosite_hash}")
# **更新 Makefile**
update_makefile(makefile_path, version, geoip_hash, geosite_hash)
except Exception as e:
print(f"❌ 发生错误: {e}")
if __name__ == "__main__":
main()