mirror of
https://gitee.com/houhuan/TrendRadar.git
synced 2025-12-21 16:07:15 +08:00
v2.4.2
This commit is contained in:
parent
0c2f6fa065
commit
a118a788fd
3
.github/workflows/crawler.yml
vendored
3
.github/workflows/crawler.yml
vendored
@ -58,6 +58,9 @@ jobs:
|
|||||||
EMAIL_TO: ${{ secrets.EMAIL_TO }}
|
EMAIL_TO: ${{ secrets.EMAIL_TO }}
|
||||||
EMAIL_SMTP_SERVER: ${{ secrets.EMAIL_SMTP_SERVER }}
|
EMAIL_SMTP_SERVER: ${{ secrets.EMAIL_SMTP_SERVER }}
|
||||||
EMAIL_SMTP_PORT: ${{ secrets.EMAIL_SMTP_PORT }}
|
EMAIL_SMTP_PORT: ${{ secrets.EMAIL_SMTP_PORT }}
|
||||||
|
NTFY_TOPIC: ${{ secrets.NTFY_TOPIC }}
|
||||||
|
NTFY_SERVER_URL: ${{ secrets.NTFY_SERVER_URL }}
|
||||||
|
NTFY_TOKEN: ${{ secrets.NTFY_TOKEN }}
|
||||||
GITHUB_ACTIONS: true
|
GITHUB_ACTIONS: true
|
||||||
run: python main.py
|
run: python main.py
|
||||||
|
|
||||||
|
|||||||
@ -58,6 +58,9 @@ notification:
|
|||||||
email_to: "" # 收件人邮箱地址,多个收件人用逗号分隔
|
email_to: "" # 收件人邮箱地址,多个收件人用逗号分隔
|
||||||
email_smtp_server: "" # SMTP服务器地址(可选,留空自动识别)
|
email_smtp_server: "" # SMTP服务器地址(可选,留空自动识别)
|
||||||
email_smtp_port: "" # SMTP端口(可选,留空自动识别)
|
email_smtp_port: "" # SMTP端口(可选,留空自动识别)
|
||||||
|
ntfy_server_url: "https://ntfy.sh" # ntfy服务器地址,默认使用公共服务,可改为自托管地址
|
||||||
|
ntfy_topic: "" # ntfy主题名称
|
||||||
|
ntfy_token: "" # ntfy访问令牌(可选,用于私有主题)
|
||||||
|
|
||||||
# 用于让关注度更高的新闻在更前面显示,即用算法重新组合不同平台的热搜排序形成你侧重的热搜,合起来是 1 就行
|
# 用于让关注度更高的新闻在更前面显示,即用算法重新组合不同平台的热搜排序形成你侧重的热搜,合起来是 1 就行
|
||||||
weight:
|
weight:
|
||||||
|
|||||||
62
main.py
62
main.py
@ -20,7 +20,7 @@ import requests
|
|||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
|
|
||||||
VERSION = "2.4.1"
|
VERSION = "2.4.2"
|
||||||
|
|
||||||
|
|
||||||
# === SMTP邮件配置 ===
|
# === SMTP邮件配置 ===
|
||||||
@ -3738,9 +3738,9 @@ def send_to_ntfy(
|
|||||||
headers = {
|
headers = {
|
||||||
"Content-Type": "text/plain; charset=utf-8",
|
"Content-Type": "text/plain; charset=utf-8",
|
||||||
"Markdown": "yes",
|
"Markdown": "yes",
|
||||||
"Title": f"TrendRadar Report - {report_type_en}",
|
"Title": report_type_en,
|
||||||
"Priority": "default",
|
"Priority": "default",
|
||||||
"Tags": "newspaper,📰",
|
"Tags": "news",
|
||||||
}
|
}
|
||||||
|
|
||||||
if token:
|
if token:
|
||||||
@ -3761,27 +3761,37 @@ def send_to_ntfy(
|
|||||||
report_data, "ntfy", update_info, max_bytes=3800, mode=mode
|
report_data, "ntfy", update_info, max_bytes=3800, mode=mode
|
||||||
)
|
)
|
||||||
|
|
||||||
print(f"ntfy消息分为 {len(batches)} 批次发送 [{report_type}]")
|
total_batches = len(batches)
|
||||||
|
print(f"ntfy消息分为 {total_batches} 批次发送 [{report_type}]")
|
||||||
|
|
||||||
# 逐批发送
|
# 反转批次顺序,使得在ntfy客户端显示时顺序正确
|
||||||
|
# ntfy显示最新消息在上面,所以我们从最后一批开始推送
|
||||||
|
reversed_batches = list(reversed(batches))
|
||||||
|
|
||||||
|
print(f"ntfy将按反向顺序推送(最后批次先推送),确保客户端显示顺序正确")
|
||||||
|
|
||||||
|
# 逐批发送(反向顺序)
|
||||||
success_count = 0
|
success_count = 0
|
||||||
for i, batch_content in enumerate(batches, 1):
|
for idx, batch_content in enumerate(reversed_batches, 1):
|
||||||
|
# 计算正确的批次编号(用户视角的编号)
|
||||||
|
actual_batch_num = total_batches - idx + 1
|
||||||
|
|
||||||
batch_size = len(batch_content.encode("utf-8"))
|
batch_size = len(batch_content.encode("utf-8"))
|
||||||
print(
|
print(
|
||||||
f"发送ntfy第 {i}/{len(batches)} 批次,大小:{batch_size} 字节 [{report_type}]"
|
f"发送ntfy第 {actual_batch_num}/{total_batches} 批次(推送顺序: {idx}/{total_batches}),大小:{batch_size} 字节 [{report_type}]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 检查消息大小,确保不超过4KB
|
# 检查消息大小,确保不超过4KB
|
||||||
if batch_size > 4096:
|
if batch_size > 4096:
|
||||||
print(f"警告:ntfy第 {i} 批次消息过大({batch_size} 字节),可能被拒绝")
|
print(f"警告:ntfy第 {actual_batch_num} 批次消息过大({batch_size} 字节),可能被拒绝")
|
||||||
|
|
||||||
# 添加批次标识
|
# 添加批次标识(使用正确的批次编号)
|
||||||
current_headers = headers.copy()
|
current_headers = headers.copy()
|
||||||
if len(batches) > 1:
|
if total_batches > 1:
|
||||||
batch_header = f"**[第 {i}/{len(batches)} 批次]**\n\n"
|
batch_header = f"**[第 {actual_batch_num}/{total_batches} 批次]**\n\n"
|
||||||
batch_content = batch_header + batch_content
|
batch_content = batch_header + batch_content
|
||||||
current_headers["Title"] = (
|
current_headers["Title"] = (
|
||||||
f"TrendRadar Report - {report_type_en} ({i}/{len(batches)})"
|
f"{report_type_en} ({actual_batch_num}/{total_batches})"
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -3794,15 +3804,15 @@ def send_to_ntfy(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次发送成功 [{report_type}]")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次发送成功 [{report_type}]")
|
||||||
success_count += 1
|
success_count += 1
|
||||||
if i < len(batches):
|
if idx < total_batches:
|
||||||
# 公共服务器建议 2-3 秒,自托管可以更短
|
# 公共服务器建议 2-3 秒,自托管可以更短
|
||||||
interval = 2 if "ntfy.sh" in server_url else 1
|
interval = 2 if "ntfy.sh" in server_url else 1
|
||||||
time.sleep(interval)
|
time.sleep(interval)
|
||||||
elif response.status_code == 429:
|
elif response.status_code == 429:
|
||||||
print(
|
print(
|
||||||
f"ntfy第 {i}/{len(batches)} 批次速率限制 [{report_type}],等待后重试"
|
f"ntfy第 {actual_batch_num}/{total_batches} 批次速率限制 [{report_type}],等待后重试"
|
||||||
)
|
)
|
||||||
time.sleep(10) # 等待10秒后重试
|
time.sleep(10) # 等待10秒后重试
|
||||||
# 重试一次
|
# 重试一次
|
||||||
@ -3814,19 +3824,19 @@ def send_to_ntfy(
|
|||||||
timeout=30,
|
timeout=30,
|
||||||
)
|
)
|
||||||
if retry_response.status_code == 200:
|
if retry_response.status_code == 200:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次重试成功 [{report_type}]")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次重试成功 [{report_type}]")
|
||||||
success_count += 1
|
success_count += 1
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
f"ntfy第 {i}/{len(batches)} 批次重试失败,状态码:{retry_response.status_code}"
|
f"ntfy第 {actual_batch_num}/{total_batches} 批次重试失败,状态码:{retry_response.status_code}"
|
||||||
)
|
)
|
||||||
elif response.status_code == 413:
|
elif response.status_code == 413:
|
||||||
print(
|
print(
|
||||||
f"ntfy第 {i}/{len(batches)} 批次消息过大被拒绝 [{report_type}],消息大小:{batch_size} 字节"
|
f"ntfy第 {actual_batch_num}/{total_batches} 批次消息过大被拒绝 [{report_type}],消息大小:{batch_size} 字节"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print(
|
print(
|
||||||
f"ntfy第 {i}/{len(batches)} 批次发送失败 [{report_type}],状态码:{response.status_code}"
|
f"ntfy第 {actual_batch_num}/{total_batches} 批次发送失败 [{report_type}],状态码:{response.status_code}"
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
error_detail = response.text[:200] # 只显示前200字符的错误信息
|
error_detail = response.text[:200] # 只显示前200字符的错误信息
|
||||||
@ -3835,20 +3845,20 @@ def send_to_ntfy(
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
except requests.exceptions.ConnectTimeout:
|
except requests.exceptions.ConnectTimeout:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次连接超时 [{report_type}]")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次连接超时 [{report_type}]")
|
||||||
except requests.exceptions.ReadTimeout:
|
except requests.exceptions.ReadTimeout:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次读取超时 [{report_type}]")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次读取超时 [{report_type}]")
|
||||||
except requests.exceptions.ConnectionError as e:
|
except requests.exceptions.ConnectionError as e:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次连接错误 [{report_type}]:{e}")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次连接错误 [{report_type}]:{e}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"ntfy第 {i}/{len(batches)} 批次发送异常 [{report_type}]:{e}")
|
print(f"ntfy第 {actual_batch_num}/{total_batches} 批次发送异常 [{report_type}]:{e}")
|
||||||
|
|
||||||
# 判断整体发送是否成功
|
# 判断整体发送是否成功
|
||||||
if success_count == len(batches):
|
if success_count == total_batches:
|
||||||
print(f"ntfy所有 {len(batches)} 批次发送完成 [{report_type}]")
|
print(f"ntfy所有 {total_batches} 批次发送完成 [{report_type}]")
|
||||||
return True
|
return True
|
||||||
elif success_count > 0:
|
elif success_count > 0:
|
||||||
print(f"ntfy部分发送成功:{success_count}/{len(batches)} 批次 [{report_type}]")
|
print(f"ntfy部分发送成功:{success_count}/{total_batches} 批次 [{report_type}]")
|
||||||
return True # 部分成功也视为成功
|
return True # 部分成功也视为成功
|
||||||
else:
|
else:
|
||||||
print(f"ntfy发送完全失败 [{report_type}]")
|
print(f"ntfy发送完全失败 [{report_type}]")
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
[](https://github.com/sansan0/TrendRadar/stargazers)
|
[](https://github.com/sansan0/TrendRadar/stargazers)
|
||||||
[](https://github.com/sansan0/TrendRadar/network/members)
|
[](https://github.com/sansan0/TrendRadar/network/members)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://github.com/sansan0/TrendRadar)
|
[](https://github.com/sansan0/TrendRadar)
|
||||||
|
|
||||||
[](https://work.weixin.qq.com/)
|
[](https://work.weixin.qq.com/)
|
||||||
[](https://telegram.org/)
|
[](https://telegram.org/)
|
||||||
@ -464,11 +464,16 @@ GitHub 一键 Fork 即可使用,无需编程基础。
|
|||||||
- **小版本更新**:从 v2.x 升级到 v2.y, 用本项目的 `main.py` 代码替换你 fork 仓库中的对应文件
|
- **小版本更新**:从 v2.x 升级到 v2.y, 用本项目的 `main.py` 代码替换你 fork 仓库中的对应文件
|
||||||
- **大版本升级**:从 v1.x 升级到 v2.y, 建议删除现有 fork 后重新 fork,这样更省力且避免配置冲突
|
- **大版本升级**:从 v1.x 升级到 v2.y, 建议删除现有 fork 后重新 fork,这样更省力且避免配置冲突
|
||||||
|
|
||||||
### 2025/10/8 - v2.4.1
|
### 2025/10/8 - v2.4.2
|
||||||
|
|
||||||
- 修复 ntfy 推送编码问题
|
- 修复 ntfy 推送编码问题
|
||||||
|
- 修复配置文件缺失问题
|
||||||
|
- 优化 ntfy 推送效果
|
||||||
- 增加 github page 图片分段导出功能
|
- 增加 github page 图片分段导出功能
|
||||||
|
|
||||||
|
- **更新提示**:
|
||||||
|
- 建议使用【大版本更新】
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary><strong>👉 历史更新</strong></summary>
|
<summary><strong>👉 历史更新</strong></summary>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user