wechaty/wechaty-puppet-padchat

Room.create "no id" error

Gyufei opened this issue · 11 comments

重要:请不要删除模板自行填写,所有不按照模板填写的issue,我们将不会处理。

0. 发 Issue 指南

  1. 请运行下面的命令,看问题是否可以被解决:
rm -rf package-lock.json
rm -rf node_modules
npm install
  1. 请在 FAQ 清单 看是否已有解决办法。

  2. 请先在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的消息代表着什么,是否是微信方的限制还是什么?

确认下是否是所有的号都会报这个错误,还是只有某个微信报此错误。

有可能是被微信限制了

我们7个机器人 无一例外 都会报这个错 @lijiarui

粘贴下你的可复现的最小化代码

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-padchatwechaty-puppet-padchatfork,其余部分完全一致,除了增加了一个 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() 会带着公众号,群好友等一些你不想要的好友找出来