wxpy icon indicating copy to clipboard operation
wxpy copied to clipboard

用户更换昵称、用户名导致PUID发生变化

Open bestony opened this issue 7 years ago • 12 comments

  • 测试中出现了用户昵称变化后,PUID发生变化
  • 测试中出现了群名变换后,PUID发生变化
  • 机器人在重新登录后,PUID发生变化。

bestony avatar May 03 '17 22:05 bestony

PUID,是通过 user_namewxidremark_namecaption(昵称、性别、地区),这 4 个属性来标记用户的。

在登出之前会优先使用 user_name 匹配,并自动同步其他属性作为缓存,重新登录后再用之前缓存的其他属性来按优先顺序匹配 (按以上 4 个属性的列出顺序),当然也会再自动同步 user_name

如果先前只获取到用户的 caption,且机器人进行了重新登录(user_name 都变了),而且没有获取到 wxidremark_name,那么就只能根据 caption 来标记。

因此改名后 PUID 确实可能会变,但只有在可追踪信息过少的情况下才会出现。


另外,目前 PUID Map 是注册在机器人退出时进行保存的,若程序未正常退出,本次所同步的数据将无法保留。

这个问题似乎只能通过运行过程中定时保存的方式来改进。我会在最近的版本中进行处理。如果有更好的建议,欢迎提出。

youfou avatar May 04 '17 12:05 youfou

为何不直接用wxid来保存? 是因为这个id 每次登陆都会变化吗?

JiaFeiX avatar May 05 '17 02:05 JiaFeiX

@JiaFeiX 因为 wxid 并不是总是可以获取到的,经常为 None。当然如果拿到 wxid 的话,puid_map 会优先采用 wxid 来匹配。

youfou avatar May 05 '17 02:05 youfou

我在使用中,也遇到了: 只要重新登陆,puid就会更换。 退出的原因,python脚本并未暂停,是微信号退出了这种情况。 也会puid都更换了 这种情况是因为文件没有保存的原因?

JiaFeiX avatar May 05 '17 02:05 JiaFeiX

{ "BaseResponse": { "Ret": 0, "ErrMsg": "" }, "MemberCount": 334, "MemberList": [ { "Uin": 0, "UserName": xxx, "NickName": "Urinx", "HeadImgUrl": xxx, "ContactFlag": 3, "MemberCount": 0, "MemberList": [], "RemarkName": "", "HideInputBarFlag": 0, "Sex": 0, "Signature": "我是二蛋", "VerifyFlag": 8, "OwnerUin": 0, "PYInitial": "URINX", "PYQuanPin": "Urinx", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0, "AttrStatus": 0, "Province": "",

这是在一篇微信协议的文章里看到的获取联系人之后的返回信息, 咱们说的 wxid 就是 上面这个返回里面的uin对吧? 是经常uin获取不到对嘛?

JiaFeiX avatar May 05 '17 02:05 JiaFeiX

https://segmentfault.com/a/1190000004471678 这篇文章中提的

JiaFeiX avatar May 05 '17 02:05 JiaFeiX

@JiaFeiX 应该是没有保存文件导致的。

wxid 是上面的 Alias or Uin (取先有的)

youfou avatar May 05 '17 02:05 youfou

可以试试手动保存文件

bot.puid_map.dump()

youfou avatar May 05 '17 02:05 youfou

@youfou 谢谢,明白了!

JiaFeiX avatar May 05 '17 09:05 JiaFeiX

puid就是user_name的后8位 “ if puid: new_caption = merge_captions(self.captions.get_key(puid), chat_caption) else: puid = chat.user_name[-8:] new_caption = get_caption(chat) ” 在来看决定puid的四个变量:user_name,wxid、remark_name、caption(昵称、性别、地区)

  1. user_name,是微信服务器根据对话双方产生的一个临时的以@开头的64个字符串,如果你登出微信robot,再重新登入进来的话,即使和同一个好友对话,这个user_name也是不同的
  2. wxid基本拿不到
  3. remark_name,我认为这个才是一个你自己能真正掌控,并且仅和你所使用的微信robot有关,和其他任何变量(好友,微信服务器等等)无关的区分用户的变量。我的建议是用remark_name来查找用户。
  4. caption,如果大规模使用,(昵称、性别、地区)相同是几乎不可避免的。

FortiLeiZhang avatar Nov 14 '17 22:11 FortiLeiZhang

遇到了同样的问题,目前最好的办法是:(用remark_name来查找用户)吗?

gswf-sha avatar Jan 16 '18 03:01 gswf-sha

@bestony 这个问题你最后怎么处理的?我也发现了同样的情况

kiprunning avatar Dec 11 '19 13:12 kiprunning