99 Throttle ,
1010 local_storage_clip_url_template ,
1111)
12- from blinkpy .helpers .constants import DEFAULT_URL , TIMEOUT , DEFAULT_USER_AGENT
12+ from blinkpy .helpers .constants import (
13+ TIMEOUT ,
14+ DEFAULT_USER_AGENT ,
15+ OAUTH_CLIENT_ID ,
16+ OAUTH_GRANT_TYPE_PASSWORD ,
17+ OAUTH_GRANT_TYPE_REFRESH_TOKEN ,
18+ OAUTH_SCOPE ,
19+ )
20+ from urllib .parse import urlencode
1321
1422_LOGGER = logging .getLogger (__name__ )
1523
@@ -22,32 +30,44 @@ async def request_login(
2230 auth ,
2331 url ,
2432 login_data ,
33+ is_refresh = False ,
2534 is_retry = False ,
2635):
2736 """
28- Login request.
37+ OAuth login request.
2938
3039 :param auth: Auth instance.
3140 :param url: Login url.
3241 :param login_data: Dictionary containing blink login data.
3342 :param is_retry:
43+ :param two_fa_code: 2FA code if required
3444 """
45+
3546 headers = {
36- "Host " : DEFAULT_URL ,
37- "Content-Type " : "application/json" ,
38- "user-agent " : DEFAULT_USER_AGENT ,
47+ "Content-Type " : "application/x-www-form-urlencoded" ,
48+ "User-Agent " : DEFAULT_USER_AGENT ,
49+ "hardware_id " : login_data . get ( "device_id" , "Blinkpy" ) ,
3950 }
4051
41- data = dumps (
42- {
43- "email" : login_data ["username" ],
44- "password" : login_data ["password" ],
45- "unique_id" : login_data ["uid" ],
46- "device_identifier" : login_data ["device_id" ],
47- "client_name" : "Computer" ,
48- "reauth" : True ,
49- }
50- )
52+ # Add 2FA code to headers if provided
53+ if "2fa_code" in login_data :
54+ headers ["2fa-code" ] = login_data ["2fa_code" ]
55+
56+ # Prepare form data for OAuth
57+ form_data = {
58+ "username" : login_data ["username" ],
59+ "client_id" : OAUTH_CLIENT_ID ,
60+ "scope" : OAUTH_SCOPE ,
61+ }
62+
63+ if is_refresh :
64+ form_data ["grant_type" ] = OAUTH_GRANT_TYPE_REFRESH_TOKEN
65+ form_data ["refresh_token" ] = auth .refresh_token
66+ else :
67+ form_data ["grant_type" ] = OAUTH_GRANT_TYPE_PASSWORD
68+ form_data ["password" ] = login_data ["password" ]
69+
70+ data = urlencode (form_data )
5171
5272 return await auth .query (
5373 url = url ,
@@ -56,23 +76,23 @@ async def request_login(
5676 json_resp = False ,
5777 reqtype = "post" ,
5878 is_retry = is_retry ,
79+ skip_refresh_check = True ,
5980 )
6081
6182
62- async def request_verify (auth , blink , verify_key ):
63- """Send verification key to blink servers."""
64- url = (
65- f" { blink . urls . base_url } /api/v5/accounts/ { blink . account_id } "
66- f"/users/ { blink . auth . user_id } "
67- f"/clients/ { blink . client_id } /client_verification/pin/verify"
68- )
69- data = dumps ({ "pin" : verify_key })
83+ async def request_tier (auth , url ):
84+ """Get account tier information from blink servers."""
85+ headers = {
86+ "Content-Type" : "application/x-www-form-urlencoded" ,
87+ "User-Agent" : DEFAULT_USER_AGENT ,
88+ "Authorization" : f"Bearer { auth . token } " ,
89+ }
90+
7091 return await auth .query (
7192 url = url ,
72- headers = auth .header ,
73- data = data ,
74- json_resp = False ,
75- reqtype = "post" ,
93+ headers = headers ,
94+ json_resp = True ,
95+ reqtype = "get" ,
7696 )
7797
7898
@@ -214,7 +234,7 @@ async def request_command_status(blink, network, command_id):
214234async def request_homescreen (blink , ** kwargs ):
215235 """Request homescreen info."""
216236 url = f"{ blink .urls .base_url } /api/v3/accounts/{ blink .account_id } /homescreen"
217- return await http_get (blink , url )
237+ return await http_get (blink , url , json = False )
218238
219239
220240@Throttle (seconds = MIN_THROTTLE_TIME )
0 commit comments