Last active
October 19, 2015 22:04
-
-
Save Clijsters/9082005 to your computer and use it in GitHub Desktop.
-UPDATED- Get Data from API with Node.JS
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
/* | |
Found this complete file from 20.02.2014 | |
= = = = = = = = */ | |
/** | |
* Dependencies: | |
* - forever - to start Node as a service | |
* - mysql npm package - for database | |
* | |
* Description: | |
* Fetch data from yahoo.finance.historicaldata as JSON and push it to local MySQL-DB | |
* Errors are handled and printed to console | |
* | |
**/ | |
var mysql = require('mysql'); | |
var http = require('http'); | |
//YQL | |
var intervalMinute = 1.25; | |
var limitPerInterval = 8; | |
var strFormat = 'json'; | |
//MySQL | |
var host = '127.0.0.1'; | |
var user = 'Benutzername'; | |
var password = 'gibtesnicht'; | |
var database = 'Boerse'; | |
var MySQLNow; | |
var bodyData; | |
var client = mysql.createConnection({ | |
host : host, | |
user : user, | |
password : password, | |
database : database | |
}); | |
client.connect(function(err) { | |
if(err) { | |
console.log('There was an error while trying to connect to MySQL: ' + err.message); | |
} else { | |
console.log('Connected to ' + host + ' with user ' + user + ' to database ' + database + '.'); | |
} | |
}); | |
client.on('error', function(err){ | |
if(err.fatal){ | |
console.log('Fatal:'); | |
} | |
console.log(err.code); | |
}); | |
console.log('Setting Interval for YQL Queries.\nQuerying ' + limitPerInterval + ' Symbol(s) every ' + intervalMinute + ' minute(s).' + ' ' + (limitPerInterval/intervalMinute)*60 + ' Symbols/Hour'); | |
var interval = setInterval(getData, intervalMinute * 60 * 1000); | |
function getData() { | |
//console.log('getData'); | |
var pDate = new Date(); | |
MySQLNow = pDate.toISOString().slice(0,10); //Format: YYYY-MM-DD /////////////////!!! | |
//var strQuery = 'SELECT Symbol FROM Companies WHERE (LastGet IS NULL OR LastGet < 2006-01-01) AND (State <> "unavailable" OR State IS NULL) ORDER BY LastGet DESC LIMIT 0,' + limitPerInterval + ';'; | |
var strQuery = 'SELECT Symbol FROM Companies WHERE State = "unavailable" OR State IS NULL ORDER BY LastGet DESC LIMIT 0,' + limitPerInterval + ';'; | |
var query = client.query(strQuery, function(err, rows) { | |
console.log('rows:'); | |
console.log(rows); | |
if(rows) { | |
try{ | |
rows.forEach(function(row){ | |
getFromAPI(row.Symbol, '2006-01-01', MySQLNow); | |
}); | |
} catch(err) { | |
console.log('Uncaught Exception while "getFromAPI()": ' + err.message); | |
} | |
} else { | |
//clearInterval(interval); | |
console.log('No Companies to query. Stopping.'); | |
} | |
}); | |
query.on('error', function(err){ | |
console.log('Error while querying for Companies'); | |
}); | |
} | |
function getFromAPI(symbol, start, end) { | |
//console.log('getFromAPI'); | |
var strQuery = 'SELECT * FROM yahoo.finance.historicaldata WHERE symbol = "' + symbol + '" AND startDate = "' + start + '" AND endDate = "' + end + '"'; | |
strQuery = encodeURIComponent(strQuery); | |
//console.log('Get Quotes for ' + symbol); | |
var url = 'http://query.yahooapis.com/v1/public/yql?q=' + strQuery + '&format=' + strFormat + '&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback='; | |
var data = ''; | |
var request = http.get(url, function(res) { | |
console.log("Response: STATUS/" + res.statusCode); | |
res.on("data", function(chunk) { | |
if(res.statusCode == 200){ | |
console.log('Adding Data to buffer...'); | |
data += chunk; | |
} else { | |
console.log('Wrong HTTP Status-Code while fetching from API'); | |
} | |
}); | |
res.on('end', function(){ | |
saveToDB(data, symbol, MySQLNow); | |
}); | |
}).on('error', function(err) { | |
console.log("Error: " + err.message); | |
}); | |
} | |
function saveToDB(answer, company, mySQLDate) { | |
try { | |
var toPost = JSON.parse(answer); | |
} catch (e) { | |
console.log('Could not parse Response!\nat: JSON.Parse(answer)\n'); | |
} | |
if(toPost.query.results){ | |
console.log('Adding Quotes for ' + company + ' to local database...'); | |
toPost.query.results.quote.forEach(function(entry){ | |
//console.log(JSON.stringify(entry)); | |
var query = client.query('INSERT INTO Quotes SET ?', entry, function(err, result) { | |
if (err) { | |
console.log('There was an Error during MySQL-Insert: ' + err.code); | |
} else { | |
//console.log('' + result.InsertID + ' inserted to DB.'); | |
//console.log('Adding quote for ' + company); | |
} | |
}); | |
}); | |
query = client.query('UPDATE Companies SET LastGet = "' + mySQLDate + '" WHERE Symbol = "' + company + '";', function(err, result) { | |
if (err) { | |
console.log('There was an Error during Timestamp-Update: ' + err.code); | |
} else { | |
console.log('Timestamp for Company ' + company + ' updated to now().'); | |
} | |
}); | |
} else { | |
console.log('No quotes for ' + company); | |
query = client.query('UPDATE Companies SET State = "unavailable" WHERE Symbol = "' + company + '";', function(err, result) { | |
if (err) { | |
console.log('Error while marking ' + company + ' as unavailable: ' + err.code); | |
} else { | |
console.log('Marked ' + company + ' as unavailable.'); | |
} | |
}); | |
} | |
} |
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 strQuery = encodeURIComponent('select * from yahoo.finance.historicaldata where symbol = "GOOG"'); | |
var url = 'http://query.yahooapis.com/v1/public/yql?q=' + strQuery + '&format=JSON&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback='; | |
var data = ''; //Will hold JSON String | |
var request = http.get(url, function(res) { | |
console.log("HTTP Response Status" + res.statusCode); | |
res.on("data", function(chunk) { | |
if(res.statusCode == 200){ | |
console.log('Adding Data to buffer...'); | |
data += chunk; | |
} else { | |
console.log('Bad HTTP Status-Code'); | |
} | |
}); | |
res.on('end', function(){ | |
process(data); | |
}); | |
}).on('error', function(err) { | |
console.log("Error: " + err.message); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment