feat: 抖音直播间弹幕监控 - Go+Wails 实现

后端:
- SQLite 数据层 (rooms/users/chat_logs/settings/error_logs)
- 抖音 WebSocket 抓取器 (proto 解析, 心跳, watchdog)
- __ac_signature 算法 (纯 Go 移植)
- a_bogus/sign.js 签名 (goja JS 引擎)
- Echo HTTP API 服务器 (端口 5000)
- SSE 事件广播
- 自动保活 + 授权守护
- PAYS 云授权对接

前端:
- 顶栏: 品牌 + 日志/调试/客户名单/授权/文档/房间控制/主题切换
- 添加直播间 (链接解析 + 关键词)
-  Dashboard (卡片/列表视图, 公开/匿名房筛选, 分页)
- 详情页 (多 tab 消息流, 右侧用户面板, 颜色标记, 精准客户, 已看标记)
- 精准客户名单 (跨房间汇总)
- 订阅授权页面 (登录/注册/购买)
- 使用帮助 + 系统调试
- 白昼/黑夜主题切换 (CSS 变量 + iconfont)
- 底部版权栏
This commit is contained in:
2026-09-18 04:25:57 +08:00
commit e266d3098a
56 changed files with 29905 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
package sign
import "time"
func GetACSignature(oneSite, oneNonce, uaN string, oneTimeStamp int64) string {
if oneTimeStamp == 0 {
oneTimeStamp = time.Now().Unix()
}
calOneStr := func(s string, iv int) int {
k := iv
for _, ch := range s {
k = int(((k ^ int(ch)) * 65599) & 0xFFFFFFFF)
}
return k
}
calOneStr3 := func(s string, iv int) int {
k := iv
for _, ch := range s {
k = int((int64(k)*65599 + int64(ch)) & 0xFFFFFFFF)
}
return k
}
getOneChr := func(code int) string {
code &= 0x3F
if code < 26 {
return string(rune('A' + code))
} else if code < 52 {
return string(rune('a' + code - 26))
} else if code < 62 {
return string(rune('0' + code - 52))
} else if code == 62 {
return "+"
}
return "/"
}
encNumToStr := func(val uint32) string {
var s string
for i := 24; i >= 0; i -= 6 {
s += getOneChr(int((val >> uint(i)) & 0x3F))
}
return s
}
signHead := "_02B4Z6wo00f01"
timeStampS := itoa(oneTimeStamp)
a := calOneStr(oneSite, calOneStr(timeStampS, 0)) % 65521
xorVal := uint32(oneTimeStamp) ^ uint32(a*65521)
b := uint64(0x80F0) << 32 | uint64(xorVal)
bStr := itoa(int64(b))
c := calOneStr(bStr, 0)
d := encNumToStr(uint32(b >> 2))
e := uint32((b >> 32) & 0xFFFFFFFF)
f := encNumToStr(uint32((b << 28) | (uint64(e) >> 4)))
g := uint32(0x22AA7A58) ^ uint32(b&0xFFFFFFFF)
h := encNumToStr(uint32((e << 26) | (g >> 6)))
i := getOneChr(int(g & 0x3F))
j := (uint32(calOneStr(uaN, c)%65521) << 16) | uint32(calOneStr(oneNonce, c)%65521)
k := encNumToStr(j >> 2)
l := encNumToStr(uint32((j << 28) | ((0x8000 ^ uint32(b&0xFFFFFFFF)) >> 4)))
m := encNumToStr(uint32(a))
n := signHead + d + f + h + i + k + l + m
oHex := itoa(int64(calOneStr3(n, 0)))
if len(oHex) < 2 {
oHex = "00"
}
o := oHex[len(oHex)-2:]
return n + o
}
func itoa(v int64) string {
if v == 0 {
return "0"
}
var digits []byte
n := v
if n < 0 {
n = -n
}
for n > 0 {
digits = append([]byte{byte('0' + n%10)}, digits...)
n /= 10
}
return string(digits)
}