1. 程式人生 > >模擬登陸改版後的知乎(最新版)

模擬登陸改版後的知乎(最新版)

今天,想著看看視訊,把模擬登陸這一塊學習學習,以後弄把梯子,去爬爬FaceBook什麼的。就拿知乎練練手吧,可曾想,知乎竟然改版了!!之前的教程書籍對現在的知乎來說,都是扯淡,連頁面都找不到了。下面一起談談改版後的紙糊的模擬登陸吧。

頁面分析

抓包

首先,開啟頁面:https://www.zhihu.com/signup?next=%2F(登入網址都變了…),F12輸入賬號密碼(記得把密碼輸錯),點選網路所有,剩下的如圖所示,得到請求頭。發現幾個請求頭和正常的不一樣(如圖所示):
這裡寫圖片描述
1. authorization: 應該是js生成的。
2. content-type

: 第一次看感覺很沒有頭緒,接下來和請求引數一起看就會一目瞭然了。
3. x-udidx-sxrftoken:這兩個是驗證引數,在網頁原始碼中可以找到。
接下來看一下請求引數:
這裡寫圖片描述
然後我們結合請求頭裡 content-type:multipart/form-data; boundary=…---------------22839196617062
其中multipart/form-data就是一種表單提交方式;後面的 boundary=…---------------22839196617062就是引數中的 “分割線”:
這裡寫圖片描述
所以,直接不看那一串,引數就相當於:
client_id = c3cef7c66a1843f8b3a9e6a1e3160e20

grant_type = password
等11個引數。其中比如賬戶、密碼這些都是固定的,多次請求後,發現client_idtimestamp(時間戳) 也是固定的,signature是變動的,那麼這個signature 是什麼東西呢?

確定引數位置

這裡寫圖片描述
所以,上面假設得到證實。而且發現,後面那一串和 client_id 的值一樣。

signature

function (e, t, n) {
    "use strict";
    function r(e, t) {
        var n = Date.now(), r = new a.a("SHA-1"
, "TEXT"); return r.setHMACKey("d1b964811afb40118a12068ff74a12f4", "TEXT"), r.update(e), r.update(i.a), r.update("com.zhihu.web"), r.update(String(n)), c({ clientId: i.a, grantType: e, timestamp: n, source: "com.zhihu.web", signature: r.getHMAC("HEX") }, t) }

所以,signature 的值就是一些變數進行 HMAC 得到的值。

x-udidx-sxrftoken

直接查詢網站原始碼,搜尋全域性,定位了這兩個:
這裡寫圖片描述
後續就是使用正則把他們匹配出來。

程式碼設計

主函式的書寫

需要匯入的python庫有:

import scrapy
from scrapy.http import Request,FormRequest
import base64
import re
import execjs
import time
from PIL import Image
import os

設定爬蟲通用的請求頭:

    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0',
        'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20'
        }

時間戳的和獲取方法:

timestamp = int(time.time() * 1000)

客戶端 id

client_id = 'c3cef7c66a1843f8b3a9e6a1e3160e20'

定向登入原網站,這裡用到 Request()方法

    def start_requests(self):
        url = 'https://www.zhihu.com/signup?next=%2F'
        return [Request(url, meta={'cookiejar': 1}, callback=self.parse)]

定位驗證碼網站

    def parse(self, response):
        pat = re.compile('xsrf":"(.*?)&')
        self.xtoken = pat.findall(response.body.decode('utf-8', 'ignore'))[0]
        tempurl = 'https://www.zhihu.com/api/v3/oauth/captcha?lang=en'
        yield Request(tempurl, headers=self.header, meta={"cookiejar": True}, callback=self.end)
 def end(self, response):
        data = response.text
        if re.search('true', data):
            self.i = self.i + 1
            print('需要驗證碼')
            yield Request('https://www.zhihu.com/api/v3/oauth/captcha?lang=cn', method='put', headers=self.header,
                          meta={"cookiejar": True},
                          callback=lambda response, ki='cn': self.parser_captcha(response, ki))
        else:
            print('無需驗證碼')
            username = '+86手機號'
            password = '你的密碼'
            signature = self.add().call('run', 'password', self.timestamp)
            data = {
                'client_id': self.client_id, 'grant_type': 'password',
                'timestamp': str(self.timestamp), 'source': 'com.zhihu.web',
                'signature': signature, 'username': username,
                'password': password, 'captcha': self.captcha,
                'lang': 'en', 'ref_source': 'homepage', 'utm_source': ''
            }
            urls = 'https://www.zhihu.com/api/v3/oauth/sign_in'
            yield FormRequest(urls, method='post', headers=self.header, meta={"cookiejar": response.meta["cookiejar"]},
                              formdata=data, callback=self.next, )

登陸所需方法:驗證碼模組。(知乎的驗證比較變態,需要post兩次。)

POST第一次,傳送資料給驗證碼來源網站.

    def parser_captcha(self, response, ki):
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0',
            'x - udid': 'ACBCVUdOYguPTkCvnaFKpSly5-s9HmXSCPg=',
            'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20',
            'X-Xsrftoken': self.xtoken
        }
        print(ki)
        pat = re.compile('(?s)"img_base64":"(.*?)"')
        data = eval(repr(pat.findall(response.body.decode('utf-8', 'ignore'))[0]).replace('\\\\', '\\'))
        k = base64.b64decode(data)
        with open('D:/captcha.jpg', 'wb') as f:
            f.write(k)
            f.close()
        try:
            im = Image.open('D:/captcha.jpg')
            im.show()
            im.close()
        except:
            print(u'請到 %s 目錄找到captcha.jpg 手動輸入' % os.path.abspath('captcha.jpg'))
        self.captcha = input("please input the captcha\n>")
        form = {'input_text': str(self.captcha)}
        yield FormRequest(response.url, headers=header, meta={'cookiejar': response.meta['cookiejar']}, formdata=form,
                          callback=self.finall)

POST第二次,傳送資料給真正的登陸介面。

    def finall(self, response):
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/58.0',
            'x - udid': 'ACBCVUdOYguPTkCvnaFKpSly5-s9HmXSCPg=',
            'authorization': 'oauth c3cef7c66a1843f8b3a9e6a1e3160e20',
            'X-Xsrftoken': self.xtoken
        }
        username = '+86手機號'
        print('1')
        password = '你的密碼'
        timestamp = int(time.time() * 1000)
        signature = self.add().call('run', 'password', timestamp)
        print(signature)
        data = {
            'client_id': self.client_id, 'grant_type': 'password',
            'timestamp': str(timestamp), 'source': 'com.zhihu.web',
            'signature': signature, 'username': username,
            'password': password, 'captcha': str(self.captcha),
            'lang': 'en', 'ref_source': 'homepage', 'utm_source': ''
        }
        urls = 'https://www.zhihu.com/api/v3/oauth/sign_in'
        print(2)
        print(data)
        yield FormRequest(urls, method='post', headers=header, meta={"cookiejar": response.meta["cookiejar"]},
                          formdata=data, callback=self.next, )
 def add(self):
        js1 = execjs.compile("""
                      貼上程式碼(由於篇幅太長,沒展示)
               """)
        return js1

多次執行測試,發現都沒返回圖片。
這裡寫圖片描述
但是不排除有返回的可能性。
今天就到這吧,歡迎留言交流。
歡迎關注我的個人公眾號。

相關推薦

模擬登陸改版新版

今天,想著看看視訊,把模擬登陸這一塊學習學習,以後弄把梯子,去爬爬FaceBook什麼的。就拿知乎練練手吧,可曾想,知乎竟然改版了!!之前的教程書籍對現在的知乎來說,都是扯淡,連頁面都找不到了。下面一起談談改版後的紙糊的模擬登陸吧。 頁面分析

python爬蟲項目新手教程requests方式

ror eas 點擊 elif 原因 ffffff 文章 重點 F12 -前言 之前一直用scrapy與urllib姿勢爬取數據,最近使用requests感覺還不錯,這次希望通過對知乎數據的爬取為 各位爬蟲愛好者和初學者更好的了解爬蟲制作的準備過程以及requests請求方

嶺南師範學院VPN使用登陸校園網教程新版

以下的教程比之前的教程增加手機登陸的方式 舊版教程連結:嶺南師範學院外網登陸校園網教程(例如外網登陸正方系統)  https://blog.csdn.net/future_ai/article/details/80742513#commentsedit VPN使用方法 目錄

第三方登陸實踐之基於OAuth的FACEBOOK Web Login新版

Facebook 登入簡介 Facebook 登入是在多個平臺供使用者建立帳戶並登入應用的便捷方式。它可用於 iOS、Android、Web、Windows Phone、桌面應用和智慧電視、物聯網物件等裝置。 Facebook 登入功能可打造以下體驗: 建

ESP32搭建3.ubuntu14.04下搭建esp32開發環境 新版

終端 pat 權限 技術 實例 為我 tro component 直接 硬件為樂鑫出品的ESP32一款集成了wifi和藍牙的集成模塊。 1.首先ctrl+alt+t打開終端,sudo -s選擇用root權限登陸 。 2. 輸入指令:sudo apt-get install

Linux 平臺安裝MongoDB 4.0新版

文件格式 http rip 機制 selinux 新版 要求 錯誤 平臺 概 述 MongoDB 是由C++語言編寫的,是一個基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在為WEB應用提供可擴展的高性能數據

Sketch52.3 中文漢化新版

Sketch52.3 中文漢化 之前,我已經分享過一款功能強大的向量繪圖軟體——Sketch,它可以幫助你輕鬆的製作各種需要的圖形。這次帶來的是52.3版本。 Sketch是一款擁有美觀介面和強大功能的專業向量圖形繪製工具。它旨在為美術設計師創造出一款更優秀的作品,不是複製品,而是提

Sketch52.2 中文漢化新版

Sketch52.2中文漢化(最新版) 之前,我已經分享過一款功能強大的向量繪圖軟體——Sketch,它可以幫助你輕鬆的製作各種需要的圖形。這次帶來的是52.2版本。 Sketch是一款擁有美觀介面和強大功能的專業向量圖形繪製工具。它旨在為美術設計師創造出一款更優秀的作品,不是複製品

principle4.3 中文漢化新版

principle4.3 中文漢化(最新版) principle4.3 中文漢化(最新版) 今天,要來分享的是Mac下一款互動設計軟體——Principle,它可以幫助你製作出一個完整互動動畫的原型,非常強大。這次帶來的是Principle_4.3 中文漢化版本。

Sketch51.3 中文漢化新版

之前,我已經分享過一款功能強大的向量繪圖軟體——Sketch,它可以幫助你輕鬆的製作各種需要的圖形。這次帶來的是51.3版本。 Sketch是一款擁有美觀介面和強大功能的專業向量圖形繪製工具。它旨在為美術設計師創造出一款更優秀的作品,不是複製品,而是提升品。接觸最直觀的感覺就是Sk

principle4.1 中文漢化新版

- 今天,要來分享的是Mac下一款互動設計軟體——Principle,它可以幫助你製作出一個完整互動動畫的原型,非常強大。這次帶來的是Principle_4.1 中文漢化版本。 - Principle可以將互動動畫生成視訊或者Gif分享到Dribbble、Twitter 等社交平

Centos 7.x yum安裝php5.6.X新版

1、檢查當前安裝的PHP包 yum list installed | grep php 如果有安裝的PHP包,先刪除他們 yum remove php.x86_64 php-cli.x86_64 2、配置yum源  CentOS 7.0的源 yum install epe

CentOS7.5 Kubernetes V1.13新版二進位制部署叢集

一、概述 Kubernetes 1.13 正式GA,這是2018年釋出的第四次也是最後一次大版本,1.13也是迄今為止發行最快的版本,僅用10周時間。此版本繼續關注Kubernetes的穩定性和可擴充套件性,其中在儲存和群集生命週期領域的三個主要功能實現普遍可用(GA)。Kubeadm簡化叢集管理、容器儲存

CentOS7.5 Kubernetes V1.13新版二進制部署集群

init 根據 emc install 組成 功能實現 sort 監控 自己的 一、概述 Kubernetes 1.13 正式GA,這是2018年發布的第四次也是最後一次大版本,1.13也是迄今為止發行最快的版本,僅用10周時間。此版本繼續關註Kubernetes的穩定性和

ubuntu16.04 64bit安裝交叉編譯工具arm-none-linux-gnueabi-2014.05新版

安裝方式: 將下載好的安裝包拷貝到linux環境下,此處可以藉助設定虛擬機器與主機之間的共享資料夾實現。(設定方式自行百度) 實現的過程並不像網上說的那麼一帆風順,因為我的ubuntu是64bit,

[轉貼]CentOS7.5 Kubernetes V1.13新版二進位制部署叢集

CentOS7.5 Kubernetes V1.13(最新版)二進位制部署叢集 http://blog.51cto.com/10880347/2326146   一、概述 kubernetes 1.13 已釋出,這是 2018 年年內第四次也

樹莓派kali linux詳細配置新版

1.準備一個樹莓派,配置16g或32gtf卡 2.在kali linux官網上下載kali-linux-2018.3-rpi3-nexmon.img 3.使用win32diskimager將img檔案燒錄至tf卡,將tf卡插入樹莓派,插上dhcp顯示器,網線/無

Apache+php+mysql在windows下的安裝與配置圖解新版

先準備好軟體: 一、安裝Apache,配置成功一個普通網站伺服器 出現Apache HTTP Server 2.0.55的安裝嚮導介面,點“Next”繼續 確認同意軟體安裝使用許可條例,選擇“I accept the terms in the l

android AES加密解密新版

專案中要用到AES加密,百度上的AES壓根不能用,也不知道是那年的東西了,和後臺不相容,後來,後臺把他的AES程式碼拷給我  通過PHP程式碼找到了對應的Android程式碼 原文地址:http://www.funboxpower.com/php_android_ios_a

一些具非常有用原始碼分享百度指數破解新版,NDIS實現類似P2P終結者功能程式碼,GOOGLE線上翻譯等等

最近自己要去深圳,開始人生的第二份工程,所以整理以前自己寫過的小玩意程式碼(跟自己工作的程式碼無關),自己下班回家寫的程式碼,準備解除安裝簡歷裡面去求職。程式碼風格自己有注意,但還是每次看自己以前寫的程式碼就感覺是那麼醜。 1:NDIS實現類似P2P終結者的核心程式碼