当前位置: 首页 > 科技观察

Python一键导出微信阅读记录和笔记

时间:2023-03-17 21:50:46 科技观察

全民阅读时代已经来临。目前使用阅读软件的用户已达2.1亿,日活跃用户超过500万。其中,19-35岁的年轻用户占比超过60%。学历及以上用户占比高达80%,北京、上海、广州、深圳等省会/直辖市用户占比超过80%。我习惯在微信上看书。为了方便整理书籍和导出笔记,我开发了这个小工具。部分截图代码思路1.目录结构首先看一下整体目录结构├─excel_func.py读写excel文件├─pyqt_gui.pyPyQtGUI接口└─wereader.py微信阅读相关apiexcel_func.py使用xlrd和xlwt库对Excel文件读写操作pyqt_gui.py使用PyQt绘制GUI界面wareader.py获取相关api2。excel_func.pydefwrite_excel_xls(path,sheet_name_list,value):#新建一个工作簿workbook=xlwt.Workbook()#获取需要写入的行数index=len(value)forsheet_nameinsheet_name_list:#在工作簿中新建一个表sheet=workbook.add_sheet(sheet_name)#向本工作簿的表中写入数据foriinrange(0,index):forjinrange(0,len(value[i])):sheet.write(i,j,value[i][j])#保存工作簿workbook.save(path)该函数的代码流程为:创建excel文件,创建表格向表格写入数据3.pyqt_gui.pyclassMainWindow(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()#i实例化浏览器对象QWebEngineProfile.defaultProfile().cookieStore().deleteAllCookies()#第一次运行软件时删除所有cookie.browser.loadFinished.connect(self.onLoadFinished)#网页加载时触发self.onLoadFinished()函数该函数的代码流程是:新建一个QT窗口,实例化一个QWebEngineView对象,绑定self.onCookieAdd事件,绑定self.onLoadFinished事件,加载网页#网页加载完成事件defonLoadFinished(self):globalUSER_VIDglobalHEADERS#getcookiecookies=['{}={};'.format(key,value)forkey,valueinself.DomainCookies.items()]cookies=''.join(cookies)#在header中添加CookieHEADERS.update(Cookie=cookies)#判断是否登录微信阅读成功iflogin_success(HEADERS):print('成功登录微信!')#获取用户user_vidif'wr_vid'inself.DomainCookies.keys():USER_VID=self.DomainCookies['wr_vid']print('用户id:{}'.format(USER_VID))#关闭整个qt窗口self.close()else:print('请扫描二维码登录微信阅读...')这个函数的代码流程是:当网页是loaded,查看微信阅读是否登录成功。登录微信读书,关闭QT窗口,开始数数根据导出,如果登录微信阅读失败,继续等待用户扫描二维码#添加cookies事件defonCookieAdd(self,cookie):if'weread.qq.com'incookie.domain():name=cookie.name().data().decode('utf-8')value=cookie.value().data().decode('utf-8')ifnamenotinself.DomainCookies:self.DomainCookies.update该函数的({name:value})代码流程为:保存微信阅读网站的cookie,以便后续操作=books['recentBooks']booksbooks_all=books['allBooks']write_excel_xls_append(data_dir+'我的书架.xls','已读过的书',books_finish_read)#追加写入excel文件write_excel_xls_append(data_dir+'我的书架.xls.xls','最近读过的书',books_recent_read)#添加写入excel文件write_excel_xls_append(data_dir+'mybookshelf.xls','allbooks',books_all)#添加写入excel文件#获取书架上每本书的笔记forindex,bookinenumerate(books_finish_read):bookbook_id=book[0]bookbook_name=book[1]notes=get_bookmarklist(book[0],HEADERS)withopen(note_dir+book_name+'.txt','w')asf:f.write(notes)print('导出笔记{}({}/{})'.format(note_dir+book_name+'.txt',index+1,len(books_finish_read)))该函数的代码流程是:调用write_excel_xls_append函数,保存书籍,导出笔记4.wereader.pydefget_bookshelf(userVid,headers):"""获取书架上的所有书籍"""url="https://i.weread.qq.com/shelf/friendCommon"params=dict(userViduserVid=userVid)r=requests.get(url,paramsparams=params,headersheaders=headers,verify=False)ifr.好的:数据=r。json()else:raiseException(r.text)books_finish_read=set()#已读过的书books_recent_read=set()#最近读过的书books_all=set()#所有书架上的书forbookindata['recentBooks']:ifnotbook['bookId'].isdigit():#filter公众号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_readreturndict(finishReadBooks=books_finish_read,recentBooks=books_recent_read,allBooks=books_all)这个函数的代码流程是:获取最近的readbooks,Booksread,allbooksfilter公众号部分以字典格式保存书籍数据defget_bookmarklist(bookId,headers):"""获取一本书的笔记并返回md文本"""url="https://i.weread.qq.com/book/bookmarklist"params=dict(bookIdbookId=bookId)r=requests.get(url,paramsparams=params,headersheaders=headers,verify=False)ifr.ok:data=r.json()#clipboard.copy(json.dumps(data,indent=4,sort_keys=True))else:raiseException(r.text)chapters={c['chapterUid']:c['title']forcindata['chapters']}contents=defaultdict(list)foriteminsorted(data['updated'],key=lambdax:x['chapterUid']):#foritemindata['updated']:chapter=item['chapterUid']文本=item['markText']create_time=item["createTime"]start=int(item['range'].split('-')[0])contents[chapter].append((start,text))chapters_map={title:levelforlevel,titleinget_chapters(int(bookId),headers)}res=''forcinsorted(chapters.keys()):title=chapters[c]res+='#'*chapters_map[title]+''+title+'\n'forstart,textinsorted(contents[c],key=lambdae:e[0]):res+='>'+text.strip()+'\n\n'res+='\n'returnres函数代码流程是:获取某本书的笔记,将返回的字符串重写成markdown格式并输出如何运行#跳转到current目录cd目录名#先卸载依赖库pipuninstall-y-rrequirement.txt#重新安装依赖库pipinstall-rrequirement.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple#开始运行pythonpyqt_gui.py补充完整版源码存放在github上,如有需要请点击在这里下载https://github.com/shengqiangzhang/examples-of-web-crawlers