Commit 407be6e0 authored by Taddeüs Kroes's avatar Taddeüs Kroes

Implement simple polling server that updates files in shared memory

parent 1b914140
import requests
#!/usr/bin/env python
import sys
import os
import atexit
import time
import grequests
from Queue import PriorityQueue
class APIError(RuntimeError):
pass
interval = 3 # poll exchange tickers every 3 seconds
cap_interval = 60 # poll check market cap every minute
def get_check_status(errstr, url, *args):
r = requests.get(url, timeout=10.0, *args)
if r.status_code != 200:
raise APIError(errstr)
return r.json()
exchanges = {
'https://btc-e.com/api/3/ticker/btc_usd':
('btce', ('btc_usd', 'last'), 'USD', interval),
'https://api.gdax.com/products/BTC-USD/ticker':
('coinbase', ('price',), 'USD', interval),
'https://www.bitstamp.net/api/v2/ticker/btcusd/':
('bitstamp', ('last',), 'USD', interval),
'https://api.bitfinex.com/v1/pubticker/btcusd':
('bitfinex', ('last_price',), 'USD', interval),
'https://data.btcchina.com/data/ticker?market=btccny':
('btcchina', ('ticker', 'last'), 'CNY', interval),
'http://api.huobi.com/staticmarket/ticker_btc_json.js':
('huobi', ('ticker', 'last'), 'CNY', interval),
'https://www.okcoin.com/api/v1/ticker.do?symbol=btc_usd':
('okcoin', ('ticker', 'last'), 'CNY', interval),
'https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR':
('kraken', ('result', 'XXBTZEUR', 'c', 0), 'EUR', interval),
'https://api.coinmarketcap.com/v1/ticker/bitcoin/':
('coinmarketcap', (0, 'market_cap_usd'), 'USD', cap_interval),
}
def poll_btce():
url = 'https://btc-e.com/api/3/ticker/btc_usd'
return float(get_check_status('BTC-e', url)['btc_usd']['last']), 'USD'
queue = PriorityQueue(len(exchanges))
def poll_coinbase():
url = 'https://api.gdax.com/products/BTC-USD/ticker'
return float(get_check_status('Coinbase', url)['price']), 'USD'
def generate_requests():
while True:
scheduled, url = queue.get()
wait = scheduled - time.time()
def poll_bitstamp():
url = 'https://www.bitstamp.net/api/v2/ticker/btcusd/'
return float(get_check_status('Bitstamp', url)['last']), 'USD'
if wait > 0:
time.sleep(wait)
def poll_bitfinex():
url = 'https://api.bitfinex.com/v1/pubticker/btcusd'
return float(get_check_status('Bitfinex', url)['last_price']), 'USD'
yield grequests.get(url, timeout=5)
def poll_btcchina():
url = 'https://data.btcchina.com/data/ticker?market=btccny'
return float(get_check_status('BTCChina', url)['ticker']['last']), 'CNY'
if __name__ == '__main__':
for url in exchanges.iterkeys():
queue.put((0, url))
def poll_huobi():
url = 'http://api.huobi.com/staticmarket/ticker_btc_json.js'
return float(get_check_status('Huobi', url)['ticker']['last']), 'CNY'
root = sys.argv[1] if len(sys.argv) == 2 else '/dev/shm/tothemoon'
create_root = not os.path.isdir(root)
def poll_okcoin():
url = 'https://www.okcoin.com/api/v1/ticker.do?symbol=btc_usd'
return float(get_check_status('OKcoin', url)['ticker']['last']), 'CNY'
def remove_files():
for ex in exchanges.itervalues():
path = root + '/' + ex[0]
if os.path.exists(path):
os.remove(path)
def poll_kraken():
url = 'https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR'
return float(get_check_status('Kraken', url)['result']['XXBTZEUR']['c'][0]), 'EUR'
if create_root:
os.rmdir(root)
def poll_coinmarketcap():
url = 'https://api.coinmarketcap.com/v1/ticker/bitcoin'
return get_check_status('Coinmarketcap', url)[0]['market_cap_usd'], 'USD'
atexit.register(remove_files)
if __name__ == '__main__':
print 'btc-e', poll_btce()
print 'coinbase', poll_coinbase()
print 'bitstamp', poll_bitstamp()
print 'bitfinex', poll_bitfinex()
print 'btcchina', poll_btcchina()
print 'huobi', poll_huobi()
print 'okcoin', poll_okcoin()
print 'kraken', poll_kraken()
print 'coinmarketcap', poll_coinmarketcap()
if create_root:
try:
os.mkdir(root)
except OSError as e:
print >>sys.stderr, 'Could not create root directory %s:' % root,
print >>sys.stderr, e.strerror
sys.exit(1)
try:
for res in grequests.imap(generate_requests()):
exid, indices, currency, interval = exchanges[res.request.url]
queue.put((time.time() + interval, res.request.url))
last = res.json()
for i in indices:
last = last[i]
last = float(last)
with open(root + '/' + exid, 'w') as f:
print >>f, last, currency
except KeyboardInterrupt:
pass
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment