feat: add Bark iOS push support with HTTP requests
This commit is contained in:
parent
e715ca7350
commit
da23eee4ec
Binary file not shown.
Binary file not shown.
@ -3,6 +3,10 @@ from fastapi import FastAPI
|
|||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# 添加项目根目录到路径
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
from backend.database import init_db
|
from backend.database import init_db
|
||||||
from backend.routers import channels, notify, history
|
from backend.routers import channels, notify, history
|
||||||
@ -35,15 +39,15 @@ app.include_router(channels.router)
|
|||||||
app.include_router(notify.router)
|
app.include_router(notify.router)
|
||||||
app.include_router(history.router)
|
app.include_router(history.router)
|
||||||
|
|
||||||
# 静态文件(前端)
|
|
||||||
frontend_path = os.path.join(os.path.dirname(__file__), "..", "frontend")
|
|
||||||
if os.path.exists(frontend_path):
|
|
||||||
app.mount("/", StaticFiles(directory=frontend_path, html=True), name="frontend")
|
|
||||||
|
|
||||||
@app.get("/api/health")
|
@app.get("/api/health")
|
||||||
async def health_check():
|
async def health_check():
|
||||||
return {"status": "ok"}
|
return {"status": "ok"}
|
||||||
|
|
||||||
|
# 静态文件(前端)- 放在最后
|
||||||
|
frontend_path = os.path.join(os.path.dirname(__file__), "..", "frontend")
|
||||||
|
if os.path.exists(frontend_path):
|
||||||
|
app.mount("/", StaticFiles(directory=frontend_path, html=True), name="frontend")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import uvicorn
|
import uvicorn
|
||||||
uvicorn.run("backend.main:app", host="0.0.0.0", port=8000, reload=True)
|
uvicorn.run("backend.main:app", host="0.0.0.0", port=8000, reload=True)
|
||||||
|
|||||||
@ -48,6 +48,14 @@ class NotifyService:
|
|||||||
elif channel.type == "apprise":
|
elif channel.type == "apprise":
|
||||||
return config.get("url", "")
|
return config.get("url", "")
|
||||||
|
|
||||||
|
# Bark iOS 推送 - 在 send_notification 中直接处理
|
||||||
|
elif channel.type == "bark":
|
||||||
|
base_url = config.get("base_url", "")
|
||||||
|
device_key = config.get("device_key", "")
|
||||||
|
if base_url and device_key:
|
||||||
|
# 返回特殊标记,实际发送在 send_notification 中处理
|
||||||
|
return "__bark__"
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
async def send_notification(
|
async def send_notification(
|
||||||
@ -101,7 +109,50 @@ class NotifyService:
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 发送通知
|
# Bark 特殊处理 - 使用 requests
|
||||||
|
if channel.type == "bark":
|
||||||
|
import requests
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
|
base_url = channel.config.get("base_url", "").rstrip("/")
|
||||||
|
device_key = channel.config.get("device_key", "")
|
||||||
|
|
||||||
|
# 强制使用 HTTP(因为你的 Bark 服务器 SSL 有问题)
|
||||||
|
if base_url.startswith("https://"):
|
||||||
|
base_url = base_url.replace("https://", "http://")
|
||||||
|
elif not base_url.startswith("http://"):
|
||||||
|
base_url = "http://" + base_url
|
||||||
|
|
||||||
|
# 构建 URL
|
||||||
|
encoded_body = urllib.parse.quote(str(body), safe='')
|
||||||
|
encoded_title = urllib.parse.quote(str(title), safe='') if title else ""
|
||||||
|
|
||||||
|
if encoded_title:
|
||||||
|
bark_url = f"{base_url}/{device_key}/{encoded_title}/{encoded_body}"
|
||||||
|
else:
|
||||||
|
bark_url = f"{base_url}/{device_key}/{encoded_body}"
|
||||||
|
|
||||||
|
# 添加参数
|
||||||
|
params = {}
|
||||||
|
if priority == "high":
|
||||||
|
params["level"] = "active"
|
||||||
|
elif priority == "urgent":
|
||||||
|
params["level"] = "critical"
|
||||||
|
|
||||||
|
try:
|
||||||
|
headers = {
|
||||||
|
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)',
|
||||||
|
'Accept': 'application/json, text/plain, */*',
|
||||||
|
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
||||||
|
}
|
||||||
|
response = requests.get(bark_url, params=params, timeout=10, headers=headers)
|
||||||
|
result = response.status_code == 200
|
||||||
|
print(f"Bark response: {response.status_code}, {response.text[:100]}")
|
||||||
|
except Exception as e:
|
||||||
|
result = False
|
||||||
|
print(f"Bark error: {e}")
|
||||||
|
else:
|
||||||
|
# 使用 apprise 发送通知
|
||||||
apobj = apprise.Apprise()
|
apobj = apprise.Apprise()
|
||||||
apobj.add(apprise_url)
|
apobj.add(apprise_url)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user