import bs4 import flask import functools import re import requests import time app = flask.Flask(__name__) def _cached(f): f._cache = None f._cache_time = None @functools.wraps(f) def wrapper(*args, **kwargs): if f._cache is None or f._cache_time + 60 < time.time(): res = f(*args, **kwargs) f._cache_time = time.time() f._cache = res return res else: return f._cache return wrapper @_cached def get_stats(): t = requests.get("http://xpm.syware.de/?a=AT1tRrSHYEBSy9tA24GgHy3qKyDKhfAwys").text soup = bs4.BeautifulSoup(t) pre = str(soup.body.pre) m = re.search(r"([0-9\.]+) [0-9\.]+\t([0-9\.]+) XPM/h", pre) speed = float(m.group(2)) m = re.search(r"([0-9]+)\t([0-9][0-9]\.[0-9][0-9])\. ([0-9][0-9]:[0-9][0-9])\t([0-9\.]+)\t\+([0-9\.]+)\t([0-9\.]+)", pre) block, date, time, total, add, balance = m.groups() return speed, (date, time, total, add, balance) @_cached def get_exchange_rate(): j = requests.get('https://crypto-trade.com/rfetch/23').json() rate = j["values"][-1][2] return rate @app.template_filter('real_money') def real_money(xpm): xpm = float(xpm) return '{:.2f} USD'.format(xpm * get_exchange_rate()) MINERS = {} MINER_TIMEOUT = 120 def get_miners(): # first, get rid of stale miners global MINERS to_delete = set() for name, miner in MINERS.iteritems(): if miner['time'] + MINER_TIMEOUT < time.time(): to_delete.add(name) for td in to_delete: del MINERS[td] return MINERS @app.route('/report-miner//') def view_report_miner(name, threads): MINERS[name] = { 'name': name, 'threads': threads, 'time': time.time()} return flask.jsonify({'status': 'ok'}) @app.route('/') def view_index(): speed, (date, time, total, add, balance) = get_stats() # hack at = '{}.2014 {}'.format(date, time) return flask.render_template('status.html', speed=speed, add=add, at=at, total=total, miners=get_miners()) @app.route('/api') def view_api(): speed, (date, time, total, add, balance) = get_stats() result = { 'speed': float(speed), 'total': float(total), 'last_share': { 'time': time, 'date': date, 'add': add }, 'power_used': '1.21 jiggowats', } return flask.jsonify(result) if __name__ == '__main__': app.run(debug=True)