新版知乎登入request登入(2)(類程式設計)
接上一篇,用類重構了程式碼,方法是一致的,但是看起來更整潔些。
不多說了,上程式碼:
#! /usr/local/bin python3.6
"""
@Time : 2018/4/17 20:00
@Author : ysj
@Site :
@File : ZhiHuLogIn.py
@Software: PyCharm
"""
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
import http.cookiejar as cookielib
# 忽略 InsecureRequestWarning報錯; verify=True 即可
# requests.packages.urllib3.disable_warnings()
class ZhiHu:
"""
知乎登入類,例項化後,self.session即相當於登入客戶端requests.session
"""
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'}
login_url = 'https://www.zhihu.com/api/v3/oauth/sign_in'
captcha_url = 'https://www.zhihu.com/api/v3/oauth/captcha?lang=en'
check_url = 'https://www.zhihu.com/inbox'
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': ''
}
"""
測試資料,固定簽名,無需簽名
post_data = {
'client_id': 'c3cef7c66a1843f8b3a9e6a1e3160e20',
'grant_type': 'password',
'timestamp': '1515398025518',
'source': 'com.zhihu.web',
'signature': '30b129980d00e5efb09f16b0334bf4e8601b060b',
'username': 1,
'password': 2,
'captcha': 3,
'lang': 'en',
'ref_source': 'homepage',
'utm_source': ''
}
"""
def __init__(self, account, password, cookie_file='zhihu_cookie.txt'):
self.session = requests.session()
self.session.headers = self.headers
self.cookie_file = cookie_file
self.session.cookies = cookielib.LWPCookieJar(filename=self.cookie_file)
self.username = account
self.password = password
self.check_count = 0
try:
self.session.cookies.load(ignore_discard=True, ignore_expires=True)
print('cookie資訊載入成功')
except FileNotFoundError:
print("cookie資訊載入失敗")
self.login()
else:
if not self.check_login():
print('cookie登入失敗,即將重新登入')
self.login()
# self.check_login()
def login(self):
"""整個登入過程"""
self.check_count = 0
self.post_data['username'] = self.username
self.post_data['password'] = self.password
self.post_data['captcha'] = self.check_captcha()
self.post_data['signature'] = self.get_signature()
self.sign_in()
def check_login(self):
"""傳入session物件, 使用地址判斷是否登入"""
# 不允許跳轉,不然總是為200
res = self.session.get(self.check_url, verify=True, allow_redirects=False)
code = res.status_code
if code < 300:
print('已登入成功')
return True
else:
print('未登入或登入失敗')
return False
def sign_in(self):
"""實際登入api"""
response = self.session.post(self.login_url, data=self.post_data, verify=True)
if self.check_login():
self.session.cookies.save(ignore_expires=True, ignore_discard=True)
return True
else:
print(response.json())
def check_captcha(self):
response = self.session.get(self.captcha_url, verify=True)
show_captcha = response.json()['show_captcha']
if not show_captcha:
return None
else:
# 有驗證嗎,重新請求獲取驗證碼
response = self.session.put(self.captcha_url, verify=True)
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}
response = self.session.post(self.captcha_url, data=data, verify=True)
try:
result = response.json()
except Exception as ex2:
print('驗證碼的post請求響應失敗,原因:{}'.format(ex2))
""" 驗證碼失敗,則再遞迴3次重新獲取驗證碼"""
self.check_count += 1
if self.check_count < 4:
self.check_captcha()
else:
if result.get('success'):
return captcha
else:
print(result)
""" 驗證碼失敗,則再遞迴3次重新獲取驗證碼"""
self.check_count += 1
if self.check_count < 4:
self.check_captcha()
def get_signature(self):
"""知乎登入簽名,先載入預設字串
實測比較死板,固定拿任意個對應的時間戳和signature 直接載入到請求引數即可跳過簽名步驟
"""
def ensure_bytes(value):
"""位元組確保,方便後續加密簽名"""
return value if isinstance(value, bytes) else value.encode('utf-8')
hm = hmac.new(b'd1b964811afb40118a12068ff74a12f4', None, sha1)
try:
kwargs = self.post_data
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)
else:
return hm.hexdigest()
if __name__ == '__main__':
login = ZhiHu('18516157608', '*****')
print(login.session.get(login.check_url, allow_redirects=False).status_code)
# 未登入的為302
print(requests.get('https://www.zhihu.com/inbox', headers=ZhiHu.headers, allow_redirects=False).status_code)
相關推薦
新版知乎登入request登入(2)(類程式設計)
接上一篇,用類重構了程式碼,方法是一致的,但是看起來更整潔些。 不多說了,上程式碼: #! /usr/local/bin python3.6 """ @Time : 2018/4/17 20:00 @Author : ysj @Site :
python 模擬知乎登錄,包含驗證碼(轉)
mozilla log 5.0 color att pos head one 成功 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ‘‘‘ Required - requests (必須) - pillow (可選) Info
基於pyppeteer實現最新版知乎模擬登陸
現在還在爬知乎的同學,想必已經被知乎這個登陸搞得頭大了吧,哈哈哈哈哈!!用selenium吧,不行,會被檢測出來,用requests構造表單吧,提交的加密引數複雜,而且還不給出那些引數名,知乎的攻城獅為了反爬,很牛B好吧!!!我還試過用selenium結合mit
kaggle窺屏(知乎說入門需要獨立完成101和playground比賽)
1.titanic 主要是設計pd的資料處理,使用的是最簡單的regression模型,不太明白怎麼本地跑程式碼。 2.digital recognizer 3.我去,原來101說的是playground。 4.房價預測, 可以使用RandomForestRegressor和De
如何進入阿里巴巴,如何學好Java(轉自:知乎話題“在阿里巴巴工作是怎樣一番體驗”)
BAT是當今網際網路行業的三駕馬車,能進入其中工作,估計是絕大部分志在網際網路行業學生的願望。在知乎看到一位社招大哥深入剖析了一下阿里Java面試的各個環節以及不同階段Java學習的要求,洋洋灑灑一萬多字。讀完之後深受啟發,特地整理了一下,轉載成部落格,希
知乎上關於ReactNative的評論彙總(網友們有才喲...)
React native充分利用了Facebook的現有輪子,是一個很優秀的整合作品,並且我相信這個團隊對前端的瞭解很深刻,否則不可能讓Native code「退居二線」。 對應到前端開發,整個系統結構是這樣: JSX vs HTML CSS-layout
爬取知乎熱榜標題和連接 (python,requests,xpath)
app 分享圖片 dea -a mar margin 瀏覽器 判斷 agen 用python爬取知乎的熱榜,獲取標題和鏈接。 環境和方法:ubantu16.04、python3、requests、xpath 1.用瀏覽器打開知乎,並登錄 2.獲取cookie
Python模擬登陸新版知乎
目前網上很多模擬登入知乎的程式碼已經無法使用,即使是二、三月的程式碼也已經無法模擬登陸知乎,所以我現在將新版知乎的模擬登入程式碼和講解發布出來。 零、開發環境 開發工具:Pycharm Python版本:3.6 執行環境:Win10 一、程式碼
第六章 面向對象的程序設計 (2 創建對象)
屬性設置 真的 兩個 實例方法 應用 最大 訪問 技術分享 全局 6.2 創建對象 6.2.1 工廠模式 工廠模式是軟件工程領域一種廣為人知的設計模式,這種模式抽象了創建具體對象的過程。考慮到在ECMAScript 中無法創建類,開發人員就發明了一種函數,用函數來封裝以特定
CP2044-深入Java Web項目實戰精講(2套實戰項目)
整體 各級 現實 *** 效率 復雜 網站 依賴關系 決策 隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉到程序開發的,有沒有一些基礎性的資料給我們學習學習呢,你的框架感覺一下太大了,希望有個循序漸進的教程或者視頻來學習就好了。對於學習有困難不知道如
Eliminate the Conflict HDU - 4115(2-sat 建圖 hhh)
ems clock memset void cloc define str mat sin 題意: 石頭剪刀布 分別為1、2、3,有n輪,給出了小A這n輪出什麽,然後m行,每行三個數a b k,如果k為0 表示小B必須在第a輪和第b輪的策略一樣,如果k為1 表示小B在第
JDBC增刪改查方法小記(2個表相關聯)
第一個類引用http://blog.csdn.net/bhq2010/article/details/7478659 SingletonConn類: import java.sql.Connection; import java.sql.DriverManager; import jav
Spring(2)之 (2.1 Spring AOP 開發)
在Spring AOP程式設計中: 如果加入容器中的目標物件有實現介面,用 JDK代理; 如果目標物件沒有實現介面,用 Cglib代理; 手動實現 AOP程式設計: AOP面向切面程式設計: AOP業務程式碼與關注點程式碼分離; 關注點: 重複的程式碼(方法)叫關注點; 切面:
躺雨沒的學習筆記(4)——藍芽系統架構 (2.0 核心系統架構)
Agenda: 2.0 核心系統架構 (181頁)藍芽核心系統包括一個主機,一個主要控制器和零到多個次要控制器。 2.0.1 藍芽BR/EDR最小系統 藍芽BR/EDR最小核心系統包括: 控制器中四個最底層,BR/EDR射頻物理層
順序棧實現將十進位制整數轉換為r(2、8、16)進位制數
參考程式碼1: /順序棧結構利用陣列實現—引數由指標傳遞/ #include<stdlib.h> #include<stdio.h> #include<stddef.h> #define MAXSIZE 50 typedef char ElemTyp
為什麼HashMap的初始容量一定要設定為16(2的整數次冪)?
HaspMap的資料結構是陣列加單鏈表,把初始容量設定為2的冪有助於HashMap中的元素存放地更均勻,降低了hash碰撞的概率,提高了查詢的效率和空間利用率。 最理想的情況是Entry陣列中每一個位置都只存放一個元素,這樣在查詢的時候不用去遍歷連結串列,這時候空間利用率最大,時間複雜度
GreenDao (2.1.0 反射機制) 初步使用
GreenDao (2.1.0 反射機制) 初步使用 參考文件: 史上最高效的ORM方案——GreenDao3.0詳解 GreenDao的簡單使用說明(二)單表的增,刪,改,查 GreenDao 別人總結匯總 greenDAO講義(二):資料庫查詢篇 G
2689 Prime Distance(2次用篩法)
The branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for
dubbo起步搭建Spring+SpringMVC+dubbo的開發環境(2,provider工程構建)
緊接上一期,構建provider工程 工程目錄如下圖: TestDubbo介面程式碼如下: package dp.dubbo.service; public interface TestDubbo { public String getStr(); } 介面的實現T
zookeeper 伺服器安裝(2,叢集zookeeper安裝)
在conf目錄下的zoo.cfg檔案中修改叢集配置 tickTime=2000 initLimit=10 syncLimit=5 dataDir=D:/dubbo/zookeeper/data clientPort=2181 server.30=172.17.0.30:28