步骤

1、分析qzone请求

2、分析参数来源

3、仿照数据请求

上次写的一个qzone登陆写的不详细这次决定写一个详细分析qzone js 获取好友列表

分析qzone请求

我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.com/mqzone/index 并且登陆

qzone_login_success.png

你可能会说你在逗我,这特么哪里来的好友列表

别急,好友列表肯定是有的不然你发表说说怎么@你的好友呢

说到@好友都明白了吧,我们的好友列表接口就从这里开始拦截接口请求。

先把打开我们发说说的那个框框,再把浏览器开启调试模式,清空网络请求拦截列表

qzone_network_requests.png

现在你应该在发说说的那个界面,点一下说说框下面的 @符号

qzone_send_message.png

盯住网络请求那一块,找一下那个像是获取好友列表的,发现一共就6个请求,我一眼就看到了mfriend_list 接口意思很直白啊

qzone_network_requests02.png

好友列表已经找到,接下来就是分析参数了,这个过程很痛苦

分析参数来源

首先点我刚刚说到的那一条请求记录 就是这样子的 我对自己的qq号打了码毕竟这个东西获取到可以直接用cookie登陆的

qzone_friend_list_details.png

这里可能有人会说,为什么不直接点击拦截列表上面有个可以定位js发出请求的位置,这样找分析请求参数不是更简单吗

这边呢我只能说我之前也找过,但是找不到,因为点击过去找到的是封装类的位置

这边参数呢不多 六个 需要分析的就两个

qzonetoken c2176b5d6f0deff03d0dd0f59f26e51c2b408aa83419d416c737cc1b21d1e913c861ca780ad34ff4293ca5640b69

g_tk:1760587213

res_uin:***

res_type:normal

format:json

timestamp 时间戳

我们现在看一下这个 qzonetoken 使用全局搜索找一下看是不是写在静态页面中的

qzone_search_qzonetoken_result.png

继续搜索 window.shine0callback

qzone_search_window.shine0callback_result.png

发现都是一个结果。。。。 后面我试着搜索一下html 里面 发现竟然真的有

qzone_search_html_result.png

window.shine0callback = 自执行函数

所以呢 qzonetoken 参数直接用 window.shine0callback 就好了

继续全局搜索 g_tk

qzone_search_g_tk_result.png

这边呢有三个方法获取token

1、userHelper.getPskeyToken()

2、userHelper.getToken()

3、user.getToken()

我们先在控制台执行一下这些方法

qzone_exec_console_out.png

发现 user 能执行也和请求的参数对上了,不过我还是想找一下 userHelper 这个东西

先把ajax.js 这个类给弄到本地来 搜索 userHelper

qzone_search_userHelper_result.png

既然写在里面的那copy到控制台就可以执行了

开始我把 userHelper copy进去发现少了一个getCookie,再把getCookie 也复制到控制台就好了

qzone_exec_console_userHelper.png

这样子执行就能获取到 token 了

res_uin qq号码,我在搜索静态html的时候无意间发现了可以从 FrontPage 对象中获取,当然也可以从 user 对象中获取

res_type 固定normal

format 固定json

timestamp 时间戳拿一下系统时间戳就好

现在参数都分析完毕,qzone 的接口分析还是蛮简单的,不像某宝网站的程序

仿照数据请求

请到我上一篇文章拿 qzone登陆 的源码 传送到源码

找到 paresHtml 函数 在这里先切换到默认窗口

def paresHtml(self):

self.driver.switch_to.default_content()

获取 qzonetoken 这边直接执行window.shine0callback 就能获取

qzonetoken = self.driver.execute_script('return window.shine0callback')

获取 g_tk 上面说到user里面可以直接获取,那我们就偷个懒使用 user.getToken()

g_tk = self.driver.execute_script('return user.getToken()')

获取 res_uin 直接从user 里面 getUin()

res_uin = self.driver.execute_script('return user.getUin()')

获取时间戳 由于python 中的time.time()是秒,需要乘个1000

import time

timestamp = time.time() * 1000

拼接url

list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \

'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (

qzonetoken, g_tk, res_uin, timestamp)

本身我想偷懒的直接用 self.driver.get() 直接执行的 后来想想还是算了,没有一点技术含量的东西怎么好意思写呢

最后决定使用js中的XMLHttpRequest 来模仿请求

self.driver.execute_script('window.xhr = new XMLHttpRequest;')

self.driver.execute_script('window.xhr.withCredentials=true;')

self.driver.execute_script(

'window.xhr.open(\'GET\',\'%s\',false)' % list)

self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')

self.driver.execute_script('window.xhr.send()')

print(self.driver.execute_script('return window.xhrsuccess'))

请求完成后的结果是这个样子的

qzone_xmlHttprequest_result.png

下面是请求返回的结果

{

"code":0,

"subcode":0,

"message":"",

"default":0,

"data":{

"gpnames":[//分组列表

{

"gpid":0,//分组id

"gpname":"agp"//分组名称

}

],

"list":[//好友列表

{

"groupid":0,//分组id

"isvip":1,//是否是vip 1 是 vip

"nick":"消费主张", //昵称

"remark":"消费主张",//备注

"searchField":"12315 消费主张 消费主张 xiaofeizhuzhang xfzz xiaofeizhuzhang xfzz",//关键字

"uin":12315,//qq号码

"viplevel":1 //qq等级

}

],

"mayknow":{

"allnum":0,

"list":null,

"page":1

},

"speciallist":null

}

}

最后发一下模仿请求的源码 结合我上一篇文章的源码可以直接执行出结果

import time

def paresHtml(self):

# 切换到默认窗口

self.driver.switch_to.default_content()

# 请求状态

shine0callback = self.driver.execute_script('return window.shine0callback')

