2018-01-10 01:42:25 +00:00
# -*- coding: utf8 -*-
2018-01-20 15:23:51 +00:00
import json
import socket
2018-06-11 15:03:23 +00:00
from collections import OrderedDict
2018-01-23 09:48:09 +00:00
from time import sleep
2018-01-10 01:42:25 +00:00
import requests
2018-01-24 04:56:18 +00:00
from config import logger
2018-09-30 06:35:27 +00:00
import wrapcache
2018-01-10 01:42:25 +00:00
2018-01-25 06:15:47 +00:00
2018-06-11 15:03:23 +00:00
def _set_header_default ( ) :
header_dict = OrderedDict ( )
2018-08-29 11:19:13 +00:00
header_dict [ " Accept " ] = " application/json, text/plain, */* "
header_dict [ " Accept-Encoding " ] = " gzip, deflate "
2018-06-11 15:03:23 +00:00
header_dict [
2018-08-29 11:19:13 +00:00
" User-Agent " ] = " Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) 12306-electron/1.0.1 Chrome/59.0.3071.115 Electron/1.8.4 Safari/537.36 "
2018-06-11 15:03:23 +00:00
header_dict [ " Content-Type " ] = " application/x-www-form-urlencoded; charset=UTF-8 "
return header_dict
2018-01-10 01:42:25 +00:00
class HTTPClient ( object ) :
def __init__ ( self ) :
"""
: param method :
: param headers : Must be a dict . Such as headers = { ' Content_Type ' : ' text/html ' }
"""
2018-01-20 15:23:51 +00:00
self . initS ( )
2018-01-28 06:27:24 +00:00
self . _cdn = None
2018-01-20 15:23:51 +00:00
def initS ( self ) :
self . _s = requests . Session ( )
2018-08-29 11:19:13 +00:00
self . _s . headers . update ( _set_header_default ( ) )
2018-01-20 15:23:51 +00:00
return self
def set_cookies ( self , * * kwargs ) :
"""
设置cookies
: param kwargs :
: return :
"""
for k , v in kwargs . items ( ) :
self . _s . cookies . set ( k , v )
2018-08-29 11:19:13 +00:00
def get_cookies ( self ) :
"""
获取cookies
: return :
"""
return self . _s . cookies . values ( )
2018-01-20 15:23:51 +00:00
def del_cookies ( self ) :
"""
删除所有的key
: return :
"""
self . _s . cookies . clear ( )
def del_cookies_by_key ( self , key ) :
"""
删除指定key的session
: return :
"""
self . _s . cookies . set ( key , None )
2018-01-10 01:42:25 +00:00
2018-01-20 15:23:51 +00:00
def setHeaders ( self , headers ) :
self . _s . headers . update ( headers )
return self
2018-08-29 11:19:13 +00:00
def resetHeaders ( self ) :
2018-01-21 05:47:38 +00:00
self . _s . headers . clear ( )
2018-08-29 11:19:13 +00:00
self . _s . headers . update ( _set_header_default ( ) )
2018-01-21 05:47:38 +00:00
2018-01-20 15:23:51 +00:00
def getHeadersHost ( self ) :
return self . _s . headers [ " Host " ]
def setHeadersHost ( self , host ) :
self . _s . headers . update ( { " Host " : host } )
return self
def getHeadersReferer ( self ) :
return self . _s . headers [ " Referer " ]
def setHeadersReferer ( self , referer ) :
self . _s . headers . update ( { " Referer " : referer } )
return self
2018-01-28 06:27:24 +00:00
@property
def cdn ( self ) :
return self . _cdn
@cdn.setter
def cdn ( self , cdn ) :
self . _cdn = cdn
def send ( self , urls , data = None , * * kwargs ) :
2018-01-20 15:23:51 +00:00
""" send request to url.If response 200,return response, else return None. """
2018-01-23 09:48:09 +00:00
allow_redirects = False
2018-06-11 15:03:23 +00:00
is_logger = urls . get ( " is_logger " , False )
req_url = urls . get ( " req_url " , " " )
re_try = urls . get ( " re_try " , 0 )
s_time = urls . get ( " s_time " , 0 )
2018-09-30 06:35:27 +00:00
is_cdn = urls . get ( " is_cdn " , False )
is_test_cdn = urls . get ( " is_test_cdn " , False )
2018-01-29 13:59:01 +00:00
error_data = { " code " : 99999 , " message " : u " 重试次数达到上限 " }
2018-01-21 05:47:38 +00:00
if data :
method = " post "
self . setHeaders ( { " Content-Length " : " {0} " . format ( len ( data ) ) } )
else :
method = " get "
2018-08-29 11:19:13 +00:00
self . resetHeaders ( )
2018-06-11 15:03:23 +00:00
self . setHeadersReferer ( urls [ " Referer " ] )
2018-01-24 14:35:24 +00:00
if is_logger :
logger . log (
2018-06-11 15:03:23 +00:00
u " url: {0} \n 入参: {1} \n 请求方式: {2} \n " . format ( req_url , data , method , ) )
2018-08-31 16:24:40 +00:00
self . setHeadersHost ( urls [ " Host " ] )
2018-09-30 06:35:27 +00:00
if is_test_cdn :
url_host = self . _cdn
elif is_cdn :
2018-12-26 08:05:51 +00:00
if self . _cdn :
url_host = self . _cdn
2018-09-30 06:35:27 +00:00
else :
url_host = urls [ " Host " ]
2018-01-28 06:27:24 +00:00
else :
url_host = urls [ " Host " ]
2018-06-11 15:03:23 +00:00
for i in range ( re_try ) :
2018-01-23 13:29:06 +00:00
try :
2018-03-01 03:10:36 +00:00
# sleep(urls["s_time"]) if "s_time" in urls else sleep(0.001)
2018-06-11 15:03:23 +00:00
sleep ( s_time )
2018-01-28 06:27:24 +00:00
requests . packages . urllib3 . disable_warnings ( )
2018-01-23 13:29:06 +00:00
response = self . _s . request ( method = method ,
2018-01-29 03:19:25 +00:00
timeout = 2 ,
2018-06-11 15:03:23 +00:00
url = " https:// " + url_host + req_url ,
2018-01-23 13:29:06 +00:00
data = data ,
allow_redirects = allow_redirects ,
2018-01-28 06:27:24 +00:00
verify = False ,
2018-01-23 13:29:06 +00:00
* * kwargs )
2018-12-26 08:05:51 +00:00
if response . status_code == 200 or response . status_code == 302 :
2018-01-24 04:56:18 +00:00
if response . content :
if is_logger :
logger . log (
u " 出参: {0} " . format ( response . content ) )
2018-06-11 15:03:23 +00:00
return json . loads ( response . content ) if urls [ " is_json " ] else response . content
2018-01-24 04:56:18 +00:00
else :
logger . log (
2018-01-28 06:27:24 +00:00
u " url: {} 返回参数为空 " . format ( urls [ " req_url " ] ) )
2018-01-24 04:56:18 +00:00
return error_data
2018-01-23 13:29:06 +00:00
else :
2018-01-28 06:27:24 +00:00
sleep ( urls [ " re_time " ] )
2018-01-23 13:29:06 +00:00
except ( requests . exceptions . Timeout , requests . exceptions . ReadTimeout , requests . exceptions . ConnectionError ) :
pass
except socket . error :
pass
2018-01-23 09:58:17 +00:00
return error_data