I had a similar problem and wrote a small html page with embedded javascript. It checks the blockexplorer and the exchangerate and produces a nice web page where it lists all my accounts, with my btcs and converted into EUR - without having to start the bitcoin client with my wallet and the private keys.
There are 4 files you need, bitcoin.js with the script funcitonality, config.js (where you should edit the addAccount lines, replacing the FILLIN stuff with your bitcoin addresses, style.css for some cometics and sum.html as main file. I am using a bit of jquery, so you should make sure that all files including jquery_min.js (to be picked at the jquery website) reside in the same directory.
Then just load it with firefox version 3 and confirm the security dialogue. You will have to navigate to about:config and set signed.applets.codebase_principal_support to true as well.
I am including the files below. They are very far from perfect but help me solve my problem. They do not run in firefox 5 (mozilla removed the privilege manager), but version 3.6 is fine for this purpose. Do NOT put the code on a web server, it has security issues if you do not understand what I am doing here.
=== config.js:
// URL of the block explorer
const SERVICE_URL = "
http://blockexplorer.com/address/";
// URL for the exchange rate
const EXC_RATE = "
http://bitcoincharts.com/t/weighted_prices.json";
// default exchange rate
const CURR = "EUR";
// default weighting
const WHEN = "24h";
addAccount ("1PFILLIN", "Eligius");
addAccount ("1FILLIN", "Other");
fakeAccount ("1PRCQbVgLkNjUCWafA8UYsmBH1Ay7zyvu8");
exRate();
dobit();
=== bitcoin.js
var accounts=[];
function addAccount (address, name) { accounts.push ({address:address , name: name , org:true});}
function fakeAccount (address) {accounts.push ({address:address, name:"other", org: false});}
/// try to log a text in case console.log is defined
function myLog (text) {
if (console && console.log) {
try {console.log (text);} catch (x) {}
} else {
// alert ("Console not found for logging");
}
return;
}
var request = false;
var sumReceived = 0;
var sumSent = 0;
var timesSent = 0;
var timesRcv = 0;
function makeRequest(account, mine, title) {
url = SERVICE_URL+account;
// check if we are loading from local file system
if (!location.href.match(/^file.*$/)) {alert ("Incorrect location for privilege escalation; rejecting; probably attempted attack"); try{alert (location.href);} catch(e){} return;}
try {netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");} catch (e) {alert("Permission UniversalBrowserRead denied.");}
var request = false; request = new XMLHttpRequest(); if (!request) {alert('Cannot create XMLHTTP instance');return false;}
request.title = title;
request.mine = mine;
request.account = account;
request.onreadystatechange = function () {
myLog ("readystatechanged: "+ request.readyState + " " + request.status);
if (request.readyState == 4) {
if (request.status == 200) {
myLog ("returned");
if (!request.mine) {myLog ("Skipping output, not mine"); return;}
var string = request.responseText;
var received, sent, rTx, sTx;
$(string).filter(".infoList").children().filter(":contains('Received BTC:')").each(function(idx,elem){
received = elem.textContent;
myLog(" "+elem.textContent);
});
myLog ("second");
$(string).filter(".infoList").children().filter(":contains('Sent BTC:')").each(function(idx,elem){
sent = elem.textContent;
myLog(" "+elem.textContent);
});
$(string).filter(".infoList").children().filter(":contains('Received transactions:')").each(function(idx,elem){
rTx = elem.textContent;
myLog(" "+elem.textContent);
});
$(string).filter(".infoList").children().filter(":contains('Sent transactions:')").each(function(idx,elem){
sTx = elem.textContent;
myLog(" "+elem.textContent);
});
received = received.substring(14);
sent = sent.substring (10);
rTx = rTx.substring(23);
sTx = sTx.substring(19);
received = parseFloat (received);
sent = parseFloat (sent);
rTx = parseInt (rTx);
sTx = parseInt (sTx);
timesSent += sTx;
timesRcv += rTx;
sumReceived += received;
sumSent += sent;
try{$("#last").remove();} catch (x){} // before append, remove a last line (if exists)
try{$("#curr").remove();} catch (x){} // before append, remove a last line (if exists)
$("#mytable").append("<tr>" + "<td class='c1'>"+ request.title + "</td><td>" + request.account + "</td><td class='c2'>" + received + "</td><td>" +rTx + "</td><td class='c3'>" + sent + "</td><td>" +sTx+ "</td><td class='c4'>" + (received-sent) + "</td></tr>" );
finalize(); // calculate overall sums
// alert(string);
} else {
alert('There was a problem with the request:'+request.status);
console.log (request);
}
}
}
try {request.open('GET', url, true);} catch (e) {alert ("Exception on opening XHR"); alert(e);}
try {request.send(null);} catch(e) {alert ("Exception on sending XHR"); alert (e);}
try {netscape.security.PrivilegeManager.revertPrivilege ("UniversalBrowserRead");}
catch (e) {alert ("error on reverting");}
}
function finalize() {
$("#mytable").append("<tr id='last' style='font-weight:bold;'>" + "<td>"+ "Totals in BTC"+ "</td><td></td><td>" + sumReceived + "</td><td>" + timesRcv + "</td><td>" +sumSent + "</td><td>" +timesSent+ "</td><td>" + (sumReceived-sumSent) + "</td></tr>");
$("#mytable").append("<tr id='curr' style='font-weight:bold;'>" + "<td>"+ "Totals in "+ CURR +" of "+ WHEN + "</td><td></td><td>" + sumReceived*exRate + "</td><td></td><td>" + sumSent*exRate + "</td><td></td><td>" + (sumReceived-sumSent)*exRate + "</td></tr>");
}
function dobit () {
for (var i = 0; i < accounts.length; i++) {makeRequest (accounts
.address, accounts.org, accounts.name);} }
// get the exchange rate
function exRate() {
// standard start
if (!location.href.match(/^file.*$/)) {alert ("Incorrect location for privilege escalation; rejecting; probably attempted attack"); try{alert (location.href);} catch(e){} return;}
try {netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");} catch (e) {alert("Permission UniversalBrowserRead denied");}
var request = false; request = new XMLHttpRequest(); if (!request) {alert('Cannot create XMLHTTP instance');return false;}
request.onreadystatechange = function () {
myLog ("readystatechanged: "+ request.readyState + " " + request.status);
if (request.readyState == 4) {
if (request.status == 200) {
myLog ("returned exchange rate");
var string = request.responseText;
var exch = JSON.parse (string);
exRate = exch[CURR][WHEN];
} else {
alert('There was a problem with the exchangerate request request:'+request.status);
}
}
}
// standard end
try {request.open('GET', EXC_RATE, true);} catch (e) {alert ("Exception on opening XHR"); alert(e);}
try {request.send(null);} catch(e) {alert ("Exception on sending XHR"); alert (e);}
try {netscape.security.PrivilegeManager.revertPrivilege ("UniversalBrowserRead");} catch (e) {alert ("error on reverting permission at exRate()");}
}
=== sum.html
<html>
<head>
<title>Bitcoin Summary</title>
<script src="jquery_min.js"></script>
<LINK REL=StyleSheet HREF="style.css" TYPE="text/css" MEDIA=screen>
</head>
<body>
<table id="mytable">
<tr id="row"><td class='c1'>Account</td><td class=''>Address</td><td class='c2'>BTC Rcvd</td><td>Tx Rcvd</td><td class='c3'>BTC Snt</td><td>Tx Snt</td><td class='c4'>BTC Total</td></tr>
</table>
<script src="bitcoin.js"></script>
<script src="config.js"></script>
</body>
</html>
=== style.css
html table tr td {font-family:verdana,sans-serif; font-size:smaller;}
#row {font-weight:bold; background-color:Aquamarine;}
#mytable {width:100%;}
tr {background-color:Bisque;}
.c1 {}
.c2 {}
.c3 {}
.c4 {}
#last {background-color:Aquamarine;margin:10px 0px 0px 0px;}
#curr {background-color: LightPink;}
=== and jquery_min.js from the jquery site
Enjoy !