@rune-kit/rune 2.10.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +65 -6
- package/commands/rune.md +168 -168
- package/compiler/__tests__/detect-invariants.test.js +136 -0
- package/compiler/__tests__/doctor-mesh.test.js +229 -0
- package/compiler/__tests__/hook-dispatch.test.js +91 -0
- package/compiler/__tests__/hooks-antigravity.test.js +118 -0
- package/compiler/__tests__/hooks-cursor.test.js +139 -0
- package/compiler/__tests__/hooks-install.test.js +305 -0
- package/compiler/__tests__/hooks-merge.test.js +204 -0
- package/compiler/__tests__/hooks-tiers.test.js +519 -0
- package/compiler/__tests__/hooks-windsurf.test.js +115 -0
- package/compiler/__tests__/inject-claude-md.test.js +152 -0
- package/compiler/__tests__/load-invariants.test.js +408 -0
- package/compiler/__tests__/onboard-invariants.test.js +240 -0
- package/compiler/adapters/hooks/antigravity.js +140 -0
- package/compiler/adapters/hooks/claude.js +166 -0
- package/compiler/adapters/hooks/cursor.js +191 -0
- package/compiler/adapters/hooks/index.js +82 -0
- package/compiler/adapters/hooks/tier-emitter.js +182 -0
- package/compiler/adapters/hooks/windsurf.js +202 -0
- package/compiler/bin/rune.js +196 -6
- package/compiler/commands/hook-dispatch.js +87 -0
- package/compiler/commands/hooks/install.js +120 -0
- package/compiler/commands/hooks/merge.js +211 -0
- package/compiler/commands/hooks/presets.js +116 -0
- package/compiler/commands/hooks/status.js +112 -0
- package/compiler/commands/hooks/tiers.js +221 -0
- package/compiler/commands/hooks/uninstall.js +94 -0
- package/compiler/doctor.js +236 -0
- package/contexts/dev.md +34 -34
- package/contexts/research.md +43 -43
- package/contexts/review.md +55 -55
- package/extensions/ai-ml/PACK.md +88 -88
- package/extensions/ai-ml/skills/ai-agents.md +172 -172
- package/extensions/ai-ml/skills/code-sandbox.md +187 -187
- package/extensions/ai-ml/skills/deep-research.md +146 -146
- package/extensions/ai-ml/skills/embedding-search.md +66 -66
- package/extensions/ai-ml/skills/fine-tuning-guide.md +74 -74
- package/extensions/ai-ml/skills/llm-architect.md +125 -125
- package/extensions/ai-ml/skills/llm-integration.md +64 -64
- package/extensions/ai-ml/skills/prompt-patterns.md +72 -72
- package/extensions/ai-ml/skills/rag-patterns.md +66 -66
- package/extensions/ai-ml/skills/web-extraction.md +114 -114
- package/extensions/analytics/PACK.md +92 -92
- package/extensions/analytics/skills/ab-testing.md +72 -72
- package/extensions/analytics/skills/dashboard-patterns.md +83 -83
- package/extensions/analytics/skills/data-validation.md +68 -68
- package/extensions/analytics/skills/funnel-analysis.md +81 -81
- package/extensions/analytics/skills/sql-patterns.md +57 -57
- package/extensions/analytics/skills/statistical-analysis.md +79 -79
- package/extensions/analytics/skills/tracking-setup.md +71 -71
- package/extensions/backend/PACK.md +104 -104
- package/extensions/backend/skills/api-patterns.md +84 -84
- package/extensions/backend/skills/async-pipeline.md +193 -193
- package/extensions/backend/skills/auth-patterns.md +97 -97
- package/extensions/backend/skills/background-jobs.md +133 -133
- package/extensions/backend/skills/caching-patterns.md +108 -108
- package/extensions/backend/skills/cli-generation.md +133 -133
- package/extensions/backend/skills/database-patterns.md +87 -87
- package/extensions/backend/skills/middleware-patterns.md +104 -104
- package/extensions/chrome-ext/PACK.md +93 -93
- package/extensions/chrome-ext/skills/cws-preflight.md +143 -143
- package/extensions/chrome-ext/skills/cws-publish.md +104 -104
- package/extensions/chrome-ext/skills/ext-ai-integration.md +251 -251
- package/extensions/chrome-ext/skills/ext-messaging.md +139 -139
- package/extensions/chrome-ext/skills/ext-storage.md +133 -133
- package/extensions/chrome-ext/skills/mv3-scaffold.md +164 -164
- package/extensions/content/PACK.md +96 -96
- package/extensions/content/skills/blog-patterns.md +88 -88
- package/extensions/content/skills/cms-integration.md +131 -131
- package/extensions/content/skills/content-scoring.md +107 -107
- package/extensions/content/skills/i18n.md +83 -83
- package/extensions/content/skills/mdx-authoring.md +137 -137
- package/extensions/content/skills/reference.md +1014 -1014
- package/extensions/content/skills/seo-patterns.md +67 -67
- package/extensions/content/skills/video-repurpose.md +153 -153
- package/extensions/devops/PACK.md +101 -101
- package/extensions/devops/skills/chaos-testing.md +67 -67
- package/extensions/devops/skills/ci-cd.md +75 -75
- package/extensions/devops/skills/docker.md +58 -58
- package/extensions/devops/skills/edge-serverless.md +163 -163
- package/extensions/devops/skills/infra-as-code.md +158 -158
- package/extensions/devops/skills/kubernetes.md +110 -110
- package/extensions/devops/skills/monitoring.md +57 -57
- package/extensions/devops/skills/server-setup.md +64 -64
- package/extensions/devops/skills/ssl-domain.md +42 -42
- package/extensions/ecommerce/PACK.md +116 -116
- package/extensions/ecommerce/skills/cart-system.md +79 -79
- package/extensions/ecommerce/skills/inventory-mgmt.md +102 -102
- package/extensions/ecommerce/skills/order-management.md +126 -126
- package/extensions/ecommerce/skills/payment-integration.md +472 -472
- package/extensions/ecommerce/skills/shopify-dev.md +69 -69
- package/extensions/ecommerce/skills/subscription-billing.md +93 -93
- package/extensions/ecommerce/skills/tax-compliance.md +117 -117
- package/extensions/gamedev/PACK.md +142 -142
- package/extensions/gamedev/skills/asset-pipeline.md +74 -74
- package/extensions/gamedev/skills/audio-system.md +129 -129
- package/extensions/gamedev/skills/camera-system.md +87 -87
- package/extensions/gamedev/skills/ecs.md +98 -98
- package/extensions/gamedev/skills/game-loops.md +72 -72
- package/extensions/gamedev/skills/input-system.md +199 -199
- package/extensions/gamedev/skills/multiplayer.md +180 -180
- package/extensions/gamedev/skills/particles.md +105 -105
- package/extensions/gamedev/skills/physics-engine.md +89 -89
- package/extensions/gamedev/skills/scene-management.md +146 -146
- package/extensions/gamedev/skills/threejs-patterns.md +90 -90
- package/extensions/gamedev/skills/webgl.md +71 -71
- package/extensions/mobile/PACK.md +106 -106
- package/extensions/mobile/skills/app-store-connect.md +152 -152
- package/extensions/mobile/skills/app-store-prep.md +66 -66
- package/extensions/mobile/skills/deep-linking.md +109 -109
- package/extensions/mobile/skills/flutter.md +60 -60
- package/extensions/mobile/skills/ios-build-pipeline.md +142 -142
- package/extensions/mobile/skills/native-bridge.md +66 -66
- package/extensions/mobile/skills/ota-updates.md +97 -97
- package/extensions/mobile/skills/push-notifications.md +111 -111
- package/extensions/mobile/skills/react-native.md +82 -82
- package/extensions/saas/PACK.md +116 -116
- package/extensions/saas/skills/billing-integration.md +200 -200
- package/extensions/saas/skills/feature-flags.md +130 -130
- package/extensions/saas/skills/multi-tenant.md +103 -103
- package/extensions/saas/skills/onboarding-flow.md +139 -139
- package/extensions/saas/skills/subscription-flow.md +95 -95
- package/extensions/saas/skills/team-management.md +144 -144
- package/extensions/security/PACK.md +99 -99
- package/extensions/security/skills/api-security.md +140 -140
- package/extensions/security/skills/compliance.md +68 -68
- package/extensions/security/skills/owasp-audit.md +64 -64
- package/extensions/security/skills/pentest-patterns.md +77 -77
- package/extensions/security/skills/secret-mgmt.md +65 -65
- package/extensions/security/skills/supply-chain.md +65 -65
- package/extensions/trading/PACK.md +80 -80
- package/extensions/trading/skills/chart-components.md +55 -55
- package/extensions/trading/skills/experiment-loop.md +125 -125
- package/extensions/trading/skills/fintech-patterns.md +47 -47
- package/extensions/trading/skills/indicator-library.md +58 -58
- package/extensions/trading/skills/quant-analysis.md +111 -111
- package/extensions/trading/skills/realtime-data.md +58 -58
- package/extensions/trading/skills/trade-logic.md +104 -104
- package/extensions/ui/PACK.md +130 -130
- package/extensions/ui/skills/a11y-audit.md +91 -91
- package/extensions/ui/skills/animation-patterns.md +127 -127
- package/extensions/ui/skills/component-patterns.md +100 -100
- package/extensions/ui/skills/design-decision.md +108 -108
- package/extensions/ui/skills/design-system.md +68 -68
- package/extensions/ui/skills/landing-patterns.md +155 -155
- package/extensions/ui/skills/palette-picker.md +173 -173
- package/extensions/ui/skills/react-health.md +90 -90
- package/extensions/ui/skills/type-system.md +125 -125
- package/extensions/ui/skills/web-vitals.md +153 -153
- package/extensions/zalo/PACK.md +145 -145
- package/extensions/zalo/skills/zalo-oa-mcp.md +317 -317
- package/extensions/zalo/skills/zalo-oa-messaging.md +429 -429
- package/extensions/zalo/skills/zalo-oa-setup.md +236 -236
- package/extensions/zalo/skills/zalo-oa-webhook.md +189 -189
- package/extensions/zalo/skills/zalo-personal-messaging.md +194 -194
- package/extensions/zalo/skills/zalo-personal-setup.md +153 -153
- package/extensions/zalo/skills/zalo-rate-guard.md +219 -219
- package/hooks/auto-format/index.cjs +48 -48
- package/hooks/hooks.json +111 -111
- package/hooks/post-session-reflect/index.cjs +189 -189
- package/hooks/pre-compact/index.cjs +95 -95
- package/hooks/run-hook.cmd +1 -1
- package/hooks/secrets-scan/index.cjs +100 -100
- package/hooks/session-start/index.cjs +71 -71
- package/hooks/typecheck/index.cjs +65 -65
- package/package.json +63 -63
- package/references/ui-pro-max-data/LICENSE-UI-PRO-MAX +21 -21
- package/references/ui-pro-max-data/charts.csv +26 -26
- package/references/ui-pro-max-data/colors.csv +161 -161
- package/references/ui-pro-max-data/styles.csv +68 -68
- package/references/ui-pro-max-data/typography.csv +74 -74
- package/references/ui-pro-max-data/ui-reasoning.csv +162 -162
- package/references/ui-pro-max-data/ux-guidelines.csv +99 -99
- package/skills/adversary/SKILL.md +283 -283
- package/skills/asset-creator/SKILL.md +157 -157
- package/skills/audit/SKILL.md +147 -2
- package/skills/autopsy/SKILL.md +335 -335
- package/skills/ba/SKILL.md +85 -1
- package/skills/brainstorm/SKILL.md +380 -342
- package/skills/browser-pilot/SKILL.md +169 -168
- package/skills/constraint-check/SKILL.md +165 -165
- package/skills/context-engine/SKILL.md +408 -404
- package/skills/cook/SKILL.md +917 -863
- package/skills/db/SKILL.md +273 -273
- package/skills/debug/SKILL.md +465 -465
- package/skills/dependency-doctor/SKILL.md +265 -235
- package/skills/deploy/SKILL.md +274 -231
- package/skills/design/DESIGN-REFERENCE.md +365 -365
- package/skills/design/SKILL.md +590 -589
- package/skills/doc-processor/SKILL.md +254 -254
- package/skills/docs/SKILL.md +374 -374
- package/skills/docs-seeker/SKILL.md +178 -177
- package/skills/fix/SKILL.md +332 -330
- package/skills/git/SKILL.md +339 -339
- package/skills/hallucination-guard/SKILL.md +220 -219
- package/skills/incident/SKILL.md +254 -253
- package/skills/integrity-check/SKILL.md +169 -169
- package/skills/journal/SKILL.md +241 -240
- package/skills/launch/SKILL.md +344 -344
- package/skills/logic-guardian/SKILL.md +269 -251
- package/skills/marketing/SKILL.md +351 -289
- package/skills/mcp-builder/SKILL.md +425 -425
- package/skills/neural-memory/SKILL.md +359 -362
- package/skills/onboard/SKILL.md +432 -403
- package/skills/onboard/references/invariants-template.md +76 -0
- package/skills/onboard/scripts/detect-invariants.js +439 -0
- package/skills/onboard/scripts/inject-claude-md.js +150 -0
- package/skills/onboard/scripts/onboard-invariants.js +194 -0
- package/skills/perf/SKILL.md +347 -346
- package/skills/plan/SKILL.md +435 -428
- package/skills/preflight/SKILL.md +415 -415
- package/skills/problem-solver/SKILL.md +380 -284
- package/skills/rescue/SKILL.md +474 -474
- package/skills/research/SKILL.md +4 -0
- package/skills/retro/SKILL.md +3 -1
- package/skills/review/SKILL.md +614 -588
- package/skills/review-intake/SKILL.md +249 -249
- package/skills/safeguard/SKILL.md +200 -200
- package/skills/sast/SKILL.md +190 -190
- package/skills/scaffold/SKILL.md +328 -287
- package/skills/scope-guard/SKILL.md +183 -180
- package/skills/scout/SKILL.md +269 -263
- package/skills/sentinel/SKILL.md +384 -381
- package/skills/sentinel-env/SKILL.md +254 -254
- package/skills/sequential-thinking/SKILL.md +234 -234
- package/skills/session-bridge/SKILL.md +595 -543
- package/skills/session-bridge/scripts/load-invariants.js +397 -0
- package/skills/skill-forge/SKILL.md +581 -581
- package/skills/skill-router/SKILL.md +3 -0
- package/skills/slides/SKILL.md +19 -0
- package/skills/surgeon/SKILL.md +215 -215
- package/skills/team/SKILL.md +557 -537
- package/skills/test/SKILL.md +620 -614
- package/skills/trend-scout/SKILL.md +145 -145
- package/skills/verification/SKILL.md +334 -326
- package/skills/video-creator/SKILL.md +201 -201
- package/skills/watchdog/SKILL.md +168 -168
- package/skills/worktree/SKILL.md +140 -140
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: zalo-personal-setup
|
|
3
|
-
pack: "@rune/zalo"
|
|
4
|
-
description: Personal Zalo account automation setup via zca-js — QR login, credential persistence, WebSocket listener, session management. UNOFFICIAL — risk-gated.
|
|
5
|
-
model: sonnet
|
|
6
|
-
tools: "Read, Glob, Grep, Bash, Write, Edit"
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# zalo-personal-setup
|
|
10
|
-
|
|
11
|
-
## Purpose
|
|
12
|
-
|
|
13
|
-
Bootstrap a personal Zalo account automation using zca-js — the community-maintained reverse-engineered client. Handles first-time QR login, credential persistence, WebSocket listener setup, and session restore on subsequent runs.
|
|
14
|
-
|
|
15
|
-
<HARD-GATE>
|
|
16
|
-
This skill uses UNOFFICIAL reverse-engineered APIs via zca-js.
|
|
17
|
-
BEFORE proceeding, acknowledge ALL risks:
|
|
18
|
-
1. ToS VIOLATION — Zalo can ban your account without warning
|
|
19
|
-
2. SINGLE SESSION — cannot use Zalo mobile/web simultaneously
|
|
20
|
-
3. API INSTABILITY — Zalo can break internal APIs anytime
|
|
21
|
-
4. NO SUPPORT — Zalo will not help with issues from unofficial usage
|
|
22
|
-
5. NOT FOR PRODUCTION — personal projects and prototypes ONLY
|
|
23
|
-
|
|
24
|
-
If building for business/production → use Track A (zalo-oa-setup) instead.
|
|
25
|
-
</HARD-GATE>
|
|
26
|
-
|
|
27
|
-
## Step 1 — Install Dependency
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
npm install zca-js
|
|
31
|
-
# zca-js: https://github.com/RFS-ADRENO/zca-js (359★, 202 forks)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
Minimum Node.js: 18+. TypeScript users add `@types/node` if not already present.
|
|
35
|
-
|
|
36
|
-
## Step 2 — QR Login (First Run)
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
import { Zalo } from 'zca-js'
|
|
40
|
-
|
|
41
|
-
const zalo = new Zalo()
|
|
42
|
-
|
|
43
|
-
// First-time login: QR code
|
|
44
|
-
const api = await zalo.loginQR()
|
|
45
|
-
// Terminal displays QR → scan with Zalo mobile app
|
|
46
|
-
// Returns API instance with full access
|
|
47
|
-
|
|
48
|
-
// Save credentials for next time
|
|
49
|
-
const credentials = {
|
|
50
|
-
imei: api.getImei(), // generated device ID
|
|
51
|
-
cookie: api.getCookie(), // session cookies
|
|
52
|
-
userAgent: api.getUserAgent() // browser fingerprint
|
|
53
|
-
}
|
|
54
|
-
await saveCredentials(credentials)
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
QR code expires in ~60 seconds — scan quickly. After scan, zca-js completes handshake and returns a live API instance.
|
|
58
|
-
|
|
59
|
-
## Step 3 — Credential Persistence
|
|
60
|
-
|
|
61
|
-
```typescript
|
|
62
|
-
import { readFile, writeFile, chmod } from 'fs/promises'
|
|
63
|
-
import { join } from 'path'
|
|
64
|
-
import { homedir } from 'os'
|
|
65
|
-
|
|
66
|
-
const CRED_PATH = join(homedir(), '.zalo-personal', 'credentials.json')
|
|
67
|
-
|
|
68
|
-
async function saveCredentials(creds: ZaloCredentials): Promise<void> {
|
|
69
|
-
await writeFile(CRED_PATH, JSON.stringify(creds, null, 2))
|
|
70
|
-
await chmod(CRED_PATH, 0o600) // owner-only read/write
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
async function loadCredentials(): Promise<ZaloCredentials | null> {
|
|
74
|
-
try {
|
|
75
|
-
return JSON.parse(await readFile(CRED_PATH, 'utf-8'))
|
|
76
|
-
} catch { return null }
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Store at `~/.zalo-personal/credentials.json` — outside the project repo. Never commit credentials to git. Add `.zalo-personal/` to `.gitignore`.
|
|
81
|
-
|
|
82
|
-
## Step 4 — Session Restore (Subsequent Runs)
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
const creds = await loadCredentials()
|
|
86
|
-
|
|
87
|
-
const api = creds
|
|
88
|
-
? await zalo.login({
|
|
89
|
-
imei: creds.imei,
|
|
90
|
-
cookie: creds.cookie,
|
|
91
|
-
userAgent: creds.userAgent
|
|
92
|
-
})
|
|
93
|
-
: await zalo.loginQR() // fall back to QR if no saved creds
|
|
94
|
-
|
|
95
|
-
// Always re-persist after login — cookies may have refreshed
|
|
96
|
-
await saveCredentials({
|
|
97
|
-
imei: api.getImei(),
|
|
98
|
-
cookie: api.getCookie(),
|
|
99
|
-
userAgent: api.getUserAgent()
|
|
100
|
-
})
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Step 5 — WebSocket Listener
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
const listener = api.listener
|
|
107
|
-
await listener.start({ retryOnClose: true })
|
|
108
|
-
|
|
109
|
-
listener.on('message', (msg) => {
|
|
110
|
-
// Handle incoming DMs
|
|
111
|
-
console.log(`[DM] ${msg.data.content}`)
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
listener.on('group_message', (msg) => {
|
|
115
|
-
// Group messages arrive on separate event
|
|
116
|
-
console.log(`[Group] ${msg.data.content}`)
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
// keepAlive is automatic via zca-js — no manual ping needed
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
`retryOnClose: true` enables automatic reconnect using the retry schedule provided by Zalo's server.
|
|
123
|
-
|
|
124
|
-
## Session Management Notes
|
|
125
|
-
|
|
126
|
-
| Concept | Detail |
|
|
127
|
-
|---------|--------|
|
|
128
|
-
| IMEI | Deterministic UUID from userAgent — acts as device fingerprint. Must stay consistent across restarts. |
|
|
129
|
-
| Cookies | Auto-refreshed on keepAlive. Always re-persist after each session start. |
|
|
130
|
-
| DuplicateConnection (3000) | Another session opened — this one closes. Cannot run bot + Zalo mobile simultaneously. |
|
|
131
|
-
| Reconnect | Handled by zca-js via server retry schedule. No manual logic needed. |
|
|
132
|
-
|
|
133
|
-
## Anti-Detection Baseline
|
|
134
|
-
|
|
135
|
-
- Use consistent `userAgent` across sessions — don't randomize on each run
|
|
136
|
-
- Don't send messages too fast (see `zalo-rate-guard` for throttle patterns)
|
|
137
|
-
- Avoid running during unusual hours (3–6 AM local time)
|
|
138
|
-
- Keep sessions long-lived — frequent login/logout is suspicious
|
|
139
|
-
- Never change profile info programmatically
|
|
140
|
-
|
|
141
|
-
## Sharp Edges
|
|
142
|
-
|
|
143
|
-
- Cookie refresh happens on keepAlive — **MUST** persist updated cookies after every session start, not just first login
|
|
144
|
-
- IMEI must stay consistent — changing it looks like a new device to Zalo's backend
|
|
145
|
-
- If Zalo mobile is active on same account, bot receives `DuplicateConnection` kick immediately
|
|
146
|
-
- zca-js depends on Zalo's internal undocumented API — breaks without warning on Zalo updates
|
|
147
|
-
- No official rate limits documented — err heavily on the side of caution
|
|
148
|
-
|
|
149
|
-
## Mesh Links
|
|
150
|
-
|
|
151
|
-
- `zalo-oa-setup` — Track A (official OA API) if this use case grows to production
|
|
152
|
-
- `zalo-rate-guard` — rate limiting and message throttle for personal bots
|
|
153
|
-
- `zalo-personal-messaging` — send/reply DMs and group messages once session is live
|
|
1
|
+
---
|
|
2
|
+
name: zalo-personal-setup
|
|
3
|
+
pack: "@rune/zalo"
|
|
4
|
+
description: Personal Zalo account automation setup via zca-js — QR login, credential persistence, WebSocket listener, session management. UNOFFICIAL — risk-gated.
|
|
5
|
+
model: sonnet
|
|
6
|
+
tools: "Read, Glob, Grep, Bash, Write, Edit"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# zalo-personal-setup
|
|
10
|
+
|
|
11
|
+
## Purpose
|
|
12
|
+
|
|
13
|
+
Bootstrap a personal Zalo account automation using zca-js — the community-maintained reverse-engineered client. Handles first-time QR login, credential persistence, WebSocket listener setup, and session restore on subsequent runs.
|
|
14
|
+
|
|
15
|
+
<HARD-GATE>
|
|
16
|
+
This skill uses UNOFFICIAL reverse-engineered APIs via zca-js.
|
|
17
|
+
BEFORE proceeding, acknowledge ALL risks:
|
|
18
|
+
1. ToS VIOLATION — Zalo can ban your account without warning
|
|
19
|
+
2. SINGLE SESSION — cannot use Zalo mobile/web simultaneously
|
|
20
|
+
3. API INSTABILITY — Zalo can break internal APIs anytime
|
|
21
|
+
4. NO SUPPORT — Zalo will not help with issues from unofficial usage
|
|
22
|
+
5. NOT FOR PRODUCTION — personal projects and prototypes ONLY
|
|
23
|
+
|
|
24
|
+
If building for business/production → use Track A (zalo-oa-setup) instead.
|
|
25
|
+
</HARD-GATE>
|
|
26
|
+
|
|
27
|
+
## Step 1 — Install Dependency
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install zca-js
|
|
31
|
+
# zca-js: https://github.com/RFS-ADRENO/zca-js (359★, 202 forks)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Minimum Node.js: 18+. TypeScript users add `@types/node` if not already present.
|
|
35
|
+
|
|
36
|
+
## Step 2 — QR Login (First Run)
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { Zalo } from 'zca-js'
|
|
40
|
+
|
|
41
|
+
const zalo = new Zalo()
|
|
42
|
+
|
|
43
|
+
// First-time login: QR code
|
|
44
|
+
const api = await zalo.loginQR()
|
|
45
|
+
// Terminal displays QR → scan with Zalo mobile app
|
|
46
|
+
// Returns API instance with full access
|
|
47
|
+
|
|
48
|
+
// Save credentials for next time
|
|
49
|
+
const credentials = {
|
|
50
|
+
imei: api.getImei(), // generated device ID
|
|
51
|
+
cookie: api.getCookie(), // session cookies
|
|
52
|
+
userAgent: api.getUserAgent() // browser fingerprint
|
|
53
|
+
}
|
|
54
|
+
await saveCredentials(credentials)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
QR code expires in ~60 seconds — scan quickly. After scan, zca-js completes handshake and returns a live API instance.
|
|
58
|
+
|
|
59
|
+
## Step 3 — Credential Persistence
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
import { readFile, writeFile, chmod } from 'fs/promises'
|
|
63
|
+
import { join } from 'path'
|
|
64
|
+
import { homedir } from 'os'
|
|
65
|
+
|
|
66
|
+
const CRED_PATH = join(homedir(), '.zalo-personal', 'credentials.json')
|
|
67
|
+
|
|
68
|
+
async function saveCredentials(creds: ZaloCredentials): Promise<void> {
|
|
69
|
+
await writeFile(CRED_PATH, JSON.stringify(creds, null, 2))
|
|
70
|
+
await chmod(CRED_PATH, 0o600) // owner-only read/write
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function loadCredentials(): Promise<ZaloCredentials | null> {
|
|
74
|
+
try {
|
|
75
|
+
return JSON.parse(await readFile(CRED_PATH, 'utf-8'))
|
|
76
|
+
} catch { return null }
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Store at `~/.zalo-personal/credentials.json` — outside the project repo. Never commit credentials to git. Add `.zalo-personal/` to `.gitignore`.
|
|
81
|
+
|
|
82
|
+
## Step 4 — Session Restore (Subsequent Runs)
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const creds = await loadCredentials()
|
|
86
|
+
|
|
87
|
+
const api = creds
|
|
88
|
+
? await zalo.login({
|
|
89
|
+
imei: creds.imei,
|
|
90
|
+
cookie: creds.cookie,
|
|
91
|
+
userAgent: creds.userAgent
|
|
92
|
+
})
|
|
93
|
+
: await zalo.loginQR() // fall back to QR if no saved creds
|
|
94
|
+
|
|
95
|
+
// Always re-persist after login — cookies may have refreshed
|
|
96
|
+
await saveCredentials({
|
|
97
|
+
imei: api.getImei(),
|
|
98
|
+
cookie: api.getCookie(),
|
|
99
|
+
userAgent: api.getUserAgent()
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Step 5 — WebSocket Listener
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
const listener = api.listener
|
|
107
|
+
await listener.start({ retryOnClose: true })
|
|
108
|
+
|
|
109
|
+
listener.on('message', (msg) => {
|
|
110
|
+
// Handle incoming DMs
|
|
111
|
+
console.log(`[DM] ${msg.data.content}`)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
listener.on('group_message', (msg) => {
|
|
115
|
+
// Group messages arrive on separate event
|
|
116
|
+
console.log(`[Group] ${msg.data.content}`)
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
// keepAlive is automatic via zca-js — no manual ping needed
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`retryOnClose: true` enables automatic reconnect using the retry schedule provided by Zalo's server.
|
|
123
|
+
|
|
124
|
+
## Session Management Notes
|
|
125
|
+
|
|
126
|
+
| Concept | Detail |
|
|
127
|
+
|---------|--------|
|
|
128
|
+
| IMEI | Deterministic UUID from userAgent — acts as device fingerprint. Must stay consistent across restarts. |
|
|
129
|
+
| Cookies | Auto-refreshed on keepAlive. Always re-persist after each session start. |
|
|
130
|
+
| DuplicateConnection (3000) | Another session opened — this one closes. Cannot run bot + Zalo mobile simultaneously. |
|
|
131
|
+
| Reconnect | Handled by zca-js via server retry schedule. No manual logic needed. |
|
|
132
|
+
|
|
133
|
+
## Anti-Detection Baseline
|
|
134
|
+
|
|
135
|
+
- Use consistent `userAgent` across sessions — don't randomize on each run
|
|
136
|
+
- Don't send messages too fast (see `zalo-rate-guard` for throttle patterns)
|
|
137
|
+
- Avoid running during unusual hours (3–6 AM local time)
|
|
138
|
+
- Keep sessions long-lived — frequent login/logout is suspicious
|
|
139
|
+
- Never change profile info programmatically
|
|
140
|
+
|
|
141
|
+
## Sharp Edges
|
|
142
|
+
|
|
143
|
+
- Cookie refresh happens on keepAlive — **MUST** persist updated cookies after every session start, not just first login
|
|
144
|
+
- IMEI must stay consistent — changing it looks like a new device to Zalo's backend
|
|
145
|
+
- If Zalo mobile is active on same account, bot receives `DuplicateConnection` kick immediately
|
|
146
|
+
- zca-js depends on Zalo's internal undocumented API — breaks without warning on Zalo updates
|
|
147
|
+
- No official rate limits documented — err heavily on the side of caution
|
|
148
|
+
|
|
149
|
+
## Mesh Links
|
|
150
|
+
|
|
151
|
+
- `zalo-oa-setup` — Track A (official OA API) if this use case grows to production
|
|
152
|
+
- `zalo-rate-guard` — rate limiting and message throttle for personal bots
|
|
153
|
+
- `zalo-personal-messaging` — send/reply DMs and group messages once session is live
|