Move client session into State

This commit is contained in:
Mads Marquart
2019-06-26 18:24:36 +02:00
parent 5df10ecc31
commit 94a0f6b3df
2 changed files with 14 additions and 11 deletions

View File

@@ -130,7 +130,7 @@ class Client(object):
allow_redirects=True, allow_redirects=True,
): ):
payload = self._generatePayload(query) payload = self._generatePayload(query)
r = self._session.get( r = self._state._session.get(
prefix_url(url), prefix_url(url),
headers=self._header, headers=self._header,
params=payload, params=payload,
@@ -163,7 +163,7 @@ class Client(object):
error_retries=3, error_retries=3,
): ):
payload = self._generatePayload(query) payload = self._generatePayload(query)
r = self._session.post( r = self._state._session.post(
prefix_url(url), headers=self._header, data=payload, verify=self.ssl_verify prefix_url(url), headers=self._header, data=payload, verify=self.ssl_verify
) )
if not fix_request: if not fix_request:
@@ -200,7 +200,7 @@ class Client(object):
headers = dict( headers = dict(
(i, self._header[i]) for i in self._header if i != "Content-Type" (i, self._header[i]) for i in self._header if i != "Content-Type"
) )
r = self._session.post( r = self._state._session.post(
prefix_url(url), prefix_url(url),
headers=headers, headers=headers,
data=payload, data=payload,
@@ -259,19 +259,18 @@ class Client(object):
def _resetValues(self): def _resetValues(self):
self._state = State() self._state = State()
self._session = requests.session()
self._seq = "0" self._seq = "0"
self._uid = None self._uid = None
self._client_id = hex(int(random() * 2147483648))[2:] self._client_id = hex(int(random() * 2147483648))[2:]
def _postLogin(self): def _postLogin(self):
self._uid = self._session.cookies.get_dict().get("c_user") self._uid = self._state._session.cookies.get_dict().get("c_user")
if self._uid is None: if self._uid is None:
raise FBchatException("Could not find c_user cookie") raise FBchatException("Could not find c_user cookie")
self._uid = str(self._uid) self._uid = str(self._uid)
r = self._get("/") r = self._get("/")
self._state = State.from_base_request(r.text) self._state = State.from_base_request(self._state._session, r.text)
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")
@@ -379,7 +378,7 @@ class Client(object):
:return: A dictionay containing session cookies :return: A dictionay containing session cookies
:rtype: dict :rtype: dict
""" """
return self._session.cookies.get_dict() return self._state._session.cookies.get_dict()
def setSession(self, session_cookies): def setSession(self, session_cookies):
"""Loads session cookies """Loads session cookies
@@ -395,8 +394,8 @@ class Client(object):
try: try:
# Load cookies into current session # Load cookies into current session
self._session.cookies = requests.cookies.merge_cookies( self._state._session.cookies = requests.cookies.merge_cookies(
self._session.cookies, session_cookies self._state._session.cookies, session_cookies
) )
self._postLogin() self._postLogin()
except Exception as e: except Exception as e:

View File

@@ -4,6 +4,7 @@ from __future__ import unicode_literals
import attr import attr
import bs4 import bs4
import re import re
import requests
from . import _util from . import _util
@@ -14,6 +15,7 @@ FB_DTSG_REGEX = re.compile(r'name="fb_dtsg" value="(.*?)"')
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)
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)
@@ -35,7 +37,7 @@ class State(object):
} }
@classmethod @classmethod
def from_base_request(cls, content): def from_base_request(cls, session, content):
soup = bs4.BeautifulSoup(content, "html.parser") soup = bs4.BeautifulSoup(content, "html.parser")
fb_dtsg_element = soup.find("input", {"name": "fb_dtsg"}) fb_dtsg_element = soup.find("input", {"name": "fb_dtsg"})
@@ -50,4 +52,6 @@ class State(object):
logout_h_element = soup.find("input", {"name": "h"}) logout_h_element = soup.find("input", {"name": "h"})
logout_h = logout_h_element["value"] if logout_h_element else None logout_h = logout_h_element["value"] if logout_h_element else None
return cls(fb_dtsg=fb_dtsg, revision=revision, logout_h=logout_h) return cls(
session=session, fb_dtsg=fb_dtsg, revision=revision, logout_h=logout_h
)