Python模拟登陆新版知乎
时间:2022-07-24
本文章向大家介绍Python模拟登陆新版知乎,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目前网上很多模拟登录知乎的代码已经无法使用,即使是二、三月的代码也已经无法模拟登陆知乎,所以我现在将新版知乎的模拟登录代码和讲解发布出来。
零、开发环境
- 开发工具:Pycharm
- Python版本:3.6
- 运行环境:Win10
一、代码和讲解
# 利用requests 模拟登陆
import requests
import http.cookiejar as cookielib
import re
import time
import hmac
from hashlib import sha1
import json
import base64
from PIL import Image
# 利用session保持链接
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename="cookies.txt") # cookie存储文件,
# 提取保存的cookie
try:
session.cookies.load(ignore_discard=True) # 从文件中读取cookie
except:
print("cookie 未能加载")
# 伪造header
agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
header = {
"HOST": "www.zhihu.com",
"Referer": "https://www.zhihu.com",
"User-Agent": agent,
'Connection': 'keep-alive'
}
def is_login():
# 通过个人中心页面返回状态码来判断是否登录
# 通过allow_redirects 设置为不获取重定向后的页面
response = session.get("https://www.zhihu.com/inbox", headers=header, allow_redirects=False)
if response.status_code != 200:
zhihu_login("+8618511693445", "123*asd")
else:
print("你已经登陆了")
def get_xsrf_dc0():
# 获取xsrf code和d_c0
# 在请求登录页面的时候页面会将xsrf code 和d_c0加入到cookie中返回给客户端
response = session.get("https://www.zhihu.com/signup", headers=header)
return response.cookies["_xsrf"], response.cookies["d_c0"]
def get_signature(time_str):
# 生成signature,利用hmac加密
# 根据分析之后的js,可发现里面有一段是进行hmac加密的
# 分析执行加密的js 代码,可得出加密的字段,利用python 进行hmac几码
h = hmac.new(key='d1b964811afb40118a12068ff74a12f4'.encode('utf-8'), digestmod=sha1)
grant_type = 'password'
client_id = 'c3cef7c66a1843f8b3a9e6a1e3160e20'
source = 'com.zhihu.web'
now = time_str
h.update((grant_type + client_id + source + now).encode('utf-8'))
return h.hexdigest()
def get_identifying_code(headers):
# 判断页面是否需要填写验证码
# 如果需要填写则弹出验证码,进行手动填写
# 请求验证码的url 后的参数lang=en,意思是取得英文验证码
# 原因是知乎的验证码分为中文和英文两种
# 中文验证码是通过选择倒置的汉字验证的,破解起来相对来说比较困难,
# 英文的验证码则是输入验证码内容即可,破解起来相对简单,因此使用英文验证码
response = session.get('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', headers=headers)
# 盘但是否存在验证码
r = re.findall('"show_captcha":(w+)', response.text)
if r[0] == 'false':
return ''
else:
response = session.put('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', headers=header)
show_captcha = json.loads(response.text)['img_base64']
with open('captcha.jpg', 'wb') as f:
f.write(base64.b64decode(show_captcha))
im = Image.open('captcha.jpg')
im.show()
im.close()
captcha = input('输入验证码:')
session.post('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', headers=header,
data={"input_text": captcha})
return captcha
def zhihu_login(account, password):
'''知乎登陆'''
post_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'
XXsrftoken, XUDID = get_xsrf_dc0()
header.update({
"authorization": "oauth c3cef7c66a1843f8b3a9e6a1e3160e20", # 固定值
"X-Xsrftoken": XXsrftoken,
})
time_str = str(int((time.time() * 1000)))
# 直接写在引号内的值为固定值,
# 只要知乎不改版反爬虫措施,这些值都不湖边
post_data = {
"client_id": "c3cef7c66a1843f8b3a9e6a1e3160e20",
"grant_type": "password",
"timestamp": time_str,
"source": "com.zhihu.web",
"password": password,
"username": account,
"captcha": "",
"lang": "en",
"ref_source": "homepage",
"utm_source": "",
"signature": get_signature(time_str),
'captcha': get_identifying_code(header)
}
response = session.post(post_url, data=post_data, headers=header, cookies=session.cookies)
if response.status_code == 201:
# 保存cookie,下次直接读取保存的cookie,不用再次登录
session.cookies.save()
else:
print("登录失败")
if __name__ == '__main__':
is_login()
- Android Studio详细安装流程和配置、主题
- html5 jqueryrotate插件实现旋转动画
- 为什么要使用String
- Android网络编程(十一)源码解析Retrofit
- android Material Design详解
- android EventBus详解(三)
- Android绘制优化(一)绘制性能分析
- android EventBus详解(二)
- [置顶] android EventBus详解(一)
- 开源组件photoView学习
- ViewPagerIndicator+viewpager指示器详解
- 实现去哪儿来回机票选择的view
- 解决水平ListView在ScrollView中出现的滑动冲突
- Android逆向分析(2) APK的打包与安装背后的故事
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AndroidStudio3.6的卸载安装,Gradle持续下载/Gradle Build失败等问题
- 搭建DNSmasq简单教程带WEB管理面板
- Android Studio报错unable to access android sdk add-on list解决方案
- 自建的纯净dns服务拦截部分广告,南方推荐
- Nginx安装lua-nginx-module模块
- IPinfo 多接口IP查询工具源码
- 教你CentOS7下如何更换内核安装BBR加速
- we-extract解析和采集微信公众号文章的账号及内容必备工具
- android九宫格可分页加载控件使用详解
- WordPress用插件实现MarkDown语法支持
- Android中实现长按照片弹出右键菜单功能的实例代码
- Android Studio无法执行Java类的main方法问题及解决方法
- PlayTube优秀的视频CMS系统/支持本地和youtube导入
- Android Studio 中运行 groovy 程序的方法图文详解
- android studio按钮监听的5种方法实例详解