From ec0afcfbe224fff49affffb05b2aea63a3b0545f Mon Sep 17 00:00:00 2001 From: biss Date: Wed, 5 Aug 2026 11:55:56 +0800 Subject: [PATCH] first init --- .gitea/workflows/monitor.yml | 26 +++++++++++++++ main.py | 61 ++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++ 3 files changed, 90 insertions(+) create mode 100644 .gitea/workflows/monitor.yml create mode 100644 main.py create mode 100644 requirements.txt diff --git a/.gitea/workflows/monitor.yml b/.gitea/workflows/monitor.yml new file mode 100644 index 0000000..8df5c88 --- /dev/null +++ b/.gitea/workflows/monitor.yml @@ -0,0 +1,26 @@ +name: CET Monitor +on: + schedule: + - cron: "17 * * * *" + workflow_dispatch: + +jobs: + monitor: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + - run: pip install -r requirements.txt + - name: Run + env: + PUSH_TOKEN: ${{ secrets.PUSH_TOKEN }} + run: python main.py + - name: Save state + run: | + git config user.name "gitea-actions" + git config user.email "actions@localhost" + git add data/state.json + git diff --cached --quiet || git commit -m "update cet state" + git push diff --git a/main.py b/main.py new file mode 100644 index 0000000..449d93e --- /dev/null +++ b/main.py @@ -0,0 +1,61 @@ +import os,json,hashlib +from datetime import datetime,timezone +import requests +from bs4 import BeautifulSoup + +URL="https://cet.neea.edu.cn/" +STATE="data/state.json" + +def category(t): + if "ๆŠฅๅ" in t:return "๐Ÿ“ ๆŠฅๅ" + if "ๆˆ็ปฉ" in t:return "๐Ÿ“Š ๆˆ็ปฉ" + if "ๅ‡†่€ƒ่ฏ" in t:return "๐ŸŽซ ๅ‡†่€ƒ่ฏ" + if "่€ƒ่ฏ•" in t: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): + token=os.getenv("PUSH_TOKEN") + if not token:return + msg="๐Ÿ“ข CETๅ››ๅ…ญ็บงๆ–ฐ้€š็Ÿฅ\n\n" + for x in items: + msg+=f"{x['category']}\n{x['title']}\n{x['url']}\n\n" + requests.post("https://push.showdoc.com.cn/server/api/push", + data={"title":"ๅ››ๅ…ญ็บงๆ–ฐ้€š็Ÿฅ","content":msg,"token":token},timeout=10) + +def main(): + current=fetch() + old={x.get("hash") for x in load()} + fresh=[] + saved=[] + for x in current: + x["hash"]=h(x) + saved.append(x) + if x["hash"] not in old: + fresh.append(x) + if fresh: push(fresh) + save(saved) + +if __name__=="__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b8ee43c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +requests +beautifulsoup4 +lxml