나는 미생이다
그래서 이번 추석은 미생을 위하여 달려야했지만, 항상 시험전날에는 딴짓을 하게 되듯
딴짓을 하였다.
ㅎ_ㅎ 인생이 걸렸는뎀 ㅎ_ㅎ
딴짓잼..ㅎ_ㅎ
크롤링 잼.. 크롤링덕후되버려쓰 ㅎ_ㅎ
거의 살면서 첨으로 내 플밍 능력으로 나한테 편한 기능을 만들었다 ㅎ_ㅎ
긱스러운거 만든적이 첨이라 뿌듯 ㅎ_ㅎ
오늘 만든건 '자동 로그인 봇'이다. 어느 카페에서 등업을 하려면 로그인 기록이 몇십회 되어야하는데 매일 깜빡해서 로그인을 못했다.
그래서 나는 등업을 하려면.. 정말 몇년 후가 될 필이였다. 그래서 RUBY로 매일 새벽에 자동 로그인하는 봇을 만들었다.
웹서버 OR AWS를 사용하는 건 아니지만, GEM을 편하게 사용하려고 RAILS를 사용했다.
MECHANIZE랑 WHENEVER GEM을 사용하니까 금방 뚝딱 만들어졌다.
역시 세팅 / 업로드 등등이 문제였다. 얘네 때문에 시간이 더 많이 걸렸다 ㅠㅠ. 암튼 두달쯤 크론탭을 죽여야겠다. 안까먹어야지.
예전에 티아카데미 때 팠던 AWS를 루비용으로 재정비하고, 웹서버 세팅을 했다. (아파치/패신저 설정에서 뭐가 막혀서.. 얘는 우선 중도포기하였다) 다행이 엘라스틱 아이피는 추가비용이 안나갔었다. 서버를 끌때 과금되는거라는 소식을 들었다 후후훟
자동로그인 봇 만드는거 과정을 기록하고자 한다!
나는.. 기능 먼저 만들고 한게 아니라 크론탭 / 레이크 만들기 -> 기능만들기 순으로 구현했으니, 그 순서대로 기록하고자 한다.
1. 사용한 gem file
gem 'whenever', :require => false
gem 'mechanize', '~> 2.7.1'
whenever는 레일즈에서 쉽게 크론탭에 등록 / 관리할 수 있도록 도와주는 젬이다.
mechanize는 nokogiri랑 세트(디펜던시 걸려있는)애이다. 노코기리는 단순 파싱을 해준다면, 메카나이즈는 내가 원하는 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을 명령문 치면, 잘 로그인이 되었다.
이제 크론탭도 잘 돌아가겠지? 후후훕
끝
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
[ROR]Asset Pipeline / 자바스크립트, CSS 압축 (0) | 2016.01.01 |
---|---|
[ROR]루비온레일즈를 설치할 때, 왜 node.js를 설치해야할까? (0) | 2016.01.01 |
[RAILS]before_filter에 넘어오는 파라미터에 따라 필터 적용 여부 결정하기 (0) | 2015.12.26 |
[rubyonrails]active record의 timezone 설정하기 (0) | 2015.10.24 |
[RAILS][CHARTKICK]루비로 이쁜 그래프 만들기! (0) | 2015.10.19 |