python으로 Clien 로그인하여 글남기기
지난 강좌를 보시고 한분이 website에 로그인후 글을 남기는 과정을 웹 브라우저가 아닌 python만을 사용하여 처리할수 있는지 쪽지를 보내주신 분이계셔서 답장을 해드렸었습니다. 개인적으로 만들고 있는것에 웹로그인이 필요하여 겸사겸사 간단하게 강좌를 작성해봅니다.
Clien 로그인하기
우선 로그인 전에 Cookie와 SSL에 대해서 알아보겠습니다.
Cookie란?
사용자에 대한 정보를 사용자 PC에 보관하기 위해서 웹 사이트에 웹 브라우저로 전송하는 정보입니다. 웹 사이트에 접속하면 웹 사이트는 PC에 저장된 쿠키의 내용을 읽고, 이용자의 정보를 얻을 수 있습니다. 간편히 말해 Cookie는 사용자의 신분증과 같은것으로 생각 하시면 되겠습니다. Cookie와 비슷한 Session이란것도 있는데요 Session 은 사용자의 PC에 저장을 하는 것이 아니라 서버에 저장합니다.
SSL이란?
Secure socket layer의 약자로 정보를 암호화하여 송/수신하는 프로토콜입니다. 간단히 말하면 SSL을 적용을 안했을때는 사용자가 로그인을 할때 서버로 패킷을 전송할때 사용자의 아이디와 비밀번호가 그대로 노출이 되게 됩니다. 하지만 적용을 하였을땐 아이디와 비밀번호가 암호화 되어 전송이 되기에 악의적인 사용자로부터 사용자의 아이디와 비밀번호가 조금 더 안전하다고 보시면 됩니다.
※저는 python 3.4버전을 사용하고 있습니다.
import http.cookiejar #Cookie를 관리하기 위해 사용합니다. import urllib import ssl #ssl을 적용합니다. cj = http.cookiejar.CookieJar() #Cookie 적용 https_sslv23_handler = urllib.request.HTTPSHandler(context=ssl.SSLContext(ssl.PROTOCOL_SSLv23)) #python의 ssl protocol_SSLv23을 적용하기 위한 handler opener = urllib.request.build_opener(https_sslv23_handler,urllib.request.HTTPCookieProcessor(cj))#SSL과 Cookie를 사용하는 opner를 만듭니다. opener.addheaders=[('User-agent','Mozilla/5.0'),('Accept-Language', 'ko-KR')] #Header에 필요한 것들을 추가 시켜줍니다. urllib.request.install_opener(opener)#urllib에 생성해둔 opner를 만들어둡니다. login_url = "https://clien.net" #login시 ssl을 이용하기에 https를 사용하는 주소를 적어두었습니다. url = "http://clien.net" #login을 제외한 데이터는 http를 이용하여 사용합니다. login_info = { 'mb_id' : "Clien ID",#clien id를 적습니다. 'mb_password' : "Clien Password"#password를 적습니다. } login_request = urllib.parse.urlencode(login_info) req = urllib.request.Request(login_url+'/cs2/bbs/login_check.php',login_request.encode('UTF-8')) res = urllib.request.urlopen(req)
다음은 python의 ssl 프로토콜입니다. 저는 SSLv23을 적용시켜두었는데요 다른의미는 없고 SSLv23이 서버의 SSLv2를 제외한 남머지를 다 지원해주기에 SSLv23을 적용하였습니다.
login_info의 mb_id는 홈페이지의 아이디입력하는 text창의 id이며 mb_password는 패스워드를 입력하는 곳의 text창입니다. 저곳을 확인 하는 방법은 전에 BeautifulSoup을 이용할때 확인했던 방법으로 찾으시면 됩니다.
login_request는 login_info를 바탕으로 Request를 날릴수있게 변환하여 주는 과정입니다.
이제 패킷을 날리기 위한 준비가 다 끝이났습니다. ullib.request.Request()함수를 사용하여 Request를 생성하고 urlopen을 통하여 Request를 전송하면 로그인이 끝나게 됩니다.
Clien에 글올리기
모두의 공원과 아이포니앙에 대해서 패킷을 확인 해보았더니
#모두의 공원 Content-Disposition: form-data; name="bo_table"(게시판 이름) park Content-Disposition: form-data; name="wr_subject"(제목) python으로 모두의 공원 글쓰기 test입니다. Content-Disposition: form-data; name="wr_content"(내용) 테스트후 정리하여 팁과강좌에 글올리겠습니다.\n글은 곧 삭제됩니다.\nyangbeom Content-Disposition: form-data; name="wr_ccl_nc"(ccl영리목적) nc Content-Disposition: form-data; name="wr_ccl_nd"(ccl 변경) nd #아이포니앙 Content-Disposition: form-data; name="bo_table"(게시판이름) cm_iphonien Content-Disposition: form-data; name="ca_name"(카테고리) [잡담] Content-Disposition: form-data; name="wr_subject" python으로 아이포니앙에 글쓰기 test입니다. Content-Disposition: form-data; name="wr_content" 테스트 후 정리하여 팁과 강좌에 글올리겠습니다.\n 글은 곧 삭제됩니다.\n yangbeom
와 같이 전송을 해주면 올라가게 되어있습니다. 따라서 다음과 같이 작성을 해주었습니다. 다른 게시판의 경우 bo_table을 변경해주시면 전송이 될 것으로 보입니다.
write_info = {} write_info[0] = { 'bo_table':'park', 'wr_subject':"python으로 모두의 공원 글쓰기 test입니다.", 'wr_content':"테스트 후 정리하여 팁과 강좌에 글올리겠습니다.\n 글은 곧 삭제됩니다.\n yangbeom", 'wr_ccl_nc':"nc", 'wr_ccl_nd':"nd" } write_info[1] = { 'bo_table':"cm_iphonien", 'ca_name':"[잡담]", 'wr_subject':"python으로 아이포니앙에 글쓰기 test입니다.", 'wr_content':"테스트 후 정리하여 팁과 강좌에 글올리겠습니다.\n 글은 곧 삭제됩니다.\n yangbeom" }
위에 로그인과 다른점은 Request를 보내야할곳이 /cs2/bbs/login_check.php이 아닌 /cs2/bbs/write_update.php 이란것입니다.
강좌를 위해 for문을 이용하여 모두의 공원가 아이포니앙에 글을 올려보도록하겠습니다.
for i in range(0,2): write_request = urllib.parse.urlencode(write_info[i]) req = urllib.request.Request(url+"/cs2/bbs/write_update.php",write_request.encode('UTF-8')) res = urllib.request.urlopen(req)
실행결과는 다음과 같습니다.
짧은 시간내에 request를 보내게 된다면 모든 글이 올라가지 않을수 있습니다.










