import requests from zeep import Client from settings import conf from . import consts from common.redis_cache import redis_handler as rh class EDMS: def __init__(self, user_name, pwd): self.sm_client = Client(wsdl=conf.SM_WSDL) self.dm_client = Client(wsdl=conf.DM_WSDL) self.df_client = Client(wsdl=conf.DF_WSDL) self.download_url = conf.EDMS_DOWNLOAD_URL self.user_name = user_name self.pwd = pwd self.session_id = None def set_session_id(self): self.session_id = self.sm_client.service.StartSession(login=self.user_name, password=self.pwd, clientType=consts.CUSTOM_CLIENT) rh.set_session_id(self.session_id) return self.session_id def get_session_id(self): if self.session_id is None: # redis获取session_id self.session_id = rh.get_session_id() if self.session_id is None: return self.set_session_id() # 验证session_id is_session_valid = self.sm_client.service.IsSessionValid(sessionId=self.session_id, keepAlive=False) if is_session_valid is True: return self.session_id return self.set_session_id() def get_download_token(self, headers, metadata_version_id): with self.dm_client.settings(extra_http_headers=headers): res = self.dm_client.service.PrepareSingleDocumentToDownload(metadataVersionId=metadata_version_id, token=consts.FIXED_TOKEN, fileSize=consts.FIXED_FILE_SIZE, actionType=consts.DOWNLOAD_ACTION_TYPE) return res.token def download(self, save_path, metadata_version_id): session_id = self.get_session_id() headers = {'Cookie': '{0}={1}'.format(consts.SESSION_PREFIX, session_id)} token = self.get_download_token(headers, metadata_version_id) params = {'token': token} r = requests.get(self.download_url, params=params, headers=headers, stream=True) with open(save_path, "wb") as f: # chunk是指定每次写入的大小,每次只写了512byte for chunk in r.iter_content(chunk_size=512): if chunk: f.write(chunk) f.flush()