wxpy
wxpy copied to clipboard
用户更换昵称、用户名导致PUID发生变化
- 测试中出现了用户昵称变化后,PUID发生变化
- 测试中出现了群名变换后,PUID发生变化
- 机器人在重新登录后,PUID发生变化。
PUID,是通过 user_name
,wxid
、remark_name
、caption
(昵称、性别、地区),这 4 个属性来标记用户的。
在登出之前会优先使用 user_name
匹配,并自动同步其他属性作为缓存,重新登录后再用之前缓存的其他属性来按优先顺序匹配 (按以上 4 个属性的列出顺序),当然也会再自动同步 user_name
。
如果先前只获取到用户的 caption
,且机器人进行了重新登录(user_name
都变了),而且没有获取到 wxid
和 remark_name
,那么就只能根据 caption
来标记。
因此改名后 PUID 确实可能会变,但只有在可追踪信息过少的情况下才会出现。
另外,目前 PUID Map 是注册在机器人退出时进行保存的,若程序未正常退出,本次所同步的数据将无法保留。
这个问题似乎只能通过运行过程中定时保存的方式来改进。我会在最近的版本中进行处理。如果有更好的建议,欢迎提出。
为何不直接用wxid来保存? 是因为这个id 每次登陆都会变化吗?
@JiaFeiX 因为 wxid 并不是总是可以获取到的,经常为 None。当然如果拿到 wxid 的话,puid_map 会优先采用 wxid 来匹配。
我在使用中,也遇到了: 只要重新登陆,puid就会更换。 退出的原因,python脚本并未暂停,是微信号退出了这种情况。 也会puid都更换了 这种情况是因为文件没有保存的原因?
{ "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获取不到对嘛?
https://segmentfault.com/a/1190000004471678 这篇文章中提的
@JiaFeiX 应该是没有保存文件导致的。
wxid 是上面的 Alias or Uin (取先有的)
可以试试手动保存文件
bot.puid_map.dump()
@youfou 谢谢,明白了!
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(昵称、性别、地区)
- user_name,是微信服务器根据对话双方产生的一个临时的以@开头的64个字符串,如果你登出微信robot,再重新登入进来的话,即使和同一个好友对话,这个user_name也是不同的
- wxid基本拿不到
- remark_name,我认为这个才是一个你自己能真正掌控,并且仅和你所使用的微信robot有关,和其他任何变量(好友,微信服务器等等)无关的区分用户的变量。我的建议是用remark_name来查找用户。
- caption,如果大规模使用,(昵称、性别、地区)相同是几乎不可避免的。
遇到了同样的问题,目前最好的办法是:(用remark_name来查找用户)吗?
@bestony 这个问题你最后怎么处理的?我也发现了同样的情况