篇文章使用到的技术: mitmdump + 电脑版微信
先分析打开可视化抓包工具, 勾选https代理。然后打开电脑版微信
任意点击一个公众号,再点击查看历史消息
进群:960410445 即可获取源码!
打开后这样
向下滑动右侧的滚动条,同时观察抓包软件,有新的数据加载即可停止滑动,仔细分析抓包软件的数据
呐,接口已经找到了。 下面来分析它的请求参数
上面这些参数我们后面通过mitmdump抓到就可以使用,关键点在于如何构造下一次请求。通过多下滑几次发现,其它参数都是固定不变的,只是 offset这个关键参数来控制它的翻页。通过观察响应
可以找到 nextoffset 这个参数就是下一次请求的 offset参数。那如何知道它已经翻到底了,没有更多内容了呢? 你可以控制滑轮一直下滑,观察最后一个接口的响应体内容,就会发现canmsg_continue=0 如果可以翻页的话,这个参数的值为1。
分析完毕我们就可以编写抓包的脚本了
这样就可以获取首次打开公众号的参数(注意: 这些参数就仅对这一个公众号有用,等控制台打印 爬取完毕,再去点击另外一个公众号)。 然后交给parse去解析下载
import requests import json import time from lxml import etree def parse ( __biz , uin , key , pass_ticket , appmsg_token = "" , offset = "0" , ** kwargs ): url = "txe_eliforp/pm/moc.qq.nixiew.pm//:sptth"[::-1] headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 MicroMessenger/6.5.2.501 NetType/WIFI WindowsWechat QBCore/3.43.901.400 QQBrowser/9.0.2524.400" , } params = { "action" : "getmsg" , "__biz" : __biz , "f" : "json" , "offset" : str ( offset ), "count" : "10" , "is_ok" : "1" , "scene" : "124" , "uin" : uin , "key" : key , "pass_ticket" : pass_ticket , "wxtoken" : "" , "appmsg_token" : appmsg_token , "x5" : "0" , } proxies = { "https" : None , "http" : None , } res = requests . get ( url , headers = headers , params = params , proxies = proxies , timeout = 3 ) data = json . loads ( res . text ) msg_list = eval ( data . get ( "general_msg_list" )). get ( "list" , []) for i in msg_list : url = i [ "app_msg_ext_info" ][ "content_url" ] title = i [ "app_msg_ext_info" ][ "title" ] print ( title , url ) # 判断是否可继续翻页 1-可以翻页 0-到底了 if 1 == data . get ( "can_msg_continue" , 0 ): time . sleep ( 3 ) parse ( __biz , uin , key , pass_ticket , appmsg_token , data [ "next_offset" ]) else : print ( "爬取完毕" )
大体代码就这样了,可以获取到标题和里面的内容了,最后我使用的pdfkit这个包 保存为pdf。
这里给大家说下这里面的坑,不知道大家发现没有,开启了mitmdump 是不能抓到 自身电脑的http请求包的,而Fiddler和Charles就可以直接抓到。 mitmdump需要设置代理,具体设置步骤如下:
然后大家肯定发现我的parse函数里为什么有一行设置代理的参数,而http和https的代理全为None
如果不加上他,它就会走代理,而且报一个 无法连接到代理的错误。具体错误,大家可以尝试一下。除非关闭刚才设置的代理,那如果关闭了, mitmdump就又抓不到电脑的请求包了。。。。所以这里必须要这样设置。其实还有种方法,下面把这两种代码都贴上
这样就OK了。道路很曲折,花了一下午时间才弄好。。。。存储为pdf也有些坑,比如保存的pdf没有图片-_-!!,这些问题开另一篇说,这里就不赘述了!