Solución:
Necesitas enviar un formulario completo. La forma más fácil de averiguar qué espera Facebook es utilizar algo como las herramientas de desarrollo de Google Chrome para monitorear sus solicitudes web.
Para hacer su vida más fácil, he monitoreado mi propio inicio de sesión en Facebook y lo reproduzco a continuación (con información privada redactada, obviamente) con la información sin importancia despojada:
Request URL:https://m.facebook.com/login.php?refsrc=https%3A%2F%2Fm.facebook.com%2F&refid=8
Request Method:POST
Form Data:
lsd:AVqAE5Wf
charset_test:€,´,€,´,水,Д,Є
version:1
ajax:0
width:0
pxr:0
gps:0
m_ts:1392974963
li:cxwHUxatQiaLv1nZEYPp0aTB
email:...
pass:...
login:Log In
Como puede ver, el formulario contiene muchos campos. Todos estos deben ser proporcionados para permitirle iniciar sesión. Su código le proporcionará el correo electrónico y la contraseña. El resto de los campos en realidad tienen sus valores establecidos por el HTML que Facebook le ofrece. Esto significa que, para emular un inicio de sesión del navegador, debe realizar los siguientes pasos:
- Haz un GET a la página de inicio de sesión (
https://m.facebook.com/
) - Utilice una biblioteca de análisis de HTML (por ejemplo, BeautifulSoup) para analizar el HTML y encontrar los valores predeterminados de los campos del formulario.
- Los valores predeterminados están todos en
<input>
Elementos HTML debajo del#login_form
elemento. Querrá encontrarlos por su nombre (p. Ej.charset_test
) y luego saque suvalue
atributo. - Descubrir cómo hacer esto está fuera del alcance de esta respuesta, por lo que no voy a entrar en eso.
- Los valores predeterminados están todos en
-
Combine los valores predeterminados de los campos del formulario con su correo electrónico y contraseña, así:
data = { 'lsd': lsd, 'charset_test': csettest, 'version': version, 'ajax': ajax, 'width': width, 'pxr': pxr, 'gps': gps, 'm_ts': mts, 'li': li, } data['email'] = email data['pass'] = pass data['login'] = 'Log In'
-
Envíe su inicio de sesión mediante Solicitudes
Session
:s = requests.Session() r = s.post(url, data=data) r.raise_for_status()
-
Envíe todo su tráfico HTTP futuro a través de ese
Session
.
Como puede ver, esta es una forma no trivial de hacer las cosas. Esto se debe a que no se espera que los programas usen el sitio web para iniciar sesión: en su lugar, se espera que use su SDK o su API web.
También estaba buscando una respuesta. Haciéndolo con requests
es dolor. Entonces, usé mecanizar.
import mechanize
browser = mechanize.Browser()
browser.set_handle_robots(False)
cookies = mechanize.CookieJar()
browser.set_cookiejar(cookies)
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7')]
browser.set_handle_refresh(False)
url="http://www.facebook.com/login.php"
browser.open(url)
browser.select_form(nr = 0) #This is login-password form -> nr = number = 0
browser.form['email'] = YourLogin
browser.form['pass'] = YourPassw
response = browser.submit()
print response.read()
Funciona. mechanize.browser
es un navegador emulado, por lo que no es necesario enviar todos los valores del formulario. Los enviará como un navegador normal, solo debe proporcionar el nombre de usuario y la contraseña.
¡Buena suerte!
Una biblioteca como RoboBrowser facilita cosas como iniciar sesión en Facebook:
import robobrowser
class Facebook(robobrowser.RoboBrowser):
url="https://facebook.com"
def __init__(self, email, password):
self.email = email
self.password = password
super().__init__()
self.login()
def login(self):
self.open(self.url)
login_form = self.get_form(id='login_form')
login_form['email'] = self.email
login_form['pass'] = self.password
self.submit_form(login_form)