# 一定要暂停一下不然 执行user的时候拿不到,因为懒加载

time.sleep(1)

g_tk = self.driver.execute_script('return window.user.getToken()')

uin = self.driver.execute_script('return window.user.getUin()')

timestamp = time.time() * 1000

list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \

'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (

shine0callback, g_tk, uin, timestamp)

# self.load_cookies()

# self.driver.get(list)

self.driver.execute_script('window.xhr = new XMLHttpRequest;')

self.driver.execute_script(

'window.xhr.open(\'GET\',\'%s\',false)' % list)

self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')

self.driver.execute_script('window.xhr.send()')

print(self.driver.execute_script('return window.xhrsuccess'))

总结

1、qzone 里面的接口参数都差不多,总归来讲都能搜索出来

2、qzone 压缩了js提高了分析的难度

3、好友列表模拟请求时记得把cookie带过去否则t不认

4、有时候登陆会登不上,拿到的好友列表数据是请先登录,删掉cookie重试即便就好

qq好友列表html页面,动态爬虫之QQ好友列表相关推荐

  1. qq好友列表获取之动态爬虫清洗爬取好友列表数据 - 获取qq好友、群、群成员列表

    qq好友列表获取之动态爬虫清洗爬取qq好友列表数据 - 获取qq好友ip.群.群成员列表.我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.c ...

  2. 视频列表html页面,vue + video.js实现视频列表页(多个视频)

    vue + video.js实现视频列表页 vue项目中做一个视频列表页,本来用原生video标签来实现,由于考虑到手机浏览器兼容问题,找了很多插件,最后决定用video.js这个插件来实现.Vide ...

  3. python爬虫qq好友信息,GitHub - equationl/QQzone_crawler: QQ 空间动态爬虫,利用cookie登录获取所有可访问好友空间的动态保存到本地...

    关于 Edit by equationl 优先在 码云 上更新 该项目修改自 xjr7670 的 QQzone_crawler 原作者说明: QQ空间动态爬虫 修改了什么? 爬取完整的评论列表 爬取点 ...

  4. python爬qq空间_QQ空间动态爬虫

    先说明几件事:题目的意思是,用于获取"QQ空间动态"的爬虫,而不是"针对QQ空间"的"动态爬虫" 这里的QQ空间动态,特指"说说& ...

  5. python模拟登录qq获取好友信息_使用Python模拟登录QQ邮箱获取QQ好友列表

    最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表. 实现方式: 通过google一搜,实现的方式大 ...

  6. python爬取加密qq空间_使用python+selenium爬取qq空间好友动态

    使用python+selenium爬取qq空间好友动态 分析过程如下: 要想用selenium登陆qq空间,必须点击账号密码登陆按钮然后再填写账号密码登陆. 1.PNG 点击账号密码按钮后跳转到如下页 ...

  7. 获取qq号码性别 接口_用户诉QQ浏览器违法获取个人隐私!实测发现好友列表被自动提取...

    日前,QQ浏览器因违法收集用户微信以及QQ账号的头像.性别.生日.好友列表等个人隐私信息,被用户起诉至江西某法院.法院审理后裁定腾讯公司立即停止在QQ浏览器App中获取上述用户隐私信息的行为,并对双方 ...

  8. QQ登录回调地址实现:【获取qq好友列表数据】附实例

    QQ登录回调地址实现:[获取qq好友列表数据] <?php require_once("../../API/qqConnectAPI.php"); $qc = new QC( ...

  9. qq动态名片代码_利用Python动态爬取QQ说说并生成词云,分析朋友状况!

    今天我们要做的事情是使用动态爬虫来爬取QQ空间的说说,并把这些内容存在txt中,然后读取出来生成云图,这样可以清晰的看出朋友的状况. 这是好友的QQ空间10年说说内容,基本有一个大致的印象了. 爬取动 ...

最新文章

  1. 模式设计概述:代理者模式
  2. matlab语言 列车平稳性指标,铁道车辆平稳性分析报告.docx
  3. [C++] Pure Virtual Function and Abstract Class
  4. 运算放大电路_电工CChap03 集成运算放大电路与应用
  5. 用 Python 处理 HTML 转义字符的5种方式
  6. 翻译: Web 3.0是一种几乎无需信任的承诺的协议/架构
  7. 按下键时蜂鸣器发出声音c语言,学习日记——蜂鸣器开关实例
  8. RFID让固定资产盘点更快更准
  9. 服务器问题网站拔毛,网站被百度拔毛的经验分析
  10. windows7与linux,Windows7与Linux——操作系统大PK
  11. 最新的CC2642R与CC2640、CC2640R2F有什么改进?
  12. Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)
  13. IOS开发系列—Objective-C之内存管理
  14. matlab测绘工程,测绘工程matlab论文.doc
  15. 分层和分段用什么符号_PPT中如何利用符号做出分层显示效果
  16. 小程序中监听input中的拼音是否已经输完
  17. Maxscale实现MySQL读写分离
  18. 1.2.1 案例-IP 拨号器
  19. 评测3款高颜值的azw3阅读器(ios手机适用)
  20. scratch教程——运算模块之章鱼哥随机出题

热门文章

  1. 工业相机和镜头的参数理解、选型、打光方案总结(附参考案例)
  2. 工业机器人入门z50的含义_工业机器人基础教程——快速入门学习
  3. OCI和CNI个人笔记
  4. Elasticsearch教程(二)java集成Elasticsearch
  5. JOS学习笔记(五)
  6. 计算机主机安装流程,电脑怎么安装打印机(详细步骤)
  7. Flat Panel X-ray Imaging[转载]
  8. Linux 之父:80486 处理器将成时代的眼泪!
  9. 深度学习利用回归算法进行数据预测
  10. 卡尔曼滤波的推导过程详解