[c#] CEF를 이용한 페이스북 자동화 프로그램 (4)
이 글은 .NET에서 Chromium Embedded Framework(CefSharp)와 Facebook SDK를 이용한 "페이스북 자동화 프로그램"의 개발 과정을 담은 기록 문서들 중 (4)에 해당하는 글입니다.
(1) - 프로그램 구상 및 개요
(2) - 페이스북 어플리케이션 등록 방법
(3) - Facebook SDK와 CefSharp 적용 방법
(4) - 프로그램의 구동 과정
(5) - 마무리 : 배운것과 보완할 점
일단 처음 설명한대로 CEF를 통해 크로미움을 프로그램에 내포하고 이를 통해 페이스북 서버와 통신할 계획이었고 이를 목표로 프로그램을 개발했습니다. 자동으로 로그인하고 글을 쓰는것 까지는 구현이 되었으니 이에 대해 프로그램 실행화면과 함께 설명하도록 하겠습니다.
프로그램을 실행화면을 보여드리기 전에 프로그램의 윈폼이 어떤식으로 구성되어 있는지 살펴보면,
Forms.Button - btnBack (뒤로 가기 버튼)
Forms.Button - btnForward (앞으로 가기 버튼)
Forms.Button - btnRefresh (새로고침 버튼)
Forms.Button - btnGo (실행 버튼)
Forms.Button - btnLogin (자동 로그인 버튼)
Forms.Button - btnUploadPost (자동 글쓰기 버튼)
Forms.Button - btnDevTool (개발자 도구 버튼)
Forms.TextBox - txURL (주소 입력창)
Forms.Panel - pContainer (웹브라우저 패널)
위와 같이 윈폼이 구성되어 있습니다. 선언된 인스턴스들은 아래 소스 코드를 보실 때 참고 하시기 바랍니다.
대부분은 웹브라우저의 기본 기능을 구현해서, [개발자 도구]를 버튼이 따로 있다는 점과 주소를 입력하고 반드시 [Go] 버튼을 클릭해야 이동한다는 점 외에는 보통의 웹브라우저를 사용하듯 사용할 수 있습니다.
프로그램을 실행하면 다음과 같은 화면이 로딩됩니다.
프로그램이 시작되자마자 페이스북 페이지로 바로 가도록 설정되어 있는데, 이는 윈폼 화면이 로딩될 때 다음과 같은 처리를 함으로써 이뤄지게 됩니다.
<프로그램 시작시 실행될 코드>
ChromiumWebBrowser chrome; //... //... //... private void Form1_Load(object sender, EventArgs e) // 프로그램 실행(윈폼 로드) 했을 때 실행됨 { CefSettings settings = new CefSettings(); Cef.Initialize(settings); txURL.Text = "https://ko-kr.facebook.com/"; chrome = new ChromiumWebBrowser(txURL.Text); // 주소 입력창에 입력된 주소로 크로미움 웹브라우저 실행 chrome.Dock = DockStyle.Fill; this.pContainer.Controls.Add(chrome); // 웹브라우저 패널에 크로미움 웹브라우저를 귀속 chrome.AddressChanged += Chrome_AddressChanged; }
<[자동 로그인] 버튼을 클릭 했을때 실행될 코드>
private void btnLogin_Click(object sender, EventArgs e) // 자동 로그인 버튼을 클릭했을 때 실행됨 { string id = "<페이스북 아이디>"; // 자신의 페이스북 아이디를 입력 string pwd = "<페이스북 비밀번호>"; // 자신의 페이스북 비밀번호를 입력 chrome.ExecuteScriptAsync("document.getElementById('email').value=" + '\'' + id + '\''); chrome.ExecuteScriptAsync("document.getElementById('pass').value=" + '\'' + pwd + '\''); chrome.ExecuteScriptAsync("document.getElementById('login_form').submit();"); // 로그인 실행 }
로그인 페이지에서는 페이스북 API 없이 로그인 폼(login_form)에 접근이 가능하기 때문에 html의 해당하는 구문에 값을 입력하는 방식으로 로그인이 가능합니다. 따라서 CEF의 ExecuteScriptAsync 함수를 통해 이메일 주소와 비밀번호 값을 넣어준 뒤 login_form의 submit() 함수를 실행함으로써, 로그인을 하게 됩니다.
<[자동 글쓰기] 버튼을 클릭 했을때 실행될 코드>
private void btnUploadPost_Click(object sender, EventArgs e) // 자동 글쓰기 버튼을 클릭했을 때 실행됨 { string contents = "TEST UPLOAD : " + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss z"); try { FacebookClient facebookClient = new FacebookClient(access_token); dynamic messagePost = new ExpandoObject(); messagePost.access_token = access_token; // 사용자 엑세스 토큰 messagePost.caption = "my caption"; // (생략 가능) messagePost.message = contents; // 포스트 글 내용. messagePost.description = "my description"; // (생략 가능) var result = facebookClient.Post("me/feed", messagePost); // 자신의 피드에 messagePost 내용을 올림. } catch (FacebookOAuthException ex) { MessageBox.Show(ex.ToString()); Console.WriteLine("PostMessage : " + ex.ToString()); } catch (Exception ex) { MessageBox.Show(ex.ToString()); Console.WriteLine("PostMessage : " + ex.ToString()); } }
사용자 엑세스 토큰을 매개변수로 FacebookClient 객체를 생성한 뒤, Post 메서드를 실행하여 페이스북에 글 등록을 요청합니다. 사실 사용자 엑세스 토큰은 Get 메서드를 통해 받는 방법이 있긴한데, 지금은 간단하게 적용하기 위해 소스 코드에 직접 적용한 점 양해부탁드립니다.
어쨌든 [자동 로그인]과 [자동 글쓰기] 버튼을 순서대로 클릭하면 다음과 같은 결과를 얻을 수 있습니다. (해당 프로그램은 반드시 [자동 로그인] 버튼을 눌러 로그인이 완료된 후에 [자동 글쓰기] 버튼을 눌러야 합니다.)
작성된 글에 "TestAutoLoginAndPost"가 표시되는것은, 해당 어플리케이션을 통해 글이 작성되었을 나타냅니다.
[개발자 도구]를 클릭하면 크롬 웹브라우저에서 F12키를 누른것과 같은 기능을 합니다. 실행시켜서 Application탭을 보면 다음과 같이 방문한 페이지 기록(쿠키, 데이터)들을 확인할 수 있고, 해당 기록들을 바로 제거할수도 있습니다.
최대한 간단히 설명하려다 보니 많은 부분들이 생략된 느낌이 있는데, CEF와 Facebook c# SDK에 더 자세한 사용방법에 대해서는 아래 링크들을 참조하시기 바랍니다.
참조사이트
- CefSharp GitHub : https://github.com/cefsharp/CefSharp
- facebook-csharp-sdk : https://github.com/facebook-csharp-sdk/facebook-csharp-sdk
- 간단한 크로미움 브라우저 제작 영상 : http://ourcodeworld.com/articles/read/173/how-to-use-cefsharp-chromium-embedded-framework-csharp-in-a-winforms-application
이렇게 직접 개발해본 간단한 페이스북 자동화 프로그램에 대해 개발 과정과 소스 코드에 대한 설명을 해드렸습니다.
다음글에는 지금까지의 내용들을 한번 더 되짚어보고, 보완해야 할 점들에 대해 언급해보도록 하겠습니다.
긴 글 읽어주셔서 감사하고, 다소 전문적인 내용이 부족할 수 있는점 양해부탁드립니다.