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
cc1093ff
Commit
cc1093ff
authored
Oct 03, 2020
by
Mrs4s
Committed by
GitHub
Oct 03, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #333 from scjtqs/adminApiDev
admin api 初版
parents
a712db5d
e386a52f
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
556 additions
and
109 deletions
+556
-109
global/config.go
global/config.go
+12
-0
global/fs.go
global/fs.go
+13
-0
main.go
main.go
+15
-107
server/apiAdmin.go
server/apiAdmin.go
+489
-0
server/http.go
server/http.go
+27
-2
No files found.
global/config.go
View file @
cc1093ff
...
...
@@ -35,6 +35,7 @@ type JsonConfig struct {
PostMessageFormat
string
`json:"post_message_format"`
Debug
bool
`json:"debug"`
LogLevel
string
`json:"log_level"`
WebUi
*
GoCqWebUi
`json:"web_ui"`
}
type
CQHttpApiConfig
struct
{
...
...
@@ -78,6 +79,12 @@ type GoCQReverseWebsocketConfig struct {
ReverseReconnectInterval
uint16
`json:"reverse_reconnect_interval"`
}
type
GoCqWebUi
struct
{
Enabled
bool
`json:"enabled"`
WebUiPort
uint64
`json:"web_ui_port"`
WebInput
bool
`json:"webinput"`
}
func
DefaultConfig
()
*
JsonConfig
{
return
&
JsonConfig
{
EnableDB
:
true
,
...
...
@@ -121,6 +128,11 @@ func DefaultConfig() *JsonConfig {
ReverseReconnectInterval
:
3000
,
},
},
WebUi
:
&
GoCqWebUi
{
Enabled
:
true
,
WebInput
:
false
,
WebUiPort
:
9999
,
},
}
}
...
...
global/fs.go
View file @
cc1093ff
...
...
@@ -94,3 +94,16 @@ func FindFile(f, cache, PATH string) (data []byte, err error) {
}
return
}
func
DelFile
(
path
string
)
bool
{
err
:=
os
.
Remove
(
path
)
if
err
!=
nil
{
// 删除失败
log
.
Error
(
err
)
return
false
}
else
{
// 删除成功
log
.
Info
(
path
+
"删除成功"
)
return
true
}
}
main.go
View file @
cc1093ff
...
...
@@ -2,32 +2,27 @@ package main
import
(
"bufio"
"bytes"
"crypto/md5"
"encoding/base64"
"encoding/json"
"fmt"
"
image
"
"
github.com/Mrs4s/go-cqhttp/server
"
"io"
"io/ioutil"
"os"
"os/signal"
"path"
"strconv"
"strings"
"time"
"github.com/Mrs4s/MiraiGo/binary"
"github.com/Mrs4s/MiraiGo/client"
"github.com/Mrs4s/go-cqhttp/coolq"
"github.com/Mrs4s/go-cqhttp/global"
"github.com/Mrs4s/go-cqhttp/server"
rotatelogs
"github.com/lestrrat-go/file-rotatelogs"
"github.com/lestrrat-go/file-rotatelogs"
"github.com/rifflock/lfshook"
log
"github.com/sirupsen/logrus"
easy
"github.com/t-tomalak/logrus-easy-formatter"
asciiart
"github.com/yinghau76/go-ascii-art"
"github.com/t-tomalak/logrus-easy-formatter"
)
func
init
()
{
...
...
@@ -238,109 +233,22 @@ func main() {
cli
.
OnServerUpdated
(
func
(
bot
*
client
.
QQClient
,
e
*
client
.
ServerUpdatedEvent
)
{
log
.
Infof
(
"收到服务器地址更新通知, 将在下一次重连时应用. "
)
})
rsp
,
err
:=
cli
.
Login
()
for
{
global
.
Check
(
err
)
if
!
rsp
.
Success
{
switch
rsp
.
Error
{
case
client
.
NeedCaptcha
:
_
=
ioutil
.
WriteFile
(
"captcha.jpg"
,
rsp
.
CaptchaImage
,
0644
)
img
,
_
,
_
:=
image
.
Decode
(
bytes
.
NewReader
(
rsp
.
CaptchaImage
))
fmt
.
Println
(
asciiart
.
New
(
"image"
,
img
)
.
Art
)
log
.
Warn
(
"请输入验证码 (captcha.jpg): (Enter 提交)"
)
text
,
_
:=
console
.
ReadString
(
'\n'
)
rsp
,
err
=
cli
.
SubmitCaptcha
(
strings
.
ReplaceAll
(
text
,
"
\n
"
,
""
),
rsp
.
CaptchaSign
)
continue
case
client
.
UnsafeDeviceError
:
log
.
Warnf
(
"账号已开启设备锁,请前往 -> %v <- 验证并重启Bot."
,
rsp
.
VerifyUrl
)
log
.
Infof
(
" 按 Enter 继续...."
)
_
,
_
=
console
.
ReadString
(
'\n'
)
return
case
client
.
OtherLoginError
,
client
.
UnknownLoginError
:
log
.
Fatalf
(
"登录失败: %v"
,
rsp
.
ErrorMessage
)
}
if
conf
.
WebUi
==
nil
{
conf
.
WebUi
=
&
global
.
GoCqWebUi
{
Enabled
:
true
,
WebInput
:
false
,
WebUiPort
:
9999
,
}
break
}
log
.
Infof
(
"登录成功 欢迎使用: %v"
,
cli
.
Nickname
)
time
.
Sleep
(
time
.
Second
)
log
.
Info
(
"开始加载好友列表..."
)
global
.
Check
(
cli
.
ReloadFriendList
())
log
.
Infof
(
"共加载 %v 个好友."
,
len
(
cli
.
FriendList
))
log
.
Infof
(
"开始加载群列表..."
)
global
.
Check
(
cli
.
ReloadGroupList
())
log
.
Infof
(
"共加载 %v 个群."
,
len
(
cli
.
GroupList
))
b
:=
coolq
.
NewQQBot
(
cli
,
conf
)
if
conf
.
PostMessageFormat
!=
"string"
&&
conf
.
PostMessageFormat
!=
"array"
{
log
.
Warnf
(
"post_message_format 配置错误, 将自动使用 string"
)
coolq
.
SetMessageFormat
(
"string"
)
}
else
{
coolq
.
SetMessageFormat
(
conf
.
PostMessageFormat
)
}
if
conf
.
RateLimit
.
Enabled
{
global
.
InitLimiter
(
conf
.
RateLimit
.
Frequency
,
conf
.
RateLimit
.
BucketSize
)
}
log
.
Info
(
"正在加载事件过滤器."
)
global
.
BootFilter
()
coolq
.
IgnoreInvalidCQCode
=
conf
.
IgnoreInvalidCQCode
coolq
.
ForceFragmented
=
conf
.
ForceFragmented
if
conf
.
HttpConfig
!=
nil
&&
conf
.
HttpConfig
.
Enabled
{
server
.
HttpServer
.
Run
(
fmt
.
Sprintf
(
"%s:%d"
,
conf
.
HttpConfig
.
Host
,
conf
.
HttpConfig
.
Port
),
conf
.
AccessToken
,
b
)
for
k
,
v
:=
range
conf
.
HttpConfig
.
PostUrls
{
server
.
NewHttpClient
()
.
Run
(
k
,
v
,
conf
.
HttpConfig
.
Timeout
,
b
)
}
if
conf
.
WebUi
.
WebUiPort
<=
0
{
conf
.
WebUi
.
WebUiPort
=
9999
}
if
conf
.
WSConfig
!=
nil
&&
conf
.
WSConfig
.
Enabled
{
server
.
WebsocketServer
.
Run
(
fmt
.
Sprintf
(
"%s:%d"
,
conf
.
WSConfig
.
Host
,
conf
.
WSConfig
.
Port
),
conf
.
AccessToken
,
b
)
confErr
:=
conf
.
Save
(
"config.json"
)
if
confErr
!=
nil
{
log
.
Error
(
"保存配置文件失败"
)
}
for
_
,
rc
:=
range
conf
.
ReverseServers
{
server
.
NewWebsocketClient
(
rc
,
conf
.
AccessToken
,
b
)
.
Run
()
}
log
.
Info
(
"资源初始化完成, 开始处理信息."
)
log
.
Info
(
"アトリは、高性能ですから!"
)
cli
.
OnDisconnected
(
func
(
bot
*
client
.
QQClient
,
e
*
client
.
ClientDisconnectedEvent
)
{
if
conf
.
ReLogin
.
Enabled
{
var
times
uint
=
1
for
{
if
cli
.
Online
{
log
.
Warn
(
"Bot已登录"
)
return
}
if
conf
.
ReLogin
.
MaxReloginTimes
!=
0
&&
times
>
conf
.
ReLogin
.
MaxReloginTimes
{
break
}
log
.
Warnf
(
"Bot已离线 (%v),将在 %v 秒后尝试重连. 重连次数:%v"
,
e
.
Message
,
conf
.
ReLogin
.
ReLoginDelay
,
times
)
times
++
time
.
Sleep
(
time
.
Second
*
time
.
Duration
(
conf
.
ReLogin
.
ReLoginDelay
))
rsp
,
err
:=
cli
.
Login
()
if
err
!=
nil
{
log
.
Errorf
(
"重连失败: %v"
,
err
)
continue
}
if
!
rsp
.
Success
{
switch
rsp
.
Error
{
case
client
.
NeedCaptcha
:
log
.
Fatalf
(
"重连失败: 需要验证码. (验证码处理正在开发中)"
)
case
client
.
UnsafeDeviceError
:
log
.
Fatalf
(
"重连失败: 设备锁"
)
default
:
log
.
Errorf
(
"重连失败: %v"
,
rsp
.
ErrorMessage
)
continue
}
}
log
.
Info
(
"重连成功"
)
return
}
log
.
Fatal
(
"重连失败: 重连次数达到设置的上限值"
)
}
b
.
Release
()
log
.
Fatalf
(
"Bot已离线:%v"
,
e
.
Message
)
})
c
:=
make
(
chan
os
.
Signal
,
1
)
b
:=
server
.
WebServer
.
Run
(
fmt
.
Sprintf
(
"%s:%d"
,
"0.0.0.0"
,
conf
.
WebUi
.
WebUiPort
),
cli
)
c
:=
server
.
Console
signal
.
Notify
(
c
,
os
.
Interrupt
,
os
.
Kill
)
<-
c
b
.
Release
()
...
...
server/apiAdmin.go
0 → 100644
View file @
cc1093ff
This diff is collapsed.
Click to expand it.
server/http.go
View file @
cc1093ff
...
...
@@ -5,6 +5,7 @@ import (
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"net/http"
"os"
"strconv"
"strings"
...
...
@@ -21,6 +22,7 @@ import (
type
httpServer
struct
{
engine
*
gin
.
Engine
bot
*
coolq
.
CQBot
Http
*
http
.
Server
}
type
httpClient
struct
{
...
...
@@ -79,13 +81,23 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
go
func
()
{
log
.
Infof
(
"CQ HTTP 服务器已启动: %v"
,
addr
)
err
:=
s
.
engine
.
Run
(
addr
)
if
err
!=
nil
{
s
.
Http
=&
http
.
Server
{
Addr
:
addr
,
Handler
:
s
.
engine
,
}
if
err
:=
s
.
Http
.
ListenAndServe
();
err
!=
nil
&&
err
!=
http
.
ErrServerClosed
{
log
.
Error
(
err
)
log
.
Infof
(
"请检查端口是否被占用."
)
time
.
Sleep
(
time
.
Second
*
5
)
os
.
Exit
(
1
)
}
//err := s.engine.Run(addr)
//if err != nil {
// log.Error(err)
// log.Infof("请检查端口是否被占用.")
// time.Sleep(time.Second * 5)
// os.Exit(1)
//}
}()
}
...
...
@@ -529,3 +541,16 @@ var httpApi = map[string]func(s *httpServer, c *gin.Context){
s
.
GetWordSlices
(
c
)
},
}
func
(
s
*
httpServer
)
ShutDown
()
{
ctx
,
cancel
:=
context
.
WithTimeout
(
context
.
Background
(),
5
*
time
.
Second
)
defer
cancel
()
if
err
:=
s
.
Http
.
Shutdown
(
ctx
);
err
!=
nil
{
log
.
Fatal
(
"http Server Shutdown:"
,
err
)
}
select
{
case
<-
ctx
.
Done
()
:
log
.
Println
(
"timeout of 5 seconds."
)
}
log
.
Println
(
"http Server exiting"
)
}
\ No newline at end of file
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