Skip to content

Instantly share code, notes, and snippets.

@Clijsters
Last active October 19, 2015 22:04
Show Gist options
  • Save Clijsters/9082005 to your computer and use it in GitHub Desktop.
Save Clijsters/9082005 to your computer and use it in GitHub Desktop.
-UPDATED- Get Data from API with Node.JS
/*
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.');
}
});
}
}
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