AutoBot | 개발 과정 포스팅 #1 - API (KAKAO C#)

2020. 10. 19. 19:43AutoBot

반응형

다운로드

KAKAO_API.zip
6.45MB


들어가기 전

저 또한 공부하며 만든 프로젝트입니다.

많이 부족하고 부실한 코드지만 조금이나마 도움이 됐으면 하는 마음에 포스팅합니다!

 

Kakao 기능은 호흡이 깁니다. (내용이 깁니다.)

최대한 이해하기 쉽게 작성했지만 부족한 점은 댓글로 남겨주세요!

피드백을 받고 수정하겠습니다!


API란?

사전적 용어는 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)로

응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 

제어할 수 있게 만든 인터페이스를 뜻합니다.

 

조금 간단히 말하면 기업(카카오톡, 네이버 등)에서 만든 서비스, 기능을 사용자에게 활용할 수 있도록

해주는 중간 매개체입니다.

 

매우 다방면에서 사용되기 때문에 많은 기업들이 제공하는 서비스이죠.

 

더 자세한 내용은 구글링! 해보시면 되겠습니다.

 


KAKAO API Developers - 개발자 등록

API를 사용할 때 기본적으로 개발자 인증을 해야됩니다. (대부분)

이번 포스팅에선 카카오톡 기능을 사용할 예정이니 카카오톡 개발자 등록을 해보겠습니다.

 

1. 카카오톡 디벨로퍼

developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

링크해둔 페이지에 들어가서 로그인을 해줍니다. (아이디가 없다면 만들어야 돼요)

 

각 동의 항목에 수락후 가입해 줍니다.

 

이러면 끝! (간단하군)

 

2. 내 애플리케이션 등록

상단 부분 '내 애플리케이션' 클릭

 

애플리케이션 추가하기 버튼을 클릭 후

 

각 데이터를 입력해줍니다.

 

앱 이름과 사업자명은 여러분 마음대로 적으셔도 됩니다.

* 사진은 포스팅 메인사진을 다운로드하시면 사용 가능합니다.

 

이러면 여러분의 애플리케이션이 추가되었습니다! (이것도 간단하군)

 


프로젝트 사전 설정

로그인 기능과 메시지를 보내기 기능을 사용하기 위해 애플리케이션 설정을 해주겠습니다.

1. 플랫폼 > Web 등록

Web 플랫폼 등록을 클릭 후

 

간단하게 테스트에 이용하니 네이버 주소로 설정해 줍니다.

 

이 사이트 도메인은 여러분이 개인으로 이용하고 있는 블로그 주소나, 구글 등의 도메인을 사용해도 되지만

후에 있을 '링크 버튼'을 클릭했을 때 설정되는 주소이므로 해외 사이트 주소 등은 사용하지 않는 게 좋습니다.

2. 카카오톡 로그인 > 활성화 설정, Redirect Url 설정

활성화 설정을 'ON'으로 변경하고 Redirect Url을 설정해줍니다.

 

여기서! Redirect란?

 

이용 가능한 웹 페이지를 하나 이상의 URL 주소로 만들어주는 웹 기법입니다.

영어 그대로 Re(다시) + 지시하다(Direct) 페이지죠.

 

예를 들어 www.test.com/page1로 접속을 했을 때 각종 권한(로그인 필요, 등급이 낮음 등)에 맞지 않을 때

다른 주소인 www.test.com/login으로 자동으로 접속되는 웹 페이지가 바로 Redirect 웹 페이지입니다. 

 

여러분이 들으면 알고 있는 대부분의 웹 페이지가 Redirect 기법을 사용 중이죠.

 

자! 그럼 Redirect URL 등록을 해보도록 하죠.

 

이 또한 테스트용이니 www.naver.com/oauth로 설정하겠습니다.

 

3. 동의 항목 > 개인정보 보호, 접근권한 관리 설정

