프로그래밍/C#: 7개의 글

C# 셀레니움으로 구글 로그인 하기

Posted by 고 고특파원
2020. 3. 2. 15:53 프로그래밍/C#

이전에는  C# 셀레니움을 이용하여 구글 로그인이 가능했었다.

그러나 현재 구글에 로그인을 하려고 하다보면, 자동화툴로 접근하여 로그인을 허용하지 않고 있다.

 

깃허브에서도 올라온 구글 로그인이 안되는 문제에 대한 의견들.

 

https://gist.github.com/ikegami-yukino/51b247080976cb41fe93

 

Automatically Google login by selenium

Automatically Google login by selenium. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

자동화툴로 진정 구글 로그인을 할수는 없을까?

 

글들을 보던중 흥미로운 내용의 유튜브 영상이 공유되었다.

 

https://www.youtube.com/watch?v=HkgDRRWrZKg&feature=youtu.be

해당 영상을 보면, stack overflow사이트를 통해 구글인증을 한 후 유튜브 사이트로 가게되면 구글에 정상적으로 로그인 되는것을 발견!

 

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true; //크롬 콘솔창 숨기기 

var options = new ChromeOptions();

using (IWebDriver driver = new ChromeDriver(driverService, options))
{
	string id = "구글ID";
	string pw = "구글PW";                
 
	 driver.Url = "https://stackoverflow.com/users/login?ssrc=head";
    var googleBtn = driver.FindElement(By.ClassName("s-btn__google"));
    googleBtn.Click();
    Thread.Sleep(2000);

    var emailTag = driver.FindElement(By.Name("identifier"));
    emailTag.SendKeys(id);

    var nextBtn = driver.FindElement(By.Id("identifierNext"));
    nextBtn.Click();

    Thread.Sleep(5000);

    var passwordTag = driver.FindElement(By.Name("password"));
    passwordTag.SendKeys(pw);

    //암호 입력 버튼
    var passNextBtn = driver.FindElement(By.Id("passwordNext"));
    passNextBtn.Click();

    Thread.Sleep(5000);
    
    driver.Url = "https://www.google.co.kr/;
}



 

위와 같이 스택오버플로우 사이트에서 구글인증 후, 구글사이트로 리다이렉트 하면 정상적으로 구글에 로그인이 가능하다!

이 방법이 또 막힐지 모르겠지만, 현재까지는 이상없이 로그인이 가능하다.

 

단, 프로그램을 하면서 기계적이고 반복적으로 로그인 할 경우, 캡챠가 생성될 수 있으니 너무 빈번한 로그인을 피하는게 좋다.

 

 

혹시나 로그인이 안될경우, 계정의 보안을 낮추어 해보도록 한다!

이 댓글을 비밀 댓글로
  1. 저같은경우는 goto 문을 통해ㅐ try를 계속 실행하게했습니다

C#으로 크롤링 하기 - 다음사이트 자동로그인 기능

Posted by 고 고특파원
2019. 7. 24. 23:52 프로그래밍/C#

오늘은 C#을 이용하여 다음포털사이트에 자동으로 로그인하는 기능을 만들어 보도록 하겠다.

 

잘만 활용하면 크롤링이나 스크랩핑을 통해서 웹브라우저를 조작하여 대량의 데이터를 수집할 수 있다.

 

과정에 대해 간단히 설명하고, 작업과정을 보여주도록 하겠다.

 

1. 비쥬얼스튜디오 윈도우폼 프로젝트 생성

 

2. Nuget Package를 이용하여 셀레니움(Selenium) 설치

 

3. 셀레니움을 이용하여 크롬 브라우저 동작

 

 

1. 비쥬얼 스튜디오 Windows Forms Application 생성

프로젝트 생성

daumAutoLogin이라는 프로젝트를 생성하였다.

 

Windows Forms 간단한 디자인

폼안에 간단히 로그인 버튼과 크롬 브라우저가 작동하는 로그를 남길 수 있는 TextBox를 디자인 하였다.

 

2.  Nuget Package를 이용하여 셀레니움(Selenium) 설치

