Advertisement
stuppid_bot

Untitled

Aug 30th, 2014
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.89 KB | None | 0 0
  1. #-*-coding:u8-*-
  2. __author__ = u'Сергей Снегирев <tz4678@gmail.com>'
  3.  
  4. import urllib
  5. import urllib2
  6. import cookielib
  7. import re
  8. import os
  9. import mimetypes
  10. import sys
  11. import random
  12.  
  13. def normalize_headers(headers):
  14.     ret = {}
  15.     for k, v in headers.items():
  16.         ret[k.lower().strip()] = v
  17.     return ret
  18.  
  19. def get_boundary(length=22):
  20.     chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
  21.     ret = ''
  22.     while len(ret) < length:
  23.         ret += random.choice(chars)
  24.     return ret
  25.  
  26. # escape_field = lambda x: x.replace('"', '\\"')
  27.  
  28. class WebClient(object):
  29.     def __init__(self):
  30.         self.cj = cookielib.CookieJar()
  31.         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) # , urllib2.HTTPHandler(debuglevel=1), urllib2.HTTPSHandler(debuglevel=1))
  32.         self.default_headers = {'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11'}
  33.  
  34.     def request(self, url, data=None, headers={}):
  35.         _headers = normalize_headers(self.default_headers)
  36.         _headers.update(normalize_headers(headers))
  37.         req = urllib2.Request(url, data, _headers)
  38.         res = self.opener.open(req)
  39.         return res
  40.  
  41.     def download(self, url, dst):
  42.         r = self.request(url)
  43.         fp = open(dst, 'wb')
  44.         while 1:
  45.             chunk = r.read(4096)
  46.             if not chunk:
  47.                 fp.close()
  48.                 break
  49.             fp.write(chunk)
  50.  
  51.     def fetch(self, url, data=None, headers={}):
  52.         try:
  53.             h = self.request(url, data, headers)
  54.         except urllib2.HTTPError as h:
  55.             pass
  56.         content = h.read()
  57.         ct = h.info().getheader('content-type')
  58.         try:
  59.             m = re.search(r'(?i)\bcharset\s*=\s*([^;]*)', ct)
  60.             content = content.decode(m.group(1))
  61.         except:
  62.             pass
  63.         return content
  64.  
  65.     def get(self, url, headers={}):
  66.         return self.fetch(url, None, headers)
  67.  
  68.     def post(self, url, fields={}, files={}, headers={}):
  69.         if not files:
  70.             data = urllib.urlencode(fields)
  71.             return self.fetch(url, data, headers)
  72.         return self.post_multipart(url, fields, files, headers)
  73.      
  74.     def post_multipart(self, url, fields={}, files={}, headers={}):
  75.         boundary = get_boundary()
  76.         headers = dict(headers)
  77.         headers['content-type'] = 'multipart/form-data; boundary=' + boundary
  78.         payload = ''
  79.         if fields:
  80.             for field, value in fields.items():
  81.                 payload += '--{0}\r\n'.format(boundary)
  82.                 payload += 'Content-Disposition: form-data; name="{0}"\r\n\r\n'.format(field)
  83.                 payload += str(value) + '\r\n'
  84.         if files:
  85.             for field, path in files.items():
  86.                 content_type = 'application/unknown'
  87.                 if re.match('(?i)https?://', path):
  88.                     path = str(path)
  89.                     r = self.request(path)
  90.                     content_type = r.info().get('content-type', content_type)
  91.                     data = r.read()
  92.                 else:
  93.                     fp = open(path, 'rb')
  94.                     data = fp.read()
  95.                     fp.close()
  96.                     extension = os.path.splitext(path)[1]
  97.                     content_type = mimetypes.types_map.get(extension, content_type)
  98.                     path = path.encode(sys.getfilesystemencoding())
  99.                 payload += '--{0}\r\n'.format(boundary)
  100.                 payload += 'Content-Disposition: form-data; name="{0}"; filename="{1}"\r\n'.format(field, os.path.basename(path))
  101.                 payload += 'Content-Type: {0}\r\n\r\n'.format(content_type)
  102.                 payload += data + '\r\n'
  103.         payload += '--{0}--\r\n\r\n'.format(boundary)
  104.         return self.fetch(url, payload, headers)
  105.  
  106. if __name__ == '__main__':
  107.     client = WebClient()
  108.     # do smth
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement