需求背景:
最近误入一个免费(daoban
)资源的分享群(正经脸),群里每天都在刷资源链接。但是大家都知道,百度云的分享链接是很容易被河蟹的,群里除了分享链接外,就是各种抱怨 “怎么又失效了”,“又河蟹了…”。本着学习技术的初心,于是我就开始研究怎样自动爬取微信群的消息并自动转存到自己的云盘。
需求:
(1),爬取微信群里的百度云分享链接
(2),将资源转存到自己的网盘
涉及
(1),正则表达式
(2),如何分析cookie
和api
(3),selenium(webdriver)
本篇文章目录
(1),爬取微信群聊信息里的网盘资源
(2),寻找并分析百度云的转存api
(3),爬取shareid、from、filelist
,发送请求转存到网盘
(4),完整代码
(5),参考
爬取微信群聊信息里的网盘资源
爬取微信群聊信息可以用微信网页版的api,这里推荐一个高度封装,使用简单的工具:wxpy
: 用 Python
玩微信
这是个不错的工具,可以实现网页版微信的所有功能,之前博主利用它还实现了机器人聊天功能,自己的个人账号华丽转变 微软小冰 。虽然微软还没有公开小冰的 api
,不过我们完全可以利用这个工具的转发功能来实现,思路很简单,微信上领养一个小冰,把别人说的话转发给小冰,再把小冰说的话转发回去。
扯远了,总之利用这个工具,就可以对微信群聊里的信息进行监听,接着就是利用正则表达式把网盘链接抓取出来。具体的代码我就不贴了,使用起来很简单。
寻找并分析百度云的转存api
这个部分才是我们的重点,首先你得有一个百度云盘的账号,然后登录,用浏览器(这里用火狐浏览器做示范)打开一个分享链接。F12
打开控制台进行抓包。手动进行转存操作:全选文件->保存到网盘->选择路径->确定
。点击【确定】前建议先清空一下抓包记录,这样可以精确定位到转存的api
,这就是我们中学时学到的【控制变量法】2333。
可以看到上图中抓到了一个带有 “transfer
” 单词的 post
请求,这就是我们要找的转存(transfer
)api
。接下来很关键,就是分析它的请求头和请求参数,以便用代码模拟。
https://pan.baidu.com/share/transfer?shareid=3927175953&from=140959320&ondup=newcopy&async=1&bdstoken=xxx&channel=chunlei&clienttype=0&web=1&app_id=250528&logid=xxx
点击它,再点击右边的【Cookies
】就可以看到请求头里的cookie
情况。
cookie分析:
因为转存是登录后的操作,所以需要模拟登录状态,将与登录有关的cookie
设置在请求头里。我们继续使用【控制变量法】,先将浏览器里关于百度的 cookie
全部删除(在右上角的设置里面,点击【隐私】,移除cookies
。具体做法自己百度吧。)
然后登录,右上角进入浏览器设置->隐私->移除cookie
,搜索 “bai
” 观察cookie
。这是所有跟百度相关的cookie
,一个个删除,删一个刷新一次百度的页面,直到删除了 BDUSS
,刷新后登录退出了,所以得出结论,它就是与登录状态有关的 cookie
。
同理,删除掉 STOKEN
后,进行转存操作会提示重新登录。所以,这两个就是转存操作所必须带上的cookie
。
弄清楚了 cookie
的情况,可以像下面这样构造请求头。
def __init__(self,bduss,stoken,bdstoken):
self.bdstoken = bdstoken
self.headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Content-Length': '161',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'BDUSS=%s;STOKEN=%s;' % (bduss, stoken),
'Host': 'pan.baidu.com',
'Origin': 'https://pan.baidu.com',
'Referer': 'https://pan.baidu.com/s/1dFKSuRn?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0',
'User-Agent': self.pro.get_user_agent(),# 作为应对反爬虫机制的策略,这是博主写的一个随机抽取user_agent的方法,你也可以自己到网上去搜集一些,写一个随机方法。
'X-Requested-With': 'XMLHttpRequest',
}
除了上面说到的两个 cookie
,其他的请求头参数可以参照手动转存时抓包的请求头。这两个 cookie
预留出来做参数的原因是cookie
都是有生存周期的,过期了需要更新,不同的账号登录也有不同的cookie
。
参数分析:
接下来分析参数,点击【Cookies
】右边的【Params
】查看参数情况。如下:
上面的query string
(也就是?后跟的参数)里,除了框起来的shareid、from、bdstoken
需要我们填写以外,其他的都可以不变,模拟请求的时候直接抄下来。
前两个与分享的资源有关,bdstoken
与登录的账号有关。下面的form data
里的两个参数分别是资源在分享用户的网盘的所在目录和刚刚我们点击保存指定的目录。
所以,需要我们另外填写的参数为:shareid、from、bdstoken、filelist 和 path,bdstoken
可以手动转存抓包找到,path
根据你的需要自己定义,前提是你的网盘里有这个路径。其他三个需要从分享链接里爬取,这个将在后面的【爬取shareid、from、filelist
,发送请求转存到网盘】部分中进行讲解。
码字不易废话两句:有需要学习资料的或者有技术问题交流“点击”即可
搞清楚了参数的问题,可以像下面这样构造转存请求的 url
。
def transfer(self,share_id,uk,filelist_str,path_t_save):# 需要填写的参数,分别对应上图的shareid、from、filelist 和 path
# 通用参数
ondup = "newcopy"
async = "1"
channel = "chunlei"
clienttype = "0"
web = "1"
app_id = "250528"
logid = "你的logid"
url_trans = "https://pan.baidu.com/share/transfer?shareid=%s" \
"&from=%s" \
"&ondup=%s" \
"&async=%s" \
"&bdstoken=%s" \
"&channel=%s" \
"&clienttype=%s" \
"&web=%s" \
"&app_id=%s" \
"&logid=%s" % (share_id, uk, ondup, async, self.bdstoken, channel, clienttype, web, app_id, logid)
form_data = {
'filelist': filelist_str,
'path': path_t_save,
}
proxies = {
'http': self.pro.get_ip(0, 30, u'国内')}# 为了应对反爬虫机制,这里用了代理,稍后做解释
response = requests.post(url_trans, data=form_data,