]> www.wagner.pp.ru Git - oss/ljdump.git/blob - ljdump.py
45466d906da9127eb75db12d57f2fec48475486e
[oss/ljdump.git] / ljdump.py
1 import codecs, md5, os, pprint, sys, xml.dom.minidom, xmlrpclib
2 from xml.sax import saxutils
3
4 def dochallenge(params, password):
5     challenge = server.LJ.XMLRPC.getchallenge()
6     params.update({
7         'auth_method': "challenge",
8         'auth_challenge': challenge['challenge'],
9         'auth_response': md5.new(challenge['challenge']+md5.new(password).hexdigest()).hexdigest()
10     })
11     return params
12
13 def dumpelement(f, name, e):
14     f.write("<%s>\n" % name)
15     for k in e.keys():
16         if isinstance(e[k], {}.__class__):
17             dumpelement(f, k, e[k])
18         else:
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)
22
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)
27     f.close()
28
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
32
33 print "Fetching journal entries for: %s" % Username
34
35 server = xmlrpclib.ServerProxy("http://livejournal.com/interface/xmlrpc")
36
37 total = 0
38 fetched = 0
39 errors = 0
40
41 last = ""
42 while True:
43     r = server.LJ.XMLRPC.syncitems(dochallenge({
44         'username': Username,
45         'ver': 1,
46         'lastsync': last,
47     }, Password))
48     #pprint.pprint(r)
49     if len(r['syncitems']) == 0:
50         break
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']
56                 try:
57                     e = server.LJ.XMLRPC.getevents(dochallenge({
58                         'username': Username,
59                         'ver': 1,
60                         'selecttype': "one",
61                         'itemid': item['item'][2:],
62                     }, Password))
63                     writedump(fn, e['events'][0])
64                     fetched += 1
65                 except xmlrpclib.Fault, x:
66                     print "Error getting item: %s" % item['item']
67                     pprint.pprint(x)
68                     errors += 1
69         last = item['time']
70         total += 1
71 print "%d total entries" % total
72 print "%d fetched entries" % fetched
73 if errors > 0:
74     print "%d errors" % errors