update
This commit is contained in:
@@ -9,6 +9,7 @@ require (
|
|||||||
github.com/Mrs4s/MiraiGo v0.0.0-20210810070836-6614d2383adb
|
github.com/Mrs4s/MiraiGo v0.0.0-20210810070836-6614d2383adb
|
||||||
github.com/Mrs4s/go-cqhttp v1.0.0-beta6
|
github.com/Mrs4s/go-cqhttp v1.0.0-beta6
|
||||||
github.com/astaxie/beego v1.12.3
|
github.com/astaxie/beego v1.12.3
|
||||||
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
|
||||||
github.com/beego/beego/v2 v2.0.1
|
github.com/beego/beego/v2 v2.0.1
|
||||||
github.com/boltdb/bolt v1.3.1
|
github.com/boltdb/bolt v1.3.1
|
||||||
github.com/buger/jsonparser v1.1.1
|
github.com/buger/jsonparser v1.1.1
|
||||||
@@ -25,7 +26,6 @@ require (
|
|||||||
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
|
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
|
||||||
github.com/tidwall/gjson v1.9.1 // indirect
|
github.com/tidwall/gjson v1.9.1 // indirect
|
||||||
github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2
|
github.com/tuotoo/qrcode v0.0.0-20190222102259-ac9c44189bf2
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d
|
|
||||||
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
|
golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect
|
||||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
|
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGn
|
|||||||
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk=
|
||||||
github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
|
github.com/astaxie/beego v1.12.3 h1:SAQkdD2ePye+v8Gn1r4X6IKZM1wd28EyUOVQ3PDSOOQ=
|
||||||
github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
|
github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
|
||||||
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
|
||||||
|
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
|
||||||
github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
|
github.com/beego/beego/v2 v2.0.1 h1:07a7Z0Ok5vbqyqh+q53sDPl9LdhKh0ZDy3gbyGrhFnE=
|
||||||
github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
|
github.com/beego/beego/v2 v2.0.1/go.mod h1:8zyHi1FnWO1mZLwTn62aKRIZF/aIKvkCBB2JYs+eqQI=
|
||||||
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
|
github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ=
|
||||||
@@ -286,7 +288,6 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP
|
|||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=
|
||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
|
|
||||||
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
|||||||
+269
@@ -0,0 +1,269 @@
|
|||||||
|
package wx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/axgle/mahonia"
|
||||||
|
"github.com/beego/beego/v2/adapter/httplib"
|
||||||
|
"github.com/cdle/sillyGirl/core"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
var wx = core.NewBucket("wx")
|
||||||
|
var api_url = wx.Get("api_url")
|
||||||
|
var robot_wxid = wx.Get("robot_wxid")
|
||||||
|
|
||||||
|
func sendTextMsg(pmsg *TextMsg) {
|
||||||
|
pmsg.Msg = TrimHiddenCharacter(pmsg.Msg)
|
||||||
|
if pmsg.Msg == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pmsg.Event = "SendTextMsg"
|
||||||
|
pmsg.RobotWxid = robot_wxid
|
||||||
|
req := httplib.Post(api_url)
|
||||||
|
req.Header("Content-Type", "application/json")
|
||||||
|
data, _ := json.Marshal(pmsg)
|
||||||
|
enc := mahonia.NewEncoder("gbk")
|
||||||
|
d := enc.ConvertString(string(data))
|
||||||
|
d = regexp.MustCompile(`[\n\s]*\n[\s\n]*`).ReplaceAllString(d, "\n")
|
||||||
|
req.Body(d)
|
||||||
|
req.Response()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TrimHiddenCharacter(originStr string) string {
|
||||||
|
srcRunes := []rune(originStr)
|
||||||
|
dstRunes := make([]rune, 0, len(srcRunes))
|
||||||
|
for _, c := range srcRunes {
|
||||||
|
if c >= 0 && c <= 31 && c != 10 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if c == 127 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dstRunes = append(dstRunes, c)
|
||||||
|
}
|
||||||
|
return string(dstRunes)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendOtherMsg(pmsg *OtherMsg) {
|
||||||
|
if pmsg.Event == "" {
|
||||||
|
pmsg.Event = "SendImageMsg"
|
||||||
|
}
|
||||||
|
pmsg.RobotWxid = robot_wxid
|
||||||
|
req := httplib.Post(api_url)
|
||||||
|
req.Header("Content-Type", "application/json")
|
||||||
|
data, _ := json.Marshal(pmsg)
|
||||||
|
req.Body(data)
|
||||||
|
req.Response()
|
||||||
|
}
|
||||||
|
|
||||||
|
type TextMsg struct {
|
||||||
|
Event string `json:"event"`
|
||||||
|
ToWxid string `json:"to_wxid"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
RobotWxid string `json:"robot_wxid"`
|
||||||
|
GroupWxid string `json:"group_wxid"`
|
||||||
|
MemberWxid string `json:"member_wxid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type OtherMsg struct {
|
||||||
|
Success bool `json:"success"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
Event string `json:"event"`
|
||||||
|
RobotWxid string `json:"robot_wxid"`
|
||||||
|
ToWxid string `json:"to_wxid"`
|
||||||
|
MemberWxid string `json:"member_wxid"`
|
||||||
|
MemberName string `json:"member_name"`
|
||||||
|
GroupWxid string `json:"group_wxid"`
|
||||||
|
Msg Msg `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Msg struct {
|
||||||
|
URL string `json:"url"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
core.Pushs["wx"] = func(i interface{}, s string) {
|
||||||
|
if robot_wxid != "" {
|
||||||
|
pmsg := TextMsg{
|
||||||
|
Msg: s,
|
||||||
|
ToWxid: fmt.Sprint(i),
|
||||||
|
}
|
||||||
|
sendTextMsg(&pmsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
core.GroupPushs["wx"] = func(i, j interface{}, s string) {
|
||||||
|
to := fmt.Sprint(i) + "@chatroom"
|
||||||
|
pmsg := TextMsg{
|
||||||
|
ToWxid: to,
|
||||||
|
}
|
||||||
|
if j != nil && fmt.Sprint(j) != "" {
|
||||||
|
pmsg.MemberWxid = fmt.Sprint(j)
|
||||||
|
}
|
||||||
|
for _, v := range regexp.MustCompile(`\[CQ:image,file=([^\[\]]+)\]`).FindAllStringSubmatch(s, -1) {
|
||||||
|
s = strings.Replace(s, fmt.Sprintf(`[CQ:image,file=%s]`, v[1]), "", -1)
|
||||||
|
data, err := os.ReadFile(core.ExecPath + "/data/images/" + v[1])
|
||||||
|
if err == nil {
|
||||||
|
add := regexp.MustCompile("(https.*)").FindString(string(data))
|
||||||
|
if add != "" {
|
||||||
|
pmsg := OtherMsg{
|
||||||
|
ToWxid: to,
|
||||||
|
Msg: Msg{
|
||||||
|
URL: relay(add),
|
||||||
|
Name: name(add),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
sendOtherMsg(&pmsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s = regexp.MustCompile(`\[CQ:([^\[\]]+)\]`).ReplaceAllString(s, "")
|
||||||
|
pmsg.Msg = s
|
||||||
|
sendTextMsg(&pmsg)
|
||||||
|
}
|
||||||
|
core.Server.POST("/wx/receive", func(c *gin.Context) {
|
||||||
|
data, _ := c.GetRawData()
|
||||||
|
jms := JsonMsg{}
|
||||||
|
json.Unmarshal(data, &jms)
|
||||||
|
c.JSON(200, map[string]string{"code": "-1"})
|
||||||
|
if jms.Event != "EventFriendMsg" && jms.Event != "EventGroupMsg" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if jms.Type != 1 && jms.Type != 3 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if jms.FinalFromWxid == jms.RobotWxid {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if robot_wxid != jms.RobotWxid {
|
||||||
|
robot_wxid = jms.RobotWxid
|
||||||
|
wx.Set("robot_wxid", robot_wxid)
|
||||||
|
}
|
||||||
|
core.Senders <- &Sender{
|
||||||
|
value: jms,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
core.Server.GET("/relay", func(c *gin.Context) {
|
||||||
|
url := c.Query("url")
|
||||||
|
rsp, err := httplib.Get(url).Response()
|
||||||
|
if err == nil {
|
||||||
|
io.Copy(c.Writer, rsp.Body)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var myip = ""
|
||||||
|
|
||||||
|
func relay(url string) string {
|
||||||
|
ip, _ := httplib.Get("https://imdraw.com/ip").String()
|
||||||
|
if ip != "" {
|
||||||
|
myip = ip
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("http://%s:%s/relay?url=%s", myip, wx.Get("relay_port", "8002"), url)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sender struct {
|
||||||
|
leixing int
|
||||||
|
mtype int
|
||||||
|
deleted bool
|
||||||
|
value JsonMsg
|
||||||
|
core.BaseSender
|
||||||
|
}
|
||||||
|
|
||||||
|
type JsonMsg struct {
|
||||||
|
Event string `json:"event"`
|
||||||
|
RobotWxid string `json:"robot_wxid"`
|
||||||
|
RobotName string `json:"robot_name"`
|
||||||
|
Type int `json:"type"`
|
||||||
|
FromWxid string `json:"from_wxid"`
|
||||||
|
FromName string `json:"from_name"`
|
||||||
|
FinalFromWxid string `json:"final_from_wxid"`
|
||||||
|
FinalFromName string `json:"final_from_name"`
|
||||||
|
ToWxid string `json:"to_wxid"`
|
||||||
|
Msg string `json:"msg"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sender *Sender) GetContent() string {
|
||||||
|
return sender.value.Msg
|
||||||
|
}
|
||||||
|
func (sender *Sender) GetUserID() interface{} {
|
||||||
|
return sender.value.FinalFromWxid
|
||||||
|
}
|
||||||
|
func (sender *Sender) GetChatID() interface{} {
|
||||||
|
return strings.Replace(sender.value.FromWxid, "@chatroom", "", -1)
|
||||||
|
}
|
||||||
|
func (sender *Sender) GetImType() string {
|
||||||
|
return "wx"
|
||||||
|
}
|
||||||
|
func (sender *Sender) GetUsername() string {
|
||||||
|
return sender.value.FinalFromName
|
||||||
|
}
|
||||||
|
func (sender *Sender) GetReplySenderUserID() int {
|
||||||
|
if !sender.IsReply() {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
func (sender *Sender) IsAdmin() bool {
|
||||||
|
return strings.Contains(wx.Get("masters"), fmt.Sprint(sender.GetUserID()))
|
||||||
|
}
|
||||||
|
func (sender *Sender) Reply(msgs ...interface{}) (int, error) {
|
||||||
|
to := sender.value.FromWxid
|
||||||
|
at := ""
|
||||||
|
if to == "" {
|
||||||
|
to = sender.value.FinalFromWxid
|
||||||
|
} else {
|
||||||
|
at = sender.value.FinalFromWxid
|
||||||
|
}
|
||||||
|
pmsg := TextMsg{
|
||||||
|
ToWxid: to,
|
||||||
|
MemberWxid: at,
|
||||||
|
}
|
||||||
|
for _, item := range msgs {
|
||||||
|
switch item.(type) {
|
||||||
|
case string:
|
||||||
|
pmsg.Msg = item.(string)
|
||||||
|
case []byte:
|
||||||
|
pmsg.Msg = string(item.([]byte))
|
||||||
|
case core.ImageUrl:
|
||||||
|
url := string(item.(core.ImageUrl))
|
||||||
|
pmsg := OtherMsg{
|
||||||
|
ToWxid: to,
|
||||||
|
MemberWxid: at,
|
||||||
|
Msg: Msg{
|
||||||
|
URL: relay(url),
|
||||||
|
Name: name(url),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
sendOtherMsg(&pmsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if pmsg.Msg != "" {
|
||||||
|
sendTextMsg(&pmsg)
|
||||||
|
}
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func name(str string) string {
|
||||||
|
pr := "jpg"
|
||||||
|
ss := regexp.MustCompile(`\.([A-Za-z0-9]+)$`).FindStringSubmatch(str)
|
||||||
|
if len(ss) != 0 {
|
||||||
|
pr = ss[1]
|
||||||
|
}
|
||||||
|
md5 := md5V(str)
|
||||||
|
return md5 + "." + pr
|
||||||
|
}
|
||||||
|
|
||||||
|
func md5V(str string) string {
|
||||||
|
h := md5.New()
|
||||||
|
h.Write([]byte(str))
|
||||||
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user