본문 바로가기
컴퓨터관련

네이버 로그인 후 카페목록 가져오기

by 기록이답이다 2016. 11. 20.
반응형

예전에 네이버 웹툰 다운로드에 필요해서 htmlunit이용하여 네이버 로그인하기 포스팅(http://bugnote.tistory.com/48)을 등록한적이 있다.

 

그후 어떤분이 댓글로 네이버 로그인을 구현하려하는데 잘 안된다고해서 소스를 올려드려야지 했는데...

한참이 지났네...

 

어찌됐든... HtmlUnit을 이용하여 네이버에 로그인한 후 나의카페목록 일부를 가져오는 법을 해보려한다.

 

카페목록 가져오기 프로세스

1. JSoup을 이용하여 카페 목록을 가져와 뿌려준다.

JSoup 관련 부분은  JSoup 이용하여 웹툰 다운로드하기 (http://bugnote.tistory.com/47) 을 참조하면 된다.

 

2. 1에서 카페목록을 가져오기전 로그인이 필요하기 때문에 HtmlUnit을 이용하여 네이버 로그인 처리를 한다.

 

3. 2에서 로그인이 완료가 되었으면 다시 1의 카페 목록을 가져와 parsing해서 카페 이름을 뿌려준다.

 

4. 끝!!!

 

이제 부분별로 살펴보기로 하자.

 

    public void getMyCafeList() throws Exception {
        Document cafeListDoc = getDocument(CAFE_URL);
        if(cafeListDoc != null) {
            Elements mycafeList = cafeListDoc.select("ul#CafeNoticeArea > li");
            for(Element e : mycafeList) {
                System.out.println(e.select("p.tit > a").attr("title"));
            }
        }
    }

 

getMyCafeList 메소드를 보면

 

Document cafeListDoc = getDocument(CAFE_URL);

 

이 부분이 JSoup 이용하여 카페목록을 가져오는 부분이다.

 

위에서 언급된 getDocument 메소드는 아래와 같다.

 

    private Document getDocument(String url) throws Exception {
        Document doc = null;
        if(!loginService.isLogin()) {

            boolean loginSuccess = loginService.doLogin("아이디", "비밀번호", LOGIN_URL");
            if(loginSuccess) cookies = loginService.makeLoginCookie();
        }
        
        if(cookies != null) doc = Jsoup.connect(url).cookies(cookies).get();
        else doc = Jsoup.connect(url).get();
        
        return doc;
    }

 

설명하자면 로그인이 되어있지 않으면 로그인처리를 한 후 쿠키를 가져와 로그인시에 사용하는 것이다.

 

로그인은 loginService.doLogin 에서 처리를 한다.

 

이제 loginService.doLogin 메소드를 살펴보자.

 

loginService는 NaverLoginServiceImpl.java 파일로 Interface ILogin을 implements 하고 있다.

NaverLoginServiceImpl이 ILogin을 implements 한 이유는 코드의 재사용성 때문이다.

 

지금 만드는 HtmlUnit을 이용한 Naver Login 소스의  getDocument를 이용해서 login처리시에 daum, naver등등 로그인처리가 필요할때 getDocument 는 그대로 사용하고(코드의 재사용성) ILogin을 implements 한 파일들만 따로 만들면 Login이 필요한 사이트에 이용할 수 있다.

 

 

코드를 재사용하여 다른 사이트에 로그인처리하는 부분은 나중에 포스팅하기로하고 우선 doLogin 메소드를 계속 살펴보자.

 

    public boolean doLogin(String id, String pw, String loginUrl) throws Exception {
        webClient = new WebClient(BrowserVersion.FIREFOX_38);
        webClient.waitForBackgroundJavaScript(5000);
        
        currPage = webClient.getPage(loginUrl);
        
        HtmlForm form = currPage.getFormByName("frmNIDLogin");
        HtmlTextInput inputId = form.getInputByName("id");
        HtmlPasswordInput inputPw = (HtmlPasswordInput)form.getInputByName("pw");
        HtmlImageInput button = (HtmlImageInput)form
                .getByXPath("//input[@alt='로그인']").get(0);
 
        inputId.setValueAttribute(id);
        inputPw.setValueAttribute(pw);
        currPage = (HtmlPage)button.click();
        
        if(!!currPage.asText().contains("Naver Sign in")) {
            isLogin = false;
            throw new Exception("cannot login with the id and pw");
        } else {
            isLogin = true;
        }
        
        return isLogin;
    }

 

doLogin 메소드를 살펴보면 htmlunit이용하여 네이버 로그인하기의 login 메소드와 동일한것을 볼 수 있다. 설명은 htmlunit이용하여 네이버 로그인하기(http://bugnote.tistory.com/48) 참조

 

 

지금까지 카페목록가져오기 프로세스의 1번과 2번을 설명했다.

 

내용이 길어지는 관계로 3번 카페목록 가져오는 부분은 이전에 등록한

JSoup 이용하여 웹툰 다운로드하기(http://bugnote.tistory.com/47) 를 참조하면 어떤 방식으로 해야 하는지 알 수 있다.

 

혹시라도 잘 모르겠거나 방법이 궁금한 사람은 댓글로 달아주세요....

그러면 그때 다시 설명해드릴게요.

 

지금까지 설명한 내용의 전체 소스는 아래와 같다.

아래 소스에는 다음 포스팅에서 설명할 카포목록 가져오기 부분이 포함되어 있다.

사실 카페목록 가져오기는 설명이 길뿐 소스는 3-4줄 밖에 안된다...

 

ILogin.java



package test.login.ksw;

import java.util.Map;

public interface ILogin {
    public boolean isLogin();
    public Map makeLoginCookie();
    public boolean doLogin(String id, String pw, String loginUrl) throws Exception;
}

 

 

로그인하여 카페목록 가져오고 하는 모든일을 하는 class

 

NaverLogin.java



package test.login.ksw;
import java.util.Map;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class NaverLogin {
    private static final String LOGIN_URL = "http://static.nid.naver.com/login.nhn";
    private static final String CAFE_URL = "http://section.cafe.naver.com/SectionHome.nhn?t=3";

    private ILogin loginService;
    private Map cookies;
    
    private String id;
    private String pw;
    
    public static void main(String[] args) throws Exception {
        new NaverLogin("아이디", "비밀번호");
    }
    
    public NaverLogin(String id, String pw) throws Exception {
        this.id = id;
        this.pw = pw;
        loginService = new NaverLoginServiceImpl();
        getMyCafeList();
    }
    
    private Document getDocument(String url) throws Exception {
        Document doc = null;
        if(!loginService.isLogin()) {
            boolean loginSuccess = loginService.doLogin(id, pw, LOGIN_URL); 
            if(loginSuccess) cookies = loginService.makeLoginCookie();
        }
        
        if(cookies != null) doc = Jsoup.connect(url).cookies(cookies).get();
        else doc = Jsoup.connect(url).get();
        
        return doc;
    }



    public void getMyCafeList() throws Exception {
        Document cafeListDoc = getDocument(CAFE_URL);
        if(cafeListDoc != null) {
            Elements mycafeList = cafeListDoc.select("ul#CafeNoticeArea > li");
            for(Element e : mycafeList) {
                System.out.println(e.select("p.tit > a").attr("title"));
            }
        }
    }
}

 

NaverLogin처리를 담당하는 class ILogin을 implements했다.

 

NaverLoginServiceImpl.java



package test.login.ksw;
import java.util.HashMap;
import java.util.Map;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.CookieManager;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlImageInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.util.Cookie;

public class NaverLoginServiceImpl implements ILogin {
    private boolean isLogin;
    private WebClient webClient;
    private HtmlPage currPage;
    private Map cookies;

    @Override
    public boolean isLogin() {
        return isLogin;
    }
    
    public Map makeLoginCookie() {
        cookies = new HashMap();
        CookieManager cookieManager = webClient.getCookieManager();
        java.util.Set cookieSet = cookieManager.getCookies();
        for(Cookie c : cookieSet) {
            cookies.put(c.getName(), c.getValue());
        }
        
        return cookies;
    }   

    public boolean doLogin(String id, String pw, String loginUrl) throws Exception {
        webClient = new WebClient(BrowserVersion.FIREFOX_38);
        webClient.waitForBackgroundJavaScript(5000);
        
        currPage = webClient.getPage(loginUrl);
        
        HtmlForm form = currPage.getFormByName("frmNIDLogin");
        HtmlTextInput inputId = form.getInputByName("id");
        HtmlPasswordInput inputPw = (HtmlPasswordInput)form.getInputByName("pw");
        HtmlImageInput button = (HtmlImageInput)form
                .getByXPath("//input[@alt='로그인']").get(0);
 
        inputId.setValueAttribute(id);
        inputPw.setValueAttribute(pw);
        currPage = (HtmlPage)button.click();
        
        if(!!currPage.asText().contains("Naver Sign in")) {
            isLogin = false;
            throw new Exception("cannot login with the id and pw");
        } else {
            isLogin = true;
        }
        
        return isLogin;
    }
}

 

이 소스를 이용하면 네이버 카페에 자동으로 방문하게 하는 프로그램도 만들 수 있을것이다.

그러면 네이버 카페에 오랫동안 방문하지 않아서 등급이 내려가는 일따위는 없겠지...

 

 

 

 

 

반응형