File size: 4,719 Bytes
0aee47a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
"""

bilibili_api.utils.Credential



凭据类,用于各种请求操作的验证。

"""

import uuid
from typing import Union
import urllib.parse

from ..exceptions import (
    CredentialNoBuvid3Exception,
    CredentialNoBiliJctException,
    CredentialNoSessdataException,
    CredentialNoDedeUserIDException,
    CredentialNoAcTimeValueException,
)


class Credential:
    """

    凭据类,用于各种请求操作的验证。

    """

    def __init__(

        self,

        sessdata: Union[str, None] = None,

        bili_jct: Union[str, None] = None,

        buvid3: Union[str, None] = None,

        dedeuserid: Union[str, None] = None,

        ac_time_value: Union[str, None] = None,

    ) -> None:
        """

        各字段获取方式查看:https://nemo2011.github.io/bilibili-api/#/get-credential.md



        Args:

            sessdata   (str | None, optional): 浏览器 Cookies 中的 SESSDATA 字段值. Defaults to None.



            bili_jct   (str | None, optional): 浏览器 Cookies 中的 bili_jct 字段值. Defaults to None.



            buvid3     (str | None, optional): 浏览器 Cookies 中的 BUVID3 字段值. Defaults to None.



            dedeuserid (str | None, optional): 浏览器 Cookies 中的 DedeUserID 字段值. Defaults to None.



            ac_time_value (str | None, optional): 浏览器 Cookies 中的 ac_time_value 字段值. Defaults to None.

        """
        self.sessdata = (
            None
            if sessdata is None
            else (
                sessdata if sessdata.find("%") != -1 else urllib.parse.quote(sessdata)
            )
        )
        self.bili_jct = bili_jct
        self.buvid3 = buvid3
        self.dedeuserid = dedeuserid
        self.ac_time_value = ac_time_value

    def get_cookies(self) -> dict:
        """

        获取请求 Cookies 字典



        Returns:

            dict: 请求 Cookies 字典

        """
        cookies = {
            "SESSDATA": self.sessdata,
            "buvid3": self.buvid3,
            "bili_jct": self.bili_jct,
            "ac_time_value": self.ac_time_value,
        }
        if self.dedeuserid:
            cookies.update({"DedeUserID": self.dedeuserid})
        return cookies

    def has_dedeuserid(self) -> bool:
        """

        是否提供 dedeuserid。



        Returns:

            bool。

        """
        return self.dedeuserid is not None and self.sessdata != ""

    def has_sessdata(self) -> bool:
        """

        是否提供 sessdata。



        Returns:

            bool。

        """
        return self.sessdata is not None and self.sessdata != ""

    def has_bili_jct(self) -> bool:
        """

        是否提供 bili_jct。



        Returns:

            bool。

        """
        return self.bili_jct is not None and self.sessdata != ""

    def has_buvid3(self) -> bool:
        """

        是否提供 buvid3



        Returns:

            bool.

        """
        return self.buvid3 is not None and self.sessdata != ""

    def has_ac_time_value(self) -> bool:
        """

        是否提供 ac_time_value



        Returns:

            bool.

        """
        return self.ac_time_value is not None and self.sessdata != ""

    def raise_for_no_sessdata(self):
        """

        没有提供 sessdata 则抛出异常。

        """
        if not self.has_sessdata():
            raise CredentialNoSessdataException()

    def raise_for_no_bili_jct(self):
        """

        没有提供 bili_jct 则抛出异常。

        """
        if not self.has_bili_jct():
            raise CredentialNoBiliJctException()

    def raise_for_no_buvid3(self):
        """

        没有提供 buvid3 时抛出异常。

        """
        if not self.has_buvid3():
            raise CredentialNoBuvid3Exception()

    def raise_for_no_dedeuserid(self):
        """

        没有提供 DedeUserID 时抛出异常。

        """
        if not self.has_dedeuserid():
            raise CredentialNoDedeUserIDException()

    def raise_for_no_ac_time_value(self):
        """

        没有提供 ac_time_value 时抛出异常。

        """
        if not self.has_ac_time_value():
            raise CredentialNoAcTimeValueException()

    async def check_valid(self):
        """

        检查 cookies 是否有效



        Returns:

            bool: cookies 是否有效

        """

    # def generate_buvid3(self):
    #     """
    #     生成 buvid3
    #     """
    #     self.buvid3 = str(uuid.uuid1()) + "infoc"
    # 长度都不同了...用 credential.get_spi_buvid