electronic-wechat icon indicating copy to clipboard operation
electronic-wechat copied to clipboard

WIP: 保存历史记录

Open iamcc opened this issue 8 years ago • 23 comments

WIP:提供一个保存历史记录的思路,但是目前存在问题,每次登录的时候用户ID都会变。

iamcc avatar Apr 27 '16 04:04 iamcc

这个帅,但是貌似用处不大的样子。

FradSer avatar May 03 '16 08:05 FradSer

@FradSer 😂,是Issues看到的,就pr了,也没时间跟进。

iamcc avatar May 03 '16 09:05 iamcc

这个好东西. 周末我来合并到我的代码中试试. 登录时的用户ID会变. 但是uin不会变吖. 可以用uin来保存历史信息吧.

eleveni386 avatar May 17 '16 14:05 eleveni386

@FradSer 对于用电脑时间长过于手机的我来说 非常有用. 手机上的wechat用的较少. 非工作时间就不用这货了.

eleveni386 avatar May 17 '16 14:05 eleveni386

这个功能比较复杂,面向所有用户肯定是不合适的,看看以后有没有合适的方式可以添加。

geeeeeeeeek avatar May 17 '16 15:05 geeeeeeeeek

希望能够有一个简单的logger一样的功能,把所有收到的response都缓存了,下次登录replay一遍

ProfFan avatar May 21 '16 06:05 ProfFan

@eleveni386 uin不会变,但是每条微信消息中,FromUserName,ToUserName, MMPeerUserName,MMActualSender这些关键性的字段不同的登录session中都会发生变化。记录历史记录最需要的MMPeerUserName这个字段是不稳定的,不同session中不一样。就算记录下来,重新显示时还需要_更新_这些字段才能正确对应上。

我的 fork https://github.com/dongyuwei/electronic-wechat 借鉴了 @iamcc 同学的部分思路,目前已经能保存文本和表情消息历史记录(图片消息还有问题),具体看 https://github.com/dongyuwei/electronic-wechat/commit/594693ec91c3ce9c61491895dd012ca514a535a8 这个提交。我的实现依赖于web微信暴露出的一个全局变量window._contacts (保存消息时通过消息的 MMPeerUserName 字段查找对应的Contact,然后记录其 NickNameRemarkName ,这2个字段基本是稳定不变的;显示历史时反向查找)。目前没有考虑不同账号登录的情形,如果要加上这个考量,只要把储存的key放在当前登录用户uid命名空间内即可。

如果哪天 window._contacts 被微信干掉了,我们还可以依赖 HTTP 协议分析和 DOM api 来获取需要的信息。

dongyuwei avatar Jun 11 '16 03:06 dongyuwei

@dongyuwei 你要说明依赖 localforage呢. 我就掉这个坑了.我拿你的代码,直接运行一直卡在splash. 后来无意中发现我没有localforage.

eleveni386 avatar Jun 13 '16 15:06 eleveni386

如果把 electronic-wechat/package.json 中 "start": "electron src/main.js", 改成 "start": "npm install && electron src/main.js", 就会自动安装依赖了。

dongyuwei avatar Jun 13 '16 23:06 dongyuwei

re @eleveni386 看到 @dongyuwei 的 package.json 里有说明 localforage 的依赖呀,,,

arrowrowe avatar Jun 14 '16 00:06 arrowrowe

各位,我的fork https://github.com/dongyuwei/electronic-wechat 目前已经达到可用状态了,我测试了文本,图片,表情这几类聊天消息的存储和重新展现。存储使用IndexedDB(dexie.js),存储时按NickName+RemarkName及Content建了索引,所以理论上支持按照内容的关键词来搜索聊天历史记录。 有兴趣的可以看看,欢迎提出优化代码的意见和建议。 image

dongyuwei avatar Jun 18 '16 11:06 dongyuwei

@dongyuwei 如果希望这个功能进入主分支的话可以发一个 Pull Request ,过几天忙完了 merge 进来。

geeeeeeeeek avatar Jun 18 '16 12:06 geeeeeeeeek

  1. 我看你前面有提到nickname,那用户如果改昵称了会有影响么?
  2. 如果聊天记录量大了之后会有效率问题么?

ripples-alive avatar Jun 18 '16 12:06 ripples-alive

@geeeeeeeeek 功能可用不代表代码质量可接受,等我重构到自己满意了再提 Pull Request吧,谢谢。

@ripples-alive 改昵称了会有影响。可以通过db migration来迁移数据,这个理论上可行,实际上可能比较麻烦。效率应该不会有问题,IndexedDB值得信赖,咱还用了索引。目前存储的聊天消息中无用冗余字段比较多,如果简化一下应该能省不少存储空间。

dongyuwei avatar Jun 18 '16 12:06 dongyuwei

@dongyuwei 好的,谢谢

geeeeeeeeek avatar Jun 18 '16 12:06 geeeeeeeeek

@dongyuwei 饿,我提效率其实不是想说 db 的效率,大概是要说一些显示之类的效率,比如历史记录会显示多少,如果显示的多了的话你显示出来会不会太慢,导致界面卡神马的,如果只显示部分的话,我往回翻历史记录的时候,加载之前没显示的纪录效率如何之类的。 PS:最近没时间,没看你咋实现的,我只是大概点一下,如果有什么不太准确的地方还请见谅

ripples-alive avatar Jun 19 '16 09:06 ripples-alive

@ripples-alive 好问题,我还没有考虑这么多,目前是全部显示。数据多了怎么显示是个大问题。

dongyuwei avatar Jun 19 '16 22:06 dongyuwei

@ripples-alive 你担心已经实现了. 因为@dongyuwei 是一次性加载所有历史记录. 所以导致了某个聊天对象窗口卡死. 可以考虑一次加载一部分. 当用户继续向上翻页时. 再加载一部分. 长度可以固定下来. 这样就完美了.

eleveni386 avatar Aug 28 '16 17:08 eleveni386

弱弱问一下,现在可以存储历史聊天记录和历史文件了吗,可以的话,可以告诉怎么设置吗

lengyueyang avatar Nov 14 '16 00:11 lengyueyang

@dongyuwei 有空的时候提个pr吧.:D

eleveni386 avatar Jan 02 '17 14:01 eleveni386

@eleveni386 因为微信官方mac客户端可以记录聊天历史了,所以一直就没有动力继续了。我那个实现还有些bug。

dongyuwei avatar Jan 02 '17 14:01 dongyuwei

@dongyuwei :( 我等Linuxer 还等待解救. 你那个实现 存在单用户历史消息过多而卡死界面问题. 如果可以分页滚动显示历史消息就不会卡死界面, 就完美了. 可惜我不会electron和nodejs.

eleveni386 avatar Jan 02 '17 14:01 eleveni386

8102年前来考古 感谢上面的前辈的探索成果

kooritea avatar Jun 26 '18 05:06 kooritea