로그인을 하기 위해선 사용자에게 동의를 구하는 설정을 해줘야 합니다.

 

프로필 정보(닉네임/프로필 사진) 설정 클릭 후

 

필수 동의, 카카오 계정으로 정보 수집 후 제공, 동의 목적을 작성 후 저장합니다.

 

이후 카카오톡 메시지 전송 권한을 설정해줍니다.

 

선택 동의, 동의 목적을 작성후 저장해줍니다.

4. 카카오 링크 > 메시지 템플릿 빌더

카카오톡 메시지는 크게 2가지 종류로 전달이 가능합니다.

템플릿 키를 이용한 방법과 Json 데이터를 넘겨주는 방법 총 2가지인데

 

우리가 만들 프로젝트에서는 2가지 방법을 모두 사용하기 때문에 간단한 템플릿을 설정해 주겠습니다.

카카오 링크 > 메시지 템플릿 빌더 바로가기를 클릭합니다.

 

템플릿 만들기 클릭 후

 

기본 'FEED'로 설정돼 있는 걸로 확인을 눌러줍니다.

 

설정은 여러분이 자유롭게 하면 됩니다.

 

저는 제목/설명만 남기고 저장하겠습니다.

 

이제 애플리케이션 설정은 끝났습니다!

프로젝트를 만들어 보죠.

 


프로젝트 제작 - C# WinForm

1. 프로젝트 세팅

Windows Form 앱(. NET Framework) 템플릿으로 만들어줍니다.

 

프로젝트명은 'KAKAO_TEST_API'로 설정해 주겠습니다.

 

솔루션 탐색기 > 추가 > 새 폴더로 폴더를 한 개 만들어줍니다.

폴더 이름은 'Scripts'로 하겠습니다.

 

Scripts 폴더에 새 항목을 만들어 줍니다.

 

클래스 설정 후 KakaoManager.cs로 이름을 설정해줍니다.

 

위와 동일한 방식으로 총 3개의. cs파일을 만들어 줍니다.

 

그리고 프로젝트명 > 새 항목 > 양식(Windows Forms)을 만들어 줍니다.

이름은 KakaoLogInPage로 하겠습니다.

2. UI 설정

전체적인 UI 모습입니다. 

 

빨간색 부분은 PictureBox

주황색 부분은 Label

노란색 부분은 Button

 

도구 상자(Ctrl + Alt + x)에서 각 도구를 검색 후 드래그 드롭을 하면 설정이 가능합니다.

3. UI 속성 설정

3-1. Form1.cs

도구(UI)를 클릭 후 F4를 누르면 속성을 편집할 수 있습니다. 

 

여기서,

(Name)은 변수 이름을 설정해주는 부분이고

Text는 UI의 텍스트를 설정해주는 부분입니다.

 

각 속성은 아래와 같습니다.

 

로그인 버튼

- (Name) : Btn_LogIn

- Text : 로그인 버튼

 

로그아웃 버튼

- (Name) : Btn_LogOut

- Text : 로그아웃 버튼

 

템플릿 메시지 버튼

- (Name) : Btn_TemplateMessage

- Text : 템플릿 메시지

 

커스텀 메시지 버튼

- (Name) : Btn_CustomMessage

- Text : 커스텀 메시지

 

유저 데이터 버튼

- (Name) : Btn_UserData

- Text : 유저 데이터

 

사진 (PictureBox)

- SizeMode : StretchImage

- (Name) : PictureBox_UserImg

- Size : 120, 120

 

이름 (Label)

- (Name) : Label_UserName

- Font : 굴림, 40pt

3-2. KakaoLogInPage.cs

KakaoLogInPage는 WebBrowser를 드래그 드롭만 하시면 됩니다.

4. 패키지 추가

도구 > NuGet 패키지 관리자 > 설루션용 NuGet 패키지 관리

 

패키지 추가란 우리가 프로그램 제작에 좀 더 편리한 외부 도구를 추가하는 작업입니다.

우리가 추가할 패키지는 총 2가지로

 

* Newtonsoft.JSON : JSON파일 조작에 더 편리한 기능을 제공합니다.

* RestSharp : Redirect, Responec 작업에 더 편리한 기능을 제공합니다.

 

 

정상적으로 설치가 되면 이렇게 2가지 패키지가 보이게 됩니다.

 

자! 이제 드디어 코딩을 해볼까요?

5. 코딩

* 복사 붙여 넣기를 하면 오류가 나기 쉽습니다. 프로젝트 이름과 클래스명이 저와 동일하지 않을 경우는 더욱!

* 처음 배우시는 분들은 직접 입력해보는 걸 추천드려요!

* 코드의 자세한 설명은 이후에 설명합니다. 우선 동작하는지 확인 후 진행해주세요.

* Form1.cs, KakaoLogInPage.cs [디자인]으로 열리시는 분들은 F7을 누르면 코드로 들어갈 수 있습니다.

* KakaoApiEndPoint.cs 부분 주의 사항

 

KakaoApiEndPoint.cs

class KakaoApiEndPoint
{
    // API 키
    public const string KakaoRestApiKey = "여러분의 키";
    public const string KakaoSendMessageKey = "여러분의 템플릿 키";
 
    // 리다이렉트 url
    public const string KakaoRedirectUrl = "https://www.naver.com/oauth";
 
    // 로그인 url
    public const string KakaoLogInUrl = "https://kauth.kakao.com/oauth/authorize?client_id=" + KakaoRestApiKey + "&redirect_uri=" + KakaoRedirectUrl + "&response_type=code";
 
    // 루트 url
    public const string KakaoHostOAuthUrl = "https://kauth.kakao.com";
    public const string KakaoHostApiUrl = "https://kapi.kakao.com";
 
    // 이벤트 url
    public const string KakaoOAuthUrl = "/oauth/token"; // AccessToken
    public const string KakaoUnlinkUrl = "/v1/user/unlink"; // LogOut
    public const string KakaoTemplateMessageUrl = "/v2/api/talk/memo/send"; // Template 메시지
    public const string KakaoDefaultMessageUrl = "/v2/api/talk/memo/default/send"; // Default 메시지
    public const string KakaoUserDataUrl = "/v2/user/me"; // 사용자 데이터
}

KakaoData.cs

using System.Drawing;

class KakaoData
{
    // 유저 데이터
    public static string userToken; // 유저 토큰
    public static string accessToken; // 에셋 토큰
    public static string UserNickName; // 사용자 이름
    public static Bitmap UserImg; // 사용자 이미지
}

KakaoManager.cs

using Newtonsoft.Json.Linq;
using RestSharp;
using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;

class KakaoManager
{
    public KakaoManager()
    {
    }

    public bool GetUserToKen(WebBrowser webBrowser)
    {
        string wUrl = webBrowser.Url.ToString();
        string userToken = wUrl.Substring(wUrl.IndexOf("=") + 1);

        if (wUrl.CompareTo(KakaoApiEndPoint.KakaoRedirectUrl + "?code=" + userToken) == 0)
        {
            Console.WriteLine("유저 토큰 얻기 성공");
            KakaoData.userToken = userToken;
            return true;
        }
        else
        {
            return false;
        }
    }

    public bool GetAccessToKen()
    {
        var client = new RestClient(KakaoApiEndPoint.KakaoHostOAuthUrl);

        var request = new RestRequest(KakaoApiEndPoint.KakaoOAuthUrl, Method.POST);
        request.AddParameter("grant_type", "authorization_code");
        request.AddParameter("client_id", KakaoApiEndPoint.KakaoRestApiKey);
        request.AddParameter("redirect_uri", KakaoApiEndPoint.KakaoRedirectUrl);
        request.AddParameter("code", KakaoData.userToken);

        var restResponse = client.Execute(request);
        var json = JObject.Parse(restResponse.Content);

        KakaoData.accessToken = json["access_token"].ToString();

        return true;
    }

    public void KakaoTalkLogOut()
    {
        var client = new RestClient(KakaoApiEndPoint.KakaoHostApiUrl);

        var request = new RestRequest(KakaoApiEndPoint.KakaoUnlinkUrl, Method.POST);
        request.AddHeader("Authorization", "bearer " + KakaoData.accessToken);

        if (client.Execute(request).IsSuccessful)
        {
            Console.WriteLine("로그아웃 성공");
        }
        else
        {
            Console.WriteLine("로그아웃 실패");
        }
    }

    /// <summary>
    /// 템플릿 메시지 보내기
    /// </summary>
    /// <param name="templateNum">템플릿 string 값</param>
    public void KakaoTemplateSendMessage(string templateNum)
    {
        var client = new RestClient(KakaoApiEndPoint.KakaoHostApiUrl);

        var request = new RestRequest(KakaoApiEndPoint.KakaoTemplateMessageUrl, Method.POST);
        request.AddHeader("Authorization", "bearer " + KakaoData.accessToken);
        request.AddParameter("template_id", templateNum);

        if (client.Execute(request).IsSuccessful)
        {
            Console.WriteLine("메시지 보내기 성공");
        }
        else
        {
            Console.WriteLine("메시지 보내기 실패");
        }
    }

    /// <summary>
    /// 커스텀 메시지 보내기
    /// </summary>
    /// <param name="sendMessageObject">템플릿 JObject 값</param>
    public void KakaoDefaultSendMessage(JObject sendMessageObject)
    {
        var client = new RestClient(KakaoApiEndPoint.KakaoHostApiUrl);

        var request = new RestRequest(KakaoApiEndPoint.KakaoDefaultMessageUrl, Method.POST);
        request.AddHeader("Authorization", "bearer " + KakaoData.accessToken);
        request.AddParameter("template_object", sendMessageObject);

        if (client.Execute(request).IsSuccessful)
        {
            Console.WriteLine("메시지 보내기 성공");
        }
        else
        {
            Console.WriteLine("메시지 보내기 실패");
        }
    }

    public void KakaoUserData()
    {
        var client = new RestClient(KakaoApiEndPoint.KakaoHostApiUrl);

        var request = new RestRequest(KakaoApiEndPoint.KakaoUserDataUrl, Method.GET);
        request.AddHeader("Authorization", "bearer " + KakaoData.accessToken);

        var restResponse = client.Execute(request);
        var json = JObject.Parse(restResponse.Content);

        // 프로필 사진이 없을 경우 예외 처리
        if (json["properties"]["profile_image"] != null)
        {
            string UserImgUrl = json["properties"]["profile_image"].ToString();
            KakaoData.UserImg = WebImageView(UserImgUrl);
        }

        KakaoData.UserNickName = json["properties"]["nickname"].ToString();

        Console.WriteLine(json);
    }

    // 웹 이미지 다운로드
    private static Bitmap WebImageView(string url)
    {
        try
        {
            using (WebClient Downloader = new WebClient())
            using (Stream ImageStream = Downloader.OpenRead(url))
            {
                Bitmap DownloadImage = Bitmap.FromStream(ImageStream) as Bitmap;
                Console.WriteLine("이미지 다운 성공");
                return DownloadImage;
            }
        }
        catch (Exception)
        {
            Console.WriteLine("이미지 다운 실패");
            return null;
        }
    }
}

Form1.cs

using Microsoft.Win32;
using Newtonsoft.Json.Linq;
using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace KAKAO_TEST_API
{
    public partial class Form1 : Form
    {
        private KakaoLogInPage kakaoLoginPage;
        private KakaoManager kakaoManager;

        public Form1()
        {
            InitializeComponent();

            Btn_LogIn.Click += Btn_Login_Click; // 클릭 이벤트 추가
            Btn_LogOut.Click += Btn_Logout_Click; // 클릭 이벤트 추가
            Btn_UserData.Click += Btn_UserData_Click; // 클릭 이벤트 추가
            Btn_TemplateMessage.Click += Btn_TemplateSendMessage_Click; // 클릭 이벤트 추가
            Btn_CustomMessage.Click += Btn_DefaultSendMessage_Click; // 클릭 이벤트 추가

            this.Load += KakaoMain_Load; // 로드 이벤트 추가

            kakaoManager = new KakaoManager();

            Console.WriteLine(KakaoApiEndPoint.KakaoLogInUrl);
        }

        private void KakaoMain_Load(object sender, EventArgs e)
        {
            Console.WriteLine("폼 로드");

            //WebBrowserVersionSetting();
        }

        private void Btn_Login_Click(object sender, EventArgs e)
        {
            Console.WriteLine("로그인 버튼");
            kakaoLoginPage = new KakaoLogInPage();
            kakaoLoginPage.ShowDialog();
        }

        private void Btn_Logout_Click(object sender, EventArgs e)
        {
            Console.WriteLine("로그아웃 버튼");
            kakaoManager.KakaoTalkLogOut();
        }

        private void Btn_TemplateSendMessage_Click(object sender, EventArgs e)
        {
            Console.WriteLine("템플릿 메시지 보내기 버튼");
            kakaoManager.KakaoTemplateSendMessage(KakaoApiEndPoint.KakaoSendMessageKey);
        }

        private void Btn_DefaultSendMessage_Click(object sender, EventArgs e)
        {
            Console.WriteLine("커스텀 메시지 보내기 버튼");

            JObject SendJson = new JObject();
            JObject LinkJson = new JObject();

            LinkJson.Add("web_url", "https://developers.kakao.com");
            LinkJson.Add("mobile_web_url", "https://developers.kakao.com");

            SendJson.Add("object_type", "text");
            SendJson.Add("text", "커스텀 메시지 입니다.\n\n https://jaeho0613.tistory.com/ \n\n");
            SendJson.Add("link", LinkJson);
            SendJson.Add("button_title", "안녕");

            Console.WriteLine(SendJson);

            kakaoManager.KakaoDefaultSendMessage(SendJson);
        }

        private void Btn_UserData_Click(object sender, EventArgs e)
        {
            Console.WriteLine("유저 데이터");
            kakaoManager.KakaoUserData();

            PictureBox_UserImg.Image = KakaoData.UserImg;
            Label_UserName.Text = KakaoData.UserNickName;
        }

        private void WebBrowserVersionSetting()
        {
            RegistryKey registryKey = null; // 레지스트리 변경에 사용 될 변수

            int browserver = 0;
            int ie_emulation = 0;
            var targetApplication = Process.GetCurrentProcess().ProcessName + ".exe"; // 현재 프로그램 이름

            // 사용자 IE 버전 확인
            using (WebBrowser wb = new WebBrowser())
            {
                browserver = wb.Version.Major;
                if (browserver >= 11)
                    ie_emulation = 11001;
                else if (browserver == 10)
                    ie_emulation = 10001;
                else if (browserver == 9)
                    ie_emulation = 9999;
                else if (browserver == 8)
                    ie_emulation = 8888;
                else
                    ie_emulation = 7000;
            }

            try
            {
                registryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(
                    @"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION", true);

                // IE가 없으면 실행 불가능
                if (registryKey == null)
                {
                    MessageBox.Show("웹 브라우저 버전 초기화에 실패했습니다..!");
                    Application.Exit();
                    return;
                }

                string FindAppkey = Convert.ToString(registryKey.GetValue(targetApplication));

                // 이미 키가 있다면 종료
                if (FindAppkey == ie_emulation.ToString())
                {
                    registryKey.Close();
                    return;
                }

                // 키가 없으므로 키 셋팅
                registryKey.SetValue(targetApplication, unchecked((int)ie_emulation), RegistryValueKind.DWord);

                // 다시 키를 받아와서
                FindAppkey = Convert.ToString(registryKey.GetValue(targetApplication));

                // 현재 브라우저 버전이랑 동일 한지 판단
                if (FindAppkey == ie_emulation.ToString())
                {
                    return;
                }
                else
                {
                    MessageBox.Show("웹 브라우저 버전 초기화에 실패했습니다..!");
                    Application.Exit();
                    return;
                }
            }
            catch
            {
                MessageBox.Show("웹 브라우저 버전 초기화에 실패했습니다..!");
                Application.Exit();
                return;
            }
            finally
            {
                // 키 메모리 해제
                if (registryKey != null)
                {
                    registryKey.Close();
                }
            }
        }
    }
}

 

