@@ -27,7 +27,7 @@ def WriteLoginInfo(response, session):
27
27
session .login_info ["success" ] = False
28
28
raise LoginFailedException (session .login_info ["content" ])
29
29
session .login_info ["success" ] = True
30
- session .csrf_token = session .cookies .get (' __csrf' )
30
+ session .csrf_token = session .cookies .get (" __csrf" )
31
31
32
32
33
33
@WeapiCryptoRequest
@@ -40,14 +40,14 @@ def LoginLogout():
40
40
return "/weapi/logout" , {}
41
41
42
42
43
- @WeapiCryptoRequest
43
+ @EapiCryptoRequest
44
44
def LoginRefreshToken ():
45
45
"""网页端 - 刷新登录令牌
46
46
47
47
Returns:
48
48
dict
49
49
"""
50
- return "/weapi/w/ login/cellphone " , {}
50
+ return "/eapi/ login/token/refresh " , {}
51
51
52
52
53
53
@WeapiCryptoRequest
@@ -102,7 +102,31 @@ def GetCurrentLoginStatus():
102
102
return "/weapi/w/nuser/account/get" , {}
103
103
104
104
105
- async def LoginViaCellphone (phone = "" , password = "" ,passwordHash = "" ,captcha = "" , ctcode = 86 , remeberLogin = True , session = None ) -> dict :
105
+ async def LoginViaCookie (MUSIC_U = "" , ** kwargs ):
106
+ """通过 Cookie 登陆
107
+
108
+ Args:
109
+ MUSIC_U (str, optional): Cookie 中的 MUSIC_U. Defaults to ''.
110
+
111
+ Returns:
112
+ dict
113
+ """
114
+ session = GetCurrentSession ()
115
+ session .cookies .update ({"MUSIC_U" : MUSIC_U , ** kwargs })
116
+ resp = await GetCurrentLoginStatus ()
117
+ WriteLoginInfo (resp , session )
118
+ return {"code" : 200 , "result" : session .login_info }
119
+
120
+
121
+ async def LoginViaCellphone (
122
+ phone = "" ,
123
+ password = "" ,
124
+ passwordHash = "" ,
125
+ captcha = "" ,
126
+ ctcode = 86 ,
127
+ remeberLogin = True ,
128
+ session = None ,
129
+ ) -> dict :
106
130
"""PC 端 - 手机号登陆
107
131
108
132
* 若同时指定 password 和 passwordHash, 优先使用 password
@@ -114,8 +138,8 @@ async def LoginViaCellphone(phone="", password="",passwordHash="",captcha="", ct
114
138
remeberLogin (bool, optional): 是否‘自动登录’,设置 `False` 可能导致权限问题. Defaults to True.
115
139
* 以下验证方式有 1 个含参即可
116
140
password (str, optional): 明文密码. Defaults to ''.
117
- passwordHash (str, optional): 密码md5哈希. Defaults to ''.
118
- captcha (str, optional): 手机验证码. 需要已在同一 Session 中发送过 SetSendRegisterVerifcationCodeViaCellphone. Defaults to ''.
141
+ passwordHash (str, optional): 密码md5哈希. Defaults to ''.
142
+ captcha (str, optional): 手机验证码. 需要已在同一 Session 中发送过 SetSendRegisterVerifcationCodeViaCellphone. Defaults to ''.
119
143
120
144
Raises:
121
145
LoginFailedException: 登陆失败时发生
@@ -126,43 +150,47 @@ async def LoginViaCellphone(phone="", password="",passwordHash="",captcha="", ct
126
150
path = "/eapi/w/login/cellphone"
127
151
session = session or GetCurrentSession ()
128
152
if password :
129
- passwordHash = HashHexDigest (password )
130
-
153
+ passwordHash = HashHexDigest (password )
154
+
131
155
if not (passwordHash or captcha ):
132
156
raise LoginFailedException ("未提供密码或验证码" )
133
157
134
- auth_token = {"password" : str (passwordHash )} if not captcha else {"captcha" : str (captcha )}
158
+ auth_token = (
159
+ {"password" : str (passwordHash )} if not captcha else {"captcha" : str (captcha )}
160
+ )
135
161
136
162
login_status = await EapiCryptoRequest (
137
163
lambda : (
138
164
path ,
139
165
{
140
- "type" : '1' ,
141
- "phone" : str (phone ),
166
+ "type" : "1" ,
167
+ "phone" : str (phone ),
142
168
"remember" : str (remeberLogin ).lower (),
143
169
"countrycode" : str (ctcode ),
144
- "checkToken" : "" ,
145
- ** auth_token
170
+ "checkToken" : "" ,
171
+ ** auth_token ,
146
172
},
147
173
)
148
174
)(session = session )
149
-
175
+
150
176
WriteLoginInfo (login_status , session )
151
- return {' code' : 200 ,' result' : session .login_info }
177
+ return {" code" : 200 , " result" : session .login_info }
152
178
153
179
154
- async def LoginViaEmail (email = "" , password = "" ,passwordHash = "" , remeberLogin = True , session = None ) -> dict :
180
+ async def LoginViaEmail (
181
+ email = "" , password = "" , passwordHash = "" , remeberLogin = True , session = None
182
+ ) -> dict :
155
183
"""网页端 - 邮箱登陆
156
184
157
185
* 若同时指定 password 和 passwordHash, 优先使用 password
158
-
186
+
159
187
Args:
160
188
email (str, optional): 邮箱地址. Defaults to ''.
161
189
remeberLogin (bool, optional): 是否‘自动登录’,设置 `False` 可能导致权限问题. Defaults to True.
162
190
* 以下验证方式有 1 个含参即可
163
191
password (str, optional): 明文密码. Defaults to ''.
164
- passwordHash (str, optional): 密码md5哈希. Defaults to ''.
165
-
192
+ passwordHash (str, optional): 密码md5哈希. Defaults to ''.
193
+
166
194
Raises:
167
195
LoginFailedException: 登陆失败时发生
168
196
@@ -172,8 +200,8 @@ async def LoginViaEmail(email="", password="",passwordHash="", remeberLogin=True
172
200
path = "/eapi/login"
173
201
session = session or GetCurrentSession ()
174
202
if password :
175
- passwordHash = HashHexDigest (password )
176
-
203
+ passwordHash = HashHexDigest (password )
204
+
177
205
if not passwordHash :
178
206
raise LoginFailedException ("未提供密码" )
179
207
@@ -183,56 +211,55 @@ async def LoginViaEmail(email="", password="",passwordHash="", remeberLogin=True
183
211
lambda : (
184
212
path ,
185
213
{
186
- "type" : '1' ,
187
- "username" : str (email ),
188
- "remember" : str (remeberLogin ).lower (),
189
- ** auth_token
214
+ "type" : "1" ,
215
+ "username" : str (email ),
216
+ "remember" : str (remeberLogin ).lower (),
217
+ ** auth_token ,
190
218
},
191
219
)
192
220
)(session = session )
193
-
194
- WriteLoginInfo (login_status ,session )
195
- return {'code' :200 ,'result' :session .login_info }
221
+
222
+ WriteLoginInfo (login_status , session )
223
+ return {"code" : 200 , "result" : session .login_info }
224
+
196
225
197
226
async def LoginViaAnonymousAccount (deviceId = None , session = None ):
198
- ''' PC 端 - 游客登陆
227
+ """ PC 端 - 游客登陆
199
228
200
229
Args:
201
230
deviceId (str optional): 设备 ID. 设置非 None 将同时改变 Session 的设备 ID. Defaults to None.
202
-
231
+
203
232
Notes:
204
233
Session 默认使用 `pyncm!` 作为设备 ID
205
234
206
235
Returns:
207
236
dict
208
- '''
237
+ """
209
238
session = session or GetCurrentSession ()
210
239
if not deviceId :
211
- deviceId = session .deviceId
240
+ deviceId = session .deviceId
212
241
login_status = WeapiCryptoRequest (
213
- lambda : ("/api/register/anonimous" , {
214
- "username" : b64encode (
215
- ( '%s %s' % (
216
- deviceId ,
217
- cloudmusic_dll_encode_id (deviceId ))).encode ()
218
- ).decode ()
219
- }
242
+ lambda : (
243
+ "/api/register/anonimous" ,
244
+ {
245
+ "username" : b64encode (
246
+ ( "%s %s" % ( deviceId , cloudmusic_dll_encode_id (deviceId ))).encode ()
247
+ ).decode ()
248
+ },
220
249
)
221
- )(session = session )
222
- assert login_status [' code' ] == 200 ,"匿名登陆失败"
223
- WriteLoginInfo ({
224
- ** login_status ,
225
- 'profile' :{
226
- 'nickname' : ' Anonymous' ,
227
- ** login_status
250
+ )(session = session )
251
+ assert login_status [" code" ] == 200 , "匿名登陆失败"
252
+ WriteLoginInfo (
253
+ {
254
+ ** login_status ,
255
+ "profile" : { "nickname" : " Anonymous" , ** login_status } ,
256
+ "account" : { "id" : login_status [ "userId" ], ** login_status },
228
257
},
229
- 'account' :{
230
- 'id' : login_status ['userId' ],
231
- ** login_status
232
- }
233
- }, session )
258
+ session ,
259
+ )
234
260
return session .login_info
235
261
262
+
236
263
@WeapiCryptoRequest
237
264
def SetSendRegisterVerifcationCodeViaCellphone (cell : str , ctcode = 86 ):
238
265
"""网页端 - 发送验证码
@@ -294,6 +321,7 @@ def SetRegisterAccountViaCellphone(
294
321
"phone" : str (cell ),
295
322
}
296
323
324
+
297
325
@EapiCryptoRequest
298
326
def CheckIsCellphoneRegistered (cell : str , prefix = 86 ):
299
327
"""移动端 - 检查某手机号是否已注册
0 commit comments