Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
G
go-cqhttp
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nanahira
go-cqhttp
Commits
2302cf62
Commit
2302cf62
authored
Oct 17, 2020
by
wdvxdr
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'upstream/dev' into dev
parents
e719c867
9b36645b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
245 additions
and
157 deletions
+245
-157
.github/workflows/ci.yml
.github/workflows/ci.yml
+4
-2
.github/workflows/release.yml
.github/workflows/release.yml
+3
-0
README.md
README.md
+4
-0
coolq/api.go
coolq/api.go
+15
-5
coolq/bot.go
coolq/bot.go
+92
-31
coolq/cqcode.go
coolq/cqcode.go
+49
-37
coolq/event.go
coolq/event.go
+28
-4
docs/QA.md
docs/QA.md
+0
-8
go.mod
go.mod
+2
-15
go.sum
go.sum
+26
-39
server/apiAdmin.go
server/apiAdmin.go
+16
-10
server/http.go
server/http.go
+4
-4
server/websocket.go
server/websocket.go
+2
-2
No files found.
.github/workflows/ci.yml
View file @
2302cf62
...
...
@@ -14,12 +14,14 @@ jobs:
runs-on
:
ubuntu-latest
strategy
:
matrix
:
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/
386, darwin/amd64
# build and publish in parallel: linux/386, linux/amd64, windows/386, windows/amd64, darwin/
amd64
goos
:
[
linux
,
windows
,
darwin
]
goarch
:
[
"
386"
,
amd64
,
arm
]
exclude
:
-
goos
:
darwin
goarch
:
arm
-
goos
:
darwin
goarch
:
"
386"
fail-fast
:
true
steps
:
...
...
@@ -28,7 +30,7 @@ jobs:
-
name
:
Setup Go environment
uses
:
actions/setup-go@v2.1.1
with
:
go-version
:
1.1
4
go-version
:
1.1
5
-
name
:
Build binary file
env
:
...
...
.github/workflows/release.yml
View file @
2302cf62
...
...
@@ -14,6 +14,8 @@ jobs:
exclude
:
-
goos
:
darwin
goarch
:
arm
-
goos
:
darwin
goarch
:
"
386"
steps
:
-
uses
:
actions/checkout@v2
...
...
@@ -26,5 +28,6 @@ jobs:
github_token
:
${{ secrets.GITHUB_TOKEN }}
goos
:
${{ matrix.goos }}
goarch
:
${{ matrix.goarch }}
goversion
:
"
https://golang.org/dl/go1.15.3.linux-amd64.tar.gz"
ldflags
:
-w -s -X "github.com/Mrs4s/go-cqhttp/coolq.Version=${{ env.RELEASE_VERSION }}"
\ No newline at end of file
README.md
View file @
2302cf62
...
...
@@ -35,6 +35,10 @@
-
[CQ:reply]
-
[CQ:forward]
-
[CQ:node]
-
[CQ:gift]
-
[CQ:redbag]
-
[CQ:tts]
-
[CQ:music]
</details>
...
...
coolq/api.go
View file @
2302cf62
...
...
@@ -189,7 +189,7 @@ func (bot *CQBot) CQSendGroupForwardMessage(groupId int64, m gjson.Result) MSG {
ts
.
Add
(
time
.
Second
)
if
e
.
Get
(
"data.id"
)
.
Exists
()
{
i
,
_
:=
strconv
.
Atoi
(
e
.
Get
(
"data.id"
)
.
Str
)
m
:=
bot
.
Get
Group
Message
(
int32
(
i
))
m
:=
bot
.
GetMessage
(
int32
(
i
))
if
m
!=
nil
{
sender
:=
m
[
"sender"
]
.
(
message
.
Sender
)
nodes
=
append
(
nodes
,
&
message
.
ForwardNode
{
...
...
@@ -412,11 +412,19 @@ func (bot *CQBot) CQProcessGroupRequest(flag, subType, reason string, approve bo
// https://cqhttp.cc/docs/4.15/#/API?id=delete_msg-%E6%92%A4%E5%9B%9E%E6%B6%88%E6%81%AF
func
(
bot
*
CQBot
)
CQDeleteMessage
(
messageId
int32
)
MSG
{
msg
:=
bot
.
Get
Group
Message
(
messageId
)
msg
:=
bot
.
GetMessage
(
messageId
)
if
msg
==
nil
{
return
Failed
(
100
)
}
bot
.
Client
.
RecallGroupMessage
(
msg
[
"group"
]
.
(
int64
),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
if
_
,
ok
:=
msg
[
"group"
];
ok
{
bot
.
Client
.
RecallGroupMessage
(
msg
[
"group"
]
.
(
int64
),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
}
else
{
if
msg
[
"sender"
]
.
(
message
.
Sender
)
.
Uin
!=
bot
.
Client
.
Uin
{
log
.
Warnf
(
"撤回 %v 失败: 好友会话无法撤回对方消息."
)
return
Failed
(
100
)
}
bot
.
Client
.
RecallPrivateMessage
(
msg
[
"target"
]
.
(
int64
),
int64
(
msg
[
"time"
]
.
(
int32
)),
msg
[
"message-id"
]
.
(
int32
),
msg
[
"internal-id"
]
.
(
int32
))
}
return
OK
(
nil
)
}
...
...
@@ -638,15 +646,17 @@ func (bot *CQBot) CQGetForwardMessage(resId string) MSG {
})
}
func
(
bot
*
CQBot
)
CQGet
Group
Message
(
messageId
int32
)
MSG
{
msg
:=
bot
.
Get
Group
Message
(
messageId
)
func
(
bot
*
CQBot
)
CQGetMessage
(
messageId
int32
)
MSG
{
msg
:=
bot
.
GetMessage
(
messageId
)
if
msg
==
nil
{
return
Failed
(
100
)
}
sender
:=
msg
[
"sender"
]
.
(
message
.
Sender
)
_
,
group
:=
msg
[
"group"
]
return
OK
(
MSG
{
"message_id"
:
messageId
,
"real_id"
:
msg
[
"message-id"
],
"group"
:
group
,
"sender"
:
MSG
{
"user_id"
:
sender
.
Uin
,
"nickname"
:
sender
.
Nickname
,
...
...
coolq/bot.go
View file @
2302cf62
...
...
@@ -5,6 +5,7 @@ import (
"encoding/gob"
"encoding/json"
"fmt"
"github.com/syndtr/goleveldb/leveldb"
"hash/crc32"
"path"
"sync"
...
...
@@ -17,14 +18,13 @@ import (
log
"github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
"github.com/xujiajun/nutsdb"
)
type
CQBot
struct
{
Client
*
client
.
QQClient
events
[]
func
(
MSG
)
db
*
nuts
db
.
DB
db
*
level
db
.
DB
friendReqCache
sync
.
Map
invitedReqCache
sync
.
Map
joinReqCache
sync
.
Map
...
...
@@ -41,10 +41,8 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
Client
:
cli
,
}
if
conf
.
EnableDB
{
opt
:=
nutsdb
.
DefaultOptions
opt
.
Dir
=
path
.
Join
(
"data"
,
"db"
)
opt
.
EntryIdxMode
=
nutsdb
.
HintBPTSparseIdxMode
db
,
err
:=
nutsdb
.
Open
(
opt
)
p
:=
path
.
Join
(
"data"
,
"leveldb"
)
db
,
err
:=
leveldb
.
OpenFile
(
p
,
nil
)
if
err
!=
nil
{
log
.
Fatalf
(
"打开数据库失败, 如果频繁遇到此问题请清理 data/db 文件夹或关闭数据库功能。"
)
}
...
...
@@ -61,6 +59,7 @@ func NewQQBot(cli *client.QQClient, conf *global.JsonConfig) *CQBot {
bot
.
Client
.
OnGroupMessageRecalled
(
bot
.
groupRecallEvent
)
bot
.
Client
.
OnGroupNotify
(
bot
.
groupNotifyEvent
)
bot
.
Client
.
OnFriendMessageRecalled
(
bot
.
friendRecallEvent
)
bot
.
Client
.
OnReceivedOfflineFile
(
bot
.
offlineFileEvent
)
bot
.
Client
.
OnJoinGroup
(
bot
.
joinGroupEvent
)
bot
.
Client
.
OnLeaveGroup
(
bot
.
leaveGroupEvent
)
bot
.
Client
.
OnGroupMemberJoined
(
bot
.
memberJoinEvent
)
...
...
@@ -99,20 +98,17 @@ func (bot *CQBot) OnEventPush(f func(m MSG)) {
bot
.
events
=
append
(
bot
.
events
,
f
)
}
func
(
bot
*
CQBot
)
Get
Group
Message
(
mid
int32
)
MSG
{
func
(
bot
*
CQBot
)
GetMessage
(
mid
int32
)
MSG
{
if
bot
.
db
!=
nil
{
m
:=
MSG
{}
err
:=
bot
.
db
.
View
(
func
(
tx
*
nutsdb
.
Tx
)
error
{
e
,
err
:=
tx
.
Get
(
"group-messages"
,
binary
.
ToBytes
(
mid
))
if
err
!=
nil
{
return
err
}
buff
:=
new
(
bytes
.
Buffer
)
buff
.
Write
(
binary
.
GZipUncompress
(
e
.
Value
))
return
gob
.
NewDecoder
(
buff
)
.
Decode
(
&
m
)
})
data
,
err
:=
bot
.
db
.
Get
(
binary
.
ToBytes
(
mid
),
nil
)
if
err
==
nil
{
return
m
buff
:=
new
(
bytes
.
Buffer
)
buff
.
Write
(
binary
.
GZipUncompress
(
data
))
err
=
gob
.
NewDecoder
(
buff
)
.
Decode
(
&
m
)
if
err
==
nil
{
return
m
}
}
log
.
Warnf
(
"获取信息时出现错误: %v id: %v"
,
err
,
mid
)
}
...
...
@@ -217,30 +213,73 @@ func (bot *CQBot) SendPrivateMessage(target int64, m *message.SendingMessage) in
newElem
=
append
(
newElem
,
fm
)
continue
}
if
i
,
ok
:=
elem
.
(
*
message
.
VoiceElement
);
ok
{
fv
,
err
:=
bot
.
Client
.
UploadPrivatePtt
(
target
,
i
.
Data
)
if
err
!=
nil
{
log
.
Warnf
(
"警告: 好友 %v 消息语音上传失败: %v"
,
target
,
err
)
continue
}
newElem
=
append
(
newElem
,
fv
)
continue
}
if
i
,
ok
:=
elem
.
(
*
QQMusicElement
);
ok
{
var
msgStyle
uint32
=
4
if
i
.
MusicUrl
==
""
{
msgStyle
=
0
// fix vip song
}
bot
.
Client
.
SendFriendRichMessage
(
target
,
100497308
,
1
,
msgStyle
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"com.tencent.qqmusic"
,
Signature
:
"cbd27cd7c861227d013a25b2d10f0799"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
return
0
}
if
i
,
ok
:=
elem
.
(
*
CloudMusicElement
);
ok
{
bot
.
Client
.
SendFriendRichMessage
(
target
,
100495085
,
1
,
4
,
client
.
RichClientInfo
{
Platform
:
1
,
SdkVersion
:
"0.0.0"
,
PackageName
:
"com.netease.cloudmusic"
,
Signature
:
"da6b069da1e2982db3e386233f68d76d"
,
},
&
message
.
RichMessage
{
Title
:
i
.
Title
,
Summary
:
i
.
Summary
,
Url
:
i
.
Url
,
PictureUrl
:
i
.
PictureUrl
,
MusicUrl
:
i
.
MusicUrl
,
})
return
0
}
newElem
=
append
(
newElem
,
elem
)
}
m
.
Elements
=
newElem
var
id
int32
=
-
1
if
bot
.
Client
.
FindFriend
(
target
)
!=
nil
{
if
bot
.
Client
.
FindFriend
(
target
)
!=
nil
{
// 双向好友
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
if
msg
!=
nil
{
id
=
msg
.
Id
id
=
bot
.
InsertPrivateMessage
(
msg
)
}
}
else
if
code
,
ok
:=
bot
.
tempMsgCache
.
Load
(
target
);
ok
{
}
else
if
code
,
ok
:=
bot
.
tempMsgCache
.
Load
(
target
);
ok
{
// 临时会话
msg
:=
bot
.
Client
.
SendTempMessage
(
code
.
(
int64
),
target
,
m
)
if
msg
!=
nil
{
id
=
msg
.
Id
}
}
else
if
_
,
ok
:=
bot
.
oneWayMsgCache
.
Load
(
target
);
ok
{
}
else
if
_
,
ok
:=
bot
.
oneWayMsgCache
.
Load
(
target
);
ok
{
// 单向好友
msg
:=
bot
.
Client
.
SendPrivateMessage
(
target
,
m
)
if
msg
!=
nil
{
id
=
msg
.
Id
id
=
bot
.
InsertPrivateMessage
(
msg
)
}
}
if
id
==
-
1
{
return
-
1
}
return
ToGlobalId
(
target
,
id
)
return
id
}
func
(
bot
*
CQBot
)
InsertGroupMessage
(
m
*
message
.
GroupMessage
)
int32
{
...
...
@@ -255,14 +294,36 @@ func (bot *CQBot) InsertGroupMessage(m *message.GroupMessage) int32 {
}
id
:=
ToGlobalId
(
m
.
GroupCode
,
m
.
Id
)
if
bot
.
db
!=
nil
{
err
:=
bot
.
db
.
Update
(
func
(
tx
*
nutsdb
.
Tx
)
error
{
buf
:=
new
(
bytes
.
Buffer
)
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
return
err
}
return
tx
.
Put
(
"group-messages"
,
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
0
)
})
if
err
!=
nil
{
buf
:=
new
(
bytes
.
Buffer
)
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
}
if
err
:=
bot
.
db
.
Put
(
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
nil
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
}
}
return
id
}
func
(
bot
*
CQBot
)
InsertPrivateMessage
(
m
*
message
.
PrivateMessage
)
int32
{
val
:=
MSG
{
"message-id"
:
m
.
Id
,
"internal-id"
:
m
.
InternalId
,
"target"
:
m
.
Target
,
"sender"
:
m
.
Sender
,
"time"
:
m
.
Time
,
"message"
:
ToStringMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
true
),
}
id
:=
ToGlobalId
(
m
.
Sender
.
Uin
,
m
.
Id
)
if
bot
.
db
!=
nil
{
buf
:=
new
(
bytes
.
Buffer
)
if
err
:=
gob
.
NewEncoder
(
buf
)
.
Encode
(
val
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
}
if
err
:=
bot
.
db
.
Put
(
binary
.
ToBytes
(
id
),
binary
.
GZipCompress
(
buf
.
Bytes
()),
nil
);
err
!=
nil
{
log
.
Warnf
(
"记录聊天数据时出现错误: %v"
,
err
)
return
-
1
}
...
...
coolq/cqcode.go
View file @
2302cf62
...
...
@@ -269,7 +269,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
for
_
,
p
:=
range
ps
{
d
[
p
[
1
]]
=
CQCodeUnescapeValue
(
p
[
2
])
}
if
t
==
"reply"
&&
group
{
if
t
==
"reply"
{
if
len
(
r
)
>
0
{
if
_
,
ok
:=
r
[
0
]
.
(
*
message
.
ReplyElement
);
ok
{
log
.
Warnf
(
"警告: 一条信息只能包含一个 Reply 元素."
)
...
...
@@ -278,7 +278,7 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
}
mid
,
err
:=
strconv
.
Atoi
(
d
[
"id"
])
if
err
==
nil
{
org
:=
bot
.
Get
Group
Message
(
int32
(
mid
))
org
:=
bot
.
GetMessage
(
int32
(
mid
))
if
org
!=
nil
{
r
=
append
([]
message
.
IMessageElement
{
&
message
.
ReplyElement
{
...
...
@@ -322,7 +322,7 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
}
mid
,
err
:=
strconv
.
Atoi
(
e
.
Get
(
"data"
)
.
Get
(
"id"
)
.
Str
)
if
err
==
nil
{
org
:=
bot
.
Get
Group
Message
(
int32
(
mid
))
org
:=
bot
.
GetMessage
(
int32
(
mid
))
if
org
!=
nil
{
r
=
append
([]
message
.
IMessageElement
{
&
message
.
ReplyElement
{
...
...
@@ -367,8 +367,8 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
case
"text"
:
return
message
.
NewText
(
d
[
"text"
]),
nil
case
"image"
:
img
,
err
:=
bot
.
makeImageElem
(
d
,
group
)
if
err
!=
nil
{
img
,
err
:=
bot
.
makeImageElem
(
d
,
group
)
if
err
!=
nil
{
return
nil
,
err
}
tp
:=
d
[
"type"
]
...
...
@@ -387,21 +387,21 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
}
switch
tp
{
case
"flash"
:
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupFlashPicElement
{
GroupImageElement
:
*
i
},
nil
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupFlashPicElement
{
GroupImageElement
:
*
i
},
nil
}
if
i
,
ok
:=
img
.
(
*
message
.
FriendImageElement
);
ok
{
return
&
message
.
FriendFlashPicElement
{
FriendImageElement
:
*
i
},
nil
if
i
,
ok
:=
img
.
(
*
message
.
FriendImageElement
);
ok
{
return
&
message
.
FriendFlashPicElement
{
FriendImageElement
:
*
i
},
nil
}
case
"show"
:
id
,
_
:=
strconv
.
ParseInt
(
d
[
"id"
],
10
,
64
)
if
id
<
40000
||
id
>=
40006
{
id
=
40000
}
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupShowPicElement
{
GroupImageElement
:
*
i
,
EffectId
:
int32
(
id
)},
nil
if
i
,
ok
:=
img
.
(
*
message
.
GroupImageElement
);
ok
{
return
&
message
.
GroupShowPicElement
{
GroupImageElement
:
*
i
,
EffectId
:
int32
(
id
)},
nil
}
return
img
,
nil
// 私聊还没做
return
img
,
nil
// 私聊还没做
}
case
"poke"
:
...
...
@@ -421,11 +421,8 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
}
return
&
GiftElement
{
Target
:
t
,
GiftId
:
GiftId
[
id
]},
nil
case
"tts"
:
if
!
group
{
return
nil
,
errors
.
New
(
"private voice unsupported now"
)
}
defer
func
()
{
if
r
:=
recover
();
r
!=
nil
{
if
r
:=
recover
();
r
!=
nil
{
m
=
nil
err
=
errors
.
New
(
"tts 转换失败"
)
}
...
...
@@ -437,9 +434,6 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
}
return
&
message
.
VoiceElement
{
Data
:
data
},
nil
case
"record"
:
if
!
group
{
return
nil
,
errors
.
New
(
"private voice unsupported now"
)
}
f
:=
d
[
"file"
]
data
,
err
:=
global
.
FindFile
(
f
,
d
[
"cache"
],
global
.
VOICE_PATH
)
if
err
!=
nil
{
...
...
@@ -524,6 +518,24 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
}},
nil
}
if
d
[
"type"
]
==
"custom"
{
if
d
[
"subtype"
]
==
"qq"
{
return
&
QQMusicElement
{
MusicElement
{
Title
:
d
[
"title"
],
Summary
:
d
[
"content"
],
Url
:
d
[
"url"
],
PictureUrl
:
d
[
"image"
],
MusicUrl
:
d
[
"purl"
],
}},
nil
}
if
d
[
"subtype"
]
==
"163"
{
return
&
CloudMusicElement
{
MusicElement
{
Title
:
d
[
"title"
],
Summary
:
d
[
"content"
],
Url
:
d
[
"url"
],
PictureUrl
:
d
[
"image"
],
MusicUrl
:
d
[
"purl"
],
}},
nil
}
xml
:=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] %s" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="2"><audio cover="%s" src="%s"/><title>%s</title><summary>%s</summary></item><source name="音乐" icon="https://i.gtimg.cn/open/app_icon/01/07/98/56/1101079856_100_m.png" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.tencent.qqmusic" i_actionData="tencent1101079856://" appid="1101079856" /></msg>`
,
d
[
"title"
],
d
[
"url"
],
d
[
"image"
],
d
[
"audio"
],
d
[
"title"
],
d
[
"content"
])
return
&
message
.
ServiceElement
{
...
...
@@ -555,27 +567,27 @@ func (bot *CQBot) ToElement(t string, d map[string]string, group bool) (m messag
case
"cardimage"
:
source
:=
d
[
"source"
]
icon
:=
d
[
"icon"
]
min
w
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"minwidth"
],
10
,
64
)
if
min
w
idth
==
0
{
min
w
idth
=
200
min
W
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"minwidth"
],
10
,
64
)
if
min
W
idth
==
0
{
min
W
idth
=
200
}
min
h
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"minheight"
],
10
,
64
)
if
min
h
eight
==
0
{
min
h
eight
=
200
min
H
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"minheight"
],
10
,
64
)
if
min
H
eight
==
0
{
min
H
eight
=
200
}
max
w
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"maxwidth"
],
10
,
64
)
if
max
w
idth
==
0
{
max
w
idth
=
500
max
W
idth
,
_
:=
strconv
.
ParseInt
(
d
[
"maxwidth"
],
10
,
64
)
if
max
W
idth
==
0
{
max
W
idth
=
500
}
max
h
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"maxheight"
],
10
,
64
)
if
max
h
eight
==
0
{
max
h
eight
=
1000
max
H
eight
,
_
:=
strconv
.
ParseInt
(
d
[
"maxheight"
],
10
,
64
)
if
max
H
eight
==
0
{
max
H
eight
=
1000
}
img
,
err
:=
bot
.
makeImageElem
(
d
,
group
)
if
err
!=
nil
{
return
nil
,
errors
.
New
(
"send cardimage faild"
)
}
return
bot
.
SendNewPic
(
img
,
source
,
icon
,
min
width
,
minheight
,
maxwidth
,
maxh
eight
,
group
)
return
bot
.
SendNewPic
(
img
,
source
,
icon
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
group
)
default
:
return
nil
,
errors
.
New
(
"unsupported cq code: "
+
t
)
}
...
...
@@ -725,7 +737,7 @@ func (bot *CQBot) makeImageElem(d map[string]string, group bool) (message.IMessa
}
//SendNewPic 一种xml 方式发送的群消息图片
func
(
bot
*
CQBot
)
SendNewPic
(
elem
message
.
IMessageElement
,
source
string
,
icon
string
,
min
width
int64
,
minheigt
int64
,
maxwidth
int64
,
maxh
eight
int64
,
group
bool
)
(
*
message
.
ServiceElement
,
error
)
{
func
(
bot
*
CQBot
)
SendNewPic
(
elem
message
.
IMessageElement
,
source
string
,
icon
string
,
min
Width
int64
,
minHeight
int64
,
maxWidth
int64
,
maxH
eight
int64
,
group
bool
)
(
*
message
.
ServiceElement
,
error
)
{
var
xml
string
xml
=
""
if
i
,
ok
:=
elem
.
(
*
message
.
ImageElement
);
ok
{
...
...
@@ -735,7 +747,7 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
log
.
Warnf
(
"警告: 好友消息 %v 消息图片上传失败: %v"
,
1
,
err
)
return
nil
,
err
}
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
else
{
gm
,
err
:=
bot
.
Client
.
UploadGroupImage
(
1
,
i
.
Data
)
...
...
@@ -743,14 +755,14 @@ func (bot *CQBot) SendNewPic(elem message.IMessageElement, source string, icon s
log
.
Warnf
(
"警告: 群 %v 消息图片上传失败: %v"
,
1
,
err
)
return
nil
,
err
}
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
gm
.
Md5
,
gm
.
Md5
,
len
(
i
.
Data
),
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
}
if
i
,
ok
:=
elem
.
(
*
message
.
GroupImageElement
);
ok
{
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
if
i
,
ok
:=
elem
.
(
*
message
.
FriendImageElement
);
ok
{
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
width
,
minheigt
,
maxwidth
,
maxh
eight
,
source
,
icon
)
xml
=
fmt
.
Sprintf
(
`<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="5" templateID="12345" action="" brief="[分享]我看到一张很赞的图片,分享给你,快来看!" sourceMsgId="0" url="%s" flag="0" adverSign="0" multiMsgFlag="0"><item layout="0" advertiser_id="0" aid="0"><image uuid="%x" md5="%x" GroupFiledid="0" filesize="%d" local_path="%s" minWidth="%d" minHeight="%d" maxWidth="%d" maxHeight="%d" /></item><source name="%s" icon="%s" action="" appid="-1" /></msg>`
,
""
,
i
.
Md5
,
i
.
Md5
,
0
,
""
,
min
Width
,
minHeight
,
maxWidth
,
maxH
eight
,
source
,
icon
)
}
if
xml
!=
""
{
log
.
Warn
(
xml
)
...
...
coolq/event.go
View file @
2302cf62
...
...
@@ -31,18 +31,22 @@ func ToFormattedMessage(e []message.IMessageElement, code int64, raw ...bool) (r
func
(
bot
*
CQBot
)
privateMessageEvent
(
c
*
client
.
QQClient
,
m
*
message
.
PrivateMessage
)
{
bot
.
checkMedia
(
m
.
Elements
)
cqm
:=
ToStringMessage
(
m
.
Elements
,
0
,
true
)
cqm
:=
ToStringMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
true
)
if
!
m
.
Sender
.
IsFriend
{
bot
.
oneWayMsgCache
.
Store
(
m
.
Sender
.
Uin
,
""
)
}
log
.
Infof
(
"收到好友 %v(%v) 的消息: %v"
,
m
.
Sender
.
DisplayName
(),
m
.
Sender
.
Uin
,
cqm
)
id
:=
m
.
Id
if
bot
.
db
!=
nil
{
id
=
bot
.
InsertPrivateMessage
(
m
)
}
log
.
Infof
(
"收到好友 %v(%v) 的消息: %v (%v)"
,
m
.
Sender
.
DisplayName
(),
m
.
Sender
.
Uin
,
cqm
,
id
)
fm
:=
MSG
{
"post_type"
:
"message"
,
"message_type"
:
"private"
,
"sub_type"
:
"friend"
,
"message_id"
:
ToGlobalId
(
m
.
Sender
.
Uin
,
m
.
Id
)
,
"message_id"
:
id
,
"user_id"
:
m
.
Sender
.
Uin
,
"message"
:
ToFormattedMessage
(
m
.
Elements
,
0
,
false
),
"message"
:
ToFormattedMessage
(
m
.
Elements
,
m
.
Sender
.
Uin
,
false
),
"raw_message"
:
cqm
,
"font"
:
0
,
"self_id"
:
c
.
Uin
,
...
...
@@ -278,6 +282,26 @@ func (bot *CQBot) friendRecallEvent(c *client.QQClient, e *client.FriendMessageR
})
}
func
(
bot
*
CQBot
)
offlineFileEvent
(
c
*
client
.
QQClient
,
e
*
client
.
OfflineFileEvent
)
{
f
:=
c
.
FindFriend
(
e
.
Sender
)
if
f
==
nil
{
return
}
log
.
Infof
(
"好友 %v(%v) 发送了离线文件 %v"
,
f
.
Nickname
,
f
.
Uin
,
e
.
FileName
)
bot
.
dispatchEventMessage
(
MSG
{
"post_type"
:
"notice"
,
"notice_type"
:
"offline_file"
,
"user_id"
:
e
.
Sender
,
"file"
:
MSG
{
"name"
:
e
.
FileName
,
"size"
:
e
.
FileSize
,
"url"
:
e
.
DownloadUrl
,
},
"self_id"
:
c
.
Uin
,
"time"
:
time
.
Now
()
.
Unix
(),
})
}
func
(
bot
*
CQBot
)
joinGroupEvent
(
c
*
client
.
QQClient
,
group
*
client
.
GroupInfo
)
{
log
.
Infof
(
"Bot进入了群 %v."
,
formatGroupName
(
group
))
bot
.
dispatchEventMessage
(
bot
.
groupIncrease
(
group
.
Code
,
0
,
c
.
Uin
))
...
...
docs/QA.md
View file @
2302cf62
# 常见问题
### Q: 为什么登录的时候出现 `客户端版本过低 请升级客户端`?
### A: 此问题是因为密码输入错误导致的, 信息为服务器返回, 很可能是TX相关的错误, 请检查密码
### Q: 为什么登录的时候出现 `为了您的帐号安全,请使用QQ一键登录`?
### A: 因为目前手机协议不支持图片验证码,切换成平板协议登录成功后,再切换回手机协议即可
### Q: 为什么挂一段时间后就会出现 `消息发送失败,账号可能被风控`?
### A: 如果你刚开始使用 go-cqhttp 建议挂机3-7天,即可解除风控
go.mod
View file @
2302cf62
...
...
@@ -3,32 +3,19 @@ module github.com/Mrs4s/go-cqhttp
go 1.14
require (
github.com/Mrs4s/MiraiGo v0.0.0-20201011070235-2fa335fd8b68
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/Mrs4s/MiraiGo v0.0.0-20201017083749-517ddcd50b8d
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.4.0 // indirect
github.com/gorilla/websocket v1.4.2
github.com/guonaihong/gout v0.1.2
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
github.com/jonboulle/clockwork v0.2.0 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/lestrrat-go/strftime v1.0.3 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/sirupsen/logrus v1.7.0
github.com/syndtr/goleveldb v1.0.0
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
github.com/tebeka/strftime v0.1.5 // indirect
github.com/tidwall/gjson v1.6.1
github.com/ugorji/go v1.1.10 // indirect
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6
github.com/xujiajun/nutsdb v0.5.0
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 // indirect
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb // indirect
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 // indirect
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
gopkg.in/yaml.v2 v2.3.0 // indirect
)
go.sum
View file @
2302cf62
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Mrs4s/MiraiGo v0.0.0-20201008134448-b53aaceaa1b4 h1:vNDY7JAh+e7ac0Dft3GF+s4WZU55SZkwaAI7UmXfwHc=
github.com/Mrs4s/MiraiGo v0.0.0-20201008134448-b53aaceaa1b4/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201011070235-2fa335fd8b68 h1:+BT4VZ0ZeiTFRV5hOzxJR0d3FW2dcl+ZZwCY5zL5Xls=
github.com/Mrs4s/MiraiGo v0.0.0-20201011070235-2fa335fd8b68/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201013050256-7b392cacdb79 h1:t9PK37mnl5tbilG+FMUY1hZujoDjFr8iO8upwYHww5c=
github.com/Mrs4s/MiraiGo v0.0.0-20201013050256-7b392cacdb79/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201016033322-0922b058ff56 h1:vcXOLG+W/c56EWOwA8btrHMEGBMwFgLUZli0Jh1axzg=
github.com/Mrs4s/MiraiGo v0.0.0-20201016033322-0922b058ff56/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201017083749-517ddcd50b8d h1:f59SuqT0RVy6T9nAg6zTNfnzkvdgLdGqkNKu/AfiPU4=
github.com/Mrs4s/MiraiGo v0.0.0-20201017083749-517ddcd50b8d/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
...
...
@@ -12,7 +14,7 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/f
astly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw
=
github.com/f
snotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo
=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
...
...
@@ -25,9 +27,8 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY=
github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI=
github.com/go-playground/validator/v10 v10.4.0 h1:72qIR/m8ybvL8L5TIyfgrigqkrw7kVYAvjEvpT85l70=
github.com/go-playground/validator/v10 v10.4.0/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
...
...
@@ -41,6 +42,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
...
...
@@ -52,12 +55,9 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/guonaihong/gout v0.1.2 h1:TR2XCRopGgJdj231IayEoeavgbznFXzzzcZVdT/hG10=
github.com/guonaihong/gout v0.1.2/go.mod h1:vXvv5Kxr70eM5wrp4F0+t9lnLWmq+YPW2GByll2f/EA=
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag=
github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
...
...
@@ -71,13 +71,12 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
...
...
@@ -93,23 +92,20 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 h1:J6v8awz+me+xeb/cUTotKgceAYouhIB3pjzgRd6IlGk=
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
github.com/tebeka/strftime v0.1.5/go.mod h1:29/OidkoWHdEKZqzyDLUyC+LmgDgdHo4WAFCDT7D/Ig=
github.com/tidwall/gjson v1.6.1 h1:LRbvNuNuvAiISWg6gxLEFuCe72UKy5hDqhxW/8183ws=
github.com/tidwall/gjson v1.6.1/go.mod h1:BaHyNc5bjzYkPqgLq7mdVzeiRtULKULXLgZFKsxEHI0=
github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc=
github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E=
github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.1.10 h1:Mh7W3N/hGJJ8fRQNHIgomNTa0CgZc0aKDFvbgHl+U7A=
github.com/ugorji/go v1.1.10/go.mod h1:/tC+H0R6N4Lcv4DoSdphIa9y/RAs4QFHDtN9W2oQcHw=
github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.1.10 h1:otofY/FAoRTMVqlVeDv/Kpm04D13lfJdrDqPbc3axg4=
github.com/ugorji/go/codec v1.1.10/go.mod h1:jdPQoxvTq1mb8XV6RmofOz5UgNKV2czR6xvxXGwy1Bo=
github.com/wdvxdr1123/go-silk v0.0.0-20201006020916-0398076200ea h1:OqkIV1VL5xm88jhXLaPHRJroeRknxN3EApcAVlNIIOw=
github.com/wdvxdr1123/go-silk v0.0.0-20201006020916-0398076200ea/go.mod h1:5q9LFlBr+yX/J8Jd/9wHdXwkkjFkNyQIS7kX2Lgx/Zs=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6 h1:lX18MCdNzT2zIi7K02x4C5cPkDXpL+wCb1YTAMXjLWQ=
github.com/wdvxdr1123/go-silk v0.0.0-20201007123416-b982fd3d91d6/go.mod h1:5q9LFlBr+yX/J8Jd/9wHdXwkkjFkNyQIS7kX2Lgx/Zs=
github.com/xujiajun/gorouter v1.2.0/go.mod h1:yJrIta+bTNpBM/2UT8hLOaEAFckO+m/qmR3luMIQygM=
...
...
@@ -122,43 +118,32 @@ github.com/xujiajun/utils v0.0.0-20190123093513-8bf096c4f53b/go.mod h1:AZd87GYJl
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189 h1:4UJw9if55Fu3HOwbfcaQlJ27p3oeJU2JZqoeT3ITJQk=
github.com/yinghau76/go-ascii-art v0.0.0-20190517192627-e7f465a30189/go.mod h1:rIrm5geMiBhPQkdfUm8gDFi/WiHneOp1i9KjmJqc+9I=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20
190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg
=
golang.org/x/net v0.0.0-20
200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA
=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M=
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf h1:AvBTl0xbF/KtHyvm61X4gSPF7/dKJ/xQqJwKr1Qu9no=
golang.org/x/sys v0.0.0-20201007082116-8445cc04cbdf/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM=
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
...
...
@@ -186,11 +171,13 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD
google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
server/apiAdmin.go
View file @
2302cf62
...
...
@@ -77,7 +77,9 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
if
err
!=
nil
{
log
.
Error
(
err
)
log
.
Infof
(
"请检查端口是否被占用."
)
time
.
Sleep
(
time
.
Second
*
5
)
c
:=
make
(
chan
os
.
Signal
,
1
)
signal
.
Notify
(
c
,
os
.
Interrupt
,
os
.
Kill
)
<-
c
os
.
Exit
(
1
)
}
}
else
{
...
...
@@ -96,6 +98,10 @@ func (s *webServer) Run(addr string, cli *client.QQClient) *coolq.CQBot {
func
(
s
*
webServer
)
Dologin
()
{
s
.
Console
=
bufio
.
NewReader
(
os
.
Stdin
)
readLine
:=
func
()
(
str
string
)
{
str
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
return
}
conf
:=
GetConf
()
cli
:=
s
.
Cli
cli
.
AllowSlider
=
true
...
...
@@ -109,7 +115,7 @@ func (s *webServer) Dologin() {
if
client
.
SystemDeviceInfo
.
Protocol
==
client
.
AndroidPhone
{
log
.
Warnf
(
"警告: Android Phone 强制要求暂不支持的滑条验证码, 请开启设备锁或切换到Watch协议验证通过后再使用."
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
}
cli
.
AllowSlider
=
false
...
...
@@ -125,21 +131,21 @@ func (s *webServer) Dologin() {
text
=
<-
WebInput
}
else
{
log
.
Warn
(
"请输入验证码 (captcha.jpg): (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
}
rsp
,
err
=
cli
.
SubmitCaptcha
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
rsp
.
CaptchaSign
)
global
.
DelFile
(
"captcha.jpg"
)
continue
case
client
.
SMSNeededError
:
log
.
Warnf
(
"账号已开启设备锁, 按下 Enter 向手机 %v 发送短信验证码."
,
rsp
.
SMSPhone
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
if
!
cli
.
RequestSMS
()
{
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
time
.
Sleep
(
time
.
Second
*
5
)
os
.
Exit
(
0
)
}
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
continue
case
client
.
SMSOrVerifyNeededError
:
...
...
@@ -147,7 +153,7 @@ func (s *webServer) Dologin() {
log
.
Warnf
(
"1. 向手机 %v 发送短信验证码"
,
rsp
.
SMSPhone
)
log
.
Warnf
(
"2. 使用手机QQ扫码验证."
)
log
.
Warn
(
"请输入(1 - 2): "
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
if
strings
.
Contains
(
text
,
"1"
)
{
if
!
cli
.
RequestSMS
()
{
log
.
Warnf
(
"发送验证码失败,可能是请求过于频繁."
)
...
...
@@ -155,13 +161,13 @@ func (s *webServer) Dologin() {
os
.
Exit
(
0
)
}
log
.
Warn
(
"请输入短信验证码: (Enter 提交)"
)
text
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
text
=
readLine
(
)
rsp
,
err
=
cli
.
SubmitSMS
(
strings
.
ReplaceAll
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
"
\r
"
,
""
))
continue
}
log
.
Warnf
(
"请前往 -> %v <- 验证并重启Bot."
,
rsp
.
VerifyUrl
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
return
case
client
.
UnsafeDeviceError
:
...
...
@@ -171,7 +177,7 @@ func (s *webServer) Dologin() {
text
=
<-
WebInput
}
else
{
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
}
log
.
Info
(
text
)
os
.
Exit
(
0
)
...
...
@@ -179,7 +185,7 @@ func (s *webServer) Dologin() {
case
client
.
OtherLoginError
,
client
.
UnknownLoginError
:
log
.
Warnf
(
"登录失败: %v"
,
rsp
.
ErrorMessage
)
log
.
Infof
(
"按 Enter 继续...."
)
_
,
_
=
s
.
Console
.
ReadString
(
'\n'
)
readLine
(
)
os
.
Exit
(
0
)
return
}
...
...
server/http.go
View file @
2302cf62
...
...
@@ -234,9 +234,9 @@ func (s *httpServer) GetImage(c *gin.Context) {
c
.
JSON
(
200
,
s
.
bot
.
CQGetImage
(
file
))
}
func
(
s
*
httpServer
)
Get
Group
Message
(
c
*
gin
.
Context
)
{
func
(
s
*
httpServer
)
GetMessage
(
c
*
gin
.
Context
)
{
mid
,
_
:=
strconv
.
ParseInt
(
getParam
(
c
,
"message_id"
),
10
,
32
)
c
.
JSON
(
200
,
s
.
bot
.
CQGet
Group
Message
(
int32
(
mid
)))
c
.
JSON
(
200
,
s
.
bot
.
CQGetMessage
(
int32
(
mid
)))
}
func
(
s
*
httpServer
)
GetGroupHonorInfo
(
c
*
gin
.
Context
)
{
...
...
@@ -501,8 +501,8 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){
"get_forward_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetForwardMessage
(
c
)
},
"get_
group_
msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
Get
Group
Message
(
c
)
"get_msg"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetMessage
(
c
)
},
"get_group_honor_info"
:
func
(
s
*
httpServer
,
c
*
gin
.
Context
)
{
s
.
GetGroupHonorInfo
(
c
)
...
...
server/websocket.go
View file @
2302cf62
...
...
@@ -474,8 +474,8 @@ var wsApi = map[string]func(*coolq.CQBot, gjson.Result) coolq.MSG{
"get_forward_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetForwardMessage
(
p
.
Get
(
"message_id"
)
.
Str
)
},
"get_
group_
msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGet
Group
Message
(
int32
(
p
.
Get
(
"message_id"
)
.
Int
()))
"get_msg"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetMessage
(
int32
(
p
.
Get
(
"message_id"
)
.
Int
()))
},
"get_group_honor_info"
:
func
(
bot
*
coolq
.
CQBot
,
p
gjson
.
Result
)
coolq
.
MSG
{
return
bot
.
CQGetGroupHonorInfo
(
p
.
Get
(
"group_id"
)
.
Int
(),
p
.
Get
(
"type"
)
.
Str
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment