Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

PHPz
PHPznach vorne
2023-05-18 16:02:031483Durchsuche

Umgebungs- und Entwicklungstools

Beim Erfassen von Paketen habe ich zunächst Network in den Chrome-Entwicklungstools verwendet, konnte sie aber nicht erfassen. Später habe ich Fiddler verwendet, um die Daten erfolgreich zu erfassen. Der obige Vorgang wird im Folgenden Schritt für Schritt beschrieben.

Bevor Sie die Zhihu-Anmeldung simulieren, werfen Sie zunächst einen Blick auf die Umgebung und die in diesem Fall verwendeten Tools:

  • Windows 7 + Python 2.75

  • Chrome + Fiddler: Wird zur Überwachung der Kommunikation zwischen Client und Server verwendet. und Finden Sie die Position relevanter Parameter.

Überblick über den Simulationsprozess

  • Verwenden Sie den Google-Browser in Kombination mit Fiddler, um den Kommunikationsprozess zwischen dem Client und dem Server zu überwachen.

  • Konstruieren Sie anhand der Überwachungsergebnisse die im Anforderungsprozess übergebenen Parameter der Server;

  • Verwenden Sie Python, um den Parameterübergabeprozess zu simulieren.

Mehrere wichtige Punkte im Kommunikationsprozess zwischen Client und Server:

  • URL-Adresse beim Anmelden.

  • Es gibt zwei Hauptmethoden, um die beim Anmelden übermittelten Parameter [params] zu erhalten: Die erste besteht darin, die Formular-Tags und -Attribute durch Analyse des Seitenquellcodes zu finden. Passen Sie sich an relativ einfache Seiten an. Zweitens verwenden Sie ein Paketerfassungstool, um die übermittelte URL und die Parameter anzuzeigen. Normalerweise werden Netzwerk, Fiddler usw. in den Entwicklertools von Chrome verwendet.

  • Die URL, die nach dem Anmelden springt.

Parametererkundung

Schauen Sie sich zunächst diese Anmeldeseite an. Dies ist die URL-Adresse, wenn wir uns anmelden.

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Wenn wir diese Seite sehen, können wir auch grob erraten, dass bei der Anfrage an den Server mehrere Felder übergeben werden. Es ist offensichtlich, dass es folgende gibt: Benutzername, Passwort, Bestätigungscode und die Werte von „Mich merken“. . Welche gibt es eigentlich? Lassen Sie es uns unten analysieren.

Überprüfen Sie zunächst den HTML-Quellcode, um ihn in Google anzuzeigen, und geben Sie dann mit STRG+F Eingaben ein, um zu sehen, welche Feldwerte vorhanden sind:

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Beim Anfordern des Servers zeigt der Quellcode, dass es auch ein verstecktes Feld „_xsrf“ gibt. Die Frage ist nun, über welchen Namen die Parameter weitergeleitet werden. Daher müssen andere Tools verwendet werden, um die Datenpakete für die Analyse zu erfassen. Hier verwende ich Fiddler, das auf Windows-Systemen funktionieren kann. Natürlich können Sie auch andere Tools verwenden.

Aufgrund der großen Menge an Informationen, die bei der Paketerfassung gewonnen werden, wird es schwieriger, die erforderlichen Informationen zu finden, was den Paketerfassungsprozess umständlicher macht. Was Fiddler betrifft, ist es sehr einfach zu verwenden. Wenn Sie keine Erfahrung haben, können Sie es auf Baidu suchen. Um zu verhindern, dass andere Informationen stören, löschen wir zunächst die Datensätze in Fiddler und geben dann den Benutzernamen (der Autor verwendet eine E-Mail zum Anmelden), das Passwort und andere Informationen zum Anmelden ein. Die entsprechenden Ergebnisse in Fiddler lauten wie folgt folgt:

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Bemerkungen: Wenn Sie sich mit einem Mobiltelefon anmelden, lautet die entsprechende URL in Fiddler „/login/phone_num“.