프로젝트 우클릭 후 NuGet Package For Solutioni... 을 클릭하고 셀레니움(Selenium)을 설치해준다.

 

총 3개의 WebDriver를 설치함으로써, 크롬브라우저를 조작할 수 있게 된다.

 

3. 셀레니움(Selenium)을 이용한 다음사이트 자동 로그인

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;       //크롬 콘솔창 숨기기

var options = new ChromeOptions();
//options.AddArgument("--window-position=-32000,-32000"); 
//options.AddArgument("headless");                    //윈도우창 위치값을 화면밖으로 조정

using (var driver = new ChromeDriver(driverService, options))
{

	// Go to the home page
    driver.Navigate().GoToUrl("http://www.naver.com");

    this.txtLog.Text = this.txtLog.Text + string.Format("Url 이동 : {0}", driver.Url) + Environment.NewLine;

    driver.Navigate().GoToUrl("https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fwww.daum.net%2F");

    this.txtLog.Text = this.txtLog.Text + string.Format("Url 이동 : {0}", driver.Url) + Environment.NewLine;

    
    var idField = driver.FindElementById("id");         //id를 통해 tag 셀렉트
    var pwField = driver.FindElementById("inputPwd");
    var loginButton = driver.FindElementById("loginBtn");

    this.txtLog.Text = this.txtLog.Text + "로그인 시도!" + Environment.NewLine;

    idField.SendKeys("로그인아이디");
    pwField.SendKeys("패스워드");

    loginButton.Click();

    this.txtLog.Text = this.txtLog.Text + string.Format("Url 이동 : {0}", driver.Url) + Environment.NewLine;
                
    string nowUrl = driver.Url;

    this.txtLog.Text = this.txtLog.Text + "로그인 성공!" + Environment.NewLine;

}

소스의 전체적인 부분을 순서대로 보면, ChromeDriver를 통해서 크롬브라우저를 실행하고, naver로 url을 이동한다.

 

다음 포털 로그인 사이트로 이동후, 포털의 아이디, 암호 엘리먼트를 찾아 자동으로 로그인 시켜주게 된다.

 

 

하나씩 살펴보도록 하겠다.

 

크롬 콘솔창 숨기기, 크롬 브라우저 숨기기 옵션

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;       //크롬 콘솔창 숨기기

var options = new ChromeOptions();
//options.AddArgument("--window-position=-32000,-32000"); 
//options.AddArgument("headless");                   	 //윈도우창 위치값을 화면밖으로 조정

이 부분은 소스를 실행하다보면 크롬 콘솔창이 보여지는데 이것을 안보이도록 설정하는 소스이다.

다음 ChromeOptions를 설정하는 것은 크롬 브라우저를 숨기기 위한 소스이다.

 

 

URL 이동, Html Tag 엘리먼트 찾기

driver.Navigate().GoToUrl("https://logins.daum.net/accounts/signinform.do?url=https%3A%2F%2Fwww.daum.net%2F");

this.txtLog.Text = this.txtLog.Text + string.Format("Url 이동 : {0}", driver.Url) + Environment.NewLine;

// Get the page elements
var idField = driver.FindElementById("id");         //id를 통해 tag 셀렉트
var pwField = driver.FindElementById("inputPwd");
var loginButton = driver.FindElementById("loginBtn");

this.txtLog.Text = this.txtLog.Text + "로그인 시도!" + Environment.NewLine;

idField.SendKeys("로그인아이디");
pwField.SendKeys("패스워드");

loginButton.Click();

GoToUrl() 메서드를 통해서 다음 포털 로그인 사이트로 이동한다.

FindElementById() 메서드를 통해서 Html 태그 엘리먼트를 찾고 값을 입력할 수 있다.

 

SendKeys() : 엘리먼트에 값을 입력

Click() : 로그인 버튼 수행

 

크롬브라우저 웹도구를 통해서 다음 포털 사이트의 엘리먼트 Id를 확인할 수 있으므로, 우리는 자동으로 로그인 작업을 수행할 수 있게 된다.

 

