]> www.wagner.pp.ru Git - oss/ljdump.git/blob - ljdump.py
create dir if needed
[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 try:
35     os.mkdir(Username)
36     print "Created subdirectory: %s" % Username
37 except:
38     pass
39
40 server = xmlrpclib.ServerProxy("http://livejournal.com/interface/xmlrpc")
41
42 total = 0
43 fetched = 0
44 errors = 0
45
46 last = ""
47 while True:
48     r = server.LJ.XMLRPC.syncitems(dochallenge({
49         'username': Username,
50         'ver': 1,
51         'lastsync': last,
52     }, Password))
53     #pprint.pprint(r)
54     if len(r['syncitems']) == 0:
55         break
56     for item in r['syncitems']:
57         if item['item'][0] == 'L':
58             fn = "%s/%s" % (Username, item['item'])
59             if not os.access(fn, os.F_OK):
60                 print "Fetching journal entry %s" % item['item']
61                 try:
62                     e = server.LJ.XMLRPC.getevents(dochallenge({
63                         'username': Username,
64                         'ver': 1,
65                         'selecttype': "one",
66                         'itemid': item['item'][2:],
67                     }, Password))
68                     writedump(fn, e['events'][0])
69                     fetched += 1
70                 except xmlrpclib.Fault, x:
71                     print "Error getting item: %s" % item['item']
72                     pprint.pprint(x)
73                     errors += 1
74         last = item['time']
75         total += 1
76 print "%d total entries" % total
77 print "%d fetched entries" % fetched
78 if errors > 0:
79     print "%d errors" % errors