知乎改版api接口之scrapy自动登陆
最近使用scrapy模拟登陆知乎,发现所有接口都发生变化了,包括验证码也发生了很大变化,通过抓包分析,记录下改版后的知乎模拟登陆,废话不多说,直接上代码,亲测有效
# -*- coding: utf-8 -*-
from PIL import Image
from scrapy.exceptions import CloseSpider
import scrapy
import json
import base64 class ZhihuSpider(scrapy.Spider):
name = 'zhihu'
allowed_domains = ['www.zhihu.com']
start_urls = ['http://www.zhihu.com/']
handle_httpstatus_list = [401, 403]
client_id = 'c3cef7c66a1843f8b3a9e6a1e3160e20' #固定不变
signature = 'b858d0c8b1f2e86c6cb0d93d4055963bcf1121ec' #抓包获取
timestamp = '1519567594106' #抓包获取
headers = {
"HOST": "www.zhihu.com",
"Referer": "https://www.zhihu.com/signup?next=%2F",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36Name",
"authorization": "oauth c3cef7c66a1843f8b3a9e6a1e3160e20",
} def parse(self, response):
pass def start_requests(self):
'''
获取登陆页面,set_cookie
:return:
'''
return [scrapy.Request(url='https://www.zhihu.com/signup?next=%2F',
headers=self.headers,
method="GET",
meta={'cookiejar':1},
callback=self.post_captchareq,
dont_filter=True,
)] def post_captchareq(self, response):
'''
发送获取验证码请求
:param response:
:return:
'''
return [scrapy.Request(
url='https://www.zhihu.com/api/v3/oauth/captcha?lang=en',
headers=self.headers,
meta={'cookiejar': response.meta['cookiejar']},
dont_filter=True,
callback=self.deal_captchareq,
)] def deal_captchareq(self, response):
'''
判断是否需要验证码
:param response:
:return:
'''
json_res = json.loads(response.text)
post_data = {
"client_id": self.client_id,
"grant_type":"password",
"timestamp": self.timestamp,
"source": "com.zhihu.web",
"signature": self.signature,
"username": '+86你的手机号码',
"password":'密码',
"captcha": '',
"lang":"en",
"ref_source":"homepage",
"utm_source":""
}
if json_res.get("show_captcha", None):
return [
scrapy.Request(
url='https://www.zhihu.com/api/v3/oauth/captcha?lang=en',
headers=self.headers,
method='PUT',
meta={'cookiejar': response.meta['cookiejar'],
'post_data':post_data},
callback=self.get_captchaimg
)
]
return [
scrapy.FormRequest(
url="https://www.zhihu.com/api/v3/oauth/sign_in",
formdata=post_data,
method="POST",
headers=self.headers,
meta={'cookiejar': response.meta['cookiejar']},
callback=self.check_login,
dont_filter=True,
)
] def get_captchaimg(self, response):
'''
获取验证码图片流数据,手动输入验证码
:param response:
:return:
'''
post_data = response.meta['post_data']
try:
json_img = json.loads(response.text)
bs64_img = json_img["img_base64"]
bs64_img = bs64_img.encode('utf-8')
img_steam = base64.b64decode(bs64_img)
with open("zhihucaptcha.jpg", 'wb') as f:
f.write(img_steam)
img = Image.open("zhihucaptcha.jpg")
img.show()
input_captcha = input("请输入图中验证码:").strip()
post_data['captcha'] = input_captcha
img.close()
post_code = {
"input_text":input_captcha,
}
return [
scrapy.FormRequest(
url="https://www.zhihu.com/api/v3/oauth/captcha?lang=en",
formdata=post_code,
headers=self.headers,
method='POST',
meta={'cookiejar': response.meta['cookiejar'],
'post_data':post_data},
callback=self.post_captcha,
dont_filter=True,
)
]
except Exception as e:
raise CloseSpider('获取验证码发生错误:{error}'.format(error=e)) def post_captcha(self, response):
'''
发送用户认证信息登陆
:param response:
:return:
'''
post_data = response.meta.get('post_data')
if json.loads(response.text).get('success'):
return [
scrapy.FormRequest(
url="https://www.zhihu.com/api/v3/oauth/sign_in",
formdata=post_data,
headers=self.headers,
method='POST',
meta={'cookiejar': response.meta['cookiejar']},
callback=self.check_login,
dont_filter=True,
)
]
else:
raise CloseSpider('验证码不正确') def check_login(self, response):
#验证是否登陆成功
print('==============>',response.text)
print(response.status)
if response.status == 201:
self.logger.info("登陆成功!")
else:
raise CloseSpider('登陆信息有误!')
其中,其它参数如client_id, oauth等都是固定的,signature与timestamp是随着时间戳变化的,它是用于验证合法用户的token,实质也是一段客户端的js运行生成的,这里为了方便,直接通过抓包获取某个固定时间戳对应的signature


先在pc端输入错误账户信息,抓包获取timestamp与signature,替换对应的即可
知乎改版api接口之scrapy自动登陆的更多相关文章
- 网页截图API接口,一键自动生成网页截图
背景 最近在开发一个小程序,其中有一个帮助模块,内容为帮助文章列表,文章内容为网站后台编辑的富文本格式.鉴于小程序的特殊性,其对html格式的富文本支持并不友好. 刚开始有人开发了wxparse插件, ...
- SpringBoot + Swagger2 自动生成API接口文档
spring-boot作为当前最为流行的Java web开发脚手架,相信越来越多的开发者会使用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端 ...
- 迅雷 API 接口说明文档 -调用迅雷自动下载
我们可以利用迅雷提供的开放API接口来自动下载文件.详细的接口说明大家可以看下面的. 先要说明一下的就是 迅雷的API接口是用 .com 来调用的 首先就是脚本了,各种语言写法不同,我这里提供用vbs ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--02--02CMDB将服务器基本信息提交到API接口
AutoCmdb # urls.py """AutoCmdb URL Configuration The `urlpatterns` list routes URLs t ...
- 常用精品API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...
- 常用API接口汇总
下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...
- 【转载】常用精品API接口汇总
原文链接戳这里~~ 下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送 ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是r ...
随机推荐
- rtrim() 函数 从字符串的末端开始删除空白字符!
例子 在本例中,我们将使用 rtrim() 函数从字符串右端删除字符: <?php $str = "Hello World!\n\n"; echo $str; echo rt ...
- 【Ansible】的python api
[Ansible API] Ansible本身就是由python写成,所有其对python形式的API的支持应该不错. 其API分不同的版本,这个版本也就是ansible本身的版本,可以通过ansib ...
- 大量删除MySQL中的数据
出现的背景: 公司做了一个redis相关的项目,其中mysql存储了很多统计数据.比如客户端上报的数据,redis实例的数据,应用的数据,机器的数据等.每天都在上报,采集,由于没有定期删除,数据大量累 ...
- Tomcat 7.0安装与配置
下载后解压缩到C盘,重命名为Tomcat-7.0.67,目录最好不要有空格: 以下为Tomcat 7的配置: 首先,右键计算机–>属性–>高级系统设置–>环境变量: 下载好压缩包后 ...
- [JS] Topic - variable and function hoisting
Ref: 深入理解js的变量提升和函数提升 一.变量提升 简直就是es5的遗毒! console.log(global); // undefined 竟然能打印?因为变量提升,下一行就有定义 var ...
- MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)
列转行:利用max(case when then) SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CAS ...
- iOS 判断App启动方式
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- Linux驱动技术(二) _访问I/O内存
ARM是对内存空间和IO空间统一编址的,所以,通过读写SFR来控制硬件也就变成了通过读写相应的SFR地址来控制硬件.这部分地址也被称为I/O内存.x86中对I/O地址和内存地址是分开编址的,这样的IO ...
- 试一下Markdown
Markdown 没想到博客园居然能够有markdown这样的写法了,以前觉得有自定义CSS已经非常不错了,现在居然加入Markdown,太值得称赞了.国内的博客系统,应该首屈一指了. 强调 你要走, ...
- 深度学习(TensorFlow)环境搭建:(一)硬件选购和主机组装
一.硬件采购 近年来,人工智能AI越来越多被人们所了解,尤其是AlphaGo的人机围棋大战之后,机器学习的热潮也随之高涨.最近,公司采购了几批设备,通过深度学习(TensorFlow)来研究金融行业相 ...