소스 실행 화면

 

자동로그인 시작

 

소스를 실행하고 자동로그인 시작 버튼을 하면 웹브라우저가 열린다.

 

 

네이버 사이트로 이동 하고난 후, 다음 포털 로그인 사이트로 이동

아이디와 패스워드를 자동으로 입력 후 다음 포털사이트에 정상적으로 로그인이 되는것을 확인할 수 있다.

 

크롤링은 보통 파이썬이라는 언어로 많이들 하고 있는데, C# 셀레니움을 이용해도 크롤링을 할 수 있을것 같다는 생각이 들었다.

 

C#은 직관적이고 윈도우 응용프로그램을 만들기가 쉽기 때문에, C#과 셀레니움 라이브러리를 이용하여 크롤링에 도전해보도록 하자!

 

독자도 크롤링 프로그램을 제작에 도전하고 또 한번 글을 쓰도록 하겠다.

 
제 블로그의 내용이 도움이 되셨나요?

여러분의 공감댓글이 큰 힘이됩니다 :)

▼▼▼▼▼▼▼▼▼▼▼
이 댓글을 비밀 댓글로
    • 2019.10.30 14:00
    비밀댓글입니다

C# SqLite 사용하기 - 3편

Posted by 고 고특파원
2019. 6. 26. 23:20 프로그래밍/C#

현재 글을 보기전에 1편과 2편을 보지 않았다면 아래링크를 통해서 이전 글을 보고 오길바란다.

 

