99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代逆向爬蟲時,Python如何正確調(diào)用JAR加密邏輯?
逆向爬蟲時,Python如何正確調(diào)用JAR加密邏輯?
2021-01-04
收藏


公眾號:AirPython

作者:星安果

1. 前言

在 App 端爬蟲過程中,遇到未知的參數(shù),往往需要我們?nèi)ツ嫦蚱平?App,針對參數(shù)的生成邏輯,使用 Python 去實現(xiàn)

部分 App 參數(shù)的生成邏輯可能已經(jīng)寫入到多個 JAR 文件中,這時候,我們只需要用 Python 執(zhí)行 JAR 即可

本篇文章將聊聊 Python 如何調(diào)用 JAR 中的方法

2. 合并 JAR

以 Android App 為例,假設(shè)加密參數(shù)生成邏輯在多個 JAR 中,我們首先需要將所有的 JAR 文件合并為一個 JAR 文件

PS:對于 AAR 文件,可以先通過解壓軟件解壓,然后再合并 JAR

合并 JAR 分為 2 步:

  • 解壓 JAR
  • 合并所有源碼
  • 2-1 解壓 JAR

    安裝 JDK 之后,通過 jar -xvf 命令去解壓單個 JAR,這樣會按包名在同級目錄下生成 JAVA 編譯后的 class 文件逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    2-2 合并所有源碼

    使用 jar -cvfM 命令,將本地所有的 class 文件生成一個新的 JAR

    逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    3. Python 調(diào)用 JAR

    首先,我們安裝依賴包:jpype

    逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    假設(shè) JAR 中加密邏輯實現(xiàn)代碼如下:逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    使用 Python 調(diào)用 JAR 中的方法分為 3 步:

  • 啟動 JVM
  • 實例化 JAVA 對象,調(diào)用對應(yīng)方法
  • 關(guān)閉 JVM
  • 3-1 啟動 JVM

    逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    3-2 實例化 JAVA 對象,調(diào)用方法

    根據(jù)被調(diào)方法所在的包名,使用 jpyte 中的 JClass() 方法實例化類 JAVA 對象,最后調(diào)用 JAVA 對象的方法即可

    需要注意的是,由于 JAVA 中是實例方法,需要先進行對象實例化,然后調(diào)用方法;如果是靜態(tài)方法,可以直接調(diào)用方法逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    3-3 關(guān)閉 JVM

    可以選擇主動關(guān)閉 JVM,或者待 Python 程序運行后自動關(guān)閉,釋放資源

    逆向爬蟲時,Python 如何正確調(diào)用 JAR 加密邏輯?

    4. 最后

    Python 直接調(diào)用 JAR 中方法,可以幫我我們復(fù)用輪子,減輕爬蟲的工作量!

    如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!



    數(shù)據(jù)分析咨詢請掃描二維碼

    若不方便掃碼,搜微信號:CDAshujufenxi

    數(shù)據(jù)分析師資訊
    更多

    OK
    客服在線
    立即咨詢
    客服在線
    立即咨詢
    ') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }