Created
January 6, 2016 20:49
-
-
Save rendon/73254a72877e7f1c57ff to your computer and use it in GitHub Desktop.
TW bot
This file contains hidden or 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 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