Naver에 이은 Daum Login 분석 및 프로그래밍이다.
다음 로그인을 하고 네트워크로 분석을 해봤더니 이 POST가 핵심적 로그인을 수행하는 것 같았다.
https://logins.daum.net/accounts/srp.do?slevel=1&rid=****&srplm1=****
이 주소는 POST DATA를 보내는데 다음과 같은 DATA를 보낸다.

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 = {},
이를 차례대로 콘솔에서 입력해본결과 다음과 같이 나온다.

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을 실행시키면 다음과 같이 나온다.

이제 우리는 github에 올려서 이를 크롤링하면된다.
나머지 부분은 다음 글에서 이어서 하도록 하겠다.
'ETC > Python' 카테고리의 다른 글
파이썬 엑셀 읽고 쓰기 (Python Excel Read / Write) (0) | 2020.07.28 |
---|---|
파이썬 exe 파일 만들기 + 자동으로 꺼지는 현상 해결 (0) | 2020.07.26 |
Python을 이용해서 Email 보내기 (1) | 2020.07.23 |
Naver Login with Python requests 2(소스코드) (7) | 2020.07.09 |
Naver Login with Python requests 1(소스코드) (2) | 2020.07.08 |