#!/usr/bin/env python import random, binascii, urllib2, urllib, time, sha, types, cgi, os import mstoken __AUTHOR__ = ("Mark Pilgrim", "http://diveintomark.org/") __COPYRIGHT__ = "Copyright (c) 2003 Mark Pilgrim" __VERSION__ = "1.0" __DATE__ = "2003-09-08" __LICENSE__ = "Python" DEBUG = 1 #endpoint = 'http://localhost/msproxy.py' endpoint = 'http://diveintomark.org/msweb' def getAuthParams(token=mstoken.token, pin=mstoken.pin): nonce = sha.new(str(random.random())).digest() created = time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime(time.time())) digest = sha.new(nonce + created + pin).digest() return { 'PasswordDigest': binascii.b2a_base64(digest).strip(), 'Username': token, 'Nonce': binascii.b2a_base64(nonce).strip(), 'Created': created, 'Expires': time.strftime('%Y-%m-%dT%H:%M:%SZ',time.gmtime(time.time()+180)) } def sendRequest(methodName, argDict, etag=None): authParams = getAuthParams() url = endpoint + '/' + methodName + '?' + urllib.urlencode(argDict) if DEBUG: print print url print request = urllib2.Request(url) request.add_header("Content-type", "application/xml") authheader = '''WSSE Username="%(Username)s", PasswordDigest="%(PasswordDigest)s", Nonce="%(Nonce)s", Created="%(Created)s", Expires="%(Expires)s"''' % authParams request.add_header("X-WSSE", authheader) if etag: request.add_header("If-None-Match", etag) request.add_header("Accept-encoding", "gzip") usock = urllib2.urlopen(request) if hasattr(usock, "info"): newetag = usock.info().getheader("ETag") else: newetag = None response = usock.read() if usock.info().getheader("Content-encoding") == "gzip": if DEBUG: print '----- got gzip-compressed content, unzipping -----' import gzip, StringIO response = gzip.GzipFile(fileobj=StringIO.StringIO(response)).read() return newetag, response if __name__ == '__main__': etag, response = sendRequest("Version", {}) print response etag, response = sendRequest("Cultures", {}) print response etag, response = sendRequest("TopDownloads", {"topType":"Popular", "topN":10, "cultureID":"en-US"}) print etag print response etag2, response2 = sendRequest("TopDownloads", {"topType":"Popular", "topN":10, "cultureID":"en-US"}, etag) print etag print response