Skip to content

Commit 9c1390c

Browse files
committed
feat: support sign server
1 parent b958046 commit 9c1390c

File tree

16 files changed

+62
-1063
lines changed

16 files changed

+62
-1063
lines changed

cmd/gocq/login.go

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,19 @@ import (
1414

1515
"github.com/Mrs4s/MiraiGo/client"
1616
"github.com/Mrs4s/MiraiGo/utils"
17-
"github.com/Mrs4s/MiraiGo/wrapper"
17+
"github.com/Mrs4s/go-cqhttp/internal/base"
1818
"github.com/mattn/go-colorable"
1919
"github.com/pkg/errors"
2020
log "github.com/sirupsen/logrus"
2121
"github.com/tidwall/gjson"
2222
"gopkg.ilharper.com/x/isatty"
2323

2424
"github.com/Mrs4s/go-cqhttp/global"
25-
"github.com/Mrs4s/go-cqhttp/internal/base"
2625
"github.com/Mrs4s/go-cqhttp/internal/download"
27-
"github.com/Mrs4s/go-cqhttp/internal/encryption"
28-
_ "github.com/Mrs4s/go-cqhttp/internal/encryption/t544" // side effect
2926
)
3027

3128
var console = bufio.NewReader(os.Stdin)
3229

33-
func init() {
34-
wrapper.DandelionEnergy = energy
35-
}
36-
3730
func readLine() (str string) {
3831
str, _ = console.ReadString('\n')
3932
str = strings.TrimSpace(str)
@@ -222,9 +215,8 @@ func loginResponseProcessor(res *client.LoginResponse) error {
222215
log.Warnf("设备信息被封禁, 请删除 device.json 后重试.")
223216
case 237:
224217
log.Warnf("登录过于频繁, 请在手机QQ登录并根据提示完成认证后等一段时间重试")
225-
case 45: // 在提供 t544 后还是出现45错误是需要强行升级到最新客户端或被限制非常用设备
226-
log.Warnf("你的账号涉嫌违规被限制在非常用设备登录, 请在手机QQ登录并根据提示完成认证")
227-
log.Warnf("或使用 -update-protocol 升级到最新协议后重试")
218+
case 45:
219+
log.Warnf("你的账号被限制登录, 请配置 SignServer 后重试")
228220
}
229221
log.Infof("按 Enter 继续....")
230222
readLine()
@@ -274,32 +266,47 @@ func fetchCaptcha(id string) string {
274266
}
275267

276268
func energy(uin uint64, id string, appVersion string, salt []byte) ([]byte, error) {
277-
if localSigner, ok := encryption.T544Signer[appVersion]; ok {
278-
log.Debugf("use local T544Signer v%s", appVersion)
279-
result := localSigner(time.Now().UnixMicro(), salt)
280-
log.Debugf("t544 sign result: %x", result)
281-
return result, nil
282-
}
283-
log.Debugf("fallback to remote T544Signer v%s", appVersion)
284-
signServer := "https://captcha.go-cqhttp.org/sdk/dandelion/energy"
285-
if base.SignServerOverwrite != "" {
286-
signServer = base.SignServerOverwrite
269+
signServer := base.SignServer
270+
if !strings.HasSuffix(signServer, "/") {
271+
signServer += "/"
287272
}
288273
response, err := download.Request{
289-
Method: http.MethodPost,
290-
URL: signServer,
291-
Header: map[string]string{"Content-Type": "application/x-www-form-urlencoded"},
292-
Body: bytes.NewReader([]byte(fmt.Sprintf("uin=%v&id=%s&salt=%s&version=%s", uin, id, hex.EncodeToString(salt), appVersion))),
274+
Method: http.MethodGet,
275+
URL: signServer + "custom_energy" + fmt.Sprintf("?data=%v&salt=%v", id, hex.EncodeToString(salt)),
293276
}.Bytes()
294277
if err != nil {
295-
log.Errorf("获取T544时出现问题: %v", err)
278+
log.Warnf("获取T544 sign时出现错误: %v server: %v", err, signServer)
296279
return nil, err
297280
}
298-
sign, err := hex.DecodeString(gjson.GetBytes(response, "result").String())
299-
if err != nil || len(sign) == 0 {
300-
log.Errorf("获取T544时出现问题: %v", err)
281+
data, err := hex.DecodeString(gjson.GetBytes(response, "data").String())
282+
if err != nil {
283+
log.Warnf("获取T544 sign时出现错误: %v", err)
301284
return nil, err
302285
}
303-
log.Debugf("t544 sign result: %x", sign)
304-
return sign, nil
286+
if len(data) == 0 {
287+
log.Warnf("获取T544 sign时出现错误: %v", "data is empty")
288+
return nil, errors.New("data is empty")
289+
}
290+
return data, nil
291+
}
292+
293+
func sign(seq uint64, uin string, cmd string, qua string, buff []byte) (sign []byte, extra []byte, token []byte, err error) {
294+
signServer := base.SignServer
295+
if !strings.HasSuffix(signServer, "/") {
296+
signServer += "/"
297+
}
298+
response, err := download.Request{
299+
Method: http.MethodPost,
300+
URL: signServer + "sign",
301+
Header: map[string]string{"Content-Type": "application/x-www-form-urlencoded"},
302+
Body: bytes.NewReader([]byte(fmt.Sprintf("uin=%v&qua=%s&cmd=%s&seq=%v&buffer=%v", uin, qua, cmd, seq, hex.EncodeToString(buff)))),
303+
}.Bytes()
304+
if err != nil {
305+
log.Warnf("获取sso sign时出现错误: %v server: %v", err, signServer)
306+
return nil, nil, nil, err
307+
}
308+
sign, _ = hex.DecodeString(gjson.GetBytes(response, "data.sign").String())
309+
extra, _ = hex.DecodeString(gjson.GetBytes(response, "data.extra").String())
310+
token, _ = hex.DecodeString(gjson.GetBytes(response, "data.token").String())
311+
return sign, extra, token, nil
305312
}

cmd/gocq/main.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/Mrs4s/MiraiGo/binary"
1616
"github.com/Mrs4s/MiraiGo/client"
17+
"github.com/Mrs4s/MiraiGo/wrapper"
1718
para "github.com/fumiama/go-hide-param"
1819
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
1920
"github.com/pkg/errors"
@@ -163,6 +164,14 @@ func LoginInteract() {
163164
}
164165
}
165166

167+
if base.SignServer != "-" && base.SignServer != "" {
168+
log.Infof("使用服务器 %s 进行数据包签名", base.SignServer)
169+
wrapper.DandelionEnergy = energy
170+
wrapper.FekitGetSign = sign
171+
} else {
172+
log.Warnf("警告: 未配置签名服务器, 这可能会导致登录 45 错误码或发送消息被风控")
173+
}
174+
166175
if base.Account.Encrypt {
167176
if !global.PathExists("password.encrypt") {
168177
if base.Account.Password == "" {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.20
55
require (
66
github.com/FloatTech/sqlite v1.5.7
77
github.com/Microsoft/go-winio v0.6.0
8-
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5
8+
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e
99
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e
1010
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
1111
github.com/fumiama/go-base16384 v1.6.1

go.sum

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b h1:tvciXWq2nuvTbFeJG
44
github.com/FloatTech/ttl v0.0.0-20220715042055-15612be72f5b/go.mod h1:fHZFWGquNXuHttu9dUYoKuNbm3dzLETnIOnm1muSfDs=
55
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
66
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
7-
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5 h1:E4fIQ0l/LNZK44NjdViRb/hx4cIeHXyQFPzzkx7cjVE=
8-
github.com/Mrs4s/MiraiGo v0.0.0-20230401072048-f8d9841755b5/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
7+
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e h1:99itMjI//+KaFF0+0QCBg/uHhGMJ99jG2lP6z/UnOsU=
8+
github.com/Mrs4s/MiraiGo v0.0.0-20230627090859-19e3d172596e/go.mod h1:mU3fBFU+7eO0kaGes7YRKtzIDtwIU84nSSwTV7NK2b0=
99
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d h1:/Xuj3fIiMY2ls1TwvPKmaqQrtJsPY+c9s+0lOScVHd8=
1010
github.com/RomiChan/protobuf v0.1.1-0.20230204044148-2ed269a2e54d/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
1111
github.com/RomiChan/syncx v0.0.0-20221202055724-5f842c53020e h1:wR3MXQ3VbUlPKOOUwLOYgh/QaJThBTYtsl673O3lqSA=
@@ -31,7 +31,6 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x
3131
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
3232
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
3333
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
34-
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
3534
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
3635
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
3736
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
@@ -44,7 +43,6 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
4443
github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ=
4544
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
4645
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
47-
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
4846
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
4947
github.com/jonboulle/clockwork v0.3.0 h1:9BSCMi8C+0qdApAp4auwX0RkLGUjs956h0EkuQymUhg=
5048
github.com/jonboulle/clockwork v0.3.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
@@ -54,7 +52,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ
5452
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
5553
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
5654
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
57-
github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
5855
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
5956
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
6057
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
@@ -96,7 +93,6 @@ github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0
9693
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
9794
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
9895
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
99-
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
10096
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
10197
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
10298
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -124,7 +120,6 @@ github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCO
124120
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
125121
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
126122
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
127-
github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE=
128123
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
129124
go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
130125
go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
@@ -201,13 +196,11 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
201196
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
202197
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
203198
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
204-
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
205199
gopkg.ilharper.com/x/isatty v1.1.1 h1:RAg32Pxq/nIK4AVtdm9RBqxsxZZX1uRKRSS21E5SHMk=
206200
gopkg.ilharper.com/x/isatty v1.1.1/go.mod h1:ofpv77Td5qQO6R1dmDd3oNt8TZdRo+l5gYAMxopRyS0=
207201
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
208202
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
209203
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
210-
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
211204
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
212205
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
213206
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=

internal/base/flag.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var (
3838
FastStart bool // 是否为快速启动
3939
AllowTempSession bool // 是否允许发送临时会话信息
4040
UpdateProtocol bool // 是否更新协议
41-
SignServerOverwrite string // 使用特定的服务器进行签名
41+
SignServer string // 使用特定的服务器进行签名
4242
HTTPTimeout int
4343

4444
PostFormat string // 上报格式 string or array
@@ -64,7 +64,6 @@ func Parse() {
6464
d := flag.Bool("D", false, "debug mode")
6565
flag.BoolVar(&FastStart, "faststart", false, "skip waiting 5 seconds")
6666
flag.BoolVar(&UpdateProtocol, "update-protocol", false, "update protocol")
67-
flag.StringVar(&SignServerOverwrite, "sign-server", "", "use special server to sign tlv")
6867
flag.Parse()
6968

7069
if *d {
@@ -89,6 +88,7 @@ func Init() {
8988
ReportSelfMessage = conf.Message.ReportSelfMessage
9089
UseSSOAddress = conf.Account.UseSSOAddress
9190
AllowTempSession = conf.Account.AllowTempSession
91+
SignServer = conf.Account.SignServer
9292
HTTPTimeout = conf.Message.HTTPTimeout
9393
}
9494
{ // others

internal/encryption/config.go

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)