编写脚本
import requests
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
# === 1. 配置钉钉机器人 ===
webhook = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXX"
secret = "XXXXXXXX" # 如果没有加签验证,请设置为 None
# === 2. GitHub Releases API ===
GITHUB_API = "https://api.github.com/repos/tronprotocol/java-tron/releases"
def get_latest_mandatory_release():
try:
response = requests.get(GITHUB_API, timeout=10)
releases = response.json()
for release in releases:
body = release.get("body", "").lower()
if "mandatory upgrade" in body:
tag = release.get("tag_name")
html_url = release.get("html_url")
return tag, body.strip(), html_url
return None, None, None
except Exception as e:
return None, f"请求失败: {e}", None
def gen_sign(secret):
timestamp = str(round(time.time() * 1000))
string_to_sign = f'{timestamp}\n{secret}'
hmac_code = hmac.new(secret.encode(), string_to_sign.encode(), hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
return timestamp, sign
def send_to_dingtalk(title, content, link):
headers = {"Content-Type": "application/json"}
message = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": f"{title}\n\n{content}\n\n[查看详情]({link})"
}
}
url = webhook
if secret:
timestamp, sign = gen_sign(secret)
url += f"×tamp={timestamp}&sign={sign}"
resp = requests.post(url, headers=headers, data=json.dumps(message))
if resp.status_code != 200:
print(f"发送失败: {resp.status_code}, {resp.text}")
else:
print("✅ 已发送钉钉通知")
if __name__ == "__main__":
version, note, url = get_latest_mandatory_release()
if version and note:
send_to_dingtalk(
title=f"Java-Tron 发布 Mandatory 升级版本 {version}",
content=note[:500], # 钉钉限制最大消息体
link=url
)
else:
print("未发现 Mandatory 升级版本或请求失败")
编写定时任务
root@iZj6c2h0zqqhn8um6xho5uZ:~/python3# crontab -l
59 23 1,15 * * /usr/bin/python3 trx_mandatory_update.py
钉钉消息
点击详情就切换到当前最新版本,目前最新版本是
https://github.com/tronprotocol/java-tron/releases/tag/GreatVoyage-v4.8.0