Skip to content

Instantly share code, notes, and snippets.

@sergioccrr
Created March 18, 2014 12:59
Show Gist options
  • Save sergioccrr/9619552 to your computer and use it in GitHub Desktop.
Save sergioccrr/9619552 to your computer and use it in GitHub Desktop.
var https = require('https'),
crypto = require('crypto'),
url = require('url'),
querystring = require('querystring');
const CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxx';
const CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const ACCESS_TOKEN = 'xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
const ACCESS_TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
function urlencode_rfc3986(str) {
return encodeURIComponent(str).replace(/\!/g, '%21').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
}
function time() {
return Math.floor((new Date()).getTime() / 1000);
}
function sort(obj) {
var keys = new Array();
var sorted = {};
for (var i in obj) {
keys.push(i);
}
keys.sort();
for (var i in keys) {
sorted[keys[i]] = obj[keys[i]];
}
return sorted;
}
function generateNonce() {
var min = 0;
var max = 2147483647;
var nonce = '';
nonce += String(time());
nonce += String(Math.floor(Math.random() * (max - min + 1)) + min);
return crypto.createHash('md5').update(nonce).digest('hex');
}
function request(requestOptions, cbFunction, eFunction, postData) {
function authorizationHeader() {
var oauthParameters = {
'oauth_consumer_key':CONSUMER_KEY,
'oauth_nonce':generateNonce(),
'oauth_signature_method':'HMAC-SHA1',
'oauth_timestamp':time(),
'oauth_token':ACCESS_TOKEN,
'oauth_version':'1.0'
}
// ### Creating a signature ###
// Collecting parameters
var parsedURL = url.parse(requestOptions['path'], true);
// merge...
var parameters = {};
for (var key in oauthParameters) {
parameters[key] = oauthParameters[key];
}
for (var key in parsedURL['query']) {
parameters[key] = parsedURL['query'][key];
}
for (var key in postData) {
parameters[key] = postData[key];
}
parameters = sort(parameters);
var parameterStr = '';
for (var key in parameters) {
parameterStr += urlencode_rfc3986(key);
parameterStr += '=';
parameterStr += urlencode_rfc3986(parameters[key]);
parameterStr += '&';
}
parameterStr = parameterStr.slice(0, -1);
// Creating the signature base string
var baseURL = 'https://' + requestOptions['host'] + parsedURL['pathname'];
var signatureBaseStr = requestOptions['method'].toUpperCase();
signatureBaseStr += '&';
signatureBaseStr += urlencode_rfc3986(baseURL);
signatureBaseStr += '&';
signatureBaseStr += urlencode_rfc3986(parameterStr);
// Getting a signing key
var signingKey = urlencode_rfc3986(CONSUMER_SECRET) + '&';
signingKey += urlencode_rfc3986(ACCESS_TOKEN_SECRET);
// Calculating the signature
var signature = crypto.createHmac('sha1', signingKey).update(signatureBaseStr).digest('base64');
// ### Authorizing a request ###
oauthParameters['oauth_signature'] = signature;
var DST = 'OAuth ';
for (var key in oauthParameters) {
DST += urlencode_rfc3986(key);
DST += '="';
DST += urlencode_rfc3986(oauthParameters[key]);
DST += '", ';
}
DST = DST.slice(0, -2);
return DST;
}
requestOptions['headers']['Authorization'] = authorizationHeader();
if (postData) {
var postString = querystring.stringify(postData);
requestOptions['headers']['Content-Type'] = 'application/x-www-form-urlencoded';
requestOptions['headers']['Content-Length'] = postString.length;
}
var req = https.request(requestOptions, function(res) {
res.on('data', cbFunction);
}).on('error', eFunction);
if (postData) {
req.write(postString);
}
req.end();
}
function userStream(getData, cbFunction, eFunction) {
var requestOptions = {
host: 'userstream.twitter.com',
port: '443',
path: '/2/user.json',
method: 'GET',
headers: {}
};
if (typeof getData == 'string' && getData.length != 0) {
requestOptions['path'] += '?' + getData;
} else if (typeof getData == 'object') {
requestOptions['path'] += '?' + querystring.stringify(getData);
}
request(requestOptions, cbFunction, eFunction);
}
function post(method, postData, cbFunction, eFunction) {
var requestOptions = {
host: 'api.twitter.com',
port: '443',
path: '/1/' + method + '.json',
method: 'POST',
headers: {}
};
request(requestOptions, cbFunction, eFunction, postData);
}
exports.userStream = userStream;
exports.post = post;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment