Skip to content

Instantly share code, notes, and snippets.

@rendon
Created January 6, 2016 20:49
Show Gist options
  • Save rendon/73254a72877e7f1c57ff to your computer and use it in GitHub Desktop.
Save rendon/73254a72877e7f1c57ff to your computer and use it in GitHub Desktop.
TW bot
var casper = require('casper').create();
var system = require('system');
var util = require('../lib/util');
casper.options.viewportSize = { width: 1024, height: 768*3 };
casper.options.pageSettings = { loadImages:true, loadPlugins:true, webSecurityEnabled: false };
var ID = casper.cli.args[0];
if (typeof ID == 'undefined') {
system.stderr.write(JSON.stringify({error: 'Missing handle.'}));
casper.exit(1);
}
ID = ID.toLowerCase();
casper.start('https://twitter.com/' + ID + '/with_replies', function() {
var titleText = this.getTitle();
if (titleText.substr(0, 9) == 'Twitter /') {
system.stderr.write(JSON.stringify({error: 'Handle "' + ID + '" does not exists.'}));
casper.exit(1);
}
var photoURL = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileAvatar-image')).attr('src');
}
);
var bioText = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-bio')).text();
}
);
var locationText = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-locationText')).text().trim();
}
);
var joinDateText = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-joinDateText')).attr('title');
}
);
var urlText = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-urlText a')).text().trim();
}
);
var handleNick = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-screennameLink')).text().trim();
}
);
var handleName = this.evaluate(
function() {
return $(document.querySelectorAll('.ProfileHeaderCard-nameLink')).text().trim();
}
);
var tweets = this.evaluate(
function() {
var results = [];
var tweets = document.querySelectorAll('ol.stream-items li');
for (var i = 0; i < tweets.length; i++) {
var when = $(tweets[i].querySelectorAll('small.time a')).attr('title');
var text = $(tweets[i].querySelectorAll('p.tweet-text')).text();
var rts = $(tweets[i].querySelectorAll('button.js-actionRetweet.ProfileTweet-actionButton span.ProfileTweet-actionCount span.ProfileTweet-actionCountForPresentation')).text();
var favs = $(tweets[i].querySelectorAll('button.js-actionFavorite.ProfileTweet-actionButton span.ProfileTweet-actionCount span.ProfileTweet-actionCountForPresentation')).text();
if (text != "") {
results.push({
'retweets': parseInt(rts, 10) || 0,
'favorites': parseInt(favs, 10) || 0,
'date': when,
'text': text
});
}
}
return results;
}
);
var relationsMap = {};
for (var i = 0; i < tweets.length; i++) {
var s = tweets[i].text;
var n = s.match(/@[a-zA-Z0-9_]+/g);
if (tweets[i].date) {
tweets[i].date = util.twitterDate(tweets[i].date);
}
if (n) {
for (var j = 0; j < n.length; j++) {
var nickname = n[j].toLowerCase().substr(1);
relationsMap[nickname] = true;
}
}
// this.echo(s);
}
var data = {
'title': titleText,
'bio': bioText,
'location': locationText,
'join_date': util.twitterDate(joinDateText),
//'nick': handleNick,
'real_name': handleName,
'photo_url': photoURL,
'url': urlText,
'latest_tweets': tweets
};
var relations = [];
for (var n in relationsMap) {
relations.push({id: n});
}
var response = {
data: data,
relations: relations,
id: handleNick.substr(1).toLowerCase()
};
system.stdout.write(JSON.stringify(response));
});
casper.run();
casper.on('error', function(msg,backtrace) {
// this.capture('./out/error.png');
// throw new ErrorFunc("fatal","error","filename",backtrace,msg);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment