요즘 새 카메라를 들이기 위해 SLR클럽과 펜탁스클럽을 살펴보고 있다.
열심히 봤지만 며칠째 별로 소득은 없는데.. 점점 장터를 보는 시간이 아까워져서 간단한 프로그램을 만들었다.
별다른 기능은 없고, 장터에서 특정 검색어로 쿼리를 날려서 새로운 검색결과가 나오면 email로 알려주는 기능이다.
전체적인 구조는 다음과 같이 만들었다.
Check 프로그램 -> Cron에 의해 주기적인 실행 -> 새로운 매물이 있을때 생성되는 Cron log가 메일로 포워딩
새로운 매물이 있는지를 검사하는 Check 프로그램은 wget을 이용한 간단한 shell 프로그램이다.
이 포스트의 주제인 wget 프로그램은 인자로 URL을 주면 HTTP request를 보내 response를 파일로 저장할 수 있다.
문제는 SLR클럽은 로그인을 안하면 장터를 볼 수가 없다는 점.
로그인이 되도록 해야지만 SLR클럽의 매물을 읽어올 수 있다고 알게 된 후 공부를 시작했다. -_-ㅋ
여기서 잠깐 로그인의 원리에 대해 설명하면.. HTTP는 state-less 프로토콜이기 때문에 한번 페이지를 이동할 때마다 새로운 connection을 맺고 response를 받는 식이다. (지속적인 connection을 가지는 경우도 있으나 이 글에선 다루지 않는다.)
다른말로 하면 내가 새로고침을 눌렀을 때, SLR클럽 서버는 내가 로그인을 했는지 안했는지 전혀 모른다는 거다.
이런 HTTP가 가지는 state-less 방식의 한계를 극복하기 위해 cookie가 존재한다. 작동하는 기본 방식은 다음과 같다.
처음 로그인 할 때 ID, PASSWD를 보고 서버와 클라이언트 사이에 쿠키를 만든다.
HTTP request를 보낼때 해당 정보를 같이 보낸다.
이를 통해 서버가 cookie를 보고 "아! 이 request를 보낸 host는 방금전에 로그인했던 XXX로구나!"
라고 알아차리고 올바른 정보를 response해 주게 된다.
위에서 말한 내용에 따라.. 로그인 후 정보 요청을 위해서 wget을 두번 사용한다.
1. 로그인 세션을 만들기 위한 wget 명령어
2. 세션 정보를 첨부하고 URL의 내용을 요청하는 wget명령어.
세부적인 내용을 살펴보면
1.
HTTP request의 POST 파트에 ID와 PASSWD를 실어서 request를 보낸다. -> --post-data 옵션 활용
HTTP response를 받으면서 쿠키를 생성한다 -> --save-cookies 옵션 활용
wget을 실행후에도 쿠키를 유지한다 -> --keep-session-cookies 옵션 활용
즉, 이 글 작성 당시의 SLR클럽 로그인 방식 기준으로
wget --keep-session-cookies --save-cookies cookie --post-data='user_id=XXX&password=YYY' http://m.slrclub.com/login/process.php
하고나면 다음과 같이 cookie 파일이 생성된다.
# HTTP cookie file.
# Generated by Wget on 2011-01-05 10:51:01.
# Edit at your own risk.
.slrclub.com TRUE / FALSE 1296784271 chipkey XXXXXX
.slrclub.com TRUE / FALSE 0 returnChip XXXXXX
.slrclub.com TRUE / FALSE 0 specialkey XXXXXX
.slrclub.com TRUE / FALSE 0 member_id XXXXXX
.slrclub.com TRUE / FALSE 0 SLRV1SESSID XXXXXX
2.
HTTP request를 보낼때 cookie를 불러와서 보낸다 -> --load-cookies 옵션 활용
역시 지금의 SLR클럽을 기준으로
wget --keep-session-cookies --load-cookies cookie "http://www.slrclub.com/bbs/zboard.php?id=used_market"
의 방식으로 적절한 페이지를 얻어 올 수 있었다.
.. 이제 카메라를 사면 되는데 돈이 부족할 뿐이고 ..