Um die detaillierten Anfrageparameter anzuzeigen, klicken wir mit der linken Maustaste auf „/login/email“ und Sie können die folgenden Informationen sehen:

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Die Anfragemethode ist POST und die angeforderte URL ist https: //www.zhihu.com/login/email. Wie aus From Data hervorgeht, lauten die entsprechenden Feldnamen wie folgt: https://www.zhihu.com/login/email。而从From Data可以看出,相应的字段名称如下:

  • _xsrf

  • captcha

  • email

  • password

  • remember

对于这五个字段,代码中email、password以及captcha都是手动输入的,remember初始化为true。可以根据登录页面的源文件,获取input标签中名为_xsrf的value值,从而得到剩余的_xsrf。

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

对于验证码,则需要通过额外的请求,该链接可以通过定点查看源码看出:

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

链接为https://www.zhihu.com/captcha.gif?type=login,这里省略了ts(经测试,可省略掉)。现在,可以使用代码进行模拟登录。

温馨提示:如果使用的是手机号码进行登录,则请求的url为https://www.zhihu.com/login/phone_num

_xsrf

captcha

🎜🎜email🎜🎜🎜🎜password🎜🎜🎜🎜remember🎜🎜🎜 🎜Für diese fünf Felder: Der Code, die E-Mail-Adresse, das Passwort und das Captcha, werden alle manuell eingegeben und nicht vergessen, dass sie auf „true“ initialisiert sind. Sie können den Wert mit dem Namen _xsrf im Eingabe-Tag basierend auf der Quelldatei der Anmeldeseite abrufen und so den verbleibenden _xsrf erhalten. 🎜🎜So verwenden Sie Python, um die Anmeldung zu simulieren Zhihu🎜🎜Für den Bestätigungscode , Sie müssen eine zusätzliche Anfrage durchgehen, indem Sie den Quellcode an einem festen Punkt anzeigen: 🎜🎜🎜🎜Der Link ist https://www.zhihu.com/captcha.gif?type=login, ts wird hier weggelassen (kann nach dem Testen weggelassen werden). Es ist jetzt möglich, die Anmeldung mithilfe von Code zu simulieren. 🎜🎜Warme Erinnerung: Wenn Sie sich mit einer Mobiltelefonnummer anmelden, lautet die angeforderte URL https://www.zhihu.com/login/phone_num und der Name des E-Mail-Felds wird zu „phone_num“. " . 🎜🎜Simulationsquellcode🎜🎜Während des Schreibens von Code zur Implementierung der Zhihu-Anmeldung hat der Autor einige Funktionen zur Wiederverwendung in eine einfache Klasse WSpider gekapselt. Der Dateiname lautet WSpider.py. 🎜
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 02 14:01:17 2016
@author: liudiwei
"""
import urllib
import urllib2
import cookielib
import logging  

class WSpider(object):
    def __init__(self):
        #init params
        self.url_path = None
        self.post_data = None
        self.header = None
        self.domain = None
        self.operate = None

        #init cookie
        self.cookiejar = cookielib.LWPCookieJar()
        self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookiejar))
        urllib2.install_opener(self.opener)

    def setRequestData(self, url_path=None, post_data=None, header=None):
        self.url_path = url_path
        self.post_data = post_data
        self.header = header

    def getHtmlText(self, is_cookie=False):
        if self.post_data == None and self.header == None:
            request = urllib2.Request(self.url_path)
        else:
            request = urllib2.Request(self.url_path, urllib.urlencode(self.post_data), self.header)
        response = urllib2.urlopen(request)
        if is_cookie: 
            self.operate = self.opener.open(request)
        resText = response.read()
        return resText

    """
    Save captcha to local    
    """    
    def saveCaptcha(self, captcha_url, outpath, save_mode='wb'):
        picture = self.opener.open(captcha_url).read() #用openr访问验证码地址,获取cookie
        local = open(outpath, save_mode)
        local.write(picture)
        local.close()    

    def getHtml(self, url):
        page = urllib.urlopen(url)
        html = page.read()
        return html


    """
    功能:将文本内容输出至本地
    @params
        content:文本内容
        out_path: 输出路径
    """
    def output(self, content, out_path, save_mode="w"):
        fw = open(out_path, save_mode)
        fw.write(content)
        fw.close()
        
    """#EXAMPLE
    logger = createLogger('mylogger', 'temp/logger.log')
    logger.debug('logger debug message')  
    logger.info('logger info message')  
    logger.warning('logger warning message')  
    logger.error('logger error message')  
    logger.critical('logger critical message')  
    """    
    def createLogger(self, logger_name, log_file):
        # 创建一个logger
        logger = logging.getLogger(logger_name)  
        logger.setLevel(logging.INFO)  

        # 创建一个handler,用于写入日志文件    
        fh = logging.FileHandler(log_file)  

        # 再创建一个handler,用于输出到控制台    
        ch = logging.StreamHandler()  
        # 定义handler的输出格式formatter    

        formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')  
        fh.setFormatter(formatter)  
        ch.setFormatter(formatter)  
        # 给logger添加handler    

        logger.addHandler(fh)  
        logger.addHandler(ch)  
        return logger
🎜Der Quellcode für die simulierte Anmeldung bei Zhihu ist in der Datei zhiHuLogin.py gespeichert. Der Inhalt lautet wie folgt: 🎜
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 02 17:07:17 2016
@author: liudiwei

"""
import urllib
from WSpider import WSpider
from bs4 import BeautifulSoup as BS
import getpass
import json
import WLogger as WLog
"""
2016.11.03 由于验证码问题暂时无法正常登陆
2016.11.04 成功登录,期间出现下列问题
验证码错误返回:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码错误"}, "msg": "验证码错误" }
验证码过期:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码回话无效 :(","name":"ERR_VERIFY_CAPTCHA_SESSION_INVALID"}, "msg": "验证码回话无效 :(" }
登录:{"r":0, "msg": "登录成功"}
"""
def zhiHuLogin():
    spy = WSpider()
    logger = spy.createLogger('mylogger', 'temp/logger.log')
    homepage = r"https://www.zhihu.com/"    
    html = spy.opener.open(homepage).read()
    soup = BS(html, "html.parser")
    _xsrf = soup.find("input", {'type':'hidden'}).get("value")

    #根据email和手机登陆得到的参数名不一样,email登陆传递的参数是‘email',手机登陆传递的是‘phone_num'
    username = raw_input("Please input username: ")
    password = getpass.getpass("Please input your password: ")
    account_name = None
    if "@" in username:
        account_name = 'email'
    else:
        account_name = 'phone_num' 

    #保存验证码
    logger.info("save captcha to local machine.")
    captchaURL = r"https://www.zhihu.com/captcha.gif?type=login" #验证码url
    spy.saveCaptcha(captcha_url=captchaURL, outpath="temp/captcha.jpg") #temp目录需手动创建

    #请求的参数列表
    post_data = {
        '_xsrf': _xsrf,
        account_name: username,
        'password': password,
        'remember_me': 'true',
        'captcha':raw_input("Please input captcha: ")

    }

    #请求的头内容
    header ={
        'Accept':'*/*' ,
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With':'XMLHttpRequest',
        'Referer':'https://www.zhihu.com/',
        'Accept-Language':'en-GB,en;q=0.8,zh-CN;q=0.6,zh;q=0.4',
        'Accept-Encoding':'gzip, deflate, br',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
        'Host':'www.zhihu.com'
    }

    url = r"https://www.zhihu.com/login/" + account_name
    spy.setRequestData(url, post_data, header)
    resText = spy.getHtmlText()
    jsonText = json.loads(resText)

    if jsonText["r"] == 0:
        logger.info("Login success!")
    else:
        logger.error("Login Failed!")
        logger.error("Error info ---> " + jsonText["msg"])

    text = spy.opener.open(homepage).read() #重新打开主页,查看源码可知此时已经处于登录状态
    spy.output(text, "out/home.html") #out目录需手动创建

if __name__ == '__main__':
    zhiHuLogin()
🎜Zur Quellcode-Analyse können Sie sich auf die Anmerkungen im Code beziehen. 🎜

Ergebnisse ausführen

Führen Sie python zhiHuLogin.py in der Konsole aus und geben Sie dann nach Aufforderung den entsprechenden Inhalt ein (drei Beispiele werden angegeben):

Ergebnis 1: Falsches Passwort

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Ergebnis zwei: Bestätigungscode-Fehler

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Ergebnis drei: Erfolgreich angemeldet

So implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu

Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen