Skip to content
This repository has been archived by the owner on Nov 12, 2018. It is now read-only.

WIP: 保存历史记录 #159

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Conversation

iamcc
Copy link
Contributor

@iamcc iamcc commented Apr 27, 2016

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

@geeeeeeeeek geeeeeeeeek changed the title 保存历史记录 WIP: 保存历史记录 Apr 28, 2016
@FradSer
Copy link

FradSer commented May 3, 2016

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

@iamcc
Copy link
Contributor Author

iamcc commented May 3, 2016

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

@eleveni386
Copy link

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

@eleveni386
Copy link

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

@geeeeeeeeek
Copy link
Owner

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

@ProfFan
Copy link

ProfFan commented May 21, 2016

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

@dongyuwei
Copy link

dongyuwei commented Jun 11, 2016

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

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

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

@eleveni386
Copy link

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

@dongyuwei
Copy link

dongyuwei commented Jun 13, 2016

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

@arrowrowe
Copy link
Contributor

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

@dongyuwei
Copy link

dongyuwei commented Jun 18, 2016

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

@geeeeeeeeek
Copy link
Owner

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

@ripples-alive
Copy link
Collaborator

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

@dongyuwei
Copy link

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

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

@geeeeeeeeek
Copy link
Owner

@dongyuwei 好的,谢谢

@ripples-alive
Copy link
Collaborator

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

@dongyuwei
Copy link

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

@eleveni386
Copy link

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

@lengyueyang
Copy link

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

@eleveni386
Copy link

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

@dongyuwei
Copy link

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

@eleveni386
Copy link

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

@kooritea
Copy link

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

10 participants