diff --git a/substack/api.py b/substack/api.py index 6e1dd53..af4a35a 100644 --- a/substack/api.py +++ b/substack/api.py @@ -10,7 +10,7 @@ import os from datetime import datetime from urllib.parse import urljoin - +from substack.cookie_session import CookieSession import requests from substack.exceptions import SubstackAPIException, SubstackRequestException @@ -64,9 +64,7 @@ def __init__( # Load cookies from file if provided # Helps with Captcha errors by reusing cookies from "local" auth, then switching to running code in the cloud if cookies_path is not None: - with open(cookies_path) as f: - cookies = json.load(f) - self._session.cookies.update(cookies) + self._session = CookieSession(cookies_path) elif email is not None and password is not None: self.login(email, password) @@ -189,11 +187,11 @@ def get_publication_url(publication: dict) -> str: Args: publication: """ - custom_domain = publication["custom_domain"] - if not custom_domain: - publication_url = f"https://{publication['subdomain']}.substack.com" - else: + if publication['custom_domain_optional']: + custom_domain = publication["custom_domain"] publication_url = f"https://{custom_domain}" + else: + publication_url = f"https://{publication['subdomain']}.substack.com" return publication_url diff --git a/substack/cookie_session.py b/substack/cookie_session.py new file mode 100644 index 0000000..aa21305 --- /dev/null +++ b/substack/cookie_session.py @@ -0,0 +1,16 @@ +# substack/cookie_session.py +import json, os, requests +from requests.utils import cookiejar_from_dict + +class CookieSession(requests.Session): + """ + A requests.Session that loads cookies from Chrome/Firefox export + (JSON list of {name,value,domain,path,...}). If a CSRF token is + present it is copied to the required headers so every POST works. + """ + def __init__(self, cookie_file: str | os.PathLike, verify_ssl: bool = True): + super().__init__() + with open(cookie_file, "r", encoding="utf-8") as f: + raw = json.load(f) + self.cookies = cookiejar_from_dict({c["name"]: c["value"] for c in raw}) + self.verify = verify_ssl