Rumah >pembangunan bahagian belakang >Tutorial Python >Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

PHPz
PHPzke hadapan
2023-05-18 16:02:031559semak imbas

Alat Persekitaran dan Pembangunan

Semasa menangkap paket, saya pada mulanya menggunakan Rangkaian dalam alatan pembangunan Chrome, tetapi gagal menangkapnya Kemudian, saya menggunakan Fiddler untuk berjaya menangkap data. Proses di atas akan diperincikan langkah demi langkah di bawah.

Sebelum mensimulasikan log masuk Zhihu, mula-mula lihat persekitaran dan alatan yang digunakan dalam kes ini:

  • Windows 7 + Python 2.75

  • Chrome + Fiddler: Digunakan untuk memantau komunikasi antara klien dan pelayan, dan mencari lokasi parameter yang berkaitan.

Ikhtisar proses simulasi

  • Gunakan penyemak imbas Google digabungkan dengan Fiddler untuk memantau proses komunikasi antara klien dan pelayan;

  • Menurut hasil pemantauan, bina parameter yang diluluskan semasa permintaan kepada pelayan;

  • Beberapa perkara penting dalam proses komunikasi antara klien dan pelayan:

Alamat URL semasa log masuk.

  • Terdapat dua cara utama untuk mendapatkan parameter [param] yang diserahkan semasa log masuk: yang pertama ialah mencari teg borang dan atribut dengan menganalisis kod sumber halaman;. Sesuaikan dengan halaman yang agak mudah. Kedua, gunakan alat tangkapan paket untuk melihat URL dan parameter yang diserahkan Biasanya, Rangkaian, Fiddler, dsb. dalam alat pembangun Chrome digunakan.

  • URL untuk dilawati selepas log masuk.

  • Penerokaan parameter

    Pertama lihat halaman log masuk ini, iaitu alamat url semasa kami log masuk.

Melihat halaman ini, kami juga boleh meneka secara kasar bahawa beberapa medan diluluskan apabila meminta pelayan Jelas sekali bahawa: nama pengguna, kata laluan, kod pengesahan dan "ingat". Saya" nilai-nilai ini. Jadi yang mana sebenarnya ada? Mari analisa di bawah.

Mula-mula semak kod sumber HTML Anda boleh menggunakan CTRL+U untuk melihatnya di Google, dan kemudian gunakan CTRL+F untuk memasukkan input untuk melihat apakah nilai medan yang ada. Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Apabila meminta pelayan, kod sumber menunjukkan bahawa terdapat juga medan tersembunyi "_xsrf". Persoalannya sekarang ialah nama apakah parameter yang dilalui, jadi alat lain perlu digunakan untuk menangkap paket data untuk analisis. Di sini, saya menggunakan Fiddler, yang boleh berfungsi pada sistem Windows. Sudah tentu, anda boleh menggunakan alat lain juga.

Disebabkan jumlah maklumat yang banyak diperoleh daripada penangkapan paket, ia menjadi lebih sukar untuk mencari maklumat yang diperlukan, menjadikan proses penangkapan paket lebih rumit. Mengenai fiddler, ia sangat mudah digunakan Jika anda tiada pengalaman, anda boleh mencarinya di Baidu. Untuk mengelakkan maklumat lain daripada mengganggu, kami mula-mula mengosongkan rekod dalam fiddler, dan kemudian masukkan nama pengguna (pengarang menggunakan e-mel untuk log masuk), kata laluan dan maklumat lain untuk log masuk. Hasil yang sepadan dalam fiddler adalah seperti berikut: Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Nota: Jika anda menggunakan telefon bimbit untuk log masuk, url yang sepadan dalam fiddler ialah "/login/phone_num".

Untuk melihat parameter permintaan terperinci, kami klik kiri "/log masuk/e-mel" dan anda boleh melihat maklumat berikut: Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Permintaan kaedah ialah POST url yang diminta ialah

. Seperti yang dapat dilihat daripada Dari Data, nama medan yang sepadan adalah seperti berikut:

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

_xsrfhttps://www.zhihu.com/login/email

  • captcha

  • e-mel

  • kata laluan

  • ingat

  • Untuk lima medan ini, e-mel dalam kod, kata laluan dan captcha semuanya dimasukkan secara manual, dan ingat dimulakan kepada benar. Anda boleh mendapatkan nilai bernama _xsrf dalam teg input berdasarkan fail sumber halaman log masuk, dengan itu memperoleh baki _xsrf.

Untuk kod pengesahan, permintaan tambahan diperlukan Pautan boleh dilihat dengan melihat kod sumber pada titik tetap:

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Pautannya

, ts ditinggalkan di sini (selepas ujian, ia boleh ditinggalkan). Ia kini boleh mensimulasikan log masuk menggunakan kod.

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke ZhihuPeringatan hangat: Jika anda menggunakan nombor telefon mudah alih untuk log masuk, url yang diminta ialah

dan nama medan e-mel akan menjadi "nombor_telefon".

https://www.zhihu.com/captcha.gif?type=loginKod sumber simulasi

Dalam proses menulis kod untuk melaksanakan log masuk Zhihu, pengarang merangkumkan beberapa fungsi ke dalam kelas WSpider mudah untuk digunakan semula Nama fail ialah WSpider.py. https://www.zhihu.com/login/phone_num

# -*- 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

Kod sumber untuk log masuk simulasi ke Zhihu disimpan dalam fail zhiHuLogin.py Kandungannya adalah seperti berikut:

# -*- 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()

Untuk analisis kod sumber, anda boleh merujuk kepada anotasi dalam. kod.

Jalankan hasil

Jalankan python zhiHuLogin.py dalam konsol, dan kemudian masukkan kandungan yang sepadan seperti yang digesa Akhirnya, anda boleh mendapatkan hasil yang berbeza berikut (tiga contoh diberikan):

Keputusan Satu: Kata laluan salah

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Keputusan kedua: Kod pengesahan salah

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Keputusan ketiga: Log masuk yang berjaya

Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu

Atas ialah kandungan terperinci Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam