기본 콘텐츠로 건너뛰기

Android Auto Naver Login (네이버 자동 로그인) - 2


웹뷰에서 자바 스크립트설정이랑 쿠키도 끝낫으니 이제 요청헤더에 몇몇개의 값을 추가해줘야된다.

나중에 로딩할때

        web.loadUrl(NAVER_LOGIN, extraHeaders);
 
이렇게 포함시켜주면 된다.
일단 요청헤더를 추가하기 위해서 Map<String, String> 형식으로 추가해준다.

        Map<String, String> extraHeaders = new HashMap<String, String>();
        extraHeaders.put("Referer", Config.HEADER_REFERERURI);
        extraHeaders.put("ContentType", Config.HEADER_CONTYPE);
        extraHeaders.put("User-Agent", Config.HEADER_UA);

대충 이렇게 설정해주는데 각각의 값은 다음과 같다. (코드에서 Ctrl + C, Ctrl + V라 좀 깁니다...)

[Class Config]
    public static final String HEADER_CONTYPE = "header_ConType = \"application/x-www-form-urlencoded\";";
    public static final String HEADER_UA = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0";
    public static final String HEADER_REFERERURI = "http://static.nid.naver.com/login.nhn?svc=wme&amp;url=http%3A%2F%2Fwww.naver.com&amp;t=20120425";

이렇게 설정해 주고나면 마지막 작업이기도 하고 가장 중요한 부분이 남앗다.
이제 WebViewClient를 이용해서 자동화를 완성해야된다.

@Override
        public void onPageFinished(WebView v, String url){

일단 WebViewClient 를 상속해서 웹뷰를 정의한 클래스 내부에 클래스를 하나 만들어 준다.

Ex) protected class ViewClient extends WebViewClient

그리고 아래와 같은 함수를 정의해 줘야되는데

        @Override
        public void onPageFinished(WebView v, String url){

이 함수는 간략하게 말하자면페이지의 로딩이 끝낫을 때에 무언가를 하라고 정의할때 사용한다.
이제 js 를 하나 짜야되는데...
String Script = "var id = document.getElementById(\"id\");id.value = \"" + [네이버 ID] + "\";" +
                    "var pw = document.getElementById(\"pw\");pw.value = \"" + [네이버 PASS] + "\";" +
                    "document.getElementById(\"login_chk\").click();" +
                    "var button = document.getElementsByClassName(\"btn_global\");" +
                    "for (var i=0;i<button.length; i++) {\n" +
                    "    button[i].click();\n" +
                    "};";

그냥 이렇게 짜면 된다. 중간에 [네이버 ID] 랑 [네이버 PASS] 에는 네이버 id와 password를 담고있는 String 형 변수를 넣어주거나, 그냥 "" 해서 네이버 id, password를 바로 넣어버려도 된다.

저렇게 스크립트가 완성되면저 스크립트를 웹뷰에서 실행시켜주면 된다.
v.evaluateJavascript(Script, null);

그리고 저걸 실행시키면 로그인이 이제 가능해질텐데 로그인만 하고 다른거 할거면 여기서 그만 봐도 된다 이 아래 내용은 카페를 파싱하는 경우 보면 도움이 될것이다.


자...이제 이 함수를 써야된다. (사실 이거 어떻게 설명할지 모르겟어서 그냥 거의 그대로 들고왔다.)

@Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (!url.contains("cafe")) {
                CookieSyncManager.getInstance().sync();
                view.loadUrl([카페 주소]);
            } else if(url.equals([카페 주소])) {
                CookieSyncManager.getInstance().sync();
                dialog.dismiss();
                process_login.this.startActivity(new Intent(getApplicationContext(), [이동할 엑티비티]));
                process_login.this.finish();
            } else {
                view.loadUrl(url);
            }
            return true;
        }

로그인을 한 뒤 순서를 보면 다음과 같다.
  1. 로그인 끝
  2. url 에 cafe가 포함되지 않은 경우에는 [카페 주소]를 로드
  3. 로드가 되면 CookieSyncManager에 쿠키 동기화
  4. dialog 종료 (넣어둔 경우만 해당)
  5. 할거 다 했으므로 다른 엑티비티로 전환
  6. 웹뷰가 포함된 엑티비티를 종료
그리고 가끔 가다가...네이버에서 로그인 몇번 틀리면 아래 보안코드인가 입력하라고 하는데...이건... 현재 코드에서는 수동으로 해줘야된다 (아직 않넣어둠...)

//2016-08-25 글 수정 : 네이버 로그인 페이지 수정으로 인한 버튼 CSS선택자 수정

댓글

  1. 답글
    1. 안녕하세요. 답글이 늦어져서 죄송합니다
      그 위에서 작성한 js에서의 .int_jogin은 네이버 로그인 페이지에 있는 로그인 버튼에 대한 CSS 선택자입니다.

      삭제
    2. 혹시 몰라서 확인해보니 네이버가 로그인 하는곳을 약간 수정해놨는지 로그인 버튼에 대한 CSS 선택자가 btn_global로 바꿔져 잇네요... 위에 스크립트를 이용해서 네이버 로그인을 하실거면 int_jogin 을 btn_global 로 바꾸셔서 사용하시면 될 것 같습니다.

      삭제
  2. 안녕하세요 저는 컴퓨터/보안 관련 공부를 하고있는 학생입니다. 안드로이드에서 네이버 자동로그인 관련 자료를 검색하던 중 선생님의 블로그를 보게되었습니다. 블로그에 올려주신 코드를 보았을때 중간중간 이해가 잘 되지 않는 부분들이 있어서.. 혹시 코드 공유가 가능할까요? 학습용으로만 사용하겠습니다.

    답글삭제
  3. 안녕하세요 저는 컴퓨터/보안 관련 공부를 하고있는 학생입니다. 안드로이드에서 네이버 자동로그인 관련 자료를 검색하던 중 선생님의 블로그를 보게되었습니다. 블로그에 올려주신 코드를 보았을때 중간중간 이해가 잘 되지 않는 부분들이 있어서.. 혹시 코드 공유가 가능할까요? 학습용으로만 사용하겠습니다.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

C언어 register 변수의 함정카드

C언어를 하다보면 register 라는 CPU의 레지스터에 자료를 저장하는 변수를 알수있다. 대신에 한 프로그램에서 최대 2개 정도까지만 사용이 가능하고 지역변수만 가능 및 32bit CPU는 32bit 크기의 변수만 사용 가능하다. 장점만 보면 기본적으로 메모리쪽에 저장되는 일반 변수들보다 더 빠르게 접근이 가능할 것 같은데...인라인 어셈이랑 메모리랑 레지스터랑 비교하면 어떤게 가장 빠른지 궁금해서 한번 테스트 해보게 되었다. 우선 테스트 해볼 코드는 다음과 같다. 거의 동일한 연산을 하고 다른 점이 있다면 인라인 어셈은 전부 다 레지스터를 이용해서 연산한다는 정도...? 위의 코드를 컴파일 해서 실제로 돌려보면 실행 결과는 다음과 같이 나온다. !? 그냥 아무런 형식도 지정해주지 않은 auto와 똑같은 결과가 나온다. # C언어는 기본적으로 아무런 형식을 지정해주지 않으면 auto로 해준다. # int a => auto int a 그래서 어째서 저런 결과가 나왔는지 컴파일에 옵션을 줘서 어셈파일을 분석해 보았다. 인라인 어셈 auto for register for push ebp mov ebp, esp mov ecx, 0 jmp SHORT $INLoop$3 $INLoop$3: cmp ecx, 10000000 jae SHORT $EXIT$4 mov eax, ecx shl eax, 2 inc ecx jmp SHORT $INLoop$3 $EXIT$4: cmp ebp, esp call __RTC_CheckEsp popebp ret,0 push ebp mov ebp, esp sub esp, 8 mov DWORD PTR [ebp-8], -858993460 mov DWORD PTR [ebp-4], -858993460 mov DWORD PTR _i$2[ebp], 0 jmp SHORT $LN4@For $LN...

Android Auto Naver Login (네이버 자동 로그인) - 1

# CAUTION # 시작하기 전에 이 방식은 약간의 편법 을 이용한 방식이고 안드로이드 4.4 이상 부터 지원하는 것을 알려둔다... (그리고 현재 라이브러리로 만드는 중) 사실 이 내용은 누군가의 부탁을 받아서 만들기 시작한건데, 다 완성도 되고 부탁한 애도 관련 일 다 끝낸거 같으니까 포스팅한다... 안드로이드에서 네이버 로그인을 위해서는 간단하게 네이버 API를 사용해서 로그인 하는 방식이 주로 보편적으로 이용된다. 위와 같은 api들이 있는데 네이버 메일을 파싱하거나 네이버 카페의 글 들을 파싱해야되는경우 API 가 없기 때문에 다른 방식을 사용해서 해야된다. 지금부터 그 과정중 가장 기본이되는 네이버 로그인부터 시작해보도록 한다. https://nid.naver.com/nidlogin.login 에서의 네이버 로그인 과정을 분석해보면 id, pw의 길이를 검사해서 입력햇는지 검사 입력되엇으면 http://static.nid.naver.com/enclogin/keys.nhn 또는 https://nid.naver.com/login/ext/keys.nhn 에 접속해서 랜덤 값을 가져온다 js 에서 RSA 암호화  특정 형식으로 POST 쿠키 받기 간략하게 이러한 과정을 거치는데... 내가 아는 한에서는 안드로이드에서는 js 를 돌릴수는 있지만 C# 처럼 자유롭게(?) 이용하는 것이 힘들다. 그래서 처음 선택한 방안이 HtmlUnit 이라는 것과 Sel..뭔 라이브러리가 있는데 여러개 전부 다 테스트를 해 보았지만 전부 작동이 되지를 않았다... 그래서 그냥 라이브러리 없이 진행하기로 했다. 일단 하는 방식은 간단하게 다음과 같다. 웹뷰를 이용해서 로그인 쿠키유지 엄청 간단하다. 그런데 이러한 의문이 들 수도 있다. Q1. 웹뷰를 쓰면 입력을 수동으로 해야될텐데, 그럼 자동이 아니잖아??? A. 웹뷰 써도 자동으로 할 수 있어! 이제 답을 말하자면 WebView에서 ID와 PW...