Skip to content

Commit 6f6c594

Browse files
committed
Make auth cookie loading lazy and CI-safe
1 parent bf33080 commit 6f6c594

2 files changed

Lines changed: 49 additions & 10 deletions

File tree

src/tiktok_uploader/auth.py

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@ class AuthBackend:
2020
username: str
2121
password: str
2222
cookies: list[Cookie]
23+
cookies_path: str | None
24+
cookies_str: str | None
25+
cookies_list: list[Cookie]
26+
sessionid: str | None
2327

2428
def __init__(
2529
self,
2630
username: str = "",
2731
password: str = "",
28-
cookies_list: list[Cookie] = [],
32+
cookies_list: list[Cookie] | None = None,
2933
cookies: str | None = None,
3034
cookies_str: str | None = None,
3135
sessionid: str | None = None,
@@ -42,12 +46,16 @@ def __init__(
4246
if (username and not password) or (password and not username):
4347
raise InsufficientAuth()
4448

45-
self.cookies = self.get_cookies(path=cookies) if cookies else []
46-
self.cookies += self.get_cookies(cookies_str=cookies_str) if cookies_str else []
47-
self.cookies += cookies_list
48-
self.cookies += [{"name": "sessionid", "value": sessionid}] if sessionid else []
49+
self.cookies_path = cookies
50+
self.cookies_str = cookies_str
51+
self.cookies_list = list(cookies_list) if cookies_list else []
52+
self.sessionid = sessionid
53+
self.cookies = []
4954

50-
if not (self.cookies or (username and password)):
55+
has_cookie_input = bool(
56+
self.cookies_path or self.cookies_str or self.cookies_list or self.sessionid
57+
)
58+
if not (has_cookie_input or (username and password)):
5159
raise InsufficientAuth()
5260

5361
self.username = username
@@ -59,17 +67,24 @@ def __init__(
5967
logger.debug(green("Authenticating browser with username and password"))
6068
elif sessionid:
6169
logger.debug(green("Authenticating browser with sessionid"))
62-
elif cookies_list:
70+
elif self.cookies_list:
6371
logger.debug(green("Authenticating browser with cookies_list"))
6472

6573
def authenticate_agent(self, page: Page) -> Page:
6674
"""
6775
Authenticates the agent using the browser backend
6876
"""
69-
# tries to use cookies
77+
if not self.cookies:
78+
self.cookies = self._resolve_cookies()
79+
7080
if not self.cookies and self.username and self.password:
7181
self.cookies = login(page, username=self.username, password=self.password)
7282

83+
if not self.cookies:
84+
raise InsufficientAuth(
85+
"No valid authentication source found. Provide a valid cookies file, cookies list/string, sessionid, or username/password."
86+
)
87+
7388
logger.debug(green("Authenticating browser with cookies"))
7489

7590
# Fix cookie keys for Playwright
@@ -128,6 +143,30 @@ def authenticate_agent(self, page: Page) -> Page:
128143

129144
return page
130145

146+
def _resolve_cookies(self) -> list[Cookie]:
147+
resolved_cookies: list[Cookie] = []
148+
149+
if self.cookies_path:
150+
try:
151+
resolved_cookies.extend(self.get_cookies(path=self.cookies_path))
152+
except OSError as error:
153+
logger.warning(
154+
"Could not read cookies file '%s': %s",
155+
self.cookies_path,
156+
error,
157+
)
158+
159+
if self.cookies_str:
160+
resolved_cookies.extend(self.get_cookies(cookies_str=self.cookies_str))
161+
162+
if self.cookies_list:
163+
resolved_cookies.extend(self.cookies_list)
164+
165+
if self.sessionid:
166+
resolved_cookies.append({"name": "sessionid", "value": self.sessionid})
167+
168+
return resolved_cookies
169+
131170
def get_cookies(
132171
self, path: str | None = None, cookies_str: str | None = None
133172
) -> list[Cookie]:

tests/test_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_tiktok_uploader_lazy_loading(
4040
mock_auth.return_value = mock_page
4141

4242
# Create uploader
43-
uploader = TikTokUploader(cookies="cookies.txt")
43+
uploader = TikTokUploader(sessionid="test_session")
4444

4545
# Browser should not be called yet
4646
mock_browser.assert_not_called()
@@ -67,7 +67,7 @@ def test_tiktok_uploader_reuse_browser(
6767
mock_browser.return_value = mock_page
6868
mock_auth.return_value = mock_page
6969

70-
uploader = TikTokUploader(cookies="cookies.txt")
70+
uploader = TikTokUploader(sessionid="test_session")
7171

7272
# First upload
7373
uploader.upload_video(FILENAME, description="Test 1")

0 commit comments

Comments
 (0)