Open-Source Cold Email & Warmup Platform
Warmbly 是开源的冷邮件平台:温暖您的邮箱、发送活动、并对每条回复进行分流。可在我们的云端运行,也可自行托管整套系统。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Arată ce cuvinte-cheie caută lumea în App Store (US, GB, DE, FR, IT, ES): ce e nou, ce e în creștere, ce are cel mai mult trafic, pe categorii.
Scorurile sunt estimări din sugestiile App Store, nu volumul oficial Apple.
Specificația: ../02-specificatie-trend-radar.md.
Totul rulează în Convex (producție), singur, în fiecare zi. Site-ul: https://trend-radar.meliorapps.uk (logare Google, doar emailurile aprobate). Nu mai e nevoie de Mac sau de GitHub Actions.
convex/collect.js, cron zilnic 03:17 UTC): cele 6 țări în paralel, fiecare pe două benzi
care merg în paralel: cuvintele (sugestii, extindere, clasificare) și app-urile (topuri, lansări noi, lookup,
precomenzi). Lucrul e pe bucăți de ~4 minute (o acțiune Convex are maxim 10 minute); starea fiecărei benzi e
în tabela jobs (src/collect/worker.js), iar un paznic (cron la 10 minute) reia orice bucată căzută.
Cererile către Apple au un ritm comun pe servicii (hints, RSS, lookup, search: PACE în convex/collect.js),
pentru că toate ies prin aceeași adresă IP: la un 429 toți fac o pauză de 20 s și ritmul se rărește, apoi
revine încet; ritmul atins trece de la o bucată la alta (runs.pace), iar nicio cerere nu pornește după
sfârșitul bucății (rămâne pentru următoarea). Căutarea iTunes (clasificarea, precomenzile) are limita Apple de
~20 de cereri pe minut de pe o adresă (peste ea: 403): merge cu o cerere la 3 s (după un 403: pauză și cel mult
una la 6 s), iar pașii cu căutare se încheie la 30 de minute de la pornirea zilei (fiecare are măcar 3 minute;
întâi cuvintele noi și cele mai căutate). Dacă Apple refuză tot (5 refuzuri la rând într-o țară sau 12 în toate
țările), pașii cu căutare se sar; ziua rămâne completă (cuvintele și app-urile se culeg oricum).
Durata depinde de cât lasă Apple: cel mult ~30 de minute (plus calculul), dacă sugestiile merg cu ~5 cereri/s.convex/process.js, pașii în convex/calc.js), pe pași mici, fiecare în limitele unei
acțiuni Convex (10 minute, 512 MB de memorie, disc temporar mic); între pași totul stă în fișiere (Convex storage):
raw, aceleași fișiere
ca în data/); baza țării (SQLite, src/local/db.js, ~80 MB; copia ei e starea db/<CC>, iar prima dată
se face din arhivă) primește fișierele noi; apoi planul de mâine (plan/<CC>) și partea țării din export:
listele ei și bucățile pentru fișierele comune (tabela pieces, src/export/split.js);meta + terms, listele ALL (5 grupe), term/* și app/* (câte 8 grupe);src/export/build.js; testul
test/split.test.js).src/compute/plan.js): ce începuturi de cuvinte se extind și ce se clasifică.src/metrics/ (funcții pure, testate).web/ (Vite) + interfața din src/local/public/; web/remote-api.js citește fișierele din Convex.| Comandă | Ce face |
|---|---|
npm test | testele |
npx convex run --prod collect:start '{"manual":true}' | pornește colectarea de azi acum (dacă nu a pornit) |
npx convex run --prod collect:start '{"manual":true,"smoke":true,"date":"2000-01-01"}' | probă scurtă (nu intră în arhivă) |
npx convex logs --prod | jurnalul în timp real |
npx convex run --prod calc:last | starea ultimului calcul, pe pași (durata, reluările, erorile) |
npx convex run --prod process:run '{"date":"YYYY-MM-DD"}' | refă calculul zilei (din arhivă) și publică exportul |
npx convex run --prod store:note '{"date":"YYYY-MM-DD","log":["..."]}' | o notă în jurnalul zilei (ex. după un calcul cu remote-calc.js) |
CONVEX_SITE_URL=... INGEST_SECRET=... node src/export/remote-calc.js | rezervă: face calculul zilei pe acest calculator (bazele țărilor din Convex sau din arhivă, fișierele noi din arhivă, planul de mâine, copiile bazelor înapoi în Convex) și publică exportul |
CONVEX_SITE_URL=... INGEST_SECRET=... npm run upload | urcă în arhivă fișiere din data/ (ex. o zi colectată de pe alt calculator cu node src/collect/cli.js) și recalculează |
Starea zilei: tabela runs din dashboard-ul Convex (status, jurnal, ritmul cererilor); a calculului: tabela calcs.
Variabile în Convex (producție): AUTH_GOOGLE_ID, AUTH_GOOGLE_SECRET, JWT_PRIVATE_KEY, JWKS, SITE_URL, INGEST_SECRET,
COLLECT_ENABLED=1 (doar în producție: pornește cron-ul colectării). Vercel: CONVEX_DEPLOY_KEY.
Lista de acces (din terminal):
npx convex run --prod admin:allow '{"email":"[email protected]"}'
npx convex run --prod admin:revoke '{"email":"[email protected]"}'
npx convex run --prod admin:list
În Google Cloud, clientul OAuth (Web) are redirect URI https://<deployment>.convex.site/api/auth/callback/google. DEV_LOGIN_SECRET se setează doar pe un Convex local, pentru teste fără Google (npm run web).