Python/2.7 information

파이썬으로 로그인 구현.

qkqhxla1 2014. 8. 10. 12:09

 

전 httplib은 되도록 쓰지 않습니다. 제가보기에 urllib2가 더 쓰기가 편하고, 알아보기가 쉬운것 


같아요. 필요한 기능도 다 제공되고요. GET,POST이외의 OPTION등의 메소드로 요청 보낼 시를 제외


하고서는 httplib 모듈은 쓰지 않습니다.

나중 추가. GET,POST말고도 다른 메소드도 urllib2모듈로 보낼 수 있음. 

 

1. 로그인 요청시(로그인 버튼 클릭했을시) 로그인정보가 POST방식으로 가는 경우.(요즘사이트 대부분)

URL인코딩을 해서 보내줘야 합니다. 아래 캡쳐부분처럼 데이터가 body부분에 따로 데이터만 가는 경우 인코딩을 해줘야 제대로 데이터가 전송됩니다. 그게 아니라 전송되는 원리를 내가 안다고 하면

직접 문자열을 제작해서 보내도 됩니다.

일단은 urllib모듈의 urlencode라는 인코딩을 해주는 메소드가 있습니다. 이걸 이용합니다.

ex) 실제 webhacking.kr 의 로그인 요청부분




post방식은 아래쪽 body부분에 따로 내가 적은 정보가 가는걸 알수 있습니다. id,pw는 보내는 이름이고, 사이트마다 다를 수 있습니다. webhacking.kr에서는 명시적으로 알아보기 쉽게 id,pw를 쓴것 같고, 만약 아이디가 rara이고, 비밀번호가 haha이면 id=rara&pw=haha로 두개의 정보 사이에 &로 구분되어서 정보가 보내집니다. urllib모듈의 urlencode에는 사전형식으로 값을 넣으면 자동으로 인코딩된 값을 만들어줍니다. 아이디는 rara이고, 패스워드는 haha라 했을시 이렇게 집어넣으면 됩니다. urllib.urlencode({'id':'rara','pw':'haha'}) 자동으로 이렇게 변환됩니다. id=rara&pw=haha 아이디나 패스워드의 왼쪽에 들어가는 id, pw문자열은 사이트마다 다릅니다. 한번 프록시로 패킷을 잡아서 폼 이름이 어떤건지 안 다음 보내는걸 추천드립니다. 


import urllib,urllib2
# -*- coding: euc-kr -*-
form = urllib.urlencode({'id':'?????','pw':'?????'})
 
req = urllib2.Request('http://webhacking.kr',form) #id는 rara고 pw는 haha로 가정했을 경우 이런식으로 변경 가능합니다. urllib2.Request('http://webhacking.kr','id=rara&pw=haha') 
res = urllib2.urlopen(req)
print res.read(20000)


 

form에는 내가 보낼 폼상자이름과 진짜 아이디, 비밀번호를 적고, urllib2.Request에서 첫번째 인자는 내가 요청을 보낼 사이트, 두번째 인자는 보낼 정보입니다. urllib2.Request에서 두번째 인자가 있으면 post방식으로 요청을 보내고, 두번째 인자가 없으면 자동으로 GET방식으로 요청을 보냅니다.

res변수에는 진짜 요청을 보낸 후 받아온 정보를 을 저장하는 변수. read메소드로 얼마만큼 읽어올지 정할 수 있습니다. res.read(20000)은 20000만큼 읽어오겠다는 뜻. 숫자가 작을수록 큰 페이지 요청 시 잘리는 정보가 있을수 있습니다.


 

접속 잘 된 것처럼 보입니다. webhacking.kr에 처음 로그인시 보이는 

'최근 접속 정보'가 캡쳐한 코드에서도 보이네요. 성공했습니다. 

 

 

2. 로그인 요청시 로그인 정보가 GET방식으로 가는 경우. (오래된 방식을 쓰는 사이트들.)

URL인코딩 이런거 다 필요없이 그냥 뒤에 문자열로 붙여서 보내주면 됩니다.

ex) suninatas의 로그인부분.


 

 

GET방식은 요청하는 사이트의 주소 뒤에 ?로 붙여서 가는걸 알수 있습니다. body부분에는 아무것도 없죠. suninatas사이트에서는 아이디를 Hid로, 비밀번호를 Hpw로 구분하네요. post방식과 같이 폼 정보들의 사이는 &로 구분하며 아이디가 rara이고, 비밀번호가 haha이면 ?Hid=rara&Hpw=haha로 데이터가 전송됩니다.

 

import urllib2
# -*- coding: euc-kr -*-
req = urllib2.Request('http://suninatas.com/member/mem_action.asp?Hid=?????&Hpw=?????')
res = urllib2.urlopen(req)
 
print res.read(4000) 

post요청과 달리 인코딩된 폼을 구성할 필요가 없습니다. 단순 보낼 요청 뒤에 ?Hid와 Hpw를 세팅해주고 보내면 됩니다. 위의 post방식을 설명할때 urllib2.Request에서 두번째 인자가 없으면 자동으로 GET방식으로 요청을 보낸다 했습니다.

 

그런데 초보들은 또 헷갈릴 수 있습니다. suninatas의 메인 페이지는 http://suninatas.com/main/main.asp 인데 왜 요청을 member/mem_action.asp 에다가 보내요? 

일단 전 코딩하기전에 요청한 패킷을 캡쳐합니다. 그리고 그 요청하는 주소에 그대로 보내시면 됩니다. 주의하셔야 할 부분인데 반드시 로그인 시에 요청을 지금 보이는 메인페이지에 하지 않을 수도 있다는 겁니다. suninatas에서는 /member/mem_action.asp에다가 요청을 하네요. 저렇게 코딩을 하고 값을 받아보겠습니다.


 

 

? 뭔가 실패한것 같습니다. 메인페이지가 안나옵니다. 이상해보입니다.

하지만 성공한 화면입니다. 써니나타스 홈페이지에 로그인 시에 alert창이 뜨죠. 



 

저도 처음엔 이거 왜 이런가... 뭘 잘못했지 한참 찾았어요. 그리고 또 위에 캡쳐한 자바스크립트를 해석해보면 else문에서 alert창이 뜨는게 맞다는걸 알수있습니다. 이렇게 로그인 성공여부를 판별하기 어려운 몇몇 사이트가 있으니 주의하시길..

또 로그인 성공인지 실패인지 여부를 확실히 판단하지 않으면 다른 부분에 에러가 없어도 여기서 실패해서 아예 진도가 안 빠지는 경우가 있으니 주의하시고요.

 

GET방식과 POST방식은 웹프로그래밍같은거 공부하시면 많이 알게 되실거에요.

궁금하면 더 찾아보는걸 추천드려요.


오타나 잘못된 지식은 댓글로 알려주세요. 수정하겠습니다.