KakaoLogInPage.cs

using System;
using System.Windows.Forms;

namespace KAKAO_TEST_API
{
    public partial class KakaoLogInPage : Form
    {
        KakaoManager kakaoManager;

        public KakaoLogInPage()
        {
            InitializeComponent();

            kakaoManager = new KakaoManager();

            webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;

            webBrowser1.Navigate(KakaoApiEndPoint.KakaoLogInUrl);
        }

        private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if(kakaoManager.GetUserToKen(webBrowser1))
            {
                Console.WriteLine("토큰 얻기 종료");
                kakaoManager.GetAccessToKen();
                this.Close();
            }
        }
    }
}

 

* 코드에 대한 궁금점은 댓글로 남겨주세요!

 

위에 코드를 작성 후 F5를 눌러서 실행시켜 줍시다.

 

로그인 버튼을 누르면 카카오톡 로그인 페이지가 나오게 됩니다.

한번 로그인을 해보죠.

 

그럼 한 가지 문제가 발생합니다. 바로 동의 항목에 대한 클릭이 작동하지 않는데요.

만약 이를 동의하지 않고 메시지 보내기 기능을 사용할 경우

 

오류가 발생합니다. 권한을 설정해주지 않았기 때문이죠.

 

이를 해결하기 위해선 우리 WebBrowser(웹 브라우저)의 버전을 올려줘야 합니다.

C# WinForm의 기본 WebBrowser의 버전은 IE7입니다.

하지만 카카오톡의 로그인 페이지는 IE8이상의 버전만 호환이 가능하죠.

 

전문가의 답변

6. WebBrowser 버전 올리기 - 레지스트리 편집

우리 프로젝트의 웹 브라우저 버전을 올리기 위해선 '레지스트리'를 편집해 줘야 합니다.

 

레지스트리는 컴퓨터의 설정 및 정보까지 담고 있는 데이터베이스입니다. 

키와 값으로 이루어져 있으며 수정 지식이 없다면 건드리지 않는 편이 좋습니다.

우리는 간단한 편집만 하므로 컴퓨터에 오류를 일으키진 않습니다.

 

더 자세한 건 역시 구글링! 하면서 찾아보는 게 좋을 거 같군요.

 

솔루션 탐색기 > Properties 더블클릭을 하면 프로젝트 설정창이 나오게 됩니다.

 

보안 > ClickOnce 보안 설정 사용 체크 > app.manifest 생성

* 그리고 생성 후 체크를 해제해 주세요!

 

이제 메니패스트로 들어가면 requestedExecutionLevel의 레벨이 asInvoker로 돼있는데 이걸

 

requireAdministrator로 변경해주시면 됩니다.

 

보안 수준을 변경해 주는 것!이라고 생각하면 되겠습니다.

레지스트리를 편집하는 것은 사용자에 있어서 민감한 문제이기 때문에 그 수준을 변경해 주는 거죠.

 

이제 Form1.cs의 코드에서 KakaoMain_Load의 주석 부분을 해제합니다.

이제 다시 F5를 눌러서 실행해 봅시다.

 

만약 이런 창이 나온다면 '다른 자격 증명을 사용하여 다시 시작(R)'을 눌러주세요.

 

다시 로그인을 해주고

 

동의하기 체크가 정상적으로 동작하는지 확인 후 '동의하고 계속하기'를 누르면

 

각 동작이 정상적으로 작동하게 됩니다! (쨖쨕쨖)

 


코드 설명

1. kakaoApiEndPoint.cs

보통 이런 String값은 전역 클래스로 만들어 사용합니다. 

전역 클래스는 어디서든 가져다 쓸 수 있도록 만들어 놓는 거죠.

값을 가져올 뿐 변경되는 경우는 없으니 'const'키워드를 사용하여 혹시 변경되는 코드 작성을 막아주었습니다.

 

조금 설명할 부분은 "저런 Url을 어떻게 아는 거죠?"

 

developers.kakao.com/docs/latest/ko/kakaologin/rest-api

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

접속할 Url과 받아올 Url, 리다이렉트 타입인 Get, Post, Delete, Put의 방식 등

API 사용하는 방법은 공식문서에 자세히 나와있습니다. 

 

코드에서 KakaoLogInUrl 값을 문서에서 찾아보면

인가 코드 받기 부분의

 

GET 타입이고 주소와 Host의 정보를 알려줍니다.

 

또 메시지를 보내는 주소를 찾아볼까요?

메시지 > REST API 탭에 들어가면 사용 방법이 나와있습니다.

 

KakaoDefaultMessageUrl의 변수 값과 동일한 걸 확인할 수 있습니다.

 

이런 식으로 공식 문서를 찾아보면서 어떤 값이 필요한지 어떤 값을 넘겨줘야 하는지 확인하면 되겠습니다!

 

2. KakaoData.cs

여기는 크게 설명할 내용은 없습니다.

 

각 토큰 정보와 사용자 이름, 사진 출력에 사용될 비트맵을 정의했습니다.

원래 토큰 정보는 민감한 정보라 이렇게 노출시키면 안 되지만.. 테스트용 프로젝트니!

 

3. KakaoManager.cs

가장 중요한 매니저 스크립트입니다. 메서드 하나하나씩 뜯어봅시다.

3-1. GetUserToKen

WebBrowser의 현재 주소 값을 받아와서 특정 주소가 되면 유저 토큰을 얻는 방식입니다.

 

혹시 프로그램을 실행했을 때 출력되는 주소를 확인하셨나요? 

이 링크를 타고 들어가 보면

 

로그인을 했을 때 위 주소창의 링크 부분을 보면

/oauth?code= (유저 코드)를 처리해주는 기능을 해주는 메서드인 셈이죠.

3-2. GetAccessToKen

카카오톡은 유저 토큰과 에셋 토큰이 있습니다. (사실 리프레시 토큰 포함 총 3개입니다.)

 

유저 토큰은 에셋 토큰을 발급받기 위해 사용됩니다.

로그인을 할 때마다 유저 토큰이 1회용으로 발급되며 에셋 토큰을 발급받으면

유저 토큰은 재사용이 불가능합니다.

 

위 유저 토큰을 이용하여 에셋 토큰을 얻는 기능을 하는 메서드입니다.

 

공식 문서를 통해 설명을 해보면 위와 같이 더 자세한 토큰에 설명이 나와있습니다.

그리고 밑으로 내리면

 

어떤 값을 파라미터로 넘겨줘야 하는지 나와있는데요.

코드와 같이 보면 사진과 같은 형식입니다.

 

그리고 만약 성공했을 때 넘겨주는 데이터 형식 또한 알려주죠.

이 또한 코드와 같이 보면 사진과 같습니다.

3-3. KakaoTalkLogOut

단순히 로그아웃 기능을 합니다. 공식 문서를 보면

 

POST 타입에 에셋 토큰만 전달해 주면 사용할 수 있군요.

크게 설명할 부분은 없습니다.

3-4. KakaoTemplateSendMessage

템플릿 메시지를 보내는 기능을 합니다. 역시나 공식 문서를 확인하면

 

POST타입에 파라미터로 template_id를 넘겨줘야 한다는 걸 알 수 있습니다.

특별히 설명할 내용은 없습니다.

3-5. KakaoDefaultSendMessage

커스텀 메시지를 보내는 기능을 합니다. 공식문서로 확인하면

 

POST타입에 주소 값과 넘겨줄 파라미터로 JSON 타입의 오브젝트가 필요하군요.

 

밑으로 내리면 Sample 예제가 있는데 코드와 함께 보면 사진과 같습니다.

 

JSON 데이터를 다루는 방법은 따로 자세히 설명하진 않지만 크게 어렵지 않으므로

구글링을 조금만 하시면 많은 자료가 있으니 참고하며 보면 좋을 거 같네요.

(기회가 된다면 포스팅하겠습니다!)

3-6. KakaoUserData

유저 데이터를 얻는 기능을 합니다. 사진정보와, 사용자 이름 등을 알 수 있죠.

이 또한 공식문서로 확인해 보겠습니다.

 

특별한 게 없군요. *헤더 값으로 에셋 토큰을 넘겨주면 됩니다.

파라미터(Parameter), 헤더(Header)를 잘 보면서 넘겨주시면 되겠네요.

3-7. WebImageView

특정 URL 주소를 넘겨주면 사진(Bitmap)을 받아옵니다.

 

프로그램을 실행시켜서 출력되는 정보를 보면

파란 줄의 Url이 보이시나요? 저 Url을 통해서 사진을 얻는 메서드입니다.

4. Form1.cs - WebBrowserVersionSetting()

메인 폼의 코드에서 설명할 부분은 레지스트리를 편집하는 메서드 부분입니다.

 

사실 사용자 IE(인터넷 익스플로러)가 없다면 프로그램은 정상적으로 동작하지 않습니다..

하지만 윈도 운영체제를 사용하면 대부분 깔려있기 때문에 믿음으로 동작하는 코드입니다 (하하;)

 

browserver의 값은 현재 사용자의 운영체제 버전을 담아둡니다.

ie_emulation의 값은 각 운영체제의  *10진수 번호입니다.

 

이 *10진수 번호로 레지스트리를 편집해 주는 방식입니다.

 

이 코드가 레지스트리를 편집하는 동작을 확인할 수 있는데요.

 

윈도우 검색에서 '레지스트리 편집기'를 열어줍니다.

 

32비트 운영 체제 (이곳에 생성됩니다. 프로젝트를 32비트 버전으로 배포함.)

컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

 

64비트 운영 체제 (혹시나 이곳도 확인하면 되겠습니다.)

컴퓨터\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

 

위 주소로 들어가서 확인하면 어떤 부분을 편집하는지 알 수 있습니다. 

 

동작전
동작후

 

만약 여러분도 프로젝트 명으로 된 레지스트리가 있다면 삭제 후 다시 프로그램을 실행하여

변화하는 걸 살펴보면 도움이 될 거 같네요.

 


끝으로

어제까지 모든 포스팅을 완료하려고 했는데 이것저것 쉽게 알려주려고 고민 고민하다가 ㅠ 늦어버렸네요.

 

KAKAO 포스팅은 유난히 길었습니다. API의 기본적인 설명과 공식 문서로 확인하는 방법을 알려드려야

여러분이 활용할 수 있는 내용이 될 거 같아서 많이 고민했습니다.

 

이 포스팅이 여러분에게 도움이 됐으면 좋겠네요!

 

(이제.. 다음 포스팅하러 가보겠습니다)

반응형