Created
January 8, 2013 13:39
-
-
Save hecomi/4483898 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var phantom_sync = require('phantom-sync'); | |
var phantom = phantom_sync.phantom; | |
var sync = phantom_sync.sync; | |
var cheerio = require('cheerio'); | |
sync(function() { | |
var ph = phantom.create(); | |
page = ph.createPage(); | |
// ページが読み込まれたら page.onCallback を呼ぶ | |
page.set('onInitialized', function() { | |
sync(function() { // <-- callback は sync で囲む | |
page.evaluate(function() { | |
document.addEventListener('DOMContentLoaded', function() { | |
window.callPhantom('DOMContentLoaded'); | |
}, false); | |
}); | |
}); | |
}); | |
// ページが読み込まれたら登録した関数の配列を順次実行してくれるクラス | |
var funcs = function(funcs) { | |
this.onInitializedOld = page.onInitialized; | |
this.funcs = funcs; | |
this.init(); | |
}; | |
funcs.prototype = { | |
// ページが読み込まれたら next() を呼ぶ | |
init: function() { | |
var self = this; | |
page.set('onCallback', function(data) { | |
sync(function() { // <-- 同じく sync で囲む | |
if (data === 'DOMContentLoaded') self.next(); | |
}); | |
}); | |
}, | |
// 登録した関数の配列から1個取り出して実行 | |
next: function() { | |
var func = this.funcs.shift(); | |
if (func !== undefined) { | |
func(); | |
} else { | |
page.set('onCallback', this.onInitializedOld); | |
} | |
} | |
}; | |
// 順次実行する関数 | |
new funcs([ | |
function() { | |
console.log('ログイン処理'); | |
page.open('https://www.hatena.ne.jp/login'); // 次ページヘ | |
}, | |
function() { | |
console.log('ログイン画面'); | |
page.evaluate(function() { | |
document.getElementById('login-name').value = 'はてなの ID'; | |
document.querySelector('.password').value = 'パスワード'; | |
document.querySelector('form').submit(); // 次ページヘ | |
}); | |
}, | |
function() { | |
console.log('ログイン後画面'); | |
page.render('mypage.png'); | |
// ログイン後の HTML を取得 | |
var html = page.evaluate(function() { | |
return document.getElementsByTagName('html')[0].innerHTML; | |
}); | |
// cheerio でパースして iframe に潜る | |
var $ = cheerio.load(html); | |
var url = 'https:' + $('#profile-iframe').attr('src'); | |
page.open(url); | |
}, | |
function() { | |
console.log('iframe 内'); | |
// iframe 内の HTML を取得 | |
var html = page.evaluate(function() { | |
return document.getElementsByTagName('html')[0].innerHTML; | |
}); | |
// cheerio でパースしてユーザ名とポイントを取得 | |
var $ = cheerio.load(html); | |
var username = $('.username').text(); | |
var point = $('.point').text().replace(/\s/g, ''); | |
console.log(username, 'のポイントは後', point, 'だよ!'); | |
// お忘れなきよう (-人-) | |
ph.exit(); | |
} | |
]).next(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment