Handle headers in State
This commit is contained in:
@@ -78,24 +78,16 @@ class Client(object):
|
|||||||
:raises: FBchatException on failed login
|
:raises: FBchatException on failed login
|
||||||
"""
|
"""
|
||||||
self._sticky, self._pool = (None, None)
|
self._sticky, self._pool = (None, None)
|
||||||
self._resetValues()
|
self._state = State.with_user_agent(user_agent=user_agent)
|
||||||
|
self._seq = "0"
|
||||||
|
self._uid = None
|
||||||
|
self._client_id = hex(int(random() * 2 ** 31))[2:]
|
||||||
self._default_thread_id = None
|
self._default_thread_id = None
|
||||||
self._default_thread_type = None
|
self._default_thread_type = None
|
||||||
self._pull_channel = 0
|
self._pull_channel = 0
|
||||||
self._markAlive = True
|
self._markAlive = True
|
||||||
self._buddylist = dict()
|
self._buddylist = dict()
|
||||||
|
|
||||||
if not user_agent:
|
|
||||||
user_agent = choice(USER_AGENTS)
|
|
||||||
|
|
||||||
self._header = {
|
|
||||||
"Content-Type": "application/x-www-form-urlencoded",
|
|
||||||
"Referer": "https://www.facebook.com",
|
|
||||||
"Origin": "https://www.facebook.com",
|
|
||||||
"User-Agent": user_agent,
|
|
||||||
"Connection": "keep-alive",
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.setLevel(logging_level)
|
handler.setLevel(logging_level)
|
||||||
|
|
||||||
# If session cookies aren't set, not properly loaded or gives us an invalid session, then do the login
|
# If session cookies aren't set, not properly loaded or gives us an invalid session, then do the login
|
||||||
@@ -139,10 +131,7 @@ class Client(object):
|
|||||||
):
|
):
|
||||||
payload = self._generatePayload(query)
|
payload = self._generatePayload(query)
|
||||||
r = self._state._session.get(
|
r = self._state._session.get(
|
||||||
prefix_url(url),
|
prefix_url(url), params=payload, allow_redirects=allow_redirects
|
||||||
headers=self._header,
|
|
||||||
params=payload,
|
|
||||||
allow_redirects=allow_redirects,
|
|
||||||
)
|
)
|
||||||
if not fix_request:
|
if not fix_request:
|
||||||
return r
|
return r
|
||||||
@@ -170,9 +159,7 @@ class Client(object):
|
|||||||
error_retries=3,
|
error_retries=3,
|
||||||
):
|
):
|
||||||
payload = self._generatePayload(query)
|
payload = self._generatePayload(query)
|
||||||
r = self._state._session.post(
|
r = self._state._session.post(prefix_url(url), data=payload)
|
||||||
prefix_url(url), headers=self._header, data=payload
|
|
||||||
)
|
|
||||||
if not fix_request:
|
if not fix_request:
|
||||||
return r
|
return r
|
||||||
try:
|
try:
|
||||||
@@ -203,13 +190,7 @@ class Client(object):
|
|||||||
error_retries=3,
|
error_retries=3,
|
||||||
):
|
):
|
||||||
payload = self._generatePayload(query)
|
payload = self._generatePayload(query)
|
||||||
# Removes 'Content-Type' from the header
|
r = self._state._session.post(prefix_url(url), data=payload, files=files)
|
||||||
headers = dict(
|
|
||||||
(i, self._header[i]) for i in self._header if i != "Content-Type"
|
|
||||||
)
|
|
||||||
r = self._state._session.post(
|
|
||||||
prefix_url(url), headers=headers, data=payload, files=files
|
|
||||||
)
|
|
||||||
if not fix_request:
|
if not fix_request:
|
||||||
return r
|
return r
|
||||||
try:
|
try:
|
||||||
@@ -260,12 +241,6 @@ class Client(object):
|
|||||||
LOGIN METHODS
|
LOGIN METHODS
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _resetValues(self):
|
|
||||||
self._state = State()
|
|
||||||
self._seq = "0"
|
|
||||||
self._uid = None
|
|
||||||
self._client_id = hex(int(random() * 2147483648))[2:]
|
|
||||||
|
|
||||||
def _login(self, email, password):
|
def _login(self, email, password):
|
||||||
soup = bs(self._get("https://m.facebook.com/").text, "html.parser")
|
soup = bs(self._get("https://m.facebook.com/").text, "html.parser")
|
||||||
data = dict(
|
data = dict(
|
||||||
@@ -391,7 +366,9 @@ class Client(object):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# Load cookies into current session
|
# Load cookies into current session
|
||||||
self._state = State.from_cookies(session_cookies)
|
self._state = State.from_cookies(
|
||||||
|
session_cookies, user_agent=self._state._session.headers["User-Agent"]
|
||||||
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.exception("Failed loading session")
|
log.exception("Failed loading session")
|
||||||
self._state = State()
|
self._state = State()
|
||||||
@@ -455,7 +432,8 @@ class Client(object):
|
|||||||
data = {"ref": "mb", "h": logout_h}
|
data = {"ref": "mb", "h": logout_h}
|
||||||
|
|
||||||
r = self._get("/logout.php", data)
|
r = self._get("/logout.php", data)
|
||||||
self._resetValues()
|
self._state = None
|
||||||
|
self._uid = None
|
||||||
return r.ok
|
return r.ok
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@@ -5,17 +5,26 @@ import attr
|
|||||||
import bs4
|
import bs4
|
||||||
import re
|
import re
|
||||||
import requests
|
import requests
|
||||||
|
import random
|
||||||
|
|
||||||
from . import _util
|
from . import _util
|
||||||
|
|
||||||
FB_DTSG_REGEX = re.compile(r'name="fb_dtsg" value="(.*?)"')
|
FB_DTSG_REGEX = re.compile(r'name="fb_dtsg" value="(.*?)"')
|
||||||
|
|
||||||
|
|
||||||
|
def session_factory(user_agent=None):
|
||||||
|
session = requests.session()
|
||||||
|
session.headers["Referer"] = "https://www.facebook.com"
|
||||||
|
# TODO: Deprecate setting the user agent manually
|
||||||
|
session.headers["User-Agent"] = user_agent or random.choice(_util.USER_AGENTS)
|
||||||
|
return session
|
||||||
|
|
||||||
|
|
||||||
@attr.s(slots=True, kw_only=True)
|
@attr.s(slots=True, kw_only=True)
|
||||||
class State(object):
|
class State(object):
|
||||||
"""Stores and manages state required for most Facebook requests."""
|
"""Stores and manages state required for most Facebook requests."""
|
||||||
|
|
||||||
_session = attr.ib(factory=requests.session)
|
_session = attr.ib(factory=session_factory)
|
||||||
fb_dtsg = attr.ib(None)
|
fb_dtsg = attr.ib(None)
|
||||||
_revision = attr.ib(None)
|
_revision = attr.ib(None)
|
||||||
_counter = attr.ib(0)
|
_counter = attr.ib(0)
|
||||||
@@ -68,7 +77,11 @@ class State(object):
|
|||||||
return self._session.cookies.get_dict()
|
return self._session.cookies.get_dict()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_cookies(cls, cookies):
|
def from_cookies(cls, cookies, user_agent=None):
|
||||||
session = requests.session()
|
session = session_factory(user_agent=user_agent)
|
||||||
session.cookies = requests.cookies.merge_cookies(session.cookies, cookies)
|
session.cookies = requests.cookies.merge_cookies(session.cookies, cookies)
|
||||||
return cls.from_session(session=session)
|
return cls.from_session(session=session)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def with_user_agent(cls, user_agent=None, **kwargs):
|
||||||
|
return cls(session=session_factory(user_agent=user_agent), **kwargs)
|
||||||
|
Reference in New Issue
Block a user