Skip to content

Instantly share code, notes, and snippets.

@hecomi
Created January 8, 2013 13:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hecomi/4483898 to your computer and use it in GitHub Desktop.
Save hecomi/4483898 to your computer and use it in GitHub Desktop.
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