Created
March 18, 2014 12:59
-
-
Save sergioccrr/9619552 to your computer and use it in GitHub Desktop.
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 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