尝试修复push

This commit is contained in:
2026-08-05 12:07:02 +08:00 Unverified
parent ec0afcfbe2
commit bcea6361fa
2 changed files with 166 additions and 54 deletions
+17 -5
View File
@@ -1,23 +1,35 @@
name: CET Monitor name: CET Monitor
on: on:
schedule: schedule:
- cron: "17 * * * *" - cron: "17 * * * *"
workflow_dispatch: workflow_dispatch:
jobs: jobs:
monitor: monitor:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Checkout
- uses: actions/setup-python@v5 uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with: with:
python-version: "3.12" python-version: "3.12"
- run: pip install -r requirements.txt
- name: Run - name: Install
run: pip install -r requirements.txt
- name: Run monitor
env: env:
PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }}
run: python main.py run: python main.py
- name: Save state
- name: Commit state
run: | run: |
git config user.name "gitea-actions" git config user.name "gitea-actions"
git config user.email "actions@localhost" git config user.email "actions@localhost"
+146 -46
View File
@@ -1,61 +1,161 @@
import os,json,hashlib
import os
import json
import hashlib
from datetime import datetime, timezone from datetime import datetime, timezone
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
URL="https://cet.neea.edu.cn/"
STATE="data/state.json"
def category(t): URL = "https://cet.neea.edu.cn/"
if "报名" in t:return "📝 报名" STATE_FILE = "data/state.json"
if "成绩" in t:return "📊 成绩" PUSH_URL = "https://push.showdoc.com.cn/server/api/push"
if "准考证" in t:return "🎫 准考证"
if "考试" in t:return "📝 考试安排"
def fetch_notices():
headers = {
"User-Agent": "Mozilla/5.0"
}
for i in range(3):
try:
r = requests.get(URL, headers=headers, timeout=20)
r.encoding = "utf-8"
soup = BeautifulSoup(r.text, "lxml")
notices = []
for a in soup.find_all("a"):
title = a.get_text(strip=True)
href = a.get("href")
if title and any(k in title for k in [
"四六级", "CET", "成绩",
"报名", "考试", "准考证"
]):
notices.append({
"title": title,
"url": href
})
return notices[:20]
except Exception as e:
print(f"请求失败 {i+1}/3:", e)
return None
def make_hash(item):
return hashlib.sha256(
(item["title"] + str(item["url"])).encode("utf-8")
).hexdigest()
def load_state():
if not os.path.exists(STATE_FILE):
return {"items": []}
with open(STATE_FILE, "r", encoding="utf-8") as f:
return json.load(f)
def save_state(items):
os.makedirs("data", exist_ok=True)
with open(STATE_FILE, "w", encoding="utf-8") as f:
json.dump({
"items": items,
"last_check": datetime.now(timezone.utc).isoformat()
}, f, ensure_ascii=False, indent=2)
def category(title):
if "报名" in title:
return "📝 报名"
if "成绩" in title:
return "📊 成绩"
if "准考证" in title:
return "🎫 准考证"
if "考试" in title:
return "📅 考试安排"
return "📢 其他" return "📢 其他"
def fetch():
r=requests.get(URL,headers={"User-Agent":"Mozilla/5.0"},timeout=20)
r.encoding="utf-8"
soup=BeautifulSoup(r.text,"lxml")
out=[]
for a in soup.find_all("a"):
t=a.get_text(strip=True)
if t and any(k in t for k in ["四六级","CET","成绩","报名","考试","准考证"]):
out.append({"title":t,"url":a.get("href"),"category":category(t)})
return out[:20]
def load():
if not os.path.exists(STATE): return []
return json.load(open(STATE,encoding="utf-8")).get("items",[])
def save(items):
os.makedirs("data",exist_ok=True)
json.dump({"items":items,"last_check":datetime.now(timezone.utc).isoformat()},open(STATE,"w",encoding="utf-8"),ensure_ascii=False,indent=2)
def h(x):
return hashlib.sha256((x["title"]+str(x["url"])).encode()).hexdigest()
def push(items): def push(items):
token = os.getenv("PUSH_TOKEN") token = os.getenv("PUSH_TOKEN")
if not token:return
msg="📢 CET四六级新通知\n\n" if not token:
for x in items: print("ERROR: PUSH_TOKEN 未配置")
msg+=f"{x['category']}\n{x['title']}\n{x['url']}\n\n" return False
requests.post("https://push.showdoc.com.cn/server/api/push",
data={"title":"四六级新通知","content":msg,"token":token},timeout=10) content = "📢 CET四六级新通知\n\n"
for item in items:
content += (
f"{category(item['title'])}\n"
f"{item['title']}\n"
f"{item['url']}\n\n"
)
try:
r = requests.post(
PUSH_URL,
data={
"token": token,
"title": "四六级新通知",
"content": content
},
timeout=10
)
print("Push status:", r.status_code)
print("Push response:", r.text)
return r.ok
except Exception as e:
print("Push异常:", e)
return False
def main(): def main():
current=fetch() current = fetch_notices()
old={x.get("hash") for x in load()}
fresh=[] if current is None:
saved=[] print("获取公告失败,本轮跳过")
for x in current: return
x["hash"]=h(x)
saved.append(x) state = load_state()
if x["hash"] not in old:
fresh.append(x) old_hash = {
if fresh: push(fresh) x["hash"]
save(saved) for x in state.get("items", [])
}
new_items = []
for item in current:
item["hash"] = make_hash(item)
if item["hash"] not in old_hash:
new_items.append(item)
if not new_items:
print("没有新公告")
save_state(current)
return
print("发现新公告:", len(new_items))
if push(new_items):
print("推送成功,保存状态")
save_state(current)
else:
print("推送失败,不更新状态,等待下次重试")
if __name__ == "__main__": if __name__ == "__main__":
main() main()