fix httpx cookie issues, conflicting csrf tokens

This commit is contained in:
trevor hobenshield
2023-06-24 14:37:20 -07:00
parent b36c462ffc
commit 325c5158d2
3 changed files with 45 additions and 3 deletions

View File

@@ -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('''

View File

@@ -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

View File

@@ -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