Advertisement
stuppid_bot

Untitled

Mar 8th, 2015
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.77 KB | None | 0 0
  1. # Requires Python 3
  2.  
  3. # abcdefghijklmnopqrstuvwxyz
  4. import gzip
  5. from http import cookiejar
  6. import io
  7. import json
  8. import rand
  9. import string
  10. import urllib.parse as uparse
  11. import urllib.request as urequest
  12. import zlib
  13.  
  14. TIMEOUT = 15
  15. USER_AGENT = "Mozilla 5.0"
  16.  
  17. class HTTPErrorHandler(urequest.HTTPDefaultErrorHandler):
  18.     def http_error_default(self, req, fp, code, msg, hdrs):
  19.         return fp
  20.  
  21. class Response(object):
  22.     def __init__(self, response):
  23.         self.raw = response
  24.         self.url = response.url
  25.         self.status = response.status
  26.         self.reason = response.reason
  27.         self.version = response.version
  28.         self.headers = response.headers
  29.         self.encoding = response.headers.get_content_charset()    
  30.         self._body = None
  31.         self._text = None
  32.  
  33.     def read(self, amt=None):
  34.         return self.raw.read(amt)
  35.  
  36.     def close(self):
  37.         self.raw.close()
  38.  
  39.     @property
  40.     def success(self):
  41.         return 300 > self.status >= 200
  42.  
  43.     @property
  44.     def fail(self):
  45.         return not self.success
  46.  
  47.     @property
  48.     def body(self):
  49.         if self._body is None:
  50.             data = self.read()
  51.  
  52.             encoding = self.headers.get('content-encoding')
  53.  
  54.             if encoding == 'gzip':
  55.                 data = gzip.decompress(data)
  56.             elif encoding == 'deflate':
  57.                 try:
  58.                     data = zlib.decompress(data, -zlib.MAX_WBITS)
  59.                 except zlib.error:
  60.                     data = zlib.decompress(data)
  61.  
  62.             self._body = data
  63.  
  64.         return self._body
  65.  
  66.     @property
  67.     def text(self):
  68.         if self._text is None:
  69.             self._text = str(self.body, self.encoding or 'utf-8', 'replace')
  70.  
  71.         return self._text
  72.  
  73.     def json(self, **kw):
  74.         return json.loads(self.text, **kw)
  75.  
  76. class MultipartData(object):
  77.     BOUNDARY_CHARS = string.ascii_letters + string.digits
  78.  
  79.     def __init__(self, encoding='utf-8'):
  80.         self._encoding = encoding
  81.         self._body = b''
  82.         self._boundary = ''.join([
  83.             random.choice(self.BOUNDARY_CHARS) for _ in range(30)])
  84.  
  85.     @property
  86.     def boundary(self):
  87.         return self._boundary
  88.  
  89.     @property
  90.     def contentType(self):
  91.         return 'multipart/form-data; boundary={0}'.format(self._boundary)
  92.  
  93.     def append(self, name, value, filename=None, contentType=None):
  94.         self._body += bytes('--{0}\r\n'.format(self._boundary), 'utf-8')
  95.         self._body += b'Content-Disposition: form-data; name="' + \
  96.                       bytes(name, self._encoding) + b'"'
  97.  
  98.         if filename:
  99.             self._body += b'; filename="' + bytes(filename, self._encoding) + \
  100.                           b'"'
  101.  
  102.         self._body += b'\r\n'
  103.  
  104.         if contentType:
  105.             self._body += \
  106.             bytes('Content-Type: {0}\r\n'.format(contentType), 'utf-8')
  107.  
  108.         if isinstance(value, str):
  109.             value = bytes(value, self._encoding)
  110.  
  111.         self._body += b'\r\n' + value + b'\r\n'
  112.  
  113.  
  114.     @property
  115.     def body(self):
  116.         return (self._body +
  117.                 bytes('--{0}--\r\n\r\n'.format(self._boundary), 'utf-8')
  118.  
  119. class Client(object):
  120.     def __init__(self,
  121.                  cj=None,
  122.                  timeout=TIMEOUT,
  123.                  userAgent=USER_AGENT):
  124.         self.cj = cj or cookiejar.CookieJar()
  125.         self.timeout = timeout
  126.         self.userAgent = userAgent
  127.         self.opener = urequest.build_opener(
  128.             urequest.HTTPCookieProcessor(self.cj),
  129.             HTTPErrorHandler())
  130.  
  131.     def _normalizeParams(self, params):
  132.         if not isinstance(params, dict):
  133.             return params
  134.            
  135.         l = []
  136.         for k, v in params.items():
  137.             if isinstance(v, (list, tuple)):
  138.                 l.extend([(k, _) for _ in v])
  139.                 continue
  140.  
  141.             l.append((k, v))
  142.  
  143.         return l
  144.  
  145.     def encodeParams(self, params, urlEncoding=None):
  146.         params = self._normalizeParams(params)
  147.         return uparse.urlencode(params, encoding=urlEncoding)
  148.  
  149.     def request(self,
  150.                 url,
  151.                 data=None,
  152.                 query={},
  153.                 files={},
  154.                 headers={},
  155.                 method=None,
  156.                 urlEncoding='utf-8'):
  157.  
  158.         _headers = headers
  159.  
  160.         headers = {'Accept': '*/*',
  161.                    'Accept-Encoding': 'gzip, deflate',
  162.                    'User-Agent': self.userAgent}
  163.  
  164.         if files:
  165.             md = MultipartData(urlEncoding)
  166.             data = self._normalizeParams(data)
  167.             files = self._normalizeParams(files)
  168.  
  169.             for k, v in data:
  170.                 md.append(k, v)
  171.            
  172.             for k, v in files:
  173.  
  174.             headers.update({'Content-Type': md.contentType})        
  175.         elif data:
  176.             headers.update({
  177.                 'Content-Type': 'application/x-www-form-urlencoded'})
  178.  
  179.             data = bytes(self.encodeParams(data, urlEncoding), 'ascii')
  180.        
  181.         headers.update(_headers)
  182.         req = urequest.Request(url, data, headers, method=method)
  183.         resp = self.opener.open(req, timeout=self.timeout)
  184.         resp = Response(resp)
  185.         return resp
  186.  
  187. if __name__ == '__main__':
  188.     cl = Client()
  189.  
  190.     r1 = cl.request("http://httpbin.org/get")
  191.     print(r1.json())
  192.    
  193.     r2 = cl.request("http://httpbin.org/gzip")
  194.     print(r2.json())
  195.    
  196.     r3 = cl.request("http://httpbin.org/deflate")
  197.     print(r3.json())
  198.    
  199.     r4 = cl.request("http://httpbin.org/status/404")
  200.     print("{response.status}: {response.reason}".format(response=r4))
  201.     assert r4.success, "Response fail"
  202.    
  203. """
  204.  
  205. data = r.data
  206.  
  207. try:
  208.    data = data.decode(r.encoding)
  209. except UnicodeDecodeError:
  210.    data = data.decode('1251')
  211.  
  212. data = json.loads(data)
  213.  
  214. """
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement