File size: 3,270 Bytes
0ab2566
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# -*- 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