2015-08-26 2 views
0

Я пытаюсь веками войти в систему https://angel.co/users/login с помощью модуля запросов pythons. Проблема в том, что я получаю код статуса 404 каждый раз, когда запускаю код, хотя я знаю, что URL существует. Я думаю, проблема в том, что форма в url имеет атрибут действия с относительной ссылкой. Я понятия не имею, как это исправить, и мне не повезло найти решение.не удалось войти на сайт с запросами

Вот код, я использую:

import requests 

with requests.Session() as s: 
    url = 'https://angel.co/users/login' 
    payload = { 'user[email]' : 'username_here', 
       'user[password]' : 'password_here'}   

    r = s.post(url, data=payload) 
    print r.status_code # This is printing 404 

Вот код, который я закончил с использованием:

import requests 
from bs4 import BeautifulSoup 
from login_details import username, password # This is just a script with my username and password 

s=requests.session() 

main_url="https://angel.co/login?utm_source=top_nav_home" 

s.headers = {'Content-Type'    : 'application/x-www-form-urlencoded', 
      'Host'      : 'angel.co', 
      'Origin'     : 'https://angel.co', 
      'User-Agent'    : 'Mozilla/5.0 (Windows NT 6.1; WOW64)' \ 
              'AppleWebKit/537.36 (KHTML, like Gecko) ' \ 
              'Chrome/44.0.2403.157 ' \ 
              'Safari/537.36', 
      'Referer'     : main_url, 
      'Upgrade-Insecure-Requests' : '1'} 

response = s.get(main_url) 
soup = BeautifulSoup(response.content) 

payload={'login_only'   : 'true', 
     'user[email]'  : username, 
     'user[password]'  : password, 
     'authenticity_token' : soup.find(attrs={'name' : 'authenticity_token'})['value'], 
     'utf8'    : '%25E2%259C%2593'} 
#the value of utf8 gets urlencoded once you send the request. 

response = s.post("https://angel.co/users/login", data = payload) 
print response.status_code 

Благодаря Thothadri и блэкджек.

+1

Существует CSRF маркер в форме, которую вы должны предоставить в течение 'Post' – mshsayem

+0

Эй, я только что прошел через сайт, и вы дали imcomplete информацию. Для полезной нагрузки требуется следующая информация: «токен аутентификации», «login_only», «utf-8». Я бы предложил вам использовать контрольный элемент в хроме и понять правильные запросы –

+0

Ну, я сделал то же самое. Но главное, ему нужен токен csrf, который является динамическим; тогда как остальные являются статическими (за исключением почты и прохода). – mshsayem

ответ

0
import re,requests 

s=requests.session() 

main_url="https://angel.co/login?utm_source=top_nav_home" 
headers={"Content-Type":"application/x-www-form-urlencoded","Host":"angel.co","Origin":"https://angel.co"\ 
,"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"} # Mostly you need to pass the headers . Default headers don't work always. So be careful here 

r1=s.get(main_url,headers=headers) #authenticity token is extracted from this page using the regex i mentioned below. This is required when you login to the page 
token=re.search("""<input name="authenticity_token" type="hidden" value="(.*?)"[^>]*?>""",r1.text,re.S|re.I) 
print token.group(1) 
headers["Referer"]="https://angel.co/login?utm_source=top_nav_home" 
headers["Upgrade-Insecure-Requests"]="1" 
payload={"login_only":"true","user[email]":"youremail","user[password]":"yourpassword","authenticity_token":token.group(1),"utf8":"%25E2%259C%2593"} # the value of utf8 gets urlencoded once you send the request. 
r2=s.post("https://angel.co/users/login",headers=headers,data=payload,cookies=r1.cookies) 
print r2.status_code 
+0

Это может быть немного чище. 'Session' должен обрабатывать файлы cookie автоматически, а заголовки также могут быть установлены для всех запросов на объект сеанса. 'main_url' определен, но заголовок referrer задается строкой равным буквам. – BlackJack

+0

Спасибо Thothadri. Это сработало отлично. Я внес изменения, предложенные BlackJack, и я использую bs4 вместо re, чтобы получить подлинность_token. – user1928392

+0

@ user1928392 - Вы можете пометить ответ правильно, так как он сработал? –

Смежные вопросы