1. 程式人生 > >新版知乎登入request登入(2)(類程式設計)

新版知乎登入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 - 41152-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

Spring22.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射頻物理層

順序棧實現將十進位制整數轉換為r2、8、16進位制數

參考程式碼1: /順序棧結構利用陣列實現—引數由指標傳遞/ #include<stdlib.h> #include<stdio.h> #include<stddef.h> #define MAXSIZE 50 typedef char ElemTyp

為什麼HashMap的初始容量一定要設定為162的整數次冪

HaspMap的資料結構是陣列加單鏈表,把初始容量設定為2的冪有助於HashMap中的元素存放地更均勻,降低了hash碰撞的概率,提高了查詢的效率和空間利用率。 最理想的情況是Entry陣列中每一個位置都只存放一個元素,這樣在查詢的時候不用去遍歷連結串列,這時候空間利用率最大,時間複雜度

GreenDao 2.1.0 反射機制 初步使用

GreenDao (2.1.0 反射機制) 初步使用 參考文件: 史上最高效的ORM方案——GreenDao3.0詳解 GreenDao的簡單使用說明(二)單表的增,刪,改,查 GreenDao 別人總結匯總 greenDAO講義(二):資料庫查詢篇 G

2689 Prime Distance2次用篩法

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