abuse: классификатор ловит панели/github/hn и мульти-теги, реальный total из индекса, кап API поднят до 3000
Some checks failed
ci / test (3.10) (push) Has been cancelled
ci / test (3.11) (push) Has been cancelled
ci / test (3.12) (push) Has been cancelled

This commit is contained in:
Vlad Gothbreach
2026-10-27 01:28:28 +03:00
parent 61f15f88f2
commit 8de421b6af
13 changed files with 3082 additions and 93 deletions

View File

@@ -30,9 +30,17 @@ def _clean(v, n=0):
# ---------- обзор ----------
def timeline(days=30, cat=None):
"""Записей по дням + отдельно уязвимости и сливы. Пустые дни заполняются нулями."""
BUCKET_SEEN = "date(seen,'unixepoch')"
def timeline(days=30, cat=None, mode="pub"):
"""Записей по дням + отдельно уязвимости и сливы. Пустые дни заполняются нулями.
mode="pub" — по дате публикации (или дате попадания в базу, если публикации нет);
mode="seen" — строго по времени импорта: «что комбайн принёс за день».
"""
days = max(1, min(365, int(days or 30)))
bucket = BUCKET_SEEN if mode == "seen" else BUCKET
names = [s.name for s in sources.all_sources() if s.category == cat] if cat not in (None, "", "all") else None
where, args = "", []
if names is not None:
@@ -40,7 +48,7 @@ def timeline(days=30, cat=None):
args = list(names)
sql = ("SELECT b, COUNT(*), SUM(CASE WHEN types LIKE '%,cve,%' THEN 1 ELSE 0 END),"
" SUM(CASE WHEN types LIKE '%,leak,%' OR types LIKE '%,cve,%' THEN 1 ELSE 0 END)"
" FROM (SELECT " + BUCKET + " AS b, types FROM items" + where + ") GROUP BY b ORDER BY b")
" FROM (SELECT " + bucket + " AS b, types FROM items" + where + ") GROUP BY b ORDER BY b")
got = {}
with store.db() as c:
for b, n, cve, sev in c.execute(sql, args):
@@ -52,8 +60,9 @@ def timeline(days=30, cat=None):
d = (today - _dt.timedelta(days=i)).isoformat()
n, cve, sev = got.get(d, (0, 0, 0))
out.append({"day": d, "n": n, "cve": cve, "sev": sev})
return {"ok": True, "days": days, "points": out,
return {"ok": True, "days": days, "mode": mode, "points": out,
"total": sum(p["n"] for p in out),
"last24": (out[-1] or {}).get("n", 0),
"max": max([p["n"] for p in out] or [0])}