from bs4 import BeautifulSoup
from threading import Thread
import datetime
import file_writer
import json
import re
import renderer
import random
import secrets
import time
import urllib.request, urllib.error, urllib.parse
class stock_quote_renderer(renderer.debuggable_abstaining_renderer):
# format exchange:symbol
def __init__(self, name_to_timeout_dict, symbols):
super(stock_quote_renderer, self).__init__(name_to_timeout_dict, False)
self.symbols = symbols
self.prefix = "https://www.alphavantage.co/query?"
self.thread = None
def debug_prefix(self):
return "stock"
def get_random_key(self):
return random.choice(secrets.alphavantage_keys)
def periodic_render(self, key):
now = datetime.datetime.now()
if (now.hour < (9 - 3) or
now.hour >= (17 - 3) or
datetime.datetime.today().weekday() > 4):
self.debug_print("The stock market is closed so not re-rendering")
return True
if (self.thread is None or not self.thread.is_alive()):
self.debug_print("Spinning up a background thread...")
self.thread = Thread(target = self.thread_internal_render, args=())
self.thread.start()
return True
def thread_internal_render(self):
symbols_finished = 0
f = file_writer.file_writer('stock_3_86400.html')
f.write("
Stock Quotes
")
f.write("")
for symbol in self.symbols:
# print "---------- Working on %s\n" % symbol
# https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=
# https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=
attempts = 0
cooked = ""
while True:
key = self.get_random_key()
url = self.prefix + "function=GLOBAL_QUOTE&symbol=%s&apikey=%s" % (symbol, key)
raw = urllib.request.urlopen(url).read()
cooked = json.loads(raw)
if 'Global Quote' not in cooked:
# print "%s\n" % cooked
print("Failure %d, sleep %d sec...\n" % (attempts + 1,
2 ** attempts))
time.sleep(2 ** attempts)
attempts += 1
if attempts > 10: # we'll wait up to 512 seconds per symbol
break
else:
break
# These fuckers...
if 'Global Quote' not in cooked:
print("Can't get data for symbol %s: %s\n" % (
symbol, raw))
continue
cooked = cooked['Global Quote']
# {
# u'Global Quote':
# {
# u'01. symbol': u'MSFT',
# u'02. open': u'151.2900',
# u'03. high': u'151.8900',
# u'04. low': u'150.7650',
# u'05. price': u'151.1300',
# u'06. volume': u'16443559',
# u'07. latest trading day': u'2019-12-10',
# u'08. previous close': u'151.3600',
# u'09. change': u'-0.2300'
# u'10. change percent': u'-0.1520%',
# }
# }
price = "?????"
if '05. price' in cooked:
price = cooked['05. price']
price = price[:-2]
percent_change = "?????"
if '10. change percent' in cooked:
percent_change = cooked['10. change percent']
if not '-' in percent_change:
percent_change = "+" + percent_change
change = "?????"
cell_color = "#bbbbbb"
if '09. change' in cooked:
change = cooked['09. change']
if "-" in change:
cell_color = "#b00000"
else:
cell_color = "#009000"
change = change[:-2]
if symbols_finished % 4 == 0:
if (symbols_finished > 0):
f.write("")
f.write("")
symbols_finished += 1
f.write("""
| """ % (cell_color,
symbol,
price,
percent_change,
change))
f.write("
")
f.close()
return True
#x = stock_quote_renderer({}, ["MSFT", "GOOG", "GOOGL", "OPTAX", "VNQ"])
#x.periodic_render(None)
#x.periodic_render(None)