dberube4

Tut - MinusLib

Nov 1st, 2012
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.50 KB | None | 0 0
  1. import cookielib
  2. import urllib
  3. import urllib2
  4. import mimetools, mimetypes
  5. import os, stat
  6.  
  7. class Callable:
  8.     def __init__(self, anycallable):
  9.         self.__call__ = anycallable
  10.  
  11. # Controls how sequences are uncoded. If true, elements may be given multiple values by
  12. #  assigning a sequence.
  13. doseq = 1
  14.  
  15. class MultipartPostHandler(urllib2.BaseHandler):
  16.     handler_order = urllib2.HTTPHandler.handler_order - 10 # needs to run first
  17.  
  18.     def http_request(self, request):
  19.         data = request.get_data()
  20.         if data is not None and type(data) != str:
  21.             v_files = []
  22.             v_vars = []
  23.             try:
  24.                  for(key, value) in data.items():
  25.                      if type(value) == file:
  26.                          v_files.append((key, value))
  27.                      else:
  28.                          v_vars.append((key, value))
  29.             except TypeError:
  30.                 systype, value, traceback = sys.exc_info()
  31.                 raise TypeError, "not a valid non-string sequence or mapping object", traceback
  32.  
  33.             if len(v_files) == 0:
  34.                 data = urllib.urlencode(v_vars, doseq)
  35.             else:
  36.                 boundary, data = self.multipart_encode(v_vars, v_files)
  37.                 contenttype = 'multipart/form-data; boundary=%s' % boundary
  38.                 if(request.has_header('Content-Type')
  39.                    and request.get_header('Content-Type').find('multipart/form-data') != 0):
  40.                     print "Replacing %s with %s" % (request.get_header('content-type'), 'multipart/form-data')
  41.                 request.add_unredirected_header('Content-Type', contenttype)
  42.  
  43.             request.add_data(data)
  44.         return request
  45.  
  46.     def multipart_encode(vars, files, boundary = None, buffer = None):
  47.         if boundary is None:
  48.             boundary = mimetools.choose_boundary()
  49.         if buffer is None:
  50.             buffer = ''
  51.         for(key, value) in vars:
  52.             buffer += '--%s\r\n' % boundary
  53.             buffer += 'Content-Disposition: form-data; name="%s"' % key
  54.             buffer += '\r\n\r\n' + value + '\r\n'
  55.         for(key, fd) in files:
  56.             file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
  57.             filename = fd.name.split('/')[-1]
  58.             contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
  59.             buffer += '--%s\r\n' % boundary
  60.             buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)
  61.             buffer += 'Content-Type: %s\r\n' % contenttype
  62.             # buffer += 'Content-Length: %s\r\n' % file_size
  63.             fd.seek(0)
  64.             buffer += '\r\n' + fd.read() + '\r\n'
  65.         buffer += '--%s--\r\n\r\n' % boundary
  66.         return boundary, buffer
  67.     multipart_encode = Callable(multipart_encode)
  68.  
  69.     https_request = http_request
  70.  
  71. class minusSession():
  72.    
  73.     def __init__(self):
  74.         self.loginHeaders = {}
  75.        
  76.         self.loginHeaders['Host'] = 'minus.com'
  77.         self.loginHeaders['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0'
  78.         self.loginHeaders['Accept'] = 'application/json, text/javascript, */*; q=0.01'
  79.         self.loginHeaders['Accept-Language'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  80.         self.loginHeaders['Accept-Encoding'] = 'gzip, deflate'
  81.         self.loginHeaders['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'
  82.         self.loginHeaders['X-Requested-With'] = 'XMLHttpRequest'
  83.         self.loginHeaders['Referer'] = 'http://minus.com/'
  84.         self.loginHeaders['DNT'] = '1'
  85.         self.loginHeaders['Pragma'] = 'no-cache'
  86.         self.loginHeaders['Cache-Control'] = 'no-cache'
  87.        
  88.         self.createFolderHeaders = {}
  89.         self.createFolderHeaders['Host'] = 'minus.com'
  90.         self.createFolderHeaders['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0'
  91.         self.createFolderHeaders['Accept'] = 'application/json, text/javascript, */*; q=0.01'
  92.         self.createFolderHeaders['Accept-Language'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  93.         self.createFolderHeaders['Accept-Encoding'] = 'gzip, deflate'
  94.         self.createFolderHeaders['Referer'] = 'http://minus.com/'
  95.         self.createFolderHeaders['Cookie'] = ''
  96.         self.createFolderHeaders['DNT'] = '1'
  97.  
  98.        
  99.         self.uploadHeaders = {}
  100.         self.uploadHeaders['Host'] = 'minus.com'
  101.         self.uploadHeaders['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0'
  102.         self.uploadHeaders['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
  103.         self.uploadHeaders['Accept-Language'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
  104.         self.uploadHeaders['Accept-Encoding'] = 'gzip, deflate'
  105.         self.uploadHeaders['Referer'] = 'http://minus.com/'
  106.         self.uploadHeaders['Content-Type'] = 'multipart/form-data; boundary=---------------------------36022435010291'
  107.         self.uploadHeaders['Cookie'] = ''
  108.         self.uploadHeaders['DNT'] = '1'
  109.         self.uploadHeaders['Pragma'] = 'no-cache'
  110.         self.uploadHeaders['Cache-Control'] = 'no-cache'
  111.        
  112.     def openSession(self,username,password):
  113.         self.user = username
  114.         self.psw = password
  115.         data = "disable_safety_mode=0&web-login=true&login-username={0}&login-password={1}".format(username,password)
  116.        
  117.         cj = cookielib.CookieJar()
  118.         #Create an opener to open pages using the http protocol and to process cookies.
  119.         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), urllib2.HTTPHandler())
  120.        
  121.         req = urllib2.Request("http://minus.com/api/login/login",data = data,headers = self.loginHeaders) #Create a post request
  122.  
  123.         f = opener.open(req)
  124.         html = f.read()
  125.        
  126.         if html == '''{"success": true}''':
  127.             self.uploadHeaders['Cookie'] = '' #clear cookies if already logged
  128.             for cookie in cj:
  129.                 cookie = str(cookie).split(' ')[1]
  130.                 self.uploadHeaders['Cookie'] += cookie + '; '
  131.                 self.createFolderHeaders ['Cookie'] += cookie + '; '
  132.            
  133.             print self.uploadHeaders['Cookie']
  134.             return 1
  135.         else:
  136.             return 0,html
  137.    
  138.     def upload(self,fileName):
  139.        
  140.         def createMinusFolder():
  141.  
  142.             opener = urllib2.build_opener(urllib2.HTTPHandler())
  143.             req = urllib2.Request("http://minus.com/api/CreateGallery_Web/?d=1351809273415",headers = self.createFolderHeaders) #Create a post request
  144.             f = opener.open(req)
  145.             html = eval(f.read())
  146.            
  147.             return html['editor_id']
  148.        
  149.         def uploadFile(fileName,folderID):
  150.            
  151.             opener = urllib2.build_opener(MultipartPostHandler)
  152.            
  153.             url = 'http://minus.com/api/UploadItem_Web/?editor_id={0}&key=-&filename={1}'.format(folderID,os.path.basename(fileName.name))
  154.             req = urllib2.Request(url,headers = self.uploadHeaders)
  155.             params = {"file" : fileName }
  156.            
  157.             try:
  158.                 f = opener.open(req, params)
  159.                 return 1
  160.             except:
  161.                 return 0
  162.            
  163.        
  164.         folderId = createMinusFolder()
  165.         rep = uploadFile(fileName,folderId)
  166.        
  167.         return rep
  168.    
  169. session = minusSession()
  170. session.openSession('username','password')
  171. #ALWAYS USE "rb" TO OPEN A FILE
  172. session.upload(open("C:\\Users\\Gabriel\\Pictures\\01.jpg",'rb'))
Advertisement
Add Comment
Please, Sign In to add comment