회사에서 자주 사용하는 포탈 목록 및 그에 따른 자동로그인을 구현해보자
매일 자주 사용하는 포털을 유지하면 좋겠지만 컴퓨터가 꺼지는 경우 다시 저번에 보던 환경을 구축하는데 귀찮아서 자주 사용하거나 이전 기록을 저장했으면 좋겠다는 생각을 하게 되었다.
C#, Windows Form 형식으로 구현했다.
🎨기능
자주 사용하는 chrome url을 저장하고 하나의 윈도우에 다중 탭을 생성해 포탈을 연다. 자동으로 process를 생성해주고 프로그램이 종료될 시에 이 프로그램을 통해 생성된 process 모두를 kill하도록 하였다. 저장된 모든 데이터는 "C:/Users/autoLogin/key.txt" 경로에 관리자 권한을 가지고 저장된다.
URL외에 ID나 PW가 존재한다면 해당 웹 사이트에 로그인 까지 실행해주지만, selenium 특성상 한정된 포탈만 가능하다(현재 mbc 그룹웨어, 넷플릭스, 인터파크 등 가능 / 네이버, 구글 정책상 불가능)
- 관리자 권한 자동 획득합니다.(c드라이브 접근 후 데이터 저장 폴더생성)
- '+' : url, id, pw를 입력한 뒤 저장합니다. id, pw없이 url만 입력할 경우 로그인 로직은 실행하지 않습니다.
- '-' : listBox에서 특정 항목 선택한 뒤 클릭시 해당 정보를 삭제합니다.
'kill' : 본 프로그램을 통해 생성된 모든 process를 kill합니다. * 단순 종료시에도 같은 로직 실행함.=> 2.0.0 업데이트 삭제- 'How to use' : 사용방법
- 'start' : auto 실행
🧨기능 로직
몇몇 기능만 첨부하고 나머지는 하단의 깃헙 링크를 참조
1. url, id, pw 정보를 txt 파일에서 불러오기
private void Form1_Load(object sender, EventArgs e)
{
//문서 불러오기
di = new DirectoryInfo(path);
if (di.Exists == false)
{
di.Create();
return;
}
//dir 존재
else
{
//파일존재판단
FileInfo fi = new FileInfo(path + @"/" + KEY_FILENAME);
//FileInfo.Exists로 파일 존재시"
if (fi.Exists)
{
//listbox 추가
string[] keylines = File.ReadAllLines(path + @"/" + KEY_FILENAME, Encoding.UTF8);
for (int i = 0; i < keylines.Length; i++)
{
string[] key = keylines[i].Split(' ');
// listbox 추가
listBox1.Items.Add(key[0] + " " + key[1] + " " + key[2]);
}
}
else
{
writer = File.CreateText(path + @"/" + KEY_FILENAME);
}
}
}
2. url, id, pw 정보를 저장 UpdateFileSkipRow, 삭제하기 RemoveAt<T>
public void UpdateFileSkipRow(string fileFullPath, string key)
{
string[] lines = File.ReadAllLines(fileFullPath);
int pos = Array.FindIndex(lines, row => row.Contains(key));
if (pos < 0)
return; // 일치하는게 없다면 return
RemoveAt<string>(ref lines, pos);
File.WriteAllLines(fileFullPath, lines);
}
public void RemoveAt<T>(ref T[] arr, int index)
{
for (int a = index; a < arr.Length - 1; a++) arr[a] = arr[a + 1];
Array.Resize(ref arr, arr.Length - 1);
}
3. start 버튼(URL 시작, 자동로그인)
private void button1_Click(object sender, EventArgs e)
{
try
{
//파일읽기
string[] lines = File.ReadAllLines(path + @"/" + KEY_FILENAME);
string url = string.Empty;
string id = string.Empty;
string pw = string.Empty;
_driver = new ChromeDriver(_driverService, _options);
for (int i = 0; i < lines.Length; i++)
{
string line = lines[i];
string[] lineArr = line.Split(' ');
url = lineArr[0];
if (i > 0)
{
ExecuteScript(_driver, "window.open();");
Thread.Sleep(1000);
}
nowhandle = _driver.CurrentWindowHandle;
handles = _driver.WindowHandles;
TapChange(_driver, handles[i]);
_driver.Navigate().GoToUrl(url); // 웹 사이트에 접속합니다.
_driver.Manage().Window.Maximize();
//_driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
Thread.Sleep(1000);
//모두 존재(자동로그인3)
if (lineArr.Length > 2 && (lineArr[1] != "" || lineArr[2] != ""))
{
id = lineArr[1];
pw = lineArr[2];
//이부분은 웹별로 다르기 때문에 적절한 Selector를 저장해 객체화해줄것
var element = _driver.FindElementByCssSelector("#id");
element.SendKeys(id);
Thread.Sleep(500);
element = _driver.FindElementByCssSelector("#passwd");
element.SendKeys(pw);
element = _driver.FindElementByXPath("//*[@id='wrap']/div[2]/div[2]/p[5]/img");
element.Click();
}
}
return;
}
catch (Exception)
{
processKill();
}
}
🥼마치며...
전체 코드를 작성하고 테스트 해보는 데 하루정도가 걸렸다. 먼저 한계점에 대해서 말하자면, 셀레니움 특성상 기계처럼 보이지 않는 것이 중요한데 크롬에서 Win32를 활용하지 않으면 기계로 인식해서 바로 이렇게 표시해준다. 이것만 뜨면 크게 상관은 없지만 구글에서는 소프트웨어 접근의 자동로그인 기능을 막아버렸는데 이는 네이버도 해당이 된다. 소프트웨어 접근이 확인될 시 캡챠(CAPTCHA)가 나오게 되게 작년부터 바뀌었다고 한다.
현재 아카이브 웹 서비스에도 window form 형식의 관리자 툴을 제공하는데, 이런 토이프로젝트를 진행하면서 현업에 도움을 줄 수 있을 것 같다. 혹시나 필요로 하는 사람들이 있을 것 같아 setup파일로 만들어 배포해 두었으니 필요하면 다운받아 실행해보길 바란다. ㅇㅅㅇ
'프로젝트 직딩일기' 카테고리의 다른 글
[SMS 커밋알리미 개발기]ASP.NET C# (2) | 2021.03.25 |
---|---|
서버로 부터 받은 이미지 리소스의 로딩 시 속도 저하 개선 경험 (0) | 2021.03.21 |