在我日常工作中,我会将各种互联网以及生活中产出的信息汇总到Bear,再通过Bear的云同步使我各个终端的信息保持一致。

以前在使用有道云笔记的时候,有个功能我很喜欢,就是当看到一篇想收藏的文章的话,就可以直接右上角发送到有道云笔记,如下图:

顺便一提:熊掌记是一款优雅、灵活的写作笔记应用。

很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。

很多已经做案例的人,却不知道如何去学习更加高深的知识。

那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!

QQ群:127341871

回到正题,我现在面临的需求是能不能在看到喜欢的文章的时候,也通过类似于右上角分享一下就可以直接将文章同步到我各个终端上的Bear,最终成果如下:

解决方案

要实现上述的需求,我大概思考了如下的解决方案:

1) 准备一个微信号(这里直接称作小号)专门接收待收藏到Bear的文章

2) 编写一个服务监控小号的消息,比如收到推文类型的消息就进行内容提取

3) 监控服务将提取后的内容发送到Bear(这里要求服务运行在Mac OS上)

所以在继续之前,你需要有以下条件:

•基本的Python基础知识(写小脚本Python真的很方便)•一台装有Bear的Mac OS

方案调研

上面的解决方案看起来还是挺好实现,第一步不用多说,这年头谁没个小号,第二点的话,我印象中Python是有个第三方库可以直接监听微信对应账号的消息。

因为这些第三方库都是基于Web版的微信,所以在使用之前我想验证下此方案是否可行,刚准备登录网页版微信,就直接提示:

<error><ret>1203</ret><message>To protect your account, logging in to WeChat via the web has been suspended. Use WeChat for Windows or WeChat for Mac to log in on a computer. Download WeChat for Windows or Mac at http://wechat.com.</message></error>

果不其然现在微信准备加强Web版本的限制了,心里凉凉的,第二步还没开始就已经被宣判死刑。

只能换个思路了,怎么办。其实这一步走不通我还是能接受的,因为我一直觉得依赖Web版总有一天会挂掉,毕竟多了个依赖总是会增加复杂度。

能不能依靠客户端?

我们知道,微信数据是有同步功能的,开发过客户端的都知道,这就意味着微信的数据必然保存一份在客户端本地系统上。

所以对于第二点的解决思路就转换成了如何获取微信保存在客户端本地的数据,找到某个软件的数据文件夹自然是很简单的事情,比如微信客户端的数据就存放在:

# howie6879是我的用户名,请自行替换/Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9

具体有如下目录:

├── 988eebd1078a0d794bff2b6f5c8d5176├── Avatar├── CGI├── CrashReport├── KeyValue├── MMResourceMgr├── checkVersionFile├── d41d8cd93400b204e9800998ecf8427e├── f965739b566114f907dc394322e1e826├── topinfo.data├── upgradeHistoryFile├── whatsNewVersionFile└── wx.dat
8 directories, 5 files

不知道上面那三个32位的字符串大家看起来熟悉不熟悉:

一想到32,就是md5加密,我第一反应就是对于每个登录账号的id加密值,我们先不管,直接进去看更深一层的文件夹:

├── Account├── Avatar├── Contact├── Favorites├── FileStateSync├── FunctionMsg├── Group├── Message├── RevokeMsg├── Session├── Stickers├── Sync├── complexSearch├── mmexpt└── newabtest
15 directories, 0 files

Message出来了,这是不是我们想要的呢?再往下看里面的目录:

├── MessageTemp├── fts├── msg_0.db├── msg_0.db-backup├── msg_0.db-shm├── msg_0.db-wal├── msg_1.db

如果你登录过该台电脑并同步过信息,那么不出意外会有挺多*.db后缀的文件。大胆地猜测一下,这是不是我们想要的聊天数据存放路径呢?

不要管太多,先看看总不会错,一般本地存储的数据库,咱们程序员第一反应应该就是SQLite,要不要试试?

sqlite3 Message/msg_0.dbsqlite> .schemaError: file is not a databasesqlite>

??提示不是数据库,此时陷入了瓶颈,怎么就不是数据库了呢。反思一下,是不是打开的姿势不对。

会不会是加密了?依照这个思路,我了解到有一款基于SQLite的扩展数据库SQLCipher[1],SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能。

实践证明,我猜想的是对的,接下来主要做的怎么打开Message/msg_0.db这个文件并成功读取里面的数据。

最后我参考到一份有意思的问答,我就是参考这个问答[2]对数据库进行解密,这里我复述一下:

•打开微信,但是先不登录•打开终端,输入lldb -p $(pgrep WeChat)•会看到进入了lldb,然后输入br set -n sqlite3_key,按回车•在lldb中,输入c,按回车•打开微信并扫码登录•然后回到lldb中,输入memory read --size 1 --format x --count 32 $rsi

此时就会得到以下类似的输出:

0x600003888340: 0xd1 0x05 0x29 0x04 0x75 0xc5 0x45 0x050x600003888348: 0x92 0x26 0xa1 0x65 0x95 0xe5 0x15 0x3f0x600003888350: 0xf3 0xc7 0x43 0x85 0x05 0x35 0x45 0x3d0x600003888358: 0x84 0xc8 0x64 0xe5 0x35 0x65 0x45 0xe2

去掉冒号前面的那一串,后面是四行八列的数据,再去除掉0x空格\n等,就会得到一串64位的字符串,举个例子:

df012f587cc546000025a56599e81530f9cc49800329423d8ec460e1386549e2

这就是我们进入数据库的钥匙,接下来,请安装sqlcipher的相关软件,如:

brew install sqlcipherbrew cask install db-browser-for-sqlite

让我们用db-browser-for-sqlite打开db后缀的文件看看有什么不一样吧:

点击OK,成功打开!

随便进入一个表:

很显然,我们成功获取了本地的聊天记录,总算将第二步流程打通了,如今我们可以监控发送收藏文章的微信账户的聊天记录,只要收到此账号发来的推文消息,此时监控服务可以立马反应过来并解析发送到Bear。

有个小问题,怎么知道发推文的账号在哪个库哪个表呢?可以这样看,在电脑上登录发推文的账号,打开文件``:

cd /Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/988eebd1023a0d794bff2b6f5c8d5176/Accountcat userinfo.data

大概输出如下:

":BHPpx��127417592694754732��wxid_epXXXXXXXfj12�    Howie6879�老胡的储物柜�

这里很明显我的wxid就是:wxid_epXXXXXXXfj12,那么对应需要监控的表名就是:Chat_md5(wxid_epXXXXXXXfj12),形式如同这样

Chat_f965739xxxx114fxxxxc394322exxxx

随后实现在库里面找到对应的表即可,我本机发现对应账户的表存在于库 msg_5.db中。

接下来要做的事情就很简单了,就是将提取后的内容发送到Bear,这里可以利用X callback url Scheme documentation[3],比如你在终端输入:

open 'bear://x-callback-url/create?title=Test%20Bear&text=Hello%20Bear'

立马就可以看到Bear自动建立了一篇笔记

编码实现

终于到了编码阶段,好心酸:

第一步,拿到必须要的常量:

•S_ACCOUNT_ID:微信发送账户ID,可以在Account/userinfo.data下查看•R_ACCOUNT_ID:微信接收账户ID,同上•RAW_KEY:解密Key,就是上面介绍的64位字符串•DB_PATH_TEM:定义的是消息DB路径,比如:"/Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/{0}/Message/"

定义这四个常量,接下来的事情就一帆风顺了哈,我将项目开源在Github,地址见w2b[4],接下来我直接说说怎么用:

git clone https://github.com/howie6879/w2bcd w2b# 推荐使用pipenv 你也可以使用自己中意的环境构建方式pipenv install --python=/Users/howie6879/anaconda3/envs/python36/bin/python3.6  --skip-lock# 运行前需要填好配置文件pipenv run python w2b/run.py

随后,会有日志输出:

[w2b] pipenv run python w2b/run.py                                                                                                Loading .env environment variables…[2019:09:13 09:16:35] INFO  w2b  目标表 Chat_f965739b676114fxxxxc394322e1e826 存在于库 msg_5.db

好,代码跑起来后,接下来电脑上登录你的小号(也就是接收微信文章的微信号),然后在手机上登录发送文章的微信号,最终成功就和文章一开始的动图一样了~

如果觉得对你有帮助,点个好看然后帮忙转发一下吧。

说出来你可能不信,我用 Python 破解了微信聊天记录相关推荐

  1. chatgpt赋能python:Python如何获取微信聊天记录

    Python如何获取微信聊天记录 作为世界上最受欢迎的即时通讯工具之一,微信被大量用户使用.然而,微信聊天记录的备份和管理是一个重要的问题,特别是对于那些需要在工作和个人生活中快速查找重要信息的人来说 ...

  2. python爬取微信聊天记录数据_[使用案例]python如何爬取微信好友信息?(上)

    Python3如何爬取微信好友基本信息,并且进行数据清洗?下面跟着IP海带来的教程,我们一起看看具体的操作要怎么实现. 1.登录获取好友基础信息: 好友的获取方法为get_friends,将会返回完整 ...

  3. python itchat 无法登录_利用python实现在微信群刷屏的方法

    hello,我是小小炽,这是我写的第一篇博客,写博客一直都想在写,但是苦于能力尚浅,在各位大牛面前那既然是关公面前耍大刀了,但是其实想来每一个大牛不也是从一个小白慢慢进步学习从而达到一定的高度的吗,而 ...

  4. “Python来玩微信跳一跳”教程(问题总结)

    原文:<"Python来玩微信跳一跳"教程> 在上一篇文章中,收到了大家大量的问题反馈,因为问题比较多,并且有很多重复的问题,所以并没有一一回复,这里表示一下歉意,并整 ...

  5. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  6. 在哪里能收到python实例代码-python实现网站微信登录的示例代码

    最近微信登录开放公测,为了方便微信用户使用,我们的产品也决定加上微信登录功能,然后就有了这篇笔记. 根据需求选择相应的登录方式 python实现网站微信登录的示例代码 微信现在提供两种登录接入方式 移 ...

  7. 用Python玩转微信的正确姿势!

    0. itchat 最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息. 然后发现了itchat这个开源项目,作者是@LittleCode ...

  8. php 企业号文本消息推送,Python如何实现微信企业号文本消息推送功能的示例

    这篇文章主要介绍了Python编程实现微信企业号文本消息推送功能,结合实例形式分析了Python微信企业号文本消息推送接口的调用相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python微信企业号 ...

  9. Python破解滑块验证码算法,完美避开人机识别

    | 完美是不可能的,加个震惊!Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login pyt ...

  10. linux 脚本调用企业微信_shell或python调用企业微信发送消息(实现报警功能)

    shell或python调用企业微信发送消息(实现报警功能) 官方文档 注册登陆企业微信 登录企业微信管理端 -> 应用与小程序 -> 应用 -> 自建,点击"创建应用&q ...

最新文章

  1. python深浅拷贝 面试_python基础-深浅拷贝
  2. 关键词 onStart()和onResume()存在的原因(测验篇)两者的区别
  3. 【Linux 内核】实时调度类 ③ ( 实时调度类 rt_sched_class 源码 | 调度类 sched_class 源码 )
  4. 批量修改编码格式小工具
  5. 学习Kotlin(二)基本语法
  6. 39.左值、左值引用、右值、右值引用
  7. 经典C语言程序100例之四三
  8. JS执行Promise
  9. Mybatis中的动态SQL记录
  10. word公式编号怎么右对齐_8个能帮你大忙的Word技巧,建议花几分钟学起来!
  11. 何小鹏总结2017:小鹏汽车融资近50亿,上市车型下月亮相CES
  12. python变量定义模糊_刚接触python,对变量还有点模糊,下面的代码帮忙看下
  13. 一种基于HBase韵海量图片存储技术
  14. android内存取证,CTF内存取证入门(以安洵杯为例)
  15. 房子装饰风水有哪些讲究和忌讳
  16. 关于p操作和v操作的理解
  17. 塞班java手机qq浏览器下载_手机QQ浏览器 for Symbian S60v3
  18. 基于Arduino、ESP8266的物联网项目开发方案整理、毕业设计(第一波)
  19. 什么是“ Windows Shell体验主机”,为什么在我的PC上运行?
  20. HTC获得面部解锁专利

热门文章

  1. 单片机多级菜单的简单实现
  2. 通过IO口控制STC15F2K60S2系列单片机输出pwm
  3. Emmagee性能测试简单的使用
  4. 华为atn950b指导手册_全新原包装华为ATN950B 整机 传输设备
  5. 工业相机 - - 线阵相机
  6. vue项目电商后台管理系统(一)
  7. java面试说话技巧,Java面试题及解答技巧解析介绍
  8. 4g 控矿驱动 迪兰rx574_用结果说话 篇四:迪兰RX580 2048SP 4G X-Serial战将i7-8700与R5 2400G双平台体验点评...
  9. vue组件库和组件文档生成
  10. 用Python算出你的名字,比老僧算的更快!