From 325c5158d27737d9396b313ebd2fc0b826ff4892 Mon Sep 17 00:00:00 2001 From: trevor hobenshield Date: Sat, 24 Jun 2023 14:37:20 -0700 Subject: [PATCH] fix httpx cookie issues, conflicting csrf tokens --- setup.py | 2 +- twitter/account.py | 7 ++++++- twitter/util.py | 39 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 7d72576..a4d3a69 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ install_requires = [ setup( name="twitter-api-client", - version="0.9.8", + version="0.9.9", python_requires=">=3.10.10", description="Twitter API", long_description=dedent(''' diff --git a/twitter/account.py b/twitter/account.py index 3d1b9d6..ee9e8d0 100644 --- a/twitter/account.py +++ b/twitter/account.py @@ -615,10 +615,13 @@ class Account: # validate credentials if all((email, username, password)): - return login(email, username, password, **kwargs) + session = login(email, username, password, **kwargs) + session._init_with_cookies = False + return session # invalid credentials, try validating session if session and all(session.cookies.get(c) for c in {'ct0', 'auth_token'}): + session._init_with_cookies = True return session # invalid credentials and session @@ -627,12 +630,14 @@ class Account: # try validating cookies dict if isinstance(cookies, dict) and all(cookies.get(c) for c in {'ct0', 'auth_token'}): _session = Client(cookies=cookies, follow_redirects=True) + _session._init_with_cookies = True _session.headers.update(get_headers(_session)) return _session # try validating cookies from file if isinstance(cookies, str): _session = Client(cookies=orjson.loads(Path(cookies).read_bytes()), follow_redirects=True) + _session._init_with_cookies = True _session.headers.update(get_headers(_session)) return _session diff --git a/twitter/util.py b/twitter/util.py index 45802b9..a3de2fc 100644 --- a/twitter/util.py +++ b/twitter/util.py @@ -109,7 +109,12 @@ def get_headers(session, **kwargs) -> dict: Get the headers required for authenticated requests """ cookies = session.cookies - cookies.delete('ct0', domain='.twitter.com') + # todo httpx cookie issues + try: + if session._init_with_cookies: + cookies.delete('ct0', domain='.twitter.com') + except: + ... headers = kwargs | { 'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs=1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA', 'cookie': '; '.join(f'{k}={v}' for k, v in cookies.items()), @@ -124,6 +129,38 @@ def get_headers(session, **kwargs) -> dict: return dict(sorted({k.lower(): v for k, v in headers.items()}.items())) +# def get_headers(session, **kwargs) -> dict: +# """ +# Get the headers required for authenticated requests +# """ +# cookies = {} +# for k in {'auth_token', 'ct0', 'flow_token', 'guest_id', 'guest_id_ads', 'guest_id_marketing', 'guest_token', 'kdt', +# 'personalization_id', 'twid'}: +# cookies[k] = session.cookies.get(k, domain=None) or session.cookies.get(k, domain='.twitter.com') +# # +# # if cookies.get('ct0', domain=None): +# # cookies.delete('ct0', domain='.twitter.com') +# # elif cookies.get('ct0', domain='.twitter.com'): +# # cookies.delete('ct0', domain=None) +# +# session.cookies.clear_session_cookies() +# +# session.cookies.update(cookies) +# +# headers = kwargs | { +# 'authorization': 'Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs=1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA', +# 'cookie': '; '.join(f'{k}={v}' for k, v in cookies.items()), +# 'referer': 'https://twitter.com/', +# 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36', +# 'x-csrf-token': cookies['ct0'] or '', +# 'x-guest-token': cookies['guest_token'] or '', +# 'x-twitter-auth-type': 'OAuth2Session' if cookies['auth_token'] else '', +# 'x-twitter-active-user': 'yes', +# 'x-twitter-client-language': 'en', +# } +# return dict(sorted({k.lower(): v for k, v in headers.items()}.items())) + + def find_key(obj: any, key: str) -> list: """ Find all values of a given key within a nested dict or list of dicts