Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #-*-coding:u8-*-
- __author__ = u'Сергей Снегирев <tz4678@gmail.com>'
- import urllib
- import urllib2
- import cookielib
- import re
- import os
- import mimetypes
- import sys
- import random
- def normalize_headers(headers):
- ret = {}
- for k, v in headers.items():
- ret[k.lower().strip()] = v
- return ret
- def get_boundary(length=22):
- chars = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890'
- ret = ''
- while len(ret) < length:
- ret += random.choice(chars)
- return ret
- # escape_field = lambda x: x.replace('"', '\\"')
- class WebClient(object):
- def __init__(self):
- self.cj = cookielib.CookieJar()
- self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) # , urllib2.HTTPHandler(debuglevel=1), urllib2.HTTPSHandler(debuglevel=1))
- self.default_headers = {'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11'}
- def request(self, url, data=None, headers={}):
- _headers = normalize_headers(self.default_headers)
- _headers.update(normalize_headers(headers))
- req = urllib2.Request(url, data, _headers)
- res = self.opener.open(req)
- return res
- def download(self, url, dst):
- r = self.request(url)
- fp = open(dst, 'wb')
- while 1:
- chunk = r.read(4096)
- if not chunk:
- fp.close()
- break
- fp.write(chunk)
- def fetch(self, url, data=None, headers={}):
- try:
- h = self.request(url, data, headers)
- except urllib2.HTTPError as h:
- pass
- content = h.read()
- ct = h.info().getheader('content-type')
- try:
- m = re.search(r'(?i)\bcharset\s*=\s*([^;]*)', ct)
- content = content.decode(m.group(1))
- except:
- pass
- return content
- def get(self, url, headers={}):
- return self.fetch(url, None, headers)
- def post(self, url, fields={}, files={}, headers={}):
- if not files:
- data = urllib.urlencode(fields)
- return self.fetch(url, data, headers)
- return self.post_multipart(url, fields, files, headers)
- def post_multipart(self, url, fields={}, files={}, headers={}):
- boundary = get_boundary()
- headers = dict(headers)
- headers['content-type'] = 'multipart/form-data; boundary=' + boundary
- payload = ''
- if fields:
- for field, value in fields.items():
- payload += '--{0}\r\n'.format(boundary)
- payload += 'Content-Disposition: form-data; name="{0}"\r\n\r\n'.format(field)
- payload += str(value) + '\r\n'
- if files:
- for field, path in files.items():
- content_type = 'application/unknown'
- if re.match('(?i)https?://', path):
- path = str(path)
- r = self.request(path)
- content_type = r.info().get('content-type', content_type)
- data = r.read()
- else:
- fp = open(path, 'rb')
- data = fp.read()
- fp.close()
- extension = os.path.splitext(path)[1]
- content_type = mimetypes.types_map.get(extension, content_type)
- path = path.encode(sys.getfilesystemencoding())
- payload += '--{0}\r\n'.format(boundary)
- payload += 'Content-Disposition: form-data; name="{0}"; filename="{1}"\r\n'.format(field, os.path.basename(path))
- payload += 'Content-Type: {0}\r\n\r\n'.format(content_type)
- payload += data + '\r\n'
- payload += '--{0}--\r\n\r\n'.format(boundary)
- return self.fetch(url, payload, headers)
- if __name__ == '__main__':
- client = WebClient()
- # do smth
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement