omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    How to login Facebook with Request module for further access?

    Pythonista
    2
    4
    4307
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • henryaukc
      henryaukc last edited by

      Hi All, with the help of some nice guys here, I finished my first pythonista little project, a facebook video downloader: https://gist.github.com/henryaukc/6fd00b8baee4c069a2b44e574829469f

      It works for downloading videos posted by the pages that open to public access. I would like to enhance it a bit so that it can download videos from my friends page. It requires to login the facebook with my credentials and save the cookies to further access the pages. I have searched the web for solutions but it seems all outdated and see if someone can give me some hints?

      I will continue to investigate it and post my result here too. Thanks a lot.

      1 Reply Last reply Reply Quote 0
      • abcabc
        abcabc last edited by

        The selected answer from the following stackoverflow link may help
        http://stackoverflow.com/questions/12737740/python-requests-and-persistent-sessions

        1 Reply Last reply Reply Quote 0
        • henryaukc
          henryaukc last edited by henryaukc

          Thanks @abcabc ! I have tried the script and it works fine after some small modification. I would try to update my script accordingly later.

          1 Reply Last reply Reply Quote 0
          • henryaukc
            henryaukc last edited by

            Sorry, maybe I was not checking thoroughly or it is not working anymore, my script to login facebook fails now....

            Can someone shed some light on it?

            import requests
            from urllib.parse import urlparse
            import os
            import pickle
            import datetime
            
            class MyLoginSession:
            	"""
                a class which handles and saves login sessions. It also keeps track of proxy settings.
                It does also maintine a cache-file for restoring session data from earlier
                script executions.
            	"""
            	def __init__(self,
                             loginUrl,
                             loginData,
                             loginTestUrl,
                             loginTestString,
                             sessionFileAppendix = '_session.dat',
                             maxSessionTimeSeconds = 30 * 60,
                             proxies = None,
                             userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
                             debug = True):
            		"""
                    save some information needed to login the session
            
                    you'll have to provide 'loginTestString' which will be looked for in the
                    responses html to make sure, you've properly been logged in
            
                    'proxies' is of format { 'https' : 'https://user:pass@server:port', 'http' : ...
                    'loginData' will be sent as post data (dictionary of id : value).
                    'maxSessionTimeSeconds' will be used to determine when to re-login.
            		"""
            		urlData = urlparse(loginUrl)
            
            		self.proxies = proxies
            		self.loginData = loginData
            		self.loginUrl = loginUrl
            		self.loginTestUrl = loginTestUrl
            		self.maxSessionTime = maxSessionTimeSeconds
            		self.sessionFile = urlData.netloc + sessionFileAppendix
            		self.userAgent = userAgent
            		self.loginTestString = loginTestString
            		self.debug = debug
            
            		self.login()
            
            	def modification_date(self, filename):
            		"""
            		return last file modification date as datetime object
            		"""
            		t = os.path.getmtime(filename)
            		return datetime.datetime.fromtimestamp(t)
            
            	def login(self, forceLogin = False):
            		"""
                    login to a session. Try to read last saved session from cache file. If this fails
                    do proper login. If the last cache access was too old, also perform a proper login.
                    Always updates session cache file.
            		"""
            		wasReadFromCache = False
            		if self.debug:
            			print('loading or generating session...')
            		if os.path.exists(self.sessionFile) and not forceLogin:
            			if os.path.getsize(self.sessionFile) > 0:
            				time = self.modification_date(self.sessionFile)         
            				if self.debug:
            					print('loginURL:' + loginUrl)
            
            			# only load if file less than 30 minutes old
            			lastModification = (datetime.datetime.now() - time).seconds
            			if lastModification < self.maxSessionTime:
            				
            				with open(self.sessionFile, "rb") as f:
            					self.session = pickle.load(f)
            					wasReadFromCache = True
            					if self.debug:
            						print("loaded session from cache (last access %ds ago) " % lastModification)
            						
            		if not wasReadFromCache:
            			self.session = requests.Session()
            			self.session.headers.update({'user-agent' : self.userAgent})
            			res = self.session.post(self.loginUrl, data = self.loginData, proxies = self.proxies)
            
            			if self.debug:
            				print('created new session with login' )
            			self.saveSessionToCache()
            
            		# test login
            		res = self.session.get(self.loginTestUrl)
            		if res.text.find(self.loginTestString) > 0:
            			print(res.text)
            			raise Exception("could not log into provided site '%s'"			" (did not find successful login string)" % self.loginUrl)
            
            
            	def saveSessionToCache(self):
            		"""
                    save session to a cache file
            		"""
            		# always save (to update timeout)
            		with open(self.sessionFile, "wb") as f:
            			pickle.dump(self.session, f)
            			if self.debug:
            				print('updated session cache-file %s' % self.sessionFile)
            
            	def retrieveContent(self, url, method = "get", postData = None):
            		"""
                    return the content of the url with respect to the session.
            
                    If 'method' is not 'get', the url will be called with 'postData'
                    as a post request.
            		"""
            		if method == 'get':
            			res = self.session.get(url , proxies = self.proxies)
            		else:
            			res = self.session.get(url , data = postData, proxies = self.proxies)
            
            		res.encoding = 'utf-8'
            		# the session has been updated on the server, so also update in cache
            		self.saveSessionToCache()            
            
            		return res
            
            
            if __name__ == "__main__":
            	# proxies = {'https' : 'https://user:pass@server:port',
            	#           'http' : 'http://user:pass@server:port'}
            
            	# after I checking the source code of Facebook login form, I changed 'user' to 'email' and it also failed
            	loginData = {	'user' : 'My Login Name', 
            								'password' : 'My Password'} # these are not my real login & password 
            
            	loginUrl = 'https://www.facebook.com/login.php'
            
            	loginTestUrl = 'https://www.facebook.com/home.php?ref=home'
            	failedStr = 'facebook.com/login/'
            	s = MyLoginSession(loginUrl, loginData, loginTestUrl, failedStr, 
                                   #proxies = proxies
                                   )
            
            	res = s.retrieveContent('https://www.facebook.com/home.php?ref=home')
            	res.encoding = 'utf-8'
            	print(res.text)
            	
            	'''
            	<input type="text" class="inputtext _55r1 inputtext _1kbt inputtext _1kbt" name="email" id="email" tabindex="1" placeholder="Email address or phone number" value="" autofocus="1" aria-label="Email address or phone number">
            </div>
            <div class="clearfix _5466 _44mg">
            <input type="password" class="inputtext _55r1 inputtext _1kbt inputtext _1kbt" name="pass" id="pass" tabindex="1" placeholder="Password" aria-label="Password">
            	'''```
            1 Reply Last reply Reply Quote 0
            • First post
              Last post
            Powered by NodeBB Forums | Contributors