最近,在寫機(jī)器人的時(shí)候遇到了一個(gè)問題,合并轉(zhuǎn)發(fā)實(shí)現(xiàn)不了,這里記錄一下。
使用合并轉(zhuǎn)發(fā)主要是為了縮短消息,不然發(fā)一長(zhǎng)串消息在群里嚴(yán)重影響群里聊天吹水。
然鵝,按照官方文檔折騰了半天,最后還是報(bào)錯(cuò),消息發(fā)不出去:
(這里本來應(yīng)該有圖片的,但是之前報(bào)錯(cuò)的時(shí)候沒來得及寫博客,于是沒存,現(xiàn)在代碼改了,找不到了)
最終經(jīng)過各方查找,發(fā)現(xiàn)了一個(gè)關(guān)鍵點(diǎn):

于是,經(jīng)過啟發(fā),也許是版本問題,原先用的是0.9X的版本,可能這個(gè)接口支持得不是很好。
于是最終解決方案如下:
升級(jí)go-cqhttp到最新版(1.0.0.4 beta)
-
正確書寫代碼
原文檔的代碼屬實(shí)有點(diǎn)混亂,可以看到,涉及該接口的文檔有這么兩個(gè)部分:發(fā)送合并轉(zhuǎn)發(fā)API、合并轉(zhuǎn)發(fā)CQCode
發(fā)送合并轉(zhuǎn)發(fā)API
合并轉(zhuǎn)發(fā)CQCode
而在CQCode的介紹后面還有三種類型的示例代碼,每種看起來都不太簡(jiǎn)單的樣子。
因此,正確書寫代碼也是一種挑戰(zhàn)。
這里,給出第二種示例代碼的簡(jiǎn)化版本:
[
{
"type": "node",
"data": {
"name": "消息發(fā)送者A",
"uin": "10086",
"content": "hello world"
}
},
{
"type": "node",
"data": {
"name": "消息發(fā)送者B",
"uin": "10087",
"content": "[CQ:image,file=xxxxx]測(cè)試消息2"
}
}
]
其發(fā)送合并轉(zhuǎn)發(fā)消息的代碼也就為:
msg = [
{
"type": "node",
"data": {
"name": "消息發(fā)送者A",
"uin": "10086",
"content": "hello world"
}
},
{
"type": "node",
"data": {
"name": "消息發(fā)送者B",
"uin": "10087",
"content": "[CQ:image,file=xxxxx]測(cè)試消息2"
}
}
]
data = {
'group_id':123456787, # '消息發(fā)送的QQ群號(hào)'
'messages':msg
}
# cq_url = "http://127.0.0.1:5700/send_group_forward_msg"
# rev3 = requests.post(cq_url,data=data)
# logging.info(rev3.json())
action = "send_group_forward_msg"
post_data = json.dumps({"action": action, "params": data})
rev = ws.send(post_data)
考慮到合并轉(zhuǎn)發(fā)消息的消息發(fā)送者一般為同一人,略微簡(jiǎn)化一下,發(fā)送多條消息的代碼為:
msg = ['測(cè)試消息1', '測(cè)試消息2', '測(cè)試消息3']
group_msg = []
for item in msg:
each_msg = {
"type": "node",
"data": {
"name": "QQ昵稱",
"uin": "自己的QQ號(hào)",
"content": item
}
}
group_msg.append(each_msg)
data = {
'group_id':123456787, # '消息發(fā)送的QQ群號(hào)'
'messages':group_msg
}
# cq_url = "http://127.0.0.1:5700/send_group_forward_msg"
# rev3 = requests.post(cq_url,data=data)
# logging.info(rev3.json())
action = "send_group_forward_msg"
post_data = json.dumps({"action": action, "params": data})
rev = ws.send(post_data)
在此基礎(chǔ)上,封裝為函數(shù):
def send_forward(msg, group_id, ws, sender):
group_msg = []
for item in msg:
each_msg = {
"type": "node",
"data": {
"name": "QQ昵稱",
"uin": "自己的QQ號(hào)",
"content": item
}
}
group_msg.append(each_msg)
data = {
'group_id':group_id,
'messages':group_msg
}
# cq_url = "http://127.0.0.1:5700/send_group_forward_msg"
# rev3 = requests.post(cq_url,data=data)
# logging.info(rev3.json())
action = "send_group_forward_msg"
post_data = json.dumps({"action": action, "params": data})
rev = ws.send(post_data)
returnStr = "[CQ:at,qq={sender}]".format(sender=sender)
return returnStr
調(diào)用函數(shù)示例:
send_forward(["hello world", "test2", "test3"], "123456789", ws, '987654321')
該函數(shù)的功能為,給定一個(gè)消息列表和群號(hào),發(fā)送合并轉(zhuǎn)發(fā)消息到特定群,并返回艾特發(fā)送者的信息,其中字段說明如下:
-
msg為待發(fā)送的消息列表,例如:msg=["hello world", "test2", "test3"] -
group_id為發(fā)送消息的群號(hào) -
ws為websocket的應(yīng)用,因?yàn)檫@里采用的是正向ws連接,因此使用該參數(shù),若使用http連接可不用該字段,使用注釋的語句發(fā)送消息即可 -
sender為需要回復(fù)的人的QQ號(hào),即觸發(fā)該消息的群成員QQ -
name為合并轉(zhuǎn)發(fā)消息的人的昵稱,可以隨便填 -
uin為合并轉(zhuǎn)發(fā)的消息的人的qq,這里填機(jī)器人的qq
注意:原代碼為正向ws通信的代碼,注釋部分為http通信方式的代碼
最終實(shí)現(xiàn)效果:



