新版知乎登录request登录

运行脚本前提

pip3 install requests

更换用户名,密码,直接运行即可,运行时可能需要输入验证码,验证位于当前目录下。

具体代码,及关键步骤注释如下:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# @Time    : 2018/4/16 15:06
# @Author  : ysj
import time
import requests
import base64
import json
from hashlib import sha1
import hmac
import os
import uuid
# from PIL import Image
# from multiprocessing import Process
try:import cookielib
except Exception as e:import http.cookiejar as cookielib
# 忽略 urllib3报错
requests.packages.urllib3.disable_warnings()def check_login(session):"""传入session对象, 使用地址判断是否登录"""# 不允许跳转,不然总是为200res = session.get('https://www.zhihu.com/settings/profile', verify=False, allow_redirects=False)code = res.status_codeif code < 300:print('已登录成功')return Trueelse:print('未登录或登录失败')return Falsedef ensure_bytes(value):"""字节确保,方便后续加密签名"""return value if isinstance(value, bytes) else value.encode('utf-8')def get_signature(**kwargs):"""登录签名,先加载默认字符串"""hm = hmac.new(b'd1b964811afb40118a12068ff74a12f4', None, sha1)try:hm.update(ensure_bytes(kwargs['grant_type']))hm.update(ensure_bytes(kwargs['client_id']))hm.update(ensure_bytes(kwargs['source']))hm.update(ensure_bytes(kwargs['timestamp']))except KeyError as ex:print('缺少参数', ex)return hm.hexdigest()def sign_in(session, post_data):"""实际登录api"""headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0','HOST': 'www.zhihu.com', 'Referer': 'https://www.zhihu.com/signin?next=%2F','Authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20'}post_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'# response = session.post(post_url, data=post_data, verify=False)response = session.post(post_url, data=post_data, headers=headers, verify=False)if check_login(session):session.cookies.save(ignore_expires=True, ignore_discard=True)return Truedef log_in(username, password, session, post_data):# 先请求验证码地址,看是否需要验证码check_count = 0post_data['signature'] = get_signature(**post_data)post_data['username'] = usernamepost_data['password'] = passworddef check_captcha():nonlocal check_countresponse = session.get('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', verify=False)show_captcha = response.json()['show_captcha']if not show_captcha:return sign_in(session, post_data)else:# 有验证吗,重新请求获取验证码response = session.put('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', verify=False)img = json.loads(response.content)['img_base64']img = img.encode('utf-8')img_data = base64.b64decode(img)filename = str(uuid.uuid4()) + 'tpm.gif'with open(filename, 'wb') as f:f.write(img_data)# 多进程显示图片异常,暂时舍弃该功能# im = Image.open(filename)# sub = Process(target=im.show)# sub.start()# im.show()captcha = input('请输入上述图片%s,的验证码:' % filename)# sub.terminate()# im.close()os.remove(filename)data = {'input_text': captcha}post_data['captcha'] = captcharesponse = session.post('https://www.zhihu.com/api/v3/oauth/captcha?lang=en', data=data, verify=False)try:result = response.json()except Exception as ex2:print('验证码的post请求响应失败,原因:{}'.format(ex2))""" 验证码失败,则再递归3次重新获取验证码"""check_count += 1if check_count < 4:check_captcha()else:if result.get('success'):return sign_in(session, post_data)else:print(result)""" 验证码失败,则再递归3次重新获取验证码"""check_count += 1if check_count < 4:check_captcha()return check_captcha()def main(username, password):"""登录封装, 登录成功,返回session,失败则为None"""headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36','HOST': 'www.zhihu.com','Referer': 'https://www.zhihu.com/','Authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20'}post_data = {'client_id': 'c3cef7c66a1843f8b3a9e6a1e3160e20','grant_type': 'password','timestamp': str(int(time.time())),'source': 'com.zhihu.web','signature': None,'username': None,'password': None,'captcha': None,'lang': 'en','ref_source': 'homepage','utm_source': ''}# 使用session 登录session = requests.Session()session.headers = headerssession.cookies = cookielib.LWPCookieJar(filename='zhihu_cookie.txt')try:session.cookies.load(ignore_discard=True, ignore_expires=True)print('cookie信息加载成功')except FileNotFoundError as e:print("cookie信息加载失败", e)if log_in(username, password, session, post_data):return sessionelse:# 加载cookie成功,则判断cookie是否有效if check_login(session):return sessionelse:print('cookie 已失效,即将重新登录')if log_in(username, password, session, post_data):return sessionif __name__ == '__main__':s = main('18516157608', '******')# 请求用户信息,正常即说明登录成功,和check_login 异曲同工print(s.get('https://www.zhihu.com/inbox').status_code)# 未登录的为302print(requests.get('https://www.zhihu.com/inbox',headers=s.headers, allow_redirects=False).status_code)

新版知乎登录request登录(1)(函数式编程)相关推荐

  1. 新版知乎登录request登录(2)(类编程)

    接上一篇,用类重构了代码,方法是一致的,但是看起来更整洁些. 不多说了,上代码: #! /usr/local/bin python3.6 """ @Time : 2018 ...

  2. 新版知乎登录之post请求

    前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...

  3. Request和Response-学习笔记02【请求转发和request共享数据、Request_获取ServletContext、request登录案例】

    Java后端 学习路线 笔记汇总表[黑马程序员] Request和Response-学习笔记01[Request_原理和继承体系.Request_获取请求数据][day01] Request和Resp ...

  4. 新版正方教务网模拟登录python实现

    新版正方教务网模拟登录 前言 正好大学期末考完,分析一下正方教务网登录,实现模拟登录就可以自己实现抢课和查询成绩等常规操作了 申明 本文以我学校的正方教务网为例,关键信息已打码,理论上适用于所有新版正 ...

  5. 新版傻妞升级之后 登录 查询无反应

    新版傻妞升级之后 登录 查询无反应 原因是版本过新 芝士不支持 芝士近期可能会完善 本人存档了支持芝士的amd arm最新版本 直接覆盖root/sillyGirl目录下的sillyGirl即可 如有 ...

  6. spring security默认登录页面登录用户,和自定义数据源

    一.默认登录页面 请求 /hello 接口,在引入 spring security 之后会先经过一些列过滤器 在请求到达 FilterSecurityInterceptor时,发现请求并未认证.请求拦 ...

  7. 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片

    玩具需求分析 1.语音实时通讯 - 让玩具成为孩子与父母之间沟通的桥梁 分支 建立幼儿社交圈2.积极正面幼教内容 - 让玩具能够播放 父母选定的儿歌,故事,百科,英语- 通过语音识别内容名称 玩具可以 ...

  8. python登录跳转_Python模拟登录和登录跳转的参考示例

    # coding:utf-8 import urllib import urllib2 import cookielib from bs4 import BeautifulSoup # 设置登录url ...

  9. webform窗体怎么实现session唯一标识_微信小程序用户登录和登录态维护的实现_javascript技巧...

    这篇文章主要介绍了微信小程序用户登录和登录态维护的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 让用户登录,标识用户和获取 ...

最新文章

  1. dlp防泄密系统卸载_浙江好用的企业图纸防泄密软件推荐,局域网内部图纸透明加密方案...
  2. 解决IDEA自动重置LanguageLevel和JavaCompiler版本的问题
  3. SM37 job状态意义
  4. Django从理论到实战(part37)--关于迁移
  5. java当中递归打印目录树
  6. 决策树之 GBDT 算法 - 回归部分
  7. DotNet微信公众号简介
  8. php 怎么查看文件类型信息,php获取文件类型和文件信息的方法
  9. STM32的AD通道干扰问题
  10. 散粉在哪个步骤用_如何正确的使用散粉
  11. codejock toolkit pro 源码零售版
  12. 数值计算之第四期:追赶法和范数
  13. Pandas(九)--数据采样
  14. python转txt到xml并编译为exe
  15. 兜儿.生活(三)之《太阳照常升起》杜兜儿版
  16. 周其仁:到以色列游学,让我深受刺激!
  17. 搭建微信小程序转码机器人教程
  18. Telnet 服务 开启 步骤
  19. 运维与Python之间有着怎样的联系?
  20. Python编程100例--身份证号码的校验码

热门文章

  1. 基于K近邻法的手写数字图像识别
  2. 一篇非常不错的管理文章,看完通篇确有启发
  3. 数字IC设计和CS选那个?
  4. 【与达梦同行】达梦数据库SQL去掉sort
  5. 微软模式转型,遭遇严重挫折
  6. 且说府尹陈文昭听得 水浒
  7. IDEA官网打不开,详细解决方法(有图解)
  8. 韩媒表示Do Kwon疑每月通过LUNA2.0获310万美元质押收益
  9. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)
  10. 我是如何一步步远离开发的