Senior Member
Join Date: Jul 2010
Location: Sydney, Australia
|
04-03-2012
, 19:29
Re: What is your Steam worth?
|
#21
|
Yeah, I killed my hosting for that site sometime late last year.
The code you want is below ... it's ugly. Asherkin has the code I had hosted, but anyway, woo, hacky crap.
Code:
# -*- coding: utf-8 -*-
#/usr/bin/env python
""" Download the source of
https://store.steampowered.com/account, save it as a file,
import this class. Then load the file.
Note: This class is capable of storing multiple users,
so watch your RAM.
e.g.
from steambreakdown import SteamBreakdown
SB = SteamBreakdown()
SB.newuser('alias', '/path/to/file')
SB.saveHTML('alias','/path/to/output') # Saves to /path/to/output
SB.sidHTMLO('alias','/out/dir/') # Saves to /out/dir/64bitsteamid
SB.sidHTMLO('alias','/out/dir/',True) # Saves to /out/dir/64bitsteamid, prints SteamID
Many bugs found anf fixed due to their being encountered by:
AzuiSleet, Asherkin, DarthNinja, and ChrisFPS.
"""
__version__ = '0.0.2'
from BeautifulSoup import BeautifulSoup
import os
import codecs
import datetime
# -- TODO: Graphing
#import numpy as np
#import matplotlib.mlab as mlab
#import matplotlib.pyplot as plt
# Define this
months = ['','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
class SteamBreakdown:
def __init__(self):
self.users = {} # stored in 'alias':{'filename': filename,'data'}
def __dcheck(self,alias,key,d,m,y):
ck = '%s_count' % key
sk = '%s_spend' % key
if(y not in list(self.users[alias]['data']['dist'].keys())):
self.users[alias]['data']['dist'][y] = {}
if(m not in list(self.users[alias]['data']['dist'][y].keys())):
self.users[alias]['data']['dist'][y][m] = {}
if(ck not in list(self.users[alias]['data']['dist'][y][m].keys())):
self.users[alias]['data']['dist'][y][m][ck] = 0
if(sk not in list(self.users[alias]['data']['dist'][y][m].keys())):
self.users[alias]['data']['dist'][y][m][sk] = 0.00
def __pupdater(self, alias,key,amt,d,m,y):
self.__dcheck(alias,key,d,m,y)
self.users[alias]['data']['purchases'][key]['spend'] = self.users[alias]['data']['purchases'][key]['spend'] + amt
self.users[alias]['data']['purchases'][key]['count'] = self.users[alias]['data']['purchases'][key]['count'] + 1
self.users[alias]['data']['dist'][y][m]['%s_count' % key] = self.users[alias]['data']['dist'][y][m]['%s_count' % key] +1
self.users[alias]['data']['dist'][y][m]['%s_spend' % key] = self.users[alias]['data']['dist'][y][m]['%s_spend' % key] + amt
def parser(self, alias, myset=None, target=None):
""" target: 'self', 'ingame', 'gift' """
if(myset != None and target != None):
for pset in myset.findAll('div',recursive=False)[1:]:
for item in pset.findAll('div',recursive=False):
pmethod = item.find('div','transactionRowEvent').contents[0]
pamt = item.find('div','transactionRowPrice').contents[0]
pdate = item.find('div','transactionRowDate').contents[0]
pdate = pdate.replace(",","")
try:
if(pdate[0] == str(int(pdate[0]))):
d,m,y = pdate.split(' ')
except Exception, e:
m,d,y = pdate.split(' ')
m = str(months.index(m))
d = str(int(d))
y = str(y)
if(pamt == 'Free' or pamt == 'N/A'):
pamt = '0.00'
else:
pamt = pamt.replace("$","")
pamt = pamt.replace("-","0") # Eurofix
pamt = pamt.replace(",",".") # Eurofix
pamt = float(pamt)
if(pmethod == 'Wallet Credit'):
self.__pupdater(alias,'wall', pamt, d, m, y)
else:
self.__pupdater(alias,target, pamt, d, m, y)
# Bool return; true = win; false = fail
def newuser(self, alias, filename):
if(alias in list(self.users.keys())): return False
self.users[alias] = {}
self.users[alias]['capabilities'] = {'mitx':False,'gift':False,'self':False,'wallet':False}
self.users[alias]['data'] = {
'purchases': {
'gift':{'count':0,'spend':0.00},
'self':{'count':0,'spend':0.00}, 'mitx':{'count':0,'spend':0.00},
'wall':{'count':0,'spend':0.00}
},
# Unused licence stuff
# app_types : {'Steam Store':0,'Complimentary':0,'Retail':0},
'soup': {},
'dist': {},
}
data = codecs.open(filename,'r','utf-8').read()
cs = [[u'¢',"¢"],[u'£',"£"],[u'¥',"¥"],[u'€',"€"],[u'¤',"¤"],[u'ƒ',"ƒ"]]
for c in xrange(len(cs)):
data = data.replace(cs[c][0],cs[c][1])
self.users[alias]['currency'] = '$' # Fallback
for c in ["$","¢","£","¤","ƒ","¥","€"]:
if(data.find(c) > 0):
self.users[alias]['currency'] = c
data = data.replace(c,"$")
break
main_soup = BeautifulSoup(data)
try:
divs = main_soup.find('div', attrs={'class': 'youraccount_pages'})
except Exception:
return False
# -- We're not looking at this at the moment --
#licence_soup = divs.find('div', attrs={"class":"youraccount_page", "id":"licenses"})
#licence_soup = licence_soup.find('div', attrs={"class":"block_content"})
try:
body = main_soup.find('body')
sjs = body.findAll('script', attrs={'type':'text/javascript'})
for s in sjs:
if(s.contents[0].find("g_SteamID") > 0):
c = s.contents[0]
break
sid = c[c.find("var g_SteamID = ")+len("var g_SteamID = "):c.find(";")]
self.users[alias]['steamid'] = sid
except Exception:
return False
if(len(sid) != 17):
del self.users[alias]
return False
if(str(int(sid)) != sid):
del self.users[alias]
return False
# Microtransactions
try:
ingame_soup = divs.find('div', attrs={"class":"youraccount_page", "id":"ingame_transactions"})
self.users[alias]['data']['mitx'] = ingame_soup.find('div', attrs={"class":"block_content"})
self.users[alias]['capabilities']['mitx'] = True
except Exception:
pass
try:
transaction_soup = divs.find('div', attrs={"class":"youraccount_page", "id":"store_transactions"})
transaction_soup = transaction_soup.findAll('div', attrs={"class":"block_content"})
except Exception:
return False
try:
self.users[alias]['data']['self'] = transaction_soup[0]
self.users[alias]['capabilities']['self'] = True
except Exception:
pass
try:
self.users[alias]['data']['gift'] = transaction_soup[1]
self.users[alias]['capabilities']['gift'] = True
except Exception:
pass
# Process everything (except licences)
if(self.users[alias]['capabilities']['gift']):
self.parser(alias,self.users[alias]['data']['gift'],'gift')
if(self.users[alias]['capabilities']['self']):
self.parser(alias,self.users[alias]['data']['self'],'self')
if(self.users[alias]['capabilities']['mitx']):
self.parser(alias,self.users[alias]['data']['mitx'],'mitx')
return True
def render_month(self,alias,mName, sn, sp, gn, gp, mn, mp):
x = [int(round(float(sp),0)),
int(round(float(gp),0)),
int(round(float(mp),0))]
t = x[0] + x[1] + x[2]
i = 0
o = []
while(len(o) < 3):
n = x.index(max(x))
o.append(n)
x[n] = -1
x = [int(round(float(sp),0)),
int(round(float(gp),0)),
int(round(float(mp),0))]
while(t < 100):
x[o[i]] = x[o[i]] + 1
i = i + 1
if(i == 3): i = 0
t = x[0] + x[1] + x[2]
out = """<div class="month"><span class="mName">%s</span>""" % mName
if(int(x[0]) > int(0)):
out += """<span class="self" title="%s%s" style="width:%spx;"> </span>""" % (self.users[alias]['currency'],sn,str(x[0]*4))
if(int(x[1]) > int(0)):
out += """<span class="gift" title="%s%s" style="width: %spx;"> </span>""" % (self.users[alias]['currency'],gn,str(x[1]*4))
if(int(x[2]) > int(0)):
out += """<span class="mitx" title="%s%s" style="width: %spx;"> </span>""" % (self.users[alias]['currency'],mn,str(x[2]*4))
out += """</div>"""
return out
def saveHTML(self,alias,outfile):
yk = list(self.users[alias]['data']['dist'].keys())
T = ['self','gift','mitx','wall']
o = open(outfile,'w')
o.write("""<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Steam Breakdown</title>
<style type="text/css">
body{background: #2e3336;font-family:Arial;color:#eeeeec;margin:0;padding:0;}
h1{font-size:36px;text-align:center;font-weight:300;}
h2{font-size:24px;text-align:center;font-weight:300;margin-top:40px;}
div>h2{margin-top:0;}
.month{display:block;border:1px solid #eeeeec;font-size:18px;padding:5px;width:500px;margin:5px auto;}
.month span{display:inline-block;color:#000000;}
.month .data{width:400px;text-align:center;display:inline-block;}
.month .mName{width:100px;display:inline-block;color:#eeeeec;}
.mid {display: block; width: 400px; margin: 15px auto;}
.ca {text-align: center;}
.b{border: 1px solid #eeeeec; padding: 5px;width:500px;}
.pself:before{display:inline-block;height:12px;width:12px;background: #739fd0;content:' ';}
.pgift:before{display:inline-block;height:12px;width:12px;background: #ad7ea8;content:' ';}
.pmitx:before{display:inline-block;height:12px;width:12px;background: #89e334;content:' ';}
.self{background: #739fd0;}
.gift{background: #ad7ea8;}
.mitx{background: #89e334;}
.foot{background: #000000;font-size:10px;text-align:center;margin:75px auto 0 auto;padding:15px;width:400px;}
a,a:visited,a:hover{color:#eeeeec;}
</style>
</head>
<body>
<h1>Steam Breakdown</h1>
<div class="mid ca">
<a href="http://steamcommunity.com/profiles/%s/">View the associated Steam Profile</a>
</div>
<h2> Legend </h2>
<div class="mid b">
<div class="box pself"> Steam store (bought for self)</div>
<div class="box pgift"> Steam store (gift for someone else, via Steam)</div>
<div class="box pmitx"> In-game Microtransaction</div>
</div> """ % self.users[alias]['steamid'])
for y in xrange(int(min(yk)),int(max(yk))+1):
y = str(y)
o.write("<h2>%s</h2>" % y)
if(y in list(self.users[alias]['data']['dist'].keys())):
for m in xrange(1,13):
m = str(m)
if(m in list(self.users[alias]['data']['dist'][y].keys())):
for t in T:
self.__dcheck(alias,t,0,m,y)
s_n = self.users[alias]['data']['dist'][y][m]['self_spend']
g_n = self.users[alias]['data']['dist'][y][m]['gift_spend']
m_n = self.users[alias]['data']['dist'][y][m]['mitx_spend']
sn = float(float(s_n) + float(g_n) + float(m_n))
if(sn != 0):
s_p = float(float(s_n)/float(sn))*100.0
g_p = float(float(g_n)/float(sn))*100.0
m_p = float(float(m_n)/float(sn))*100.0
o.write(self.render_month(alias,datetime.datetime.strftime(datetime.datetime(int(y),int(m),1),"%B"),str(s_n),str(s_p),str(g_n),str(g_p),str(m_n),str(m_p)))
o.write("""
<h2> Totals </h2>
<div class="mid ca">
<div class="box pself"> %s%s</div>
<div class="box pgift"> %s%s</div>
<div class="box pmitx"> %s%s</div>
</div> """ % (self.users[alias]['currency'],self.users[alias]['data']['purchases']['self']['spend'],self.users[alias]['currency'],self.users[alias]['data']['purchases']['gift']['spend'],self.users[alias]['currency'],self.users[alias]['data']['purchases']['mitx']['spend']))
o.write("""
<div class="foot">
<p> Swixel was bored.</p>
<p>Python script used to generate this Copyright © 2010 A.W. 'Swixel' Stanley; GPLv3. </p>
<p> [ <a href="http://cloudypixels.com/sb/src.php">get/view the source</a> ]</p>
<p>The colours are from the <a href="http://tango.freedesktop.org/">Tango Pallet</a>.</p>
</div>
</body>
</html>""")
o.close()
def sidHTMLO(self,alias,outdir,pS=False):
fname = "%s.html" % os.path.join(outdir,self.users[alias]['steamid'])
self.saveHTML(alias,fname)
if(pS): print(self.users[alias]['steamid'])
__________________
Quote:
Originally Posted by asherkin
Configure your servers properly and stop blaming random things.
|
|
|