12.一键导出微信读书的书籍和笔记

article/2025/9/22 23:25:54

 

 

# 一键导出微信读书的书籍和笔记> 本项目基于[@arry-lee](https://github.com/arry-lee)的项目[wereader](https://github.com/arry-lee/wereader/issues/20)修改而来,感谢原作者提供的源代码。<br />## 简介全民阅读的时代已经来临,目前使用读书软件的用户数2.1亿,日活跃用户超过500万,其中19-35岁年轻用户占比超过60%,本科及以上学历用户占比高达80%,北上广深及其他省会城市/直辖市用户占比超过80%。**本人习惯使用微信读书,为了方便整理书籍和导出笔记,便开发了这个小工具。**<br />
<br />## 部分截图
![](demo1.png)
<br />
![](demo2.png)<br />
<br />## 代码思路### 1. 目录结构
首先,我们先看一下整体目录结构```bash
Code
├─ excel_func.py                   读写excel文件
├─ pyqt_gui.py                     PyQt GUI界面
└─ wereader.py                     微信读书相关api```
- excel_func.py
使用xlrd和xlwt库对excel文件进行读写操作- pyqt_gui.py
使用PyQt绘制GUI界面- wereader.py
通过抓包解析获得相关api<br />### 2. excel_func.py```python
def write_excel_xls(path, sheet_name_list, value):# 新建一个工作簿workbook = xlwt.Workbook()# 获取需要写入数据的行数index = len(value)for sheet_name in sheet_name_list:# 在工作簿中新建一个表格sheet = workbook.add_sheet(sheet_name)# 往这个工作簿的表格中写入数据for i in range(0, index):for j in range(0, len(value[i])):sheet.write(i, j, value[i][j])# 保存工作簿workbook.save(path)```**该函数的代码流程为:**1. 创建excel文件
2. 创建表格
3. 往表格写入数据<br />
<br />### 3. pyqt_gui.py```python
class MainWindow(QMainWindow):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)self.DomainCookies = {}self.setWindowTitle('微信读书助手') # 设置窗口标题self.resize(900, 600) # 设置窗口大小self.setWindowFlags(Qt.WindowMinimizeButtonHint) # 禁止最大化按钮self.setFixedSize(self.width(), self.height()) # 禁止调整窗口大小url = 'https://weread.qq.com/#login' # 目标地址self.browser = QWebEngineView() # 实例化浏览器对象QWebEngineProfile.defaultProfile().cookieStore().deleteAllCookies() # 初次运行软件时删除所有cookiesQWebEngineProfile.defaultProfile().cookieStore().cookieAdded.connect(self.onCookieAdd) # cookies增加时触发self.onCookieAdd()函数self.browser.loadFinished.connect(self.onLoadFinished) # 网页加载完毕时触发self.onLoadFinished()函数self.browser.load(QUrl(url)) # 加载网页self.setCentralWidget(self.browser) # 设置中心窗口
```**该函数的代码流程为:**1. 新建QT窗口
2. 实例化QWebEngineView对象
3. 绑定self.onCookieAdd事件
4. 绑定self.onLoadFinished事件
5. 加载网页<br />
<br />```python# 网页加载完毕事件def onLoadFinished(self):global USER_VIDglobal HEADERS# 获取cookiescookies = ['{}={};'.format(key, value) for key,value in self.DomainCookies.items()]cookies = ' '.join(cookies)# 添加Cookie到headerHEADERS.update(Cookie=cookies)# 判断是否成功登录微信读书if login_success(HEADERS):print('登录微信读书成功!')# 获取用户user_vidif 'wr_vid' in self.DomainCookies.keys():USER_VID = self.DomainCookies['wr_vid']print('用户id:{}'.format(USER_VID))# 关闭整个qt窗口self.close()else:print('请扫描二维码登录微信读书...')
```**该函数的代码流程为:**1. 当网页加载完毕时,检测是否成功登录微信读书
2. 如果成功登录微信读书,则关闭QT窗口,开始进行数据导出
3. 如果失败登录微信读书,则继续等待用户扫描二维码<br />
<br />```python# 添加cookies事件def onCookieAdd(self, cookie):if 'weread.qq.com' in cookie.domain():name = cookie.name().data().decode('utf-8')value = cookie.value().data().decode('utf-8')if name not in self.DomainCookies:self.DomainCookies.update({name: value})
```**该函数的代码流程为:**1. 保存微信读书网址的cookies,以便后续操作<br />
<br />```pythonbooks = get_bookshelf(USER_VID, HEADERS) # 获取书架上的书籍books_finish_read = books['finishReadBooks']books_recent_read = books['recentBooks']books_all = books['allBooks']write_excel_xls_append(data_dir + '我的书架.xls', '已读完的书籍', books_finish_read) # 追加写入excel文件write_excel_xls_append(data_dir + '我的书架.xls', '最近阅读的书籍', books_recent_read)  # 追加写入excel文件write_excel_xls_append(data_dir + '我的书架.xls', '所有的书籍', books_all)  # 追加写入excel文件# 获取书架上的每本书籍的笔记for index, book in enumerate(books_finish_read):book_id = book[0]book_name = book[1]notes = get_bookmarklist(book[0], HEADERS)with open(note_dir + book_name + '.txt', 'w') as f:f.write(notes)print('导出笔记 {} ({}/{})'.format(note_dir + book_name + '.txt', index+1, len(books_finish_read)))```**该函数的代码流程为:**1. 调用write_excel_xls_append函数,保存书籍,并且导出笔记<br />
<br />### 4. wereader.py```python
def get_bookshelf(userVid, headers):"""获取书架上所有书"""url = "https://i.weread.qq.com/shelf/friendCommon"params = dict(userVid=userVid)r = requests.get(url, params=params, headers=headers, verify=False)if r.ok:data = r.json()else:raise Exception(r.text)books_finish_read = set() # 已读完的书籍books_recent_read = set() # 最近阅读的书籍books_all = set() # 书架上的所有书籍for book in data['recentBooks']:if not book['bookId'].isdigit(): # 过滤公众号continueb = Book(book['bookId'], book['title'], book['author'], book['cover'], book['intro'], book['category'])books_recent_read.add(b)books_all = books_finish_read + books_recent_readreturn dict(finishReadBooks=books_finish_read, recentBooks=books_recent_read, allBooks=books_all)```**该函数的代码流程为:**1. 获取最近阅读的书籍、已经读完的书籍、所有书籍
2. 过滤公众号部分
2. 将书籍数据保存为字典格式<br />
<br />```python
def get_bookmarklist(bookId, headers):"""获取某本书的笔记返回md文本"""url = "https://i.weread.qq.com/book/bookmarklist"params = dict(bookId=bookId)r = requests.get(url, params=params, headers=headers, verify=False)if r.ok:data = r.json()# clipboard.copy(json.dumps(data, indent=4, sort_keys=True))else:raise Exception(r.text)chapters = {c['chapterUid']: c['title'] for c in data['chapters']}contents = defaultdict(list)for item in sorted(data['updated'], key=lambda x: x['chapterUid']):# for item in data['updated']:chapter = item['chapterUid']text = item['markText']create_time = item["createTime"]start = int(item['range'].split('-')[0])contents[chapter].append((start, text))chapters_map = {title: level for level, title in get_chapters(int(bookId), headers)}res = ''for c in sorted(chapters.keys()):title = chapters[c]res += '#' * chapters_map[title] + ' ' + title + '\n'for start, text in sorted(contents[c], key=lambda e: e[0]):res += '> ' + text.strip() + '\n\n'res += '\n'return res
```**该函数的代码流程为:**1. 获取某一本书籍的笔记
2. 将返回的字符串改写成markdown格式并输出<br />
<br />
<br />## 如何运行```bash
# 跳转到当前目录
cd 目录名
# 先卸载依赖库
pip uninstall -y -r requirement.txt
# 再重新安装依赖库
pip install -r requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 开始运行
python pyqt_gui.py
```<br />
<br />## 补充完整版源代码存放在[github][5]上,有需要的可以下载项目持续更新,欢迎您[star本项目][5]<br />
<br />## License
[The MIT License (MIT)][6][5]:https://github.com/shengqiangzhang/examples-of-web-crawlers
[6]:http://opensource.org/licenses/MIT

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
@project: PyCharm
@file: excel_func.py
@author: Shengqiang Zhang
@time: 2020/4/11 21:14
@mail: sqzhang77@gmail.com
"""


import xlrd
import xlwt
from xlutils.copy import copy


def write_excel_xls(path, sheet_name_list, value):
    # 新建一个工作簿
    workbook = xlwt.Workbook()

    # 获取需要写入数据的行数
    index = len(value)

    for sheet_name in sheet_name_list:

        # 在工作簿中新建一个表格
        sheet = workbook.add_sheet(sheet_name)

        # 往这个工作簿的表格中写入数据
        for i in range(0, index):
            for j in range(0, len(value[i])):
                sheet.write(i, j, value[i][j])

    # 保存工作簿
    workbook.save(path)


def write_excel_xls_append(path, sheet_name, value):
    index = len(value)  # 获取需要写入数据的行数
    workbook = xlrd.open_workbook(path)  # 打开工作簿
    worksheet = workbook.sheet_by_name(sheet_name)  # 获取工作簿中所有表格中的的第一个表格
    rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(sheet_name)  # 获取转化后工作簿中的第一个表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            new_worksheet.write(i + rows_old, j, value[i][j])  # 追加写入数据,注意是从i+rows_old行开始写入
    new_workbook.save(path)  # 保存工作簿
    print("{}【追加】写入【{}】数据成功!".format(path, sheet_name))


 


http://chatgpt.dhexx.cn/article/BvNS81u6.shtml

相关文章

最高16% ,微信首批付费阅读公众号分析

早在三年前微信内部就在测试付费阅读&#xff0c;但是一直没有对外发布。最大的阻力来自于苹果。 按照苹果的规定&#xff0c;虚拟支付需要抽取30%的提成&#xff0c;谁也没法绕过&#xff0c;要么妥协&#xff0c;要么放弃。但是微信最开始没有妥协。 微信选择这个时间点发布…

如何增加微信阅读量,新手公众号如何增加阅读量

对于微信公众号运营来说&#xff0c;增加阅读量和粉公众号粉丝是两个基本的要求&#xff0c;但是很多朋友在如何增加微信阅读量的问题上遇到了麻烦。那么到底如何增加微信阅读量&#xff0c;新手公众号如何增加阅读量呢&#xff1f;本文就给大家介绍下微信阅读量的问题。 一、如…

(免费资源)基于微信小程序的小说阅读系统设计与实现

活动地址&#xff1a;毕业季进击的技术er 博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 &#xff08;免费资源&#xff09;基于微信小程序的小说阅读系统设计与实现 视频效果 &#xff08;免费资源…

微信小说电子书阅读系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于web网页的电子书阅读系统&#xff0c;整个网站项目使用了B/S架构&#xff0c;基于java的springboot框架下开发&#xff1b;管理员通过后台录入信息、管理信息&#xff0c;设置网站信息&#xff0c;管理会…

关于微信阅读协议的分析

闲来无事 群里有人问 我就浅浅分析了一波协议 微信文章在客户端阅读需要授权 授权的接口称之为A8key 很多人不知道a8key是什么 a8key就是一个接口名字 类似url的path a8授权链接后就会返回一个针对单个微信授权的链接 &#xff08;会包含pass_ticket &#xff09; 然后访…

微信小程序入门与实战之构建阅读详情页面

构建文章详情页面 由于通常我们的后端人员可能没办法先给我们提供数据&#xff0c;所以我们要采用先静后动的开发方式。 我们所要实现的效果&#xff0c;如图所示&#xff1a; 基础代码&#xff1a; <view class"container"><image ></image>&l…

向阅读致敬!微信读书产品设计策略推导

全文11250字&#xff0c;拆解页面80个&#xff0c;3大理论设计模型&#xff0c;100多个产品设计细节&#xff0c;通过对【微信读书】的设计策略推导&#xff0c;为你提供一份读书类APP产品解题宝典&#xff01; 一、序言 1.1 适合人群 UI/交互设计师 跳出执行层的思维&#xff…

微信小程序-书籍阅读 【阅读、小说阅读、图书、世界读书日、爱读书爱分享】

前言&#xff1a; 微信小程序分为 小程序端【原生微信小程序】 和 后端【node】 两套代码。主要有四大模块&#xff1a;查找书籍、分享图书、书架、管理员发布书籍。阅读给人以力量&#xff0c;作为毕业设计的话是一个令人眼前一亮的作品&#xff0c;立意很稳也很积极向上&…

在线电子书阅读小程序,微信小程序电子书阅读,微信小程序小说阅读器毕业设计作品

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序在线电子书阅读系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台录入电子书信息、书目录信息&#xff0c;用户通过小程序登录&#xff0c;查…

微信小程序阅读器功能

微信小程序 小说阅读器效果 基础功能&#xff1a; 上一章&#xff0c;下一章 目录显示全部章节&#xff0c;点击章节页面对应该章节&#xff0c;正序倒序功能 基本样式设置&#xff0c;背景板切换&#xff0c;字号切换&#xff0c;亮度调节 自定义返回按钮j 静态仿照数据&…

基于微信小程序的小说阅读系统(小程序+Nodejs)

目录 摘要 1 1 前言 3 1.1 项目介绍 3 1.2 项目背景 3 2 微书书城系统分析 3 2.1 需求分析 3 2.2 功能分析 3 2.3 系统用例图设计 3 2.4 系统流程图设计 3 2.5 系统开发环境 3 3 数据库分析与设计 4 3.1 数据库分析 4 3.2 数据库概念设计 4 3.3 数据逻辑结构设计 4 3.4 各表之间…

微信读书产品分析报告(附:信息结构图、功能结构图、产品结构图)

一、产品信息 产品名称&#xff1a;微信读书 产品类型&#xff1a;社交阅读 标语&#xff1a;让阅读不再孤单 产品版本&#xff1a;4.6.5 产品定位&#xff1a;在提供极致阅读体验的同时&#xff0c;为用户推荐合适的书籍&#xff0c;并可查看微信好友的读书动态、与好友讨论正…

【产品分析】从用户体验五要素分析——微信读书

本文从用户体验五要素&#xff1a;表现层面、框架层 、战略层、范围层、结构层&#xff0c;对微信读书进行了分析。 前言 互联网发展的速度也加速了知识更新的速度&#xff0c;也许今天你还手握焦点技能&#xff0c;明天就可能被遗忘在角落。一应俱全的网课、铺天盖地的资讯加…

tensorflow: greater()

tf.greater(x, y, nameNone) 返回&#xff1a;&#xff08;x > y&#xff09;的bool类型的张量 x: 一个张量。且必须是下列类型&#xff1a; types: float32, float64, int32, int64, uint8, int16, int8,uint16. y: 一个张量。且必须是与x类型一样。 name: 节点的操作…

G Greater and Greater

G Greater and Greater Description Given a sequence A of size n{n}n and a sequence B of size m, determine the number of subintervals(called S) of size m in A satisfying ∀i∈{1,2,⋯,m},Si≥Bi​. Input The first line contains two integers n,m (1≤n≤150000,1…

C++ greater/less 和建堆

文章目录 STL中的greater<>()和less<>()Heap定义堆排序构建堆堆排序 C的STL中堆的实现 STL中的greater<>()和less<>() 两个函数的头文件为 排序的时候&#xff0c;默认是从小到大&#xff1b;从大到小排序要使第三个参数为greater()。 建堆的时候&…

Greater and Greater

题目 传送门 题目大意 给定大小为n的序列A和大小为m的序列B&#xff0c;计算A中所有大小为m的子区间S&#xff0c;满足 分析 本题使用了一个special的STL&#xff1a;bitset 考虑bitset&#xff0c;对每个A求一个长为m的bitset Si&#xff0c;其中Si[j]1当且仅当Ai≥Bj。…

Error: Microsoft Visual C++ 14.0 or greater is required 解决方法

在Windows上安装某些Python依赖包时经常会遇到如下错误&#xff0c;其原因是&#xff1a;安装包&#xff08;此处是box2d-py&#xff09;没有找到Microsoft Visual C 14.0或更高版本的运行环境&#xff0c;所以无法正常启动。 error: subprocess-exited-with-error....Running…

什么是MVP模式?

MVP&#xff08;Model-View-Presenter&#xff09;是MVC模式的改良&#xff0c;由IBM的子公司Taligent提出。 和MVC的相同之处在于&#xff1a;Controller/Presenter负责业务逻辑&#xff0c;Model管理数据&#xff0c;View负责显示。 1.各部分之间的通信,都是双向的. View &l…

理解MVP设计模式

版权声明&#xff1a;转载请注明本文出自远古大钟的博客&#xff08;http://blog.csdn.net/duo2005duo&#xff09;&#xff0c;谢谢支持&#xff01; 目录(?)[] 转载请注明本文出自远古大钟的博客&#xff08;http://blog.csdn.net/duo2005duo&#xff09;&#xff0c;谢谢支…