Skip to content

出勤紀錄 Demo

此 Demo 從 UniFi Access 主機擷取門禁開啟紀錄,彙整為每日出勤報表 — 每人當天第一筆 = 上班打卡,最後一筆 = 下班打卡。

設定您的環境(選填)

輸入您的 UniFi Access 主機位址與 API Key,讓程式碼範例可以直接複製使用。

所有數值僅儲存於您瀏覽器的 localStorage 中,會自動替換本站所有程式碼範例中的 {host} 和 Bearer ...。

隱私說明

此為選填的便利功能,僅供測試使用。所有數值僅儲存於您瀏覽器的 localStorage 中,不會進行任何資料傳輸或伺服器端保存。若您有疑慮,可至 GitHub fork 本專案後在本機使用,或自行複製範例程式碼到本機執行測試。

TIP

API Token 需具備 view:system_logview:user 權限範圍。

Configure your Host and API Key above, select a date, then click Fetch Attendance.

ERP 整合範例

作為 ERP 系統的每日排程工作:

python
import requests
from datetime import datetime, timedelta

BASE = "https://{host}:12445/api/v1/developer"
HEADERS = {"Authorization": "Bearer <TOKEN>"}

yesterday = datetime.now().replace(hour=0, minute=0, second=0) - timedelta(days=1)
since = int(yesterday.timestamp())
until = since + 86400 - 1

page = 1
all_logs = []
while True:
    resp = requests.post(
        f"{BASE}/system/logs",
        params={"page_num": page, "page_size": 100},
        json={"topic": "door_openings", "since": since, "until": until},
        headers=HEADERS, verify=False
    )
    data = resp.json()["data"]
    all_logs.extend(data["hits"])
    if len(all_logs) >= data["total"]:
        break
    page += 1

# 解析出勤:每人的第一筆 / 最後一筆紀錄
from collections import defaultdict
attendance = defaultdict(list)
for log in all_logs:
    src = log["_source"]
    uid = src["actor"]["id"]
    attendance[uid].append(src["event"]["published"])

for uid, times in attendance.items():
    times.sort()
    clock_in = datetime.fromtimestamp(times[0])
    clock_out = datetime.fromtimestamp(times[-1])
    print(f"{uid}: 上班={clock_in}, 下班={clock_out}")