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
ff29e162
Commit
ff29e162
authored
Oct 04, 2020
by
wdvxdr1123
Committed by
GitHub
Oct 04, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge
sync
parents
030eb6b7
d4811d53
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
575 additions
and
109 deletions
+575
-109
global/config.go
global/config.go
+14
-0
global/fs.go
global/fs.go
+13
-0
go.mod
go.mod
+1
-1
go.sum
go.sum
+2
-0
main.go
main.go
+18
-106
server/apiAdmin.go
server/apiAdmin.go
+500
-0
server/http.go
server/http.go
+27
-2
No files found.
global/config.go
View file @
ff29e162
...
...
@@ -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,13 @@ type GoCQReverseWebsocketConfig struct {
ReverseReconnectInterval
uint16
`json:"reverse_reconnect_interval"`
}
type
GoCqWebUi
struct
{
Enabled
bool
`json:"enabled"`
Host
string
`json:"host"`
WebUiPort
uint64
`json:"web_ui_port"`
WebInput
bool
`json:"web_input"`
}
func
DefaultConfig
()
*
JsonConfig
{
return
&
JsonConfig
{
EnableDB
:
true
,
...
...
@@ -121,6 +129,12 @@ func DefaultConfig() *JsonConfig {
ReverseReconnectInterval
:
3000
,
},
},
WebUi
:
&
GoCqWebUi
{
Enabled
:
true
,
Host
:
"0.0.0.0"
,
WebInput
:
false
,
WebUiPort
:
9999
,
},
}
}
...
...
global/fs.go
View file @
ff29e162
...
...
@@ -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
}
}
go.mod
View file @
ff29e162
...
...
@@ -3,7 +3,7 @@ module github.com/Mrs4s/go-cqhttp
go 1.14
require (
github.com/Mrs4s/MiraiGo v0.0.0-2020100
2092940-afe4132a38d5
github.com/Mrs4s/MiraiGo v0.0.0-2020100
3051902-8a968656c116
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/validator/v10 v10.4.0 // indirect
...
...
go.sum
View file @
ff29e162
...
...
@@ -4,6 +4,8 @@ github.com/Mrs4s/MiraiGo v0.0.0-20201002083653-383954dc11e2 h1:Pjs3pQKXDxvaWf3zT
github.com/Mrs4s/MiraiGo v0.0.0-20201002083653-383954dc11e2/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201002092940-afe4132a38d5 h1:NVXpGL7tssdjYBAsPRvCIL8f8V9e8n9YO8sSsOwdy44=
github.com/Mrs4s/MiraiGo v0.0.0-20201002092940-afe4132a38d5/go.mod h1:cwYPI2uq6nxNbx0nA6YuAKF1V5szSs6FPlGVLQvRUlo=
github.com/Mrs4s/MiraiGo v0.0.0-20201003051902-8a968656c116 h1:GQHsohWh9LxaWmHIVS2tKzZZSysJBrnS+Sh5jXZ+5zk=
github.com/Mrs4s/MiraiGo v0.0.0-20201003051902-8a968656c116/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=
...
...
main.go
View file @
ff29e162
...
...
@@ -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,26 @@ 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
,
Host
:
"0.0.0.0"
,
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
.
W
SConfig
!=
nil
&&
conf
.
WSConfig
.
Enabled
{
server
.
WebsocketServer
.
Run
(
fmt
.
Sprintf
(
"%s:%d"
,
conf
.
WSConfig
.
Host
,
conf
.
WSConfig
.
Port
),
conf
.
AccessToken
,
b
)
if
conf
.
W
ebUi
.
Host
==
""
{
conf
.
WebUi
.
Host
=
"0.0.0.0"
}
for
_
,
rc
:=
range
conf
.
ReverseServers
{
server
.
NewWebsocketClient
(
rc
,
conf
.
AccessToken
,
b
)
.
Run
()
confErr
:=
conf
.
Save
(
"config.json"
)
if
confErr
!=
nil
{
log
.
Error
(
"保存配置文件失败"
)
}
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"
,
conf
.
WebUi
.
Host
,
conf
.
WebUi
.
WebUiPort
),
cli
)
c
:=
server
.
Console
signal
.
Notify
(
c
,
os
.
Interrupt
,
os
.
Kill
)
<-
c
b
.
Release
()
...
...
server/apiAdmin.go
0 → 100644
View file @
ff29e162
This diff is collapsed.
Click to expand it.
server/http.go
View file @
ff29e162
...
...
@@ -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