web-automation-demo/Library/Http.py

105 lines
3.3 KiB
Python
Raw Normal View History

2023-03-13 18:49:49 +08:00
import requests
import requests.utils
class HTTPResponseObject(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.url = None
self.status = None
self.reason = None
self.header = None
self.cookie = None
self.binary = None
self.text, self.json = None, None
self.encoding, self.duration = None, None
def __setattr__(self, key, value):
pass
def __getitem__(self, item):
try:
return super().__getitem__(item)
except Exception:
return None
def __getattr__(self, item):
try:
return super().__getitem__(item)
except Exception:
return None
class HTTPRequest:
__http__ = requests
__accept_method__ = ('GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'OPTIONS', 'TRACE', 'PATCH')
def http(self, method='GET', url: str = None, query=None, data=None, json=None, file=None, header=None, cookie=None,
ua: str = None, auth=None, timeout: int | float = None, proxy: str = None, auto_redirect=False, ignore_cert_error=False):
method = method.upper()
if method not in self.__accept_method__:
raise Exception('Unsupported request method.')
if method == 'HEAD':
auto_redirect = False
if ua:
if not isinstance(header, dict):
header = {}
header['User-Agent'] = ua
if isinstance(proxy, str) and len(proxy) >= 5:
proxy = {'http': proxy, 'https': proxy}
else:
proxy = None
try:
response = self.__http__.request(
method=method,
url=url,
params=query,
data=data,
headers=header,
cookies=cookie,
files=file,
auth=auth,
timeout=timeout,
allow_redirects=auto_redirect,
proxies=proxy,
verify=not ignore_cert_error,
json=json
)
except Exception:
response = None
try:
response_json = response.json()
except Exception:
response_json = None
if response:
return HTTPResponseObject({
'url': response.url,
'status': response.status_code,
'reason': response.reason,
'header': response.headers,
'cookie': requests.utils.dict_from_cookiejar(response.cookies),
'binary': response.content,
'text': response.text,
'json': response_json,
'encoding': response.encoding,
'duration': round(response.elapsed.microseconds / 1000, 1)
})
else:
return HTTPResponseObject({
'status': -1
})
class HTTPSession(HTTPRequest):
__http__ = requests.session()
if __name__ == '__main__':
# e.g. Send a get request.
res = HTTPSession().http(
method='GET', url='http://pv.sohu.com/cityjson', query={'ie': 'utf-8'},
ua='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
auto_redirect=True
)
print(res)