Skip to content

Instantly share code, notes, and snippets.

@sjg
Last active December 18, 2015 19:19
Show Gist options
  • Save sjg/5832090 to your computer and use it in GitHub Desktop.
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.
#!/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