mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-06-30 03:43:25 +00:00
Compare commits
13 Commits
v1.0.0-rc2
...
v1.0.0-rc3
Author | SHA1 | Date | |
---|---|---|---|
177ba9d8c2 | |||
2a0babad99 | |||
ae7fefad13 | |||
23d594be29 | |||
7349fd4b82 | |||
7e24f8b6e6 | |||
babf35e495 | |||
a4a8e94b27 | |||
6fc3f0b649 | |||
b013f66209 | |||
13abf92b76 | |||
7d97216612 | |||
859f40db83 |
@ -3,6 +3,7 @@ package gocq
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/png"
|
||||
"os"
|
||||
@ -10,9 +11,11 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/Mrs4s/MiraiGo/client"
|
||||
"github.com/Mrs4s/MiraiGo/utils"
|
||||
"github.com/mattn/go-colorable"
|
||||
"github.com/pkg/errors"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/tidwall/gjson"
|
||||
|
||||
"github.com/Mrs4s/go-cqhttp/global"
|
||||
)
|
||||
@ -142,7 +145,19 @@ func loginResponseProcessor(res *client.LoginResponse) error {
|
||||
var text string
|
||||
switch res.Error {
|
||||
case client.SliderNeededError:
|
||||
log.Warnf("登录需要滑条验证码, 请使用手机QQ扫描二维码以继续登录.")
|
||||
log.Warnf("登录需要滑条验证码, 请选择验证方式: ")
|
||||
log.Warnf("1. 使用浏览器抓取滑条并登录")
|
||||
log.Warnf("2. 使用手机QQ扫码验证 (需要手Q和gocq在同一网络下).")
|
||||
log.Warn("请输入(1 - 2) (将在10秒后自动选择1):")
|
||||
text = readLineTimeout(time.Second*10, "1")
|
||||
if strings.Contains(text, "1") {
|
||||
ticket := sliderCaptchaProcessor(res.VerifyUrl)
|
||||
if ticket == "" {
|
||||
os.Exit(0)
|
||||
}
|
||||
res, err = cli.SubmitTicket(ticket)
|
||||
continue
|
||||
}
|
||||
cli.Disconnect()
|
||||
cli.Release()
|
||||
cli = client.NewClientEmpty()
|
||||
@ -192,8 +207,7 @@ func loginResponseProcessor(res *client.LoginResponse) error {
|
||||
msg := res.ErrorMessage
|
||||
if strings.Contains(msg, "版本") {
|
||||
msg = "密码错误或账号被冻结"
|
||||
}
|
||||
if strings.Contains(msg, "冻结") {
|
||||
} else if strings.Contains(msg, "冻结") {
|
||||
log.Fatalf("账号被冻结")
|
||||
}
|
||||
log.Warnf("登录失败: %v", msg)
|
||||
@ -203,3 +217,23 @@ func loginResponseProcessor(res *client.LoginResponse) error {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func sliderCaptchaProcessor(u string) string {
|
||||
id := utils.RandomString(8)
|
||||
log.Warnf("请前往该地址验证 -> %v", strings.ReplaceAll(u, "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?", fmt.Sprintf("https://captcha.go-cqhttp.org/captcha?id=%v&", id)))
|
||||
start := time.Now()
|
||||
for time.Since(start).Minutes() < 2 {
|
||||
time.Sleep(time.Second)
|
||||
data, err := global.GetBytes("https://captcha.go-cqhttp.org/captcha/ticket?id=" + id)
|
||||
if err != nil {
|
||||
log.Warnf("获取 Ticket 时出现错误: %v", err)
|
||||
return ""
|
||||
}
|
||||
g := gjson.ParseBytes(data)
|
||||
if g.Get("ticket").Exists() {
|
||||
return g.Get("ticket").String()
|
||||
}
|
||||
}
|
||||
log.Warnf("验证超时")
|
||||
return ""
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ func Main() {
|
||||
|
||||
mkCacheDir := func(path string, _type string) {
|
||||
if !global.PathExists(path) {
|
||||
if err := os.MkdirAll(path, 0o644); err != nil {
|
||||
if err := os.MkdirAll(path, 0o755); err != nil {
|
||||
log.Fatalf("创建%s缓存文件夹失败: %v", _type, err)
|
||||
}
|
||||
}
|
||||
|
24
coolq/api.go
24
coolq/api.go
@ -601,6 +601,30 @@ func (bot *CQBot) CQUploadGroupFile(groupID int64, file, name, folder string) gl
|
||||
return OK(nil)
|
||||
}
|
||||
|
||||
// CQUploadPrivateFile 扩展API-上传私聊文件
|
||||
//
|
||||
// @route(upload_private_file)
|
||||
func (bot *CQBot) CQUploadPrivateFile(userID int64, file, name string) global.MSG {
|
||||
target := message.Source{
|
||||
SourceType: message.SourcePrivate,
|
||||
PrimaryID: userID,
|
||||
}
|
||||
fileBody, err := os.Open(file)
|
||||
if err != nil {
|
||||
log.Warnf("上传私聊文件 %v 失败: %+v", file, err)
|
||||
return Failed(100, "OPEN_FILE_ERROR", "打开文件失败")
|
||||
}
|
||||
localFile := &client.LocalFile{
|
||||
FileName: name,
|
||||
Body: fileBody,
|
||||
}
|
||||
if err := bot.Client.UploadFile(target, localFile); err != nil {
|
||||
log.Warnf("上传私聊 %v 文件 %v 失败: %+v", userID, file, err)
|
||||
return Failed(100, "FILE_SYSTEM_UPLOAD_API_ERROR", err.Error())
|
||||
}
|
||||
return OK(nil)
|
||||
}
|
||||
|
||||
// CQGroupFileCreateFolder 拓展API-创建群文件文件夹
|
||||
//
|
||||
// @route(create_group_file_folder)
|
||||
|
@ -595,10 +595,10 @@ func (bot *CQBot) dispatch(ev *event) {
|
||||
for _, f := range bot.events {
|
||||
go func(fn func(*Event)) {
|
||||
defer func() {
|
||||
wg.Done()
|
||||
if pan := recover(); pan != nil {
|
||||
log.Warnf("处理事件 %v 时出现错误: %v \n%s", event.JSONString(), pan, debug.Stack())
|
||||
}
|
||||
wg.Done()
|
||||
}()
|
||||
|
||||
start := time.Now()
|
||||
|
@ -71,13 +71,12 @@ func (bot *CQBot) formatGroupMessage(m *message.GroupMessage) *event {
|
||||
typ = "message_sent/group/normal"
|
||||
}
|
||||
gm := global.MSG{
|
||||
"anonymous": nil,
|
||||
"font": 0,
|
||||
"group_id": m.GroupCode,
|
||||
"message": ToFormattedMessage(m.Elements, source),
|
||||
"message_type": "group",
|
||||
"message_seq": m.Id,
|
||||
"raw_message": cqm,
|
||||
"anonymous": nil,
|
||||
"font": 0,
|
||||
"group_id": m.GroupCode,
|
||||
"message": ToFormattedMessage(m.Elements, source),
|
||||
"message_seq": m.Id,
|
||||
"raw_message": cqm,
|
||||
"sender": global.MSG{
|
||||
"age": 0,
|
||||
"area": "",
|
||||
|
@ -19,6 +19,7 @@ import (
|
||||
"github.com/Mrs4s/MiraiGo/binary"
|
||||
"github.com/Mrs4s/MiraiGo/message"
|
||||
"github.com/Mrs4s/MiraiGo/utils"
|
||||
b14 "github.com/fumiama/go-base16384"
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/tidwall/gjson"
|
||||
|
||||
@ -1121,6 +1122,13 @@ func (bot *CQBot) makeImageOrVideoElem(d map[string]string, video bool, sourceTy
|
||||
}
|
||||
return &LocalImageElement{Stream: bytes.NewReader(b), URL: f}, nil
|
||||
}
|
||||
if !video && strings.HasPrefix(f, "base16384") {
|
||||
b, err := b14.UTF82UTF16BE(utils.S2B(strings.TrimPrefix(f, "base16384://")))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &LocalImageElement{Stream: bytes.NewReader(b14.Decode(b)), URL: f}, nil
|
||||
}
|
||||
rawPath := path.Join(global.ImagePath, f)
|
||||
if video {
|
||||
if strings.HasSuffix(f, ".video") {
|
||||
|
@ -13,6 +13,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/Mrs4s/MiraiGo/utils"
|
||||
b14 "github.com/fumiama/go-base16384"
|
||||
log "github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/Mrs4s/go-cqhttp/internal/param"
|
||||
@ -92,6 +93,12 @@ func FindFile(file, cache, p string) (data []byte, err error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
case strings.HasPrefix(file, "base16384"):
|
||||
data, err = b14.UTF82UTF16BE(utils.S2B(strings.TrimPrefix(file, "base16384://")))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
data = b14.Decode(data)
|
||||
case strings.HasPrefix(file, "file"):
|
||||
var fu *url.URL
|
||||
fu, err = url.Parse(file)
|
||||
|
7
go.mod
7
go.mod
@ -4,16 +4,17 @@ go 1.18
|
||||
|
||||
require (
|
||||
github.com/Microsoft/go-winio v0.5.1
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220605085305-ae33763fe10a
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d
|
||||
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c
|
||||
github.com/RomiChan/websocket v1.4.3-0.20220123145318-307a86b127bc
|
||||
github.com/fumiama/go-base16384 v1.5.2
|
||||
github.com/fumiama/go-hide-param v0.1.4
|
||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
|
||||
github.com/mattn/go-colorable v0.1.12
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/segmentio/asm v1.1.3
|
||||
github.com/sirupsen/logrus v1.8.1
|
||||
github.com/stretchr/testify v1.7.0
|
||||
github.com/stretchr/testify v1.7.1
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
|
||||
github.com/tidwall/gjson v1.14.0
|
||||
github.com/wdvxdr1123/go-silk v0.0.0-20210316130616-d47b553def60
|
||||
@ -48,7 +49,7 @@ require (
|
||||
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 // indirect
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
|
||||
golang.org/x/sys v0.0.0-20220111092808-5a964db01320 // indirect
|
||||
golang.org/x/text v0.3.6 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
modernc.org/libc v1.8.1 // indirect
|
||||
modernc.org/mathutil v1.2.2 // indirect
|
||||
modernc.org/memory v1.0.4 // indirect
|
||||
|
13
go.sum
13
go.sum
@ -1,7 +1,7 @@
|
||||
github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
|
||||
github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220605085305-ae33763fe10a h1:DVrEVvLNKb53wTTduRdC+hZ80S/5G9qFmKYmCmIMVws=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220605085305-ae33763fe10a/go.mod h1:mZp8Lt7uqLCUwSLouB2yuiP467Cwl4mnG9IMAaXUKA0=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d h1:Cq8HMtyL3PRpvOynuwi9WSdek2+5UTOd0zJ+JTq5hPM=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20220621083050-ae8c187aa59d/go.mod h1:mZp8Lt7uqLCUwSLouB2yuiP467Cwl4mnG9IMAaXUKA0=
|
||||
github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a h1:WIfEWYj82oEuPtm5pqlyQmCJCoiw00C6ugZFqHA0cC8=
|
||||
github.com/RomiChan/protobuf v0.1.1-0.20220602121309-9e3b8cbefd7a/go.mod h1:2Ie+hdBFQpQFDHfeklgxoFmQRCE7O+KwFpISeXq7OwA=
|
||||
github.com/RomiChan/syncx v0.0.0-20220404072119-d7ea0ae15a4c h1:cNPOdTNiVwxLpROLjXCgbIPvdkE+BwvxDvgmdYmWx6Q=
|
||||
@ -14,6 +14,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||
github.com/fumiama/go-base16384 v1.5.2 h1:cbxXTcDH92PNgG7bEBwiCEoWb5O+nwZKxKOG94ilFo8=
|
||||
github.com/fumiama/go-base16384 v1.5.2/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM=
|
||||
github.com/fumiama/go-hide-param v0.1.4 h1:y7TRTzZMdCH9GOXnIzU3B+1BSkcmvejVGmGsz4t0DGU=
|
||||
github.com/fumiama/go-hide-param v0.1.4/go.mod h1:vJkQlJIEI56nIyp7tCQu1/2QOyKtZpudsnJkGk9U1aY=
|
||||
github.com/fumiama/imgsz v0.0.2 h1:fAkC0FnIscdKOXwAxlyw3EUba5NzxZdSxGaq3Uyfxak=
|
||||
@ -85,8 +87,9 @@ github.com/stretchr/objx v0.1.0/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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
|
||||
github.com/tidwall/gjson v1.14.0 h1:6aeJ0bzojgWLa82gDQHcx3S0Lr/O51I9bJ5nv6JFx5w=
|
||||
@ -151,8 +154,8 @@ 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/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
@ -337,5 +337,10 @@ func (c *Caller) call(action string, p Getter) global.MSG {
|
||||
p2 := p.Get("name").String()
|
||||
p3 := p.Get("folder").String()
|
||||
return c.bot.CQUploadGroupFile(p0, p1, p2, p3)
|
||||
case "upload_private_file":
|
||||
p0 := p.Get("user_id").Int()
|
||||
p1 := p.Get("file").String()
|
||||
p2 := p.Get("name").String()
|
||||
return c.bot.CQUploadPrivateFile(p0, p1, p2)
|
||||
}
|
||||
}
|
||||
|
@ -31,6 +31,9 @@ func checkImage(r io.ReadSeeker) (ok bool, t string) {
|
||||
if base.SkipMimeScan {
|
||||
return true, ""
|
||||
}
|
||||
if r == nil {
|
||||
return false, "image/nil-stream"
|
||||
}
|
||||
t = scan(r)
|
||||
switch t {
|
||||
case "image/bmp", "image/gif", "image/jpeg", "image/png", "image/webp":
|
||||
|
Reference in New Issue
Block a user