본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

[ruby] ruby / rails로 자동 로그인 봇만들기

나는 미생이다

그래서 이번 추석은 미생을 위하여 달려야했지만, 항상 시험전날에는 딴짓을 하게 되듯

딴짓을 하였다.

ㅎ_ㅎ 인생이 걸렸는뎀 ㅎ_ㅎ

딴짓잼..ㅎ_ㅎ

크롤링 잼.. 크롤링덕후되버려쓰 ㅎ_ㅎ

거의 살면서 첨으로 내 플밍 능력으로 나한테 편한 기능을 만들었다 ㅎ_ㅎ 

긱스러운거 만든적이 첨이라 뿌듯 ㅎ_ㅎ


오늘 만든건 '자동 로그인 봇'이다. 어느 카페에서 등업을 하려면 로그인 기록이 몇십회 되어야하는데 매일 깜빡해서 로그인을 못했다.

그래서 나는 등업을 하려면.. 정말 몇년 후가 될 필이였다. 그래서 RUBY로 매일 새벽에 자동 로그인하는 봇을 만들었다. 

웹서버 OR AWS를 사용하는 건 아니지만, GEM을 편하게 사용하려고 RAILS를 사용했다.

MECHANIZE랑 WHENEVER GEM을 사용하니까 금방 뚝딱 만들어졌다.

역시 세팅 / 업로드 등등이 문제였다. 얘네 때문에 시간이 더 많이 걸렸다 ㅠㅠ. 암튼 두달쯤 크론탭을 죽여야겠다. 안까먹어야지.

예전에 티아카데미 때 팠던 AWS를 루비용으로 재정비하고, 웹서버 세팅을 했다. (아파치/패신저 설정에서 뭐가 막혀서.. 얘는 우선 중도포기하였다) 다행이 엘라스틱 아이피는 추가비용이 안나갔었다. 서버를 끌때 과금되는거라는 소식을 들었다 후후훟


자동로그인 봇 만드는거 과정을 기록하고자 한다! 

나는.. 기능 먼저 만들고 한게 아니라 크론탭 / 레이크 만들기 -> 기능만들기 순으로 구현했으니, 그 순서대로 기록하고자 한다.

1. 사용한 gem file 

gem 'whenever', :require => false
gem 'mechanize', '~> 2.7.1'

whenever는 레일즈에서 쉽게 크론탭에 등록 / 관리할 수 있도록 도와주는 젬이다.

mechanizenokogiri랑 세트(디펜던시 걸려있는)애이다. 노코기리는 단순 파싱을 해준다면, 메카나이즈는 내가 원하는 form을 찾아서 값을 임의로 입력하고, submit도 시키고, 그에 따른 결과 html값들도 받을 수 있게 해주는 gem이다.


2. whenever gem을 활용해서, 크론탭에 올릴 schedule을 관리할 루비파일을 생성한다.

현재 구현중인 프로젝트 위치에서 아래의 명령문을 입력하면, config/schedule.rb가 자동 생성된다. schedule.rb 은 crontab에 등록할 스케쥴을 입력하는 루비 파일이다.

whenever .  

나는 매일 하루에 한 번, 새벽 4:30에 auto_login이라는 rake를 실행시킬 것이다. 그래서 rake 명령문을 기록해 두었다.

schedule.rb

# Use this file to easily define all of your cron jobs.

every 1.day, :at => '4:30 am' do
rake "auto_login"
end

# Learn more: http://github.com/javan/whenever


3. auto_login 이라는 rake를 생성해야한다. rails에서 rake를 생성하기 위해서는 lib/takes 폴더 아래에 원하는 이름명.rake 파일을 생성해야한다.

나는 auto_login.rake라는 파일을 생성하였다!

auto_login.rake

desc 'auto login for level-up'
task :auto_login => :environment do |t, args|
AutoAction.daum_cafe_login
end


그리고 위와 같이 rake를 만들었다. 그리고 위의 auto_login을 실행하면 AutoAction.daum_cafe_login이라는 클래스/메서드를 불러오도록 하였다. 

(사실 레이크를 안쓰고 바로 메서드를 불러올 수 있는 듯 하지만.. 그냥 이렇게 했다)


4. 자동 로그인 스크립트를 생성한다.

여기서 url / username_field / password_field는 자기가 로그인해야하는 카페 주소 / 자기의 아이디 / 패스워드를 입력하면 된다.

여기서 url은 등업하고자하는 다음 카페 페이지에서 로그인 버튼을 눌렀을 때 뜨는 url이다.

보통 내가 등업하려는 카페에서 로그인 버튼을 누른 후, 로그인을 하면 

내가 처음 들어갔었던 페이지로 리다이렉트 되기 때문에 저걸 url로 입력했다.

require 'mechanize'

class AutoAction
def self.daum_cafe_login
url='#########'

a = Mechanize.new { |agent|
agent.user_agent_alias = 'Mac Safari'
}

a.get(url) do |page|

form = page.form_with(:id => 'loginForm')

username_field = form.field_with(:id => 'id')
username_field.value = '#######'
password_field = form.field_with(:id => 'inputPwd')
password_field.value = '#######'

button = form.button_with(:id => 'loginBtn')
loggedin_page = form.submit(button)

end

end
end


form_with / field_with / button_with에 걸려있는 id는 내가 크롤링하고자 하는 페이지에서 요소검사를 해서 긁어온 값이다.

form_with(:id => 내가 로그인을 하고자 하는 페이지의 로그인 form의 id )

field_with (:id=> form에서 아이디/패스워드를 입력해야 하는 field의 id )

button_with (:id=>form의 submit 기능을 실행하는 버튼의 id)






5. 실제 서버에 해당 파일을 업로드한다. 나는 AWS에다가 SFTP로 고고고고 올렸다.


6. 올린 원격 서버에서 내 프로젝트 폴더 위치에 가서, 일반 명령문에 whenever를 입력한다. 

그러면 크론탭에 내가 설정한 시각에 설정한 rake가 실행된다

참고 ) https://github.com/javan/whenever


7. 그렇지만..! 순순히 되지는 않았다. 나의 인스턴스(AWS / UBUNTU)는 TOKYO를 거치고 있었다. 그래서 위의 RAKE를 LOCAL에서 실행할때는 잘 돌아갔다. 

잘 돌아갔는지 다음에서 확인하는 방법

다음 > 내 정보 > 내 정보 보호 > 로그인 기록

그런데 원격 서버(AWS)에서 명령문을 칠 때는 다른 응답 HTML이 왔고, 로그인 기록이 안남았다.

이유는..! 도쿄IP로 내 아이디에 접속하려고 한것이기 때문!

그래서 내정보 > 국가별 로그인 허용에서 일본을 추가해줬다.

그랬더니 rake auto_login을 명령문 치면, 잘 로그인이 되었다.

이제 크론탭도 잘 돌아가겠지? 후후훕