1 import codecs, md5, os, pprint, sys, xml.dom.minidom, xmlrpclib
2 from xml.sax import saxutils
4 def dochallenge(params, password):
5 challenge = server.LJ.XMLRPC.getchallenge()
7 'auth_method': "challenge",
8 'auth_challenge': challenge['challenge'],
9 'auth_response': md5.new(challenge['challenge']+md5.new(password).hexdigest()).hexdigest()
13 def dumpelement(f, name, e):
14 f.write("<%s>\n" % name)
16 if isinstance(e[k], {}.__class__):
17 dumpelement(f, k, e[k])
19 s = unicode(str(e[k]), "UTF-8")
20 f.write("<%s>%s</%s>\n" % (k, saxutils.escape(s), k))
21 f.write("</%s>\n" % name)
23 def writedump(fn, event):
24 f = codecs.open(fn, "w", "UTF-8")
25 f.write("""<?xml version="1.0"?>\n""")
26 dumpelement(f, "event", event)
29 config = xml.dom.minidom.parse("ljdump.config")
30 Username = config.documentElement.getElementsByTagName("username")[0].childNodes[0].data
31 Password = config.documentElement.getElementsByTagName("password")[0].childNodes[0].data
33 print "Fetching journal entries for: %s" % Username
35 server = xmlrpclib.ServerProxy("http://livejournal.com/interface/xmlrpc")
43 r = server.LJ.XMLRPC.syncitems(dochallenge({
49 if len(r['syncitems']) == 0:
51 for item in r['syncitems']:
52 if item['item'][0] == 'L':
53 fn = "%s/%s" % (Username, item['item'])
54 if not os.access(fn, os.F_OK):
55 print "Fetching journal entry %s" % item['item']
57 e = server.LJ.XMLRPC.getevents(dochallenge({
61 'itemid': item['item'][2:],
63 writedump(fn, e['events'][0])
65 except xmlrpclib.Fault, x:
66 print "Error getting item: %s" % item['item']
71 print "%d total entries" % total
72 print "%d fetched entries" % fetched
74 print "%d errors" % errors