2019/06/20 - [프로그래밍/C#] - C# SQLite 사용하기 - 1편

 

C# SQLite 사용하기 - 1편

가끔씩 C#을 이용하여 프로그램을 만들 때 간단한 DB를 사용해야 하는 경우가 생긴다. MSSQL Express버전을 사용하기엔 너무 무겁고, 개인적으로 Access를 이용한 MDB를 선호하지 않는다.. 이럴 때 Sqlite를 사용..

maelife.tistory.com

 

 

2019/06/23 - [프로그래밍/C#] - C# SQLite 사용하기 - 2편

 

C# SQLite 사용하기 - 2편

2. SQLite3.exe 실행파일 다운로드 이전 기본 셋팅하는 글을 보지 않고 넘어 왔다면, 이전글 참조 후 다음 글로 넘어 오시길 바랍니다. 2019/06/20 - [프로그래밍/C#] - C# SQLite 사용하기 - 1편 SQLite3.exe를..

maelife.tistory.com

 

그럼 이제 VisualStudio를 실행하여 간단한 응용프로그램을 만들어 보도록 한다.

 

 

 

간단한 Windows 응용프로그램 프로젝트를 생성한다.

 

데이터베이스 접속 테스트를 위한 버튼을 다음과 같이 배치한다.

 

그리고 2편에서 만든 mydb.db 파일을 프로젝트에 추가하도록 한다.

 

 

솔루션탐색기에서 database라는 폴더를 생성하고 폴더안에 mydb.db 파일을 추가한다.

 

배포하기 위해 output Directory를 항상 'Copy always' 설정을 하면 된다.

 

 

다음으로 소스 부분을 보도록 한다.

 

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.btnConncet.Click += btnConncet_Click;
            this.btnSelect.Click += btnSelect_Click;
            this.btnInsert.Click += btnInsert_Click;
            this.btnDelete.Click += btnDelete_Click;
        }

        
        /// <summary>
        /// DB연결
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnConncet_Click(object sender, EventArgs e)
        {

            //string strConn = @"Data Source=C:\sqlite\mydb.db";
            string strConn = String.Format("Data Source={0}", Application.StartupPath + @"\database\mydb.db");
            
            using (SQLiteConnection conn = new SQLiteConnection(strConn))
            {
                conn.Open();

                //string sql = "INSERT INTO member VALUES (100, 'Tom')";
                //SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                //cmd.ExecuteNonQuery();

                //cmd.CommandText = "DELETE FROM member WHERE Id=1";
                //cmd.ExecuteNonQuery();

                conn.Close();
            }

        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            //string strConn = @"Data Source=C:\sqlite\mydb.db";
            string strConn = String.Format("Data Source={0}", Application.StartupPath + @"\database\mydb.db");

            //SQLiteDataAdapter 클래스를 이용 비연결 모드로 데이타 읽기
            string sql = "SELECT * FROM test1";
            var adpt = new SQLiteDataAdapter(sql, strConn);
            adpt.Fill(ds);

        }

        private void btnInsert_Click(object sender, EventArgs e)
        {
            string strConn = String.Format("Data Source={0}", Application.StartupPath + @"\database\mydb.db");

            using (SQLiteConnection conn = new SQLiteConnection(strConn))
            {
                conn.Open();
                string sql = "INSERT INTO test1 VALUES (2, '하이여')";
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                cmd.ExecuteNonQuery();

                
            }
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            string strConn = String.Format("Data Source={0}", Application.StartupPath + @"\database\mydb.db");

            using (SQLiteConnection conn = new SQLiteConnection(strConn))
            {
                conn.Open();
                string sql = "DELETE FROM test1 WHERE id=1";
                
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                cmd.ExecuteNonQuery();
                
            }
        }

 

C#에서 제공하는 SQLiteConnection을 이용하여 데이터베이스에 접속 하고 관리할 수있다.

 

데이터베이스 연결문자열은 실제 프로젝트가 빌드되고 난 후의 위치를 잡아야 하기 때문에

Application.StartupPath 를 이용하여 *.db 파일이 있는 위치를 잡아주었다.

 

이처럼 C# 응용프로그램을 이용하여 무언가를 만들때 간단한 DB가 필요할때 SQLite를 이용하는것도 괜찮은 방법인것 같다.

이 댓글을 비밀 댓글로

C# SQLite 사용하기 - 2편

Posted by 고 고특파원
2019. 6. 23. 21:41 프로그래밍/C#

2. SQLite3.exe 실행파일 다운로드

 

이전 기본 셋팅하는 글을 보지 않고 넘어 왔다면, 이전글 참조 후 다음 글로 넘어 오시길 바랍니다.

2019/06/20 - [프로그래밍/C#] - C# SQLite 사용하기 - 1편

 

 

SQLite3.exe를 받는 이유는 Command창으로 데이터베이스 파일을 생성하고 관리할 수 있기 때문에, 다운을 받는것이다.

 

요기 링크에서 다운로드 받으면 되니 아래 사이트에 가서 다운로드를 받도록 한다.

https://www.sqlite.org/download.html

 

SQLite Download Page

Templates (1) and (2) are used for source-code products. Template (1) is used for generic source-code products and templates (2) is used for source-code products that are generally only useful on unix-like platforms. Template (3) is used for precompiled bi

www.sqlite.org

각자 개발 환경 os에 맞는 Command line shell 프로그램을 다운로드 받는다.

나는 윈도우니깐 windows 탭에서 다운로드를 받았다.

 

 

3. DB파일 생성 작업 폴더 지정 및 커맨드 창 설정

SQLite 데이터베이스 파일을 생성 후 작업할 폴더 공간을 지정한다.

 

나는 아래와 같은 폴더 경로에다가 다운로드 받은 zip 파일을 압축 해제 하였다. (각자 임의로 설정해도됨)

 

C:\myTestSQLiteDB 

 

압축 해제한 다음에 cmd창을 열어서 sqlite3.exe 파일이 존재하는 폴더로 이동 한다.

 

모두 정확하게 했다면 위와 같은 화면이 보여질것이다.

 

 경로 이동 후 데이터베이스를 다음과 같은 명령어를 이용하여 만들어준다.

 

sqlite3 mydb.db

create table test_table
(
	id int,
    name string
);

 

위 그림처럼 *.db 파일이 생성된것을 확인 할 수 있는데, 이렇게 된다면 데이터베이스 파일 생성이 완료된것이다.

 

SQL문을 이용하여 데이터베이스를 생성 하고 조작 할 수 있다. SQL문에 대해서는 각자 찾아보시길!!

 

그럼 다음으로 c#에서 데이터베이스에 접근 하는법에 대해 알아보도록 하겠는데 이것은 다음 포스팅에서 하도록 하겠다!

이 댓글을 비밀 댓글로

C# SQLite 사용하기 - 1편

Posted by 고 고특파원
2019. 6. 20. 23:54 프로그래밍/C#

 

가끔씩 C#을 이용하여 프로그램을 만들 때 간단한 DB를 사용해야 하는 경우가 생긴다.

 

MSSQL Express버전을 사용하기엔 너무 무겁고, 개인적으로 Access를 이용한 MDB를 선호하지 않는다..

 

이럴 때 Sqlite를 사용하면 쉽고 간단하게 파일 DB를 사용할 수 있다.

 

그렇다면 Sqlite를 사용하는법에 대해 알아보도록 한다.

 

 

1. SQLite3 다운로드

Sqlite를 사용하기 위해 다운로드를 하고 설치를 하는 방법은 두 가지 방법이 있다.

 

1) http://system.data.sqlite.org << 해당 링크에 가서 .Net 버전에 맞게 바이너리를 다운로드하여 설치를 한다.

 

내 프로그램 개발 버전은 .netframwork 4.0에 64bit이므로 저걸 다운로드하여 설치하면 될 것 같다.

Sqlite 다운로드 홈페이지

물론 위의 방법처럼 직접 다운로드하려면 생각할게 많으니 나는 다르게 설치를 해보도록 하겠다. 어떻게??

 

두 번째 방법을 보도록 하겠다.

 

2) VisualSutdio의 Nuget 패키지 매니저를 활용하여 설치를 한다.

 

Package Manage Console

비주얼 스튜디오의 Tools-> NugetPackageManager -> Package Manager Console을 선택하면, 아래와 같이 

콘솔 창이 하나 열린다.

 

콘솔 창에 다음과 같은 명령어를 입력하여 Nuget패키지를 이용하여 알아서 설치하는 방법이다.

 

Install-Package System.Data.SQLite

 

개인적으로는 위 방법을 추천한다. 뭔가 필요 없는 것까지 깔리는 느낌이긴 한데, 이도 저도 아니고 헷갈리니 이렇게 해결하는 것도 좋을 것 같다..

 

 

실제 프로젝트파일이 있는 경로로 가보면 위 그림처럼, Packages라는 폴더가 자동으로 생긴다. Nuget을 이용하여 Sqlite를 설치함으로써 생기는 폴더이니 삭제하면 안된다!

 

폴더 내부에 들어가서 보면 SQLite를 사용할때 필요한 dll 파일들이 존재한다.

Nuget을 이용하여 설치하면 프로젝트참조 경로까지 알아서 잡아주므로 개발자는 소스만 신경 쓰면 된다.

 

일단 여기까지 하면 Sqlite를 사용하기 위한 개발환경 셋팅은 끝이났고, 다음 포스팅에서 Sqlite DB 생성 및 DB데이터를 조작하는 방법에 알아보도록 하겠다.

이 댓글을 비밀 댓글로

프로그램 설계하기 좋은 Tool! PowerMockup을 소개합니다.

Posted by 고 고특파원
2017. 5. 29. 19:30 프로그래밍/C#

프로그램 디자인 설계시 간편하게 파워포인트 플러그인을 이용해서 도움을 주는 Tool을 소개하려 합니다.

 

PowerMockup 이라는 Tool인데요

 

간단한 디자인 뿐만아니라 복잡한 디자인까지도 간단한 Drag&Drop을 이용해서 디자인을 해나갈수 있습니다!

 

 

 

PowerMockup을 다운로드 하기 위해서

 

https://www.powermockup.com/ 로 이동합니다.

 

간단히 Download후 설치를 하고 파워포인트를 실행해 보았습니다~~

 

 

파워포인트를 실행하니 PowerMockup이라는 탭이 하나 생겼구요.

 

옆에 보시면 간단한게 Drag&Drop을 해서 디자인을 쉽게 할 수 있습니다~

 

 

 

 

정말 복잡한 Alert Message창도 쉽게 그려낼 수 있기 때문에 간단하게 화면 디자인을 구성하는데 상당히 도움이 많이 될것 같아요~~

 

트라이얼 버전은 아쉽게도 비활성화되어있는게 많은데요!

 

개인적으로 비상업적으로 사용하려면 간단히 블로그에서 프로그램 설명을 하면 회사측에서 확인 후 라이센스키를 발급해 준다고 합니다!!

 

여러분들도 PowerMockup으로 신세계를 경험해 보세요~~

이 댓글을 비밀 댓글로

엔티티프레임워크에 대하여 (Entity Fraework)

Posted by 고 고특파원
2016. 2. 11. 23:07 프로그래밍/C#

엔티티프레임워크란?

 

많은 응용프로그램들은 데이터를 저장할 데이터베이스가 필요로 한다.

.Net Framework는 기능적으로 쉽게 쿼리에 접근할 수 있는 도구를 제공해주는데 이것이 바로 엔티티프레임워크이다!

 

엔티티 프레임워크는 MS에서 만든 ORM 기술인데 여기서 ORM 은Objext Relational Mapping의 약자로 풀어서 말하면 객체 관계 매핑이라고 할 수 있다. 

데이터 테이블 구조를 클래스화 시키고 각 객체에 데이터를 매핑 시키는 기술이라고 생각하시면 될것 같습니다.

 

엔티티프레임워크를 이용하면 쉽게 엔티티 데이터 모델을 (EDM)을 만들 수 있고 LINQ를 이용하여 데이터에 접근할 수 있다!

 

엔티티 프레임워크가 나오게된 배경..?

 

데이버베이스와 객체 지향 언어는 서로 다르고 데이터베이스는 언제나 바뀔수있는 흐르는 물과 같다. 이런 데이터베이스의 정규화 과정을 통해서 테이블과 테이블간의 관계를 표현하게 되는데 DB와 코드를 연결하기 위해서 비슷하게 생기는 많은 코드르르 작성해야 하는경우가 있다. 또한 DB가 변경되게 되면 코드가 변경되어야 하는 상황이 자주 발생한다. 이러한 문제를 해결하기 위해서 MS에서 만든 것이 바로 ORM기술이라고 한다.

 

엔티티 프레임워크의 강점..!

 

- 일단 엔티티프레임워크로 응용프로그램을 만들고 나면 DBMS가 바뀌더라도 쉽게 마이그레이션이 가능하다.

(일단 반복화된 개념적모델 클래스는 작성할 필요가 없기 때문에 마이그레이션이 쉽다고 생각한다.)

 

- 개발자 입장에서는 놀라운 생산성을 기대할 수 있다.

(Tool을 이용하여 Entity Data Model Wizard를 이용하면 Database와 자동으로 매핑되어 있는 EDM을 만들어주기 때문이다.)

 

뭐든지 장점만 존재할 수는 없다.

 

엔티티 프레임워크의 단점..!

 

- DB성능을 기대하기 어렵다는 단점이 있습니다.

(아무래도 DMA가 짠 쿼리보다는 성능이 떨어질 수 밖에 없다고 생각합니다.)

 

 

엔티티 프레임워크의 주요 기능

 

 - 다양한 DBMS를 지원한다.

(이전의 Linq To SQL은 MSSQL만을 지원했지만 Entity Fraework는 다양한 DMMS를 지원한다.(오라클, MySQL등등을 지원한다))

 

- Visual Studio를 통한 도구를 제공한다.

 

- DB를 구현하고 Code를 작성하는 순서가 아닌 Model을 먼저 정의하고 나중에 DB를 구성할 수 있는 Code First를 지원한다.

 

- 엔티티 질의 Linq함수를 제공한다.

(개발자는 생성된 개념적 모델클래스들을 Linq로 엔티티 질의를 할수 있는 기능을 제공한다.)

 

 

 

 

 

 

이 댓글을 비밀 댓글로