Room.create "no id" error
Gyufei opened this issue · 11 comments
重要:请不要删除模板自行填写,所有不按照模板填写的issue,我们将不会处理。
0. 发 Issue 指南
- 请运行下面的命令,看问题是否可以被解决:
rm -rf package-lock.json
rm -rf node_modules
npm install
-
请在 FAQ 清单 看是否已有解决办法。
-
请先在issue 中搜关键信息,确认你要发的内容和之前的issue 不重复。
1. 提供你的包版本信息
- wechaty 版本:0.23.39
- wechaty-puppet-padchat 版本:0.19.3
- node 版本:v10.14.1 (运行
node --version
获取版本) - 你使用的操作系统:mac
2. Bug 描述
请用精简的语言描述你遇到的bug
使用 wechaty.Room.create
时,在有些时候会发生 no id
报错。观察日志发现 rpcCall 返回 message%22%3A%22%5Cn%5Cu0014MemberList+are+wrong%22%2C%2
错误。
3. 复现的步骤 (或者解决的步骤)
这一部分非常重要,如果你无法给出复现步骤,我们也很难提供相应的解决办法:
例子:
- 第一步:使用
wechaty.Contact.load(id)
再使sync()
,或者直接使用FriendShip.find
, 得到对应 Contact - 第二步:使用
wechaty.Room.create
传入 上一步得到的联系人创建群聊,抛出no id
错误 - 。。。
4. 期待程序运行的结果
请用精简的语言描述你期待运行的结果
期待创建群聊成功
5. 程序实际运行的结果
请用精简的语言或者截图描述实际运行的结果(请不要在这里粘贴日志截图)
实际运行过程中抛出 no id 错误
6. 完整的日志信息:
通过WECHATY_LOG=silly
设定环境变量,将设置log 等级为 silly,获取最详细的日志信息(默认log 等级为 info)
请提供完整的日志信息(不要只提供部分的日志截图,请复制粘贴日志内容!)
Show Logs
VERB Room create(Contact<gyff>,Contact<fq>, 我是唐国强)
18:12:52 VERB PuppetPadchat roomCreate(guo812773673,fqzw2012, 我是唐国强)
18:12:52 SILL PadchatRpc rpcCall(WXCreateChatRoom, ["[\"guo812773673\",\"fqzw2012\"]"])
18:12:52 SILL PadchatRpc initWebSocket() ws.on(message): {"apiName":"WXCreateChatRoom","data":"%7B%22message%22%3A%22%5Cn%5Cu0014MemberList+are+wrong%22%2C%2
18:12:52 SILL PadchatRpc WXCreateChatRoom(userList.length=2) = "{"message":"\n\u0014MemberList are wrong","status":0,"user_name":""}"
18:12:52 VERB Puppet roomPayload()
18:12:52 ERR Room create() exception: Error: no id
at PuppetPadchat.<anonymous> (/Users/guoyufei/Documents/project/wechat/unibot/node_modules/wechaty-puppet/dist/src/puppet.js:682:23)
at Generator.next (<anonymous>)
at /Users/guoyufei/Documents/project/wechat/unibot/node_modules/wechaty-puppet/dist/src/puppet.js:25:71
at new Promise (<anonymous>)
at __awaiter (/Users/guoyufei/Documents/project/wechat/unibot/node_modules/wechaty-puppet/dist/src/puppet.js:21:12)
at PuppetPadchat.roomPayload (/Users/guoyufei/Documents/project/wechat/unibot/node_modules/wechaty-puppet/dist/src/puppet.js:679:16)
at PuppetPadchat.<anonymous> (/Users/guoyufei/Documents/project/wechat/unibot/node_modules/uniqueway-wechaty-puppet-padchat/dist/src/puppet-padchat.js:1088:24)
at Generator.next (<anonymous>)
at fulfilled (/Users/guoyufei/Documents/project/wechat/unibot/node_modules/uniqueway-wechaty-puppet-padchat/dist/src/puppet-padchat.js:22:58)
at process._tickCallback (internal/process/next_tick.js:68:7)
```shell
$ WECHATY_LOG=silly node yourbot.js
7. 其他信息
有相关bug 的背景信息,可以在这里说明
时好时坏,使用wechaty.Contact.load(id)
再 sync()
之后得到的contact
创建群聊时比较大概率报错,
使用FriendShip.find
得到的 contact
时有时也会报错,但不像前一种那么频繁。
但有时两种方法得到的 contact
传入 Room.create
都能创建群聊成功。
[bug]
你要保证你传的id是你的好友才可以创建群聊
你要保证你传的id是你的好友才可以创建群聊
好友这个是肯定确定是好友的,比较奇怪的就是 Room.create
方法传入两个相同的Contact
, 有时可以创建成功,有时就会报 no id
错误,非常难摸清规律。所以希望你们能不能提供一点有帮助的信息,比如是否知道在什么情况下容易报 no id
错误,rpcCall
调用 WXCreateChatRoom
返回的形如MemberList+are+wrong
的消息代表着什么,是否是微信方的限制还是什么?
确认下是否是所有的号都会报这个错误,还是只有某个微信报此错误。
有可能是被微信限制了
粘贴下你的可复现的最小化代码
async function createRoomById(managerId, customerId, topic) {
try {
if(!managerId || !customerId) {
throw(new Error('缺少参数 managerWechatId 或 customerWechatId'))
}
const manager = await exchangeRealContact(managerId)
const customer = await exchangeRealContact(customerId)
const roomId = await pullRoom(manager, customer, topic)
return roomId
} catch(err) {
return Promise.reject(err)
}
}
async function exchangeRealContact(wechatId) {
try {
let contact = await wechaty.Contact.load(wechatId)
await contact.sync()
return contact
} catch(err) {
return Promise.reject(err)
}
}
async function pullRoom(manager, customer, topic) {
try {
const contactList = [manager, customer]
const room = await wechaty.Room.create(contactList, topic)
const roomId = room.id
setTimeout( async _ => {
await room.say(`@${customer.name()} 您好, 我是xxx, @${manager.name()} 是您的xxx `)
await room.sync()
console.log(`topic: ${topic}`)
await room.topic(topic)
}, 2000)
return roomId
} catch (err) {
return Promise.reject(err)
}
}
这里是根据alias来创建群聊 也会偶发no id的问题
async function createRoomByAlias(managerAlias, customerAlias, topic) {
try {
const manager = await wechaty.Contact.find({ alias: managerAlias })
const customer = await wechaty.Contact.find({ alias: customerAlias })
const roomId = await pullRoom(manager, customer, topic)
return roomId
} catch (err) {
return Promise.reject(err)
}
}
请问为什么用的包是uniqueway-wechaty-puppet-padchat
? 这个有做什么改动么?
还有我看到log里面有这样一行
create(Contact,Contact, 我是唐国强)
18:12:52 SILL PadchatRpc rpcCall(WXCreateChatRoom, ["["guo812773673","fqzw2012"]"])
前两个应该是正确的Contact
对象,但是最后那个是一个字符串么?还是什么其他的类型?为什么前面的是有三个contact,到后面的rpcCall的时候变成了两个?
我在试图定位到代码里面抛出no id
错误的部分,但是在log里面没能正确找到位置
uniqueway-wechaty-puppet-padchat
是wechaty-puppet-padchat
的 fork
,其余部分完全一致,除了增加了一个 friendshipSearch
方法用于使用微信 ID 查找联系人(在 另一个 ISSUE 中有提到)
create(Contact,Contact, 我是唐国强)
18:12:52 SILL PadchatRpc rpcCall(WXCreateChatRoom, ["["guo812773673","fqzw2012"]"])
前两个为联系人,第三个为群聊的名称 topic
。
微信机器人调用建群,再加上两个联系人,三个人,是完全可以建群的。
关于错误定位,就是这一个调用
18:12:52 SILL PadchatRpc rpcCall(WXCreateChatRoom, ["["guo812773673","fqzw2012"]"])
为什么有时可以成功,但很多时候就会返回以下消息
18:12:52 SILL PadchatRpc initWebSocket() ws.on(message): {"apiName":"WXCreateChatRoom","data":"%7B%22message%22%3A%22%5Cn%5Cu0014MemberList+are+wrong%22%2C%2
18:12:52 SILL PadchatRpc WXCreateChatRoom(userList.length=2) = "{"message":"\n\u0014MemberList are wrong","status":0,"user_name":""}"
返回错误信息的时候没有任何规律么,比如哪些联系人一定会返回错误,哪些不会?
MemberList are wrong
是wechat返回的错误信息,不是wechaty内部生成的,因此这个验证是由wechat完成的,所以请再次检查一下传入的参数,确认下是不是好友,通过和这个好友说句话来判断,还有确认一下是不是传入了bot自己的contact id,或者是不是传入了某个公众号的id。目前只能想到这几个可能性了
我也遇到了这个情况,await wechaty.Contact.find({ alias: managerAlias }) await wechaty.Contact.findAll() 会带着公众号,群好友等一些你不想要的好友找出来