某天,想下载某人的相册,发现一张一张下载,工作量巨大,所以写了这个工具。
使用到的工具
- Fiddler(抓包工具)
- python(脚本语言)
- intellij
步骤
分析包
- 获取相册分类链接信息
打开某人空间 - 打开fiddler抓取 - 访问相册
打开fiddler,搜索相册名称 ‘侄子’
获取相册链接,将其拖到右边的composer
拷贝链接地址和cookie信息
- 获取相册里面照片的信息
同上面的步骤,打开某个相册,在fiddler里面搜索某张照片的名称
获取相册列表信息链接
编程
贴出主要代码
# coding=utf-8
import os, threading
from Queue import Queue
from py2.http_utils import Http
from py2 import soup, cookie_utils, json_utils, regex_utils, DOWNLOAD_PATH
photo_url = 'http://h5.qzone.qq.com/proxy/domain/alist.photo.qq.com/fcgi-bin/fcg_list_album_v3?g_tk=1210057952&callback=shine0_Callback&t=419513462&hostUin=773817625&uin=77086540&appid=4&inCharset=utf-8&outCharset=utf-8&source=qzone&plat=qzone&format=jsonp¬ice=0&filter=1&handset=4&pageNumModeSort=40&pageNumModeClass=15&needUserInfo=1&idcNum=0&callbackFun=shine0&_=1484721771570'
detail_url = 'http://h5.qzone.qq.com/proxy/domain/shplist.photo.qzone.qq.com/fcgi-bin/cgi_list_photo?g_tk=1210057952&callback=shine3_Callback&t=160656776&mode=0&idcNum=0&hostUin=773817625&topicId=5ceb20e9-d727-4285-b177-dc91df68e67b&noTopic=0&uin=77086540&pageStart=0&pageNum=30&skipCmtCount=0&singleurl=1&batchId=¬ice=0&appid=4&inCharset=utf-8&outCharset=utf-8&source=qzone&plat=qzone&outstyle=json&format=jsonp&json_esc=1&question=&answer=&callbackFun=shine3&_=1484721812872'
cookie1 = " pac_uid=1_77086540; tvfe_boss_uuid=2c4e1161f404d6b1; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=3; pgv_pvid=9548679930; o_cookie=77086540; __Q_w_s__QZN_TodoMsgCnt=1; __Q_w_s_hat_seed=1; RK=mBGHAsurXZ; randomSeed=23363; qq_photo_key=71b85dd259bd647f18a963405c43e803; ptisp=ctc; ptcz=eae4b39cd8587e96c54d1585575c875c51beb348f479e89c599533f6576cde1e; pt2gguin=o0077086540; uin=o0077086540; skey=@D4MK2Tg8t; p_uin=o0077086540; p_skey=wqJMnZAj7nEKuDrTMmATE7Cd0vBccQ*KloG*3aWgtF8_; pt4_token=VjVJc1wZjNTzVlXNOzKdDTXd*BdE2v7BEqs3ymF5G6E_; rv2=8066000527FC1F71AD31043B7CE2B89E62CC79CD9D7FEF3E87; property20=C112B65F9A5C0A4A00E4FE7DCC637E839780CB4B4072589CF28B5A90AD807919FE353ECC066D4A54; pgv_info=ssid=s7926413392; qzspeedup=sdch"
download_path = os.path.join(DOWNLOAD_PATH, 'csy')
topicId = regex_utils.find(r'topicId=(.*?)&', detail_url)
detail_url = detail_url.replace("&pageNum=30&", "&pageNum=500&")
http = Http()
cookie2 = cookie_utils.parse_fiddler_str_cookie(cookie1)
http.set_cookie(cookie2)
def getAlbumListModeSort():
html1 = http.get(photo_url)
if html1:
t1 = html1[html1.find("(") + 1:html1.rfind(")")]
j1 = json_utils.loads(t1)
albumList = []
if 'albumListModeSort' in j1['data']:
albumList = j1['data']['albumListModeSort']
elif 'albumList' in j1['data']:
albumList = j1['data']['albumList']
elif 'albumListModeClass' in j1['data']:
for k in j1['data']['albumListModeClass']:
if 'albumList' in k and k['albumList'] is not None:
albumList.extend(k['albumList'])
for p in albumList:
print p['name']
print p['id']
print p['priv']
question = p['question'] if 'question' in p else None
print question
if question is None:
getDetail(p['name'], p['id'])
pass
print '---------------------------'
downloadQueue = Queue()
downLoadIsStart = False
def getDetail(name, id):
print 'get photo: %s, %s' % (name, id)
detail_url1 = detail_url.replace(topicId, id)
html1 = http.get(detail_url1)
path1 = os.path.join(download_path, name)
if html1:
t1 = html1[html1.find("(") + 1:html1.rfind(")")]
j1 = json_utils.loads(t1)
if j1 is None:
j1 = json_utils.loads(t1.decode("gbk", "ignore"))
photoList = []
if 'photoList' in j1['data']:
photoList = j1['data']['photoList']
elif 'rangeList' in j1['data']:
if j1['data']['rangeList'] is not None:
for k in j1['data']['rangeList']:
if 'photoList' in k and k['photoList'] is not None:
photoList.extend(k['photoList'])
if photoList is not None and len(photoList) > 0:
for p in photoList:
print p['url']
# http.download_file(p['url'], path=path1, file_name=p['name'])
downloadQueue.put((p['url'], path1, str(p['modifytime']) + "_" + p['name']))
downloadFile()
def downloadFile():
global downLoadIsStart
if not downLoadIsStart:
downLoadIsStart = True
all_thread = []
for i in range(5):
all_thread.append(threading.Thread(target=downloadFileThread))
for t in all_thread:
t.start()
print 'start....'
def downloadFileThread():
try:
val = downloadQueue.get(block=True, timeout=5)
while val is not None:
try:
http.download_file(val[0], path=val[1], file_name=val[2])
except:
pass
val = downloadQueue.get(block=True, timeout=5)
except:
pass
if __name__ == "__main__":
getAlbumListModeSort()
# getDetail(u'叶落而知秋', u'V13N7D3U4c7iMA')