Last active
December 18, 2015 19:19
-
-
Save sjg/5832090 to your computer and use it in GitHub Desktop.
A small twitter proxy server (written in node) for all the developers who want to keep their Twitter applications running and let node do the heavy OAuth lifting for you.
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
#!/usr/bin/env node | |
// Before running install | |
// -- npm install -g optimist oauth step colors express | |
var serverPort = 8008; | |
var argv = require('optimist') | |
.usage('Usage: --key=[consumer key] -secret=[consumer secret]') | |
.demand(['key', 'secret']) | |
.argv | |
; | |
var OAuth = require('oauth').OAuth; | |
var Step = require('step'); | |
var colors = require('colors'); | |
var express = require("express"); | |
var app = express(); | |
var access_token = ""; | |
var access_token_secret = "" | |
var REQUEST_TOKEN_URL = 'http://api.twitter.com/oauth/request_token'; | |
var ACCESS_TOKEN_URL = 'http://api.twitter.com/oauth/access_token'; | |
var OAUTH_VERSION = '1.0'; | |
var HASH_VERSION = 'HMAC-SHA1'; | |
function getAccessToken(oa, oauth_token, oauth_token_secret, pin) { | |
oa.getOAuthAccessToken(oauth_token, oauth_token_secret, pin, | |
function(error, oauth_access_token, oauth_access_token_secret, results2) { | |
if (error) { | |
if (parseInt(error.statusCode) == 401) { | |
throw new Error('The pin number you have entered is incorrect'.bold.red); | |
} | |
} | |
console.log('Your OAuth Access Token: '.green + (oauth_access_token).bold.cyan); | |
console.log('Your OAuth Token Secret: '.green + (oauth_access_token_secret).bold.cyan); | |
access_token_secret = oauth_access_token_secret; | |
access_token = oauth_access_token | |
//Starting Redirect Server | |
startServer(serverPort); | |
}); | |
} | |
function getRequestToken(oa) { | |
oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, results){ | |
if(error) { | |
throw new Error(([error.statusCode, error.data].join(': ')).bold.red); | |
} else { | |
console.log('In your browser, log in to your twitter account. Then visit:'.bold.green) | |
console.log(('https://twitter.com/oauth/authorize?oauth_token=' + oauth_token).underline.green) | |
console.log('After logged in, you will be promoted with a pin number'.bold.green) | |
console.log('Enter the pin number here:'.bold.yellow); | |
var stdin = process.openStdin(); | |
stdin.on('data', function(chunk) { | |
pin = chunk.toString().trim(); | |
if(pin != ""){ | |
getAccessToken(oa, oauth_token, oauth_token_secret, pin); | |
} | |
}); | |
} | |
}); | |
} | |
var getLatestTweets = function (tweeter, count, callback) { | |
oa.get("https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=" + tweeter + "&count=" + count, access_token, access_token_secret, function (error, data) { | |
var result; | |
if(error){ | |
result = {error: error}; | |
}else{ | |
result = data; | |
} | |
callback(result); | |
}); | |
}; | |
var getLists = function (listname, owner, count, callback) { | |
oa.get("https://api.twitter.com/1.1/lists/statuses.json?slug=" + listname + "&owner_screen_name=" + owner + "&count="+count+"&page=1&include_entities=false&include_rts=true", access_token, access_token_secret, function (error, data) { | |
var result; | |
if(error){ | |
result = {error: error}; | |
}else{ | |
result = data; | |
} | |
callback(result); | |
}); | |
}; | |
var getTrends = function (woid, exclude, callback) { | |
oa.get("https://api.twitter.com/1.1/trends/place.json?id=" + woid + "&exclude=" + exclude, access_token, access_token_secret, function (error, data) { | |
var result; | |
if(error){ | |
result = {error: error}; | |
}else{ | |
result = data; | |
} | |
callback(result); | |
}); | |
}; | |
function startServer(port){ | |
var app = express(); | |
app.use(express.bodyParser()); | |
app.get('/latest', function(req, res){ | |
res.writeHead(200, {'Content-Type': 'application/json'}); | |
getLatestTweets(req.query.screen_name, req.query.count,function(data){ | |
try{ | |
res.write(data); | |
//console.log(req.query); | |
res.end(); | |
}catch(err){ | |
if(data != undefined){ | |
if(data != ""){ | |
res.write(JSON.stringify(data)); | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
res.end(); | |
} | |
}); | |
}); | |
app.get('/lists', function(req, res){ | |
res.writeHead(200, {'Content-Type': 'application/json'}); | |
getLists(req.query.slug, req.query.owner_screen_name, req.query.count,function(data){ | |
try{ | |
res.write(data); | |
//console.log(req.query); | |
res.end(); | |
}catch(err){ | |
if(data != undefined){ | |
if(data != ""){ | |
res.write(JSON.stringify(data)); | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
res.end(); | |
} | |
}); | |
}); | |
app.get('/trends', function(req, res){ | |
res.writeHead(200, {'Content-Type': 'application/json'}); | |
getTrends(req.query.id, req.query.exclude,function(data){ | |
try{ | |
res.write(data); | |
//console.log(req.query); | |
res.end(); | |
}catch(err){ | |
if(data != undefined){ | |
if(data != ""){ | |
res.write(JSON.stringify(data)); | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
}else{ | |
res.write('{"error": "server error"}'); | |
} | |
res.end(); | |
} | |
}); | |
}); | |
app.listen(port); | |
console.log(); | |
console.log(("Server started on port: " + port).bold.yellow); | |
} | |
var key = argv.key.trim(); | |
var secret = argv.secret.trim(); | |
var user_auth_token = argv.usertoken; | |
var user_auth_secret = argv.usersecret; | |
if(user_auth_token != undefined && user_auth_secret != undefined){ | |
if(user_auth_token != "" && user_auth_secret != ""){ | |
access_token_secret = user_auth_secret; | |
access_token = user_auth_token | |
startServer(serverPort); | |
}else{ | |
var oa = new OAuth(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, key, secret, OAUTH_VERSION , null, HASH_VERSION); | |
getRequestToken(oa); | |
} | |
}else{ | |
var oa = new OAuth(REQUEST_TOKEN_URL, ACCESS_TOKEN_URL, key, secret, OAUTH_VERSION , null, HASH_VERSION); | |
getRequestToken(oa); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment