SHARE
TWEET

Stereohead

a guest Aug 16th, 2009 311 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import optparse
  2. import sys
  3. import os
  4.  
  5. import httplib
  6. import urllib
  7. import xml.dom.minidom as minidom
  8.  
  9. class Webprint:
  10.        
  11.         def __init__(self):
  12.                 """
  13.                 Initialize the class
  14.                 """
  15.                 self.session_id = None
  16.                 self.upload_id = None
  17.                
  18.                 self.webprint_gateway_host = 'www.webprint.nl'
  19.                 self.webprint_gateway_path = '/flash_gateway/gateway.php'
  20.                
  21.                 self.webprint_upload_host = 'upload.webprint.nl'
  22.                 self.webprint_upload_path = '/uploader/uploader.php'
  23.                
  24.                
  25.         def login(self, username, password):
  26.                 """
  27.                 Login into webprint.nl, so that an session_id is
  28.                 returned
  29.                 """
  30.                
  31.                 # build http query
  32.                 headers = {'Content-Type':'application/x-www-form-urlencoded'}
  33.                 body = urllib.urlencode({'username':username, 'password': password, 'method':'login', 'object':'LoginManager'})
  34.                
  35.                 # do query
  36.                 conn = httplib.HTTPConnection(self.webprint_gateway_host)
  37.                 conn.request("POST", self.webprint_gateway_path, body, headers)
  38.                 resp = conn.getresponse()
  39.                
  40.                 # parse response
  41.                 try:
  42.                         xml = minidom.parseString(resp.read())
  43.                         login_status = xml.getElementsByTagName('login')[0].attributes['status'].value
  44.                        
  45.                         if login_status == 'ok':
  46.                                 session_id = xml.getElementsByTagName('login')[0].attributes['session_id'].value
  47.                         else:
  48.                                 session_id = False
  49.                 except Exception, ex:
  50.                         session_id = False
  51.                         print ex
  52.                
  53.                 self.session_id = session_id
  54.                 return session_id
  55.                
  56.                
  57.         def start_upload_session(self):
  58.                 """
  59.                 Retrieve an upload-session-id, the session is needed
  60.                 to upload photos
  61.                 """
  62.                 if self.session_id == None:
  63.                         # we need a session-id before we can get a uploadsession
  64.                         return False
  65.                        
  66.                 # build http query
  67.                 headers = {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=' + self.session_id}
  68.                 body = urllib.urlencode({'method':'getUploadSessionId', 'object':'SessionSniffer'})
  69.                
  70.                 # do query
  71.                 conn = httplib.HTTPConnection(self.webprint_gateway_host)
  72.                 conn.request("POST", self.webprint_gateway_path, body, headers)
  73.                 resp = conn.getresponse()
  74.  
  75.                 # parse response
  76.                 try:
  77.                         xml = minidom.parseString(resp.read())
  78.                         event = xml.getElementsByTagName('reply')[0].attributes['event'].value
  79.                        
  80.                         if event == 'onUploadSessionId':
  81.                                 upload_id = xml.getElementsByTagName('reply')[0].attributes['session_id'].value
  82.                         else:
  83.                                 upload_id = False
  84.                                
  85.                 except Exception, ex:
  86.                         upload_id = False
  87.                         print ex
  88.                
  89.                 self.upload_id = upload_id
  90.                 return upload_id
  91.        
  92.        
  93.         def get_folder_id(self, foldername, create_if_not_exist=False):
  94.                 """
  95.                 Return the id of the given foldername,
  96.                 if the folder does not exist, it will be created if
  97.                 'create_if_not_exist' is set to True
  98.                 """
  99.                 # get id of folder
  100.                 content = self.get_content()
  101.                 folders = content[0]
  102.                
  103.                 folder_exist = False
  104.                 for folderid in folders:
  105.                         if folders[folderid] == foldername:
  106.                                 folder_exist = True
  107.                                 return folderid
  108.                
  109.                 if folder_exist == False and create_if_not_exist == True:
  110.                         # create folder
  111.                         self.create_folder(foldername)
  112.                         return self.get_folder_id(foldername, False)
  113.                        
  114.                 else:
  115.                        
  116.                         # folder not found, and not created
  117.                         return False
  118.                
  119.                
  120.         def create_folder(self, foldername, parent_folder_id = 0):
  121.                 """
  122.                 Create a folder into the folder specified by
  123.                 'parent_folder_id'
  124.                 """
  125.                 if self.session_id == None:
  126.                         # we need a session-id before we can get a uploadsession
  127.                         return False
  128.                        
  129.                 # build http query
  130.                 headers = {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=' + self.session_id}
  131.                 body = urllib.urlencode({'parent_id':parent_folder_id,'name':foldername, 'method':'createFolder', 'object':'AssetManager'})
  132.                
  133.                 # do query
  134.                 conn = httplib.HTTPConnection(self.webprint_gateway_host)
  135.                 conn.request("POST", self.webprint_gateway_path, body, headers)
  136.                 resp = conn.getresponse()
  137.                
  138.                 # unfortunatlly we are not able to see if the file
  139.                 # is created succesfully :(
  140.                
  141.                 return True
  142.                
  143.                
  144.         def get_content(self, parent_folderid=0):
  145.                 """
  146.                 Retrieve the content of the folder specified by
  147.                 parent_folderid
  148.                 This method will return a tuple containing two
  149.                 lists, the first will contain the folders, the
  150.                 second the photos
  151.                 """
  152.                 if self.session_id == None:
  153.                         # we need a session-id before we can get a uploadsession
  154.                         return False
  155.                        
  156.                 # build http query
  157.                 headers = {'Content-Type':'application/x-www-form-urlencoded', 'Cookie':'PHPSESSID=' + self.session_id}
  158.                 body = urllib.urlencode({'folder_id':parent_folderid, 'method':'getFoldersById', 'object':'AssetManager'})
  159.                
  160.                 # do query
  161.                 conn = httplib.HTTPConnection(self.webprint_gateway_host)
  162.                 conn.request("POST", self.webprint_gateway_path, body, headers)
  163.                 resp = conn.getresponse()
  164.  
  165.                 # parse response
  166.                 try:
  167.                         xml = minidom.parseString(resp.read())
  168.                        
  169.                         reply = xml.getElementsByTagName('reply')[0]
  170.                         folders_elements = reply.getElementsByTagName('folder')
  171.                         photos_elements = reply.getElementsByTagName('photo')
  172.                        
  173.                         folders = {}
  174.                         photos = {}
  175.                        
  176.                         for folder in folders_elements:
  177.                                 id = folder.getAttribute('id')
  178.                                 name = folder.childNodes[0].data
  179.                                 folders[id] = name
  180.  
  181.                         for photo in photos_elements:
  182.                                 id = photo.getAttribute('id')
  183.                                 name = photo.childNodes[0].data
  184.                                 photos[id] = name
  185.                                
  186.                 except Exception, ex:
  187.                         folders = []
  188.                         photos = []
  189.                         print ex
  190.  
  191.                 return folders, photos
  192.                
  193.                
  194.         def upload_photo(self, filename, photodata, folder_id = 0):
  195.                 """
  196.                 Upload an photo to the specified directory, with the
  197.                 given filename
  198.                 """
  199.                 if self.upload_id == None:
  200.                         # we need a upload-id before we can upload
  201.                         return False
  202.                
  203.                 # build http query
  204.                 headers = {'Content-Type':'multipart/form-data; boundary=boundary'}
  205.                 get_params = urllib.urlencode({'folder_id':folder_id, 'upload_session_id':self.upload_id})
  206.                
  207.                 body = """--boundary
  208. Content-Disposition: form-data; name="Filename"
  209.  
  210. %(filename)s
  211. --boundary
  212. Content-Disposition: form-data; name="Filedata"; filename="%(filename)s"
  213. Content-Type: application/octet-stream
  214.  
  215. %(data)s
  216. --boundary
  217. Content-Disposition: form-data; name="Upload"
  218.  
  219. Submit Query
  220. --boundary--
  221. """ % {'filename':filename, 'data':photodata}
  222.  
  223.                
  224.                 # do query
  225.                 conn = httplib.HTTPConnection(self.webprint_upload_host)
  226.                 conn.request("POST", self.webprint_upload_path + '?' + get_params, body, headers)
  227.                 resp = conn.getresponse()
  228.                
  229.                 data = resp.read()
  230.                
  231.                 # if upload succeeded, it will return just some crlf's
  232.                 if data.strip() == "":
  233.                         return True
  234.                 else:
  235.                         return False
  236.                
  237.  
  238.  
  239.  
  240. # parse the commandline options
  241.  
  242. parser = optparse.OptionParser()
  243.  
  244. parser.add_option("-u", "--username", dest="username",
  245.                   help="your username for webprint.nl")
  246.  
  247. parser.add_option("-p", "--password", dest="password",
  248.                   help="your password for webprint.nl")
  249.  
  250. parser.add_option("-d", "--directory", dest="directory",
  251.                   help="the directory in which the photos that you want to upload are stored")
  252.  
  253. parser.add_option("-f", "--folder", dest="folder",
  254.                   help="the name of the folder where your photos will be uploaded, default will be the root map")
  255.  
  256. parser.add_option("-v", "--verbose", dest="verbose", default=True, action="store_true",
  257.                   help="be verbose")
  258.  
  259. parser.add_option("-q", "--quiet", dest="verbose", action="store_false",
  260.                   help="show errors only")
  261.  
  262. (options, args) = parser.parse_args()
  263.  
  264. if options.username == None:
  265.         parser.error("Username is required")
  266.  
  267. if options.password == None:
  268.         parser.error("Password is required")
  269.        
  270. if options.directory == None:
  271.         parser.error("A photo directory is required")
  272.  
  273.  
  274. def verbose(str):
  275.         if options.verbose:
  276.                 print str
  277.  
  278. def error(str):
  279.         print str
  280.  
  281.  
  282. # run the program
  283.  
  284. wp = Webprint()
  285.  
  286. # log in
  287. login = wp.login(options.username, options.password)
  288. if login != False:
  289.         verbose("Logged in")
  290. else:
  291.         error("Unable to login, please check your spelling")
  292.         sys.exit()
  293.  
  294.  
  295. # find the wanted folder
  296. if options.folder == None:
  297.         folderid = 0
  298. else:
  299.         folderid = wp.get_folder_id(options.folder, True)
  300.  
  301.  
  302. # retrieve upload session
  303. uploadsession = wp.start_upload_session()
  304. if uploadsession != False:
  305.         verbose("Upload session started")
  306. else:
  307.         error("Unable to start upload session")
  308.         sys.exit()
  309.  
  310.  
  311. # scan files and upload the files
  312.  
  313. def upload_photo(filename, name):
  314.         f = open(filename)
  315.         filecontent = f.read()
  316.         verbose("Uploading %s as %s" % (filename, name))
  317.         wp.upload_photo(name, filecontent, folderid)
  318.  
  319. for root, dirs, files in os.walk(options.directory):
  320.         for file in files:
  321.                 filename = os.path.join(root,file)
  322.                 base,ext = extension = os.path.splitext(filename)
  323.                
  324.                 if ext in ['.jpg', '.jpeg']:
  325.                         upload_photo(filename, file)
  326.                        
  327.  
  328. verbose("Done")
RAW Paste Data
Want to get better at Python?
Learn to code Python in 2017
Pastebin PRO Summer Special!
Get 40% OFF on Pastebin PRO accounts!
Top