본문 바로가기
ETC/Python

Daum Login with Python requests 1(소스코드)

by Guardy 2020. 7. 9.
728x90

Naver에 이은 Daum Login 분석 및 프로그래밍이다.

 

다음 로그인을 하고 네트워크로 분석을 해봤더니 이 POST가 핵심적 로그인을 수행하는 것 같았다.

https://logins.daum.net/accounts/srp.do?slevel=1&rid=****&srplm1=****

이 주소는 POST DATA를 보내는데 다음과 같은 DATA를 보낸다.

 

https://logins.daum.net/accounts/srp.do?slevel=1&rid=****&srplm1=****

 

id는 로그인 시 아이디 RAW한 상태이고 우리는 fuid와 rid srplm만 알면 로그인을 수행할 수 있을 것 같다.

네트워크에서 fuid를 검색하였더니

https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fwww.daum.net%2F에서 fuid를 찾을 수 있었다.

<input type="hidden" name="url" value="https://www.daum.net/" />
<input type="hidden" name="relative" value="" />
<input type="hidden" name="weblogin" value="1" />
<input type="hidden" name="service" value="" />
<input type="hidden" name="fuid" value="jYLqfABWeGC5uTKCyImKLpAoHFsicX16RTEDAx2cLiM9e6jPP9ufxFgnYDt-n53s2C8pGygd_wTZjmJDp6biEXpndjvIQo6-5VKCvHt05GBZ8oDoQ"/>

fuid는 get으로 윗 주소를 받아오면 얻을 수 있는 데이터였다.

그렇다면 rid와 srplm은 어떻게 얻을까

 

rid는 GET으로 보내는 https://logins.daum.net/accounts/presrp.do?id=daumID&srpla=b7d4963a84bce5033fb5d1b7d62828047581eb126d9c1b439b625cd6010402b6&_=1594298114645에서 받는 것을 확인할 수 있었다.

rid를 얻기 위해서는 srpla를 다시 얻어야한다. 크롤링은 이처럼 역순으로 열쇠를 찾아가는 것과 같다. 다른 말로 노가다 작업을 해야한다..

srpla는 https://logins.daum.net/contents/min/js/login-default.js?ver=200702020114에 다음과 같이 나와있다.

function B() {
        var F = new x(16, a),
            g = y.modPow(F, k),
            I = w({
                id: encodeURIComponent(E.id),
                srpla: g.toString(16)
            }),
            H = new Date().getTime(),
            G = f.PRESRP + "?" + I;
        jQuery.getScript(G, function() {
            v(H, g, F)
        });
        p = setTimeout(d, 10000)
    }

g = y.modPow(F,K) 이고 위를 보면 var F = new x(16, a)인데 a가 무엇인지 찾아야한다.

위로 올려보니 다음과 같이 정의되어있다.

var x = daumlogin.crypto.BigInteger,
        b = daumlogin.crypto.SHA,
        D = daumlogin.crypto.SecureRandom,
        C = b.create("SHA-256", "string", "hex");
    var k = new x("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16),
        y = new x("2"),
        a = new D();
    var z = {
            FORMID: "loginForm",
            USERID: "id",
            INPUTPWD: "inputPwd"
        },
        f = {},
        A = {},

이를 차례대로 콘솔에서 입력해본결과 다음과 같이 나온다.

 

console에서 입력한 결과

 

srpla를 얻는 방법을 얻었으니 프로그래밍을 해야한다.

js파일을 python으로 바꾸는것보다 html파일 하나를 생성해서 이를 크롤링하는 작업이 빠르다

따라서 우리는 data.html 파일을 만든다.

<!DOCTYPE html>
<html>
<body>
    <div id="srpla"></div>
    <div id="time"></div>
    <script type="text/javascript" src="login-default.js"></script>
    <script type="text/javascript">
        var x = daumlogin.crypto.BigInteger;
        var k = new x("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16), y = new x("2");
        D = daumlogin.crypto.SecureRandom;
        a = new D();
        var F = new x(16, a);
        g = y.modPow(F, k);
        srpla = g.toString(16);
        document.all("srpla").innerHTML='"srpla:'  + srpla + '"'
        time = new Date().getTime();
        document.all("time").innerHTML='"time:'  + time + '"'
    </script>
</body>
</html>

그런 다음 data.html을 실행시키면 다음과 같이 나온다.

 

srpla와 time을 얻었다.

 

이제 우리는 github에 올려서 이를 크롤링하면된다.

나머지 부분은 다음 글에서 이어서 하도록 하겠다.

 

 

728x90