#!/usr/bin/env python import oursql import requests import urllib2 from xml.dom import minidom system_name = 'amarr' #system_name = 'jita' conn = oursql.connect(db='eve', user='eve', passwd='eve') rs = requests.session(headers={'User-Agent': 'http://git.raylu.net/eve/'}) def get_systemid(name): curs = conn.cursor() try: #SELECT regionID FROM mapRegions WHERE regionName curs.execute(''' SELECT solarSystemID FROM mapSolarSystems WHERE solarSystemName LIKE ?; ''', (name,)) return curs.fetchone()[0] finally: curs.close() def iter_blueprints(): curs = conn.cursor() try: curs.execute(''' SELECT b.productTypeID, t.typeName FROM invBlueprintTypes as b INNER JOIN invTypes AS t ON b.productTypeID = t.typeID ''') while True: r = curs.fetchone() if r is None: break yield r finally: curs.close() def get_mats(typeid): curs = conn.cursor() try: # base mats curs.execute(''' SELECT t.typeID, m.quantity FROM invTypeMaterials AS m INNER JOIN invTypes AS t ON m.materialTypeID = t.typeID WHERE m.typeID = ?; ''', (typeid,)) mats = dict(curs.fetchall()) # extra mats curs.execute(''' SELECT blueprintTypeID FROM invBlueprintTypes WHERE productTypeID = ? ''', (typeid,)) blueprint_typeid = curs.fetchall()[0][0] curs.execute(''' SELECT t.typeID, r.quantity FROM ramTypeRequirements AS r INNER JOIN invTypes AS t ON r.requiredTypeID = t.typeID INNER JOIN invGroups AS g ON t.groupID = g.groupID WHERE r.typeID = ? AND r.activityID = 1 AND g.categoryID != 16; ''', (blueprint_typeid,)) while True: r = curs.fetchone() if r is None: break mat_typeid, quantity = r if mat_typeid not in minerals.keys(): return try: mats[mat_typeid] += quantity except KeyError: mats[mat_typeid] = quantity return mats finally: curs.close() def get_prices(typeid, systemid): # ®ionlimit=%d url = 'http://api.eve-central.com/api/marketstat?typeid=%d&usesystem=%d' % (typeid, systemid) xml = minidom.parseString(rs.get(url).text) buy = xml.getElementsByTagName('buy')[0] buy_max = buy.getElementsByTagName('max')[0] bid = float(buy_max.childNodes[0].data) sell = xml.getElementsByTagName('sell')[0] sell_min = sell.getElementsByTagName('min')[0] ask = float(sell_min.childNodes[0].data) return bid, ask def calc_margin(typeid, systemid): mats = get_mats(typeid) if mats is None: return cost = 0 for mtypeid, quantity in mats.iteritems(): try: cost += prices[mtypeid][1] * quantity except KeyError: return if cost == 0: return sell_value = get_prices(typeid, systemid)[0] profit = sell_value - cost margin = profit / cost return margin minerals = { 34: 'Tritanium', 35: 'Pyerite', 36: 'Mexallon', 40: 'Megacyte', 37: 'Isogen', 38: 'Nocxium', 39: 'Zydrine', } prices = {} systemid = get_systemid(system_name) for typeid in minerals.iterkeys(): prices[typeid] = get_prices(typeid, systemid) with open(system_name, 'w') as f: for typeid, name in iter_blueprints(): try: margin = calc_margin(typeid, systemid) except Exception as e: print repr(e) else: if margin is not None: line = '%0.2f\t%s' % (margin, name) print line f.write(line + '\n')