# -*- encoding: utf-8 -*- """ @File : tfsManager.py @Contact : zhangwang.zhang@alibaba-inc.com @License : (C)Copyright 2021, Alibaba Group @Modify Time @Author @Version @Desciption ------------ ------- -------- ----------- 2021/10/20 21:53 heqing 1.0 None # import lib from tfsClient import tfsManager # 初始化客户端(初始化一次即可) downloader = tfsManager('1316bec91c411') response = downloader.fetchFile('O1CN01LkpGBC1itIwx70XNy_!!0-rate.jpg', timeout=3) """ import random import time import urllib import urllib.request # import lib import requests class tfsError(Exception): """base tfs Error""" class tfsManager: def __init__(self, appkey): self.appKey = str(appkey) self.tmpTfsProxyList = [] self.lastRefreshTime = 0 def getTfsProxyList(self): """ 获取tfs的vip列表 """ try: tfsResponse = requests.get( "http://restful-store.vip.tbsite.net:3800/tfs.list" ) if tfsResponse.status_code == 200: self.tmpTfsProxyList = tfsResponse.text.split("\n")[1:] if len(self.tmpTfsProxyList) == 0: raise RuntimeError("tmpTfsProxyList is empty") self.lastRefreshTime = time.time() else: raise tfsError("ResponseError:", tfsResponse.status_code) except requests.ConnectionError: raise tfsError("ConnectionError:", str(requests.ConnectionError)) def refreshTfsProxyList(self): """ 判断是否需要刷新vip列表 """ needRefresh = False if len(self.tmpTfsProxyList) == 0: needRefresh = True else: diffTime = time.time() - self.lastRefreshTime if diffTime >= 60: needRefresh = True if needRefresh: self.getTfsProxyList() def fetchFile(self, tfsFileName, timeout=None): """ 从tfs服务器获取文件 :param tfsFileName: 请求的文件名 :return: http response """ self.refreshTfsProxyList() headers = {"user-agent": "Picasso-Python-Client-V1.0.2"} Host = random.choice(self.tmpTfsProxyList) requestUrl = "http://" + Host + "/v1/" + self.appKey + "/" + tfsFileName # response = requests.get(requestUrl, headers=headers, timeout=timeout) request = urllib.request.Request(requestUrl, headers=headers) response = urllib.request.urlopen(request, timeout=timeout) return response def fetchMetadata(self, tfsFileName, timeout=None): """ 获取一个TFS文件的元信息 :param tfsFileName: 请求的文件名 :return: http response """ self.refreshTfsProxyList() headers = {"user-agent": "Picasso-Python-Client-V1.0.2"} Host = random.choice(self.tmpTfsProxyList) requestUrl = ( "http://" + Host + "/v1/" + self.appKey + "/" + "metadata" + "/" + tfsFileName ) response = requests.get(requestUrl, headers=headers, timeout=timeout) return response