mirror of
https://github.com/Mrs4s/go-cqhttp.git
synced 2025-05-06 03:53:50 +08:00
添加 CQ:xml的支持
This commit is contained in:
parent
15085d0a6b
commit
8874ed0392
98
coolq/api.go
98
coolq/api.go
@ -622,101 +622,3 @@ func convertGroupMemberInfo(groupId int64, m *client.GroupMemberInfo) MSG {
|
|||||||
"card_changeable": false,
|
"card_changeable": false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bot *CQBot) Send_private_msg_xml(userId int64, i interface{}, ResId int64) MSG {
|
|
||||||
var str string
|
|
||||||
if m, ok := i.(gjson.Result); ok {
|
|
||||||
if m.Type == gjson.JSON {
|
|
||||||
elem := bot.ConvertObjectMessage(m, true)
|
|
||||||
mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem})
|
|
||||||
if mid == -1 {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
return OK(MSG{"message_id": mid})
|
|
||||||
}
|
|
||||||
str = func() string {
|
|
||||||
if m.Str != "" {
|
|
||||||
return m.Str
|
|
||||||
}
|
|
||||||
return m.Raw
|
|
||||||
}()
|
|
||||||
} else if s, ok := i.(string); ok {
|
|
||||||
str = s
|
|
||||||
}
|
|
||||||
if str == "" {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
var elem []message.IMessageElement
|
|
||||||
println(str)
|
|
||||||
elem = append(elem, NewXmlMsg(str,ResId))
|
|
||||||
|
|
||||||
mid := bot.SendPrivateMessage(userId, &message.SendingMessage{Elements: elem})
|
|
||||||
if mid == -1 {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
return OK(MSG{"message_id": mid})
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewXmlMsg(template string,ResId int64) *message.ServiceElement{
|
|
||||||
var serviceid string
|
|
||||||
if ResId == 0{
|
|
||||||
serviceid ="2" //默认值2
|
|
||||||
}else{
|
|
||||||
serviceid = strconv.FormatInt(ResId,10)
|
|
||||||
}
|
|
||||||
//println(serviceid)
|
|
||||||
return &message.ServiceElement{
|
|
||||||
Id: int32(ResId),
|
|
||||||
Content: template,
|
|
||||||
ResId: serviceid,
|
|
||||||
SubType: "xml",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (bot *CQBot) CQSendGroupMessage_XML(groupId int64, i interface{}, ResId int64) MSG {
|
|
||||||
var str string
|
|
||||||
fixAt := func(elem []message.IMessageElement) {
|
|
||||||
for _, e := range elem {
|
|
||||||
if at, ok := e.(*message.AtElement); ok && at.Target != 0 {
|
|
||||||
at.Display = "@" + func() string {
|
|
||||||
mem := bot.Client.FindGroup(groupId).FindMember(at.Target)
|
|
||||||
if mem != nil {
|
|
||||||
return mem.DisplayName()
|
|
||||||
}
|
|
||||||
return strconv.FormatInt(at.Target, 10)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if m, ok := i.(gjson.Result); ok {
|
|
||||||
if m.Type == gjson.JSON {
|
|
||||||
elem := bot.ConvertObjectMessage(m, true)
|
|
||||||
fixAt(elem)
|
|
||||||
mid := bot.SendGroupMessage(groupId, &message.SendingMessage{Elements: elem})
|
|
||||||
if mid == -1 {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
return OK(MSG{"message_id": mid})
|
|
||||||
}
|
|
||||||
str = func() string {
|
|
||||||
if m.Str != "" {
|
|
||||||
return m.Str
|
|
||||||
}
|
|
||||||
return m.Raw
|
|
||||||
}()
|
|
||||||
} else if s, ok := i.(string); ok {
|
|
||||||
str = s
|
|
||||||
}
|
|
||||||
if str == "" {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
var elem []message.IMessageElement
|
|
||||||
println(str)
|
|
||||||
elem = append(elem, NewXmlMsg(str,ResId))
|
|
||||||
//fixAt(elem)
|
|
||||||
mid := bot.SendGroupMessage(groupId, &message.SendingMessage{Elements: elem})
|
|
||||||
if mid == -1 {
|
|
||||||
return Failed(100)
|
|
||||||
}
|
|
||||||
return OK(MSG{"message_id": mid})
|
|
||||||
}
|
|
||||||
|
@ -196,6 +196,22 @@ func (bot *CQBot) ConvertStringMessage(m string, group bool) (r []message.IMessa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(t == "xml"){
|
||||||
|
//xml需要实体化,发送的时候不能转回去
|
||||||
|
x := make(map[string]string)
|
||||||
|
//循环遍历Map
|
||||||
|
for _, p := range ps {
|
||||||
|
x[p[1]] = p[2]
|
||||||
|
}
|
||||||
|
resId := x["resid"]
|
||||||
|
template := x["data"]
|
||||||
|
println(template)
|
||||||
|
i, _ := strconv.ParseInt(resId, 10, 64)
|
||||||
|
msg :=global.NewXmlMsg(template,i)
|
||||||
|
r=append(r,msg)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
elem, err := bot.ToElement(t, d, group)
|
elem, err := bot.ToElement(t, d, group)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("转换CQ码到MiraiGo Element时出现错误: %v 将原样发送.", err)
|
log.Warnf("转换CQ码到MiraiGo Element时出现错误: %v 将原样发送.", err)
|
||||||
@ -236,6 +252,16 @@ func (bot *CQBot) ConvertObjectMessage(m gjson.Result, group bool) (r []message.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if t =="xml"{
|
||||||
|
//xml需要实体化,发送的时候不能转回去
|
||||||
|
resId := e.Get("data").Get("resid").Str
|
||||||
|
template := e.Get("data").Get("data").Str
|
||||||
|
println(template)
|
||||||
|
i, _ := strconv.ParseInt(resId, 10, 64)
|
||||||
|
msg :=global.NewXmlMsg(template,i)
|
||||||
|
r=append(r,msg)
|
||||||
|
return
|
||||||
|
}
|
||||||
d := make(map[string]string)
|
d := make(map[string]string)
|
||||||
e.Get("data").ForEach(func(key, value gjson.Result) bool {
|
e.Get("data").ForEach(func(key, value gjson.Result) bool {
|
||||||
d[key.Str] = value.Str
|
d[key.Str] = value.Str
|
||||||
|
101
docs/cqhttp.md
101
docs/cqhttp.md
@ -119,6 +119,51 @@ Type: `node`
|
|||||||
]
|
]
|
||||||
````
|
````
|
||||||
|
|
||||||
|
### xml支持
|
||||||
|
|
||||||
|
Type: `xml`
|
||||||
|
|
||||||
|
范围: **发送**
|
||||||
|
|
||||||
|
参数:
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 说明 |
|
||||||
|
| ------ | ------ | ------------------------------------------------------------ |
|
||||||
|
| data | string | xml内容,xml中的value部分,记得实体化处理|
|
||||||
|
| resid | int32 | 可以不填|
|
||||||
|
|
||||||
|
示例: `[CQ:xml,data=xxxx]`
|
||||||
|
|
||||||
|
####一些xml样例
|
||||||
|
####ps:重要:xml中的value部分,记得html实体化处理后,再打加入到cq码中
|
||||||
|
#### qq音乐
|
||||||
|
```xml
|
||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] 十年" sourceMsgId="0" url="https://i.y.qq.com/v8/playsong.html?_wv=1&songid=4830342&souce=qqshare&source=qqshare&ADTAG=qqshare" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="http://imgcache.qq.com/music/photo/album_500/26/500_albumpic_89526_0.jpg" src="http://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=1535153710&vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&uin=&fromtag=3" /><title>十年</title><summary>陈奕迅</summary></item><source name="QQ音乐" 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>
|
||||||
|
```
|
||||||
|
#### 网易音乐
|
||||||
|
```xml
|
||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] 十年" sourceMsgId="0" url="http://music.163.com/m/song/409650368" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="http://p2.music.126.net/g-Qgb9ibk9Wp_0HWra0xQQ==/16636710440565853.jpg?param=90y90" src="https://music.163.com/song/media/outer/url?id=409650368.mp3" /><title>十年</title><summary>黄梦之</summary></item><source name="网易云音乐" icon="https://pic.rmb.bdstatic.com/911423bee2bef937975b29b265d737b3.png" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.netease.cloudmusic" i_actionData="tencent100495085://" appid="100495085" /></msg>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 卡片消息1
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<msg serviceID="1">
|
||||||
|
<item><title>生死8秒!女司机高速急刹,他一个操作救下一车性命</title></item>
|
||||||
|
<source name="官方认证消息" icon="https://qzs.qq.com/ac/qzone_v5/client/auth_icon.png" action="" appid="-1" />
|
||||||
|
</msg>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 卡片消息2
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<msg serviceID="1">
|
||||||
|
<item layout="4">
|
||||||
|
<title>test title</title>
|
||||||
|
<picture cover="http://url.cn/5CEwIUy"/>
|
||||||
|
</item>
|
||||||
|
</msg>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## API
|
## API
|
||||||
@ -258,59 +303,3 @@ Type: `node`
|
|||||||
| `user_id` | int64 | | 好友id |
|
| `user_id` | int64 | | 好友id |
|
||||||
| `message_id` | int64 | | 被撤回的消息id |
|
| `message_id` | int64 | | 被撤回的消息id |
|
||||||
|
|
||||||
|
|
||||||
## 自定义xml结构化消息发送,请自行承担风险
|
|
||||||
### 发送好友消息
|
|
||||||
|
|
||||||
终结点: `/send_private_msg_xml` 或者 `send_private_msg_xml_async`
|
|
||||||
|
|
||||||
**参数**
|
|
||||||
|
|
||||||
| 字段 | 类型 | 说明 |
|
|
||||||
| -------- | ------ | ---- |
|
|
||||||
| user_id | int64 | qq号 |
|
|
||||||
| message | string | xml数据 |
|
|
||||||
| serviceid | int | 服务Id,一般xml中也有,不填默认为2 |
|
|
||||||
|
|
||||||
### 发送群消息
|
|
||||||
|
|
||||||
终结点: `/send_group_msg_xml` 或者 `send_group_msg_xml_async`
|
|
||||||
|
|
||||||
**参数**
|
|
||||||
|
|
||||||
| 字段 | 类型 | 说明 |
|
|
||||||
| -------- | ------ | ---- |
|
|
||||||
| group_id | int64 | 群号 |
|
|
||||||
| message | string | xml数据 |
|
|
||||||
| serviceid | int | 服务Id,一般xml中也有,不填默认为2 |
|
|
||||||
|
|
||||||
|
|
||||||
###一些xml样例
|
|
||||||
#### qq音乐
|
|
||||||
```xml
|
|
||||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] 十年" sourceMsgId="0" url="https://i.y.qq.com/v8/playsong.html?_wv=1&songid=4830342&souce=qqshare&source=qqshare&ADTAG=qqshare" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="http://imgcache.qq.com/music/photo/album_500/26/500_albumpic_89526_0.jpg" src="http://ws.stream.qqmusic.qq.com/C400003mAan70zUy5O.m4a?guid=1535153710&vkey=D5315B8C0603653592AD4879A8A3742177F59D582A7A86546E24DD7F282C3ACF81526C76E293E57EA1E42CF19881C561275D919233333ADE&uin=&fromtag=3" /><title>十年</title><summary>陈奕迅</summary></item><source name="QQ音乐" 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>
|
|
||||||
```
|
|
||||||
#### 网易音乐
|
|
||||||
```xml
|
|
||||||
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="2" templateID="1" action="web" brief="[分享] 十年" sourceMsgId="0" url="http://music.163.com/m/song/409650368" flag="0" adverSign="0" multiMsgFlag="0" ><item layout="2"><audio cover="http://p2.music.126.net/g-Qgb9ibk9Wp_0HWra0xQQ==/16636710440565853.jpg?param=90y90" src="https://music.163.com/song/media/outer/url?id=409650368.mp3" /><title>十年</title><summary>黄梦之</summary></item><source name="网易云音乐" icon="https://pic.rmb.bdstatic.com/911423bee2bef937975b29b265d737b3.png" url="http://web.p.qq.com/qqmpmobile/aio/app.html?id=1101079856" action="app" a_actionData="com.netease.cloudmusic" i_actionData="tencent100495085://" appid="100495085" /></msg>
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 卡片消息1
|
|
||||||
```xml
|
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<msg serviceID="1">
|
|
||||||
<item><title>生死8秒!女司机高速急刹,他一个操作救下一车性命</title></item>
|
|
||||||
<source name="官方认证消息" icon="https://qzs.qq.com/ac/qzone_v5/client/auth_icon.png" action="" appid="-1" />
|
|
||||||
</msg>
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 卡片消息2
|
|
||||||
```xml
|
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
||||||
<msg serviceID="1">
|
|
||||||
<item layout="4">
|
|
||||||
<title>test title</title>
|
|
||||||
<picture cover="http://url.cn/5CEwIUy"/>
|
|
||||||
</item>
|
|
||||||
</msg>
|
|
||||||
```
|
|
@ -3,9 +3,11 @@ package global
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
|
"github.com/Mrs4s/MiraiGo/message"
|
||||||
"github.com/tidwall/gjson"
|
"github.com/tidwall/gjson"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -41,3 +43,19 @@ func QQMusicSongInfo(id string) (gjson.Result, error) {
|
|||||||
}
|
}
|
||||||
return gjson.ParseBytes(d).Get("songinfo.data"), nil
|
return gjson.ParseBytes(d).Get("songinfo.data"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewXmlMsg(template string,ResId int64) *message.ServiceElement{
|
||||||
|
var serviceid string
|
||||||
|
if ResId == 0{
|
||||||
|
serviceid ="2" //默认值2
|
||||||
|
}else{
|
||||||
|
serviceid = strconv.FormatInt(ResId,10)
|
||||||
|
}
|
||||||
|
//println(serviceid)
|
||||||
|
return &message.ServiceElement{
|
||||||
|
Id: int32(ResId),
|
||||||
|
Content: template,
|
||||||
|
ResId: serviceid,
|
||||||
|
SubType: "xml",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -155,10 +155,6 @@ func (s *httpServer) Run(addr, authToken string, bot *coolq.CQBot) {
|
|||||||
s.engine.Any("/get_version_info_async", s.GetVersionInfo)
|
s.engine.Any("/get_version_info_async", s.GetVersionInfo)
|
||||||
|
|
||||||
s.engine.Any("/.handle_quick_operation", s.HandleQuickOperation)
|
s.engine.Any("/.handle_quick_operation", s.HandleQuickOperation)
|
||||||
s.engine.Any("/send_private_msg_xml", s.Send_private_msg_xml)
|
|
||||||
s.engine.Any("/send_private_msg_xml_async", s.Send_private_msg_xml)
|
|
||||||
s.engine.Any("/send_group_msg_xml", s.SendGroupMessage_xml)
|
|
||||||
s.engine.Any("/send_group_msg_xml_async", s.SendGroupMessage_xml)
|
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
log.Infof("CQ HTTP 服务器已启动: %v", addr)
|
log.Infof("CQ HTTP 服务器已启动: %v", addr)
|
||||||
@ -444,23 +440,3 @@ func getParamWithType(c *gin.Context, k string) (string, gjson.Type) {
|
|||||||
}
|
}
|
||||||
return "", gjson.Null
|
return "", gjson.Null
|
||||||
}
|
}
|
||||||
func (s *httpServer) Send_private_msg_xml(c *gin.Context) {
|
|
||||||
uid, _ := strconv.ParseInt(getParam(c, "user_id"), 10, 64)
|
|
||||||
msg, t := getParamWithType(c, "message")
|
|
||||||
resId, _ := strconv.ParseInt(getParam(c, "serviceid"), 10, 64)
|
|
||||||
if t == gjson.JSON {
|
|
||||||
c.JSON(200, s.bot.Send_private_msg_xml(uid, gjson.Parse(msg), resId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.JSON(200, s.bot.Send_private_msg_xml(uid, msg, resId))
|
|
||||||
}
|
|
||||||
func (s *httpServer) SendGroupMessage_xml(c *gin.Context) {
|
|
||||||
gid, _ := strconv.ParseInt(getParam(c, "group_id"), 10, 64)
|
|
||||||
msg, t := getParamWithType(c, "message")
|
|
||||||
resId, _ := strconv.ParseInt(getParam(c, "serviceid"), 10, 64)
|
|
||||||
if t == gjson.JSON {
|
|
||||||
c.JSON(200, s.bot.CQSendGroupMessage_XML(gid, gjson.Parse(msg), resId))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
c.JSON(200, s.bot.CQSendGroupMessage_XML(gid, msg, resId))
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user