Аутентификация с помощью запросов Python - Cookies? Полезная нагрузка? Что-то другое?

Я пытаюсь войти на этот сайт, используя python (и после автоматизации некоторых действий): https://www.rika-firenet.com/web/login

Как вы видите на странице, HTML-код выглядит так:

<form id="login" method="POST" action="/action_page.php" data-ajax="false">
  <input type="text" data-theme="b" name="email" value="" placeholder="email@example.com">
  <input type="password" data-theme="b" name="password" value="" placeholder="password">
  <button type="submit" data-theme="a" data-icon="fa-sign-in" data-iconpos="right">
    Connect
  </button>
</form>

Итак, я попробовал это в python:

import requests
import urllib.parse

url = 'https://www.rika-firenet.com/'
url_login = url+'web/login'

client = requests.session()
payload = urllib.parse.urlencode({
    'email':'myemail@mail.com',
    'password':'mypwd'
})

print("+-[url get] : {}".format(url_login))
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
r = client.get(url, headers=headers, allow_redirects=True)
print(r.cookies)

print("+-[url post] : {}".format(url_login))
p = client.post(url_login, data=payload, headers=headers, cookies=r.cookies)
print(p.content)

Я получаю куки в получении, но у меня есть исходная страница в ответ на запрос почты.

+-[url get] : https://www.rika-firenet.com/web/login
<RequestsCookieJar[<Cookie connect.sid=s%3Auzv2S7zjhW6Hs2S7hOKyx6icXhbSSSTx.t%2Fg32GT2s2zIbvGI3kq%2Fht%2FR3BDa8aPUwTmWl%2BYktKU for www.rika-firenet.com/>]>
+-[url post] : https://www.rika-firenet.com/web/login

Кто-то преуспел с этим PHP-кодом:

function login ()
{
  global $login_url,$username_rika,$password_rika,$path_cookie;
  $postinfo = "email=".$username_rika."&password=".$password_rika;
  $status = false;
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_NOBODY, false);
  curl_setopt($ch, CURLOPT_URL, $login_url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($ch, CURLOPT_FAILONERROR, true);

  curl_setopt($ch, CURLOPT_COOKIEJAR, $path_cookie);
  curl_setopt($ch, CURLOPT_COOKIEFILE, $path_cookie); // file to read cookies in
  //set the cookie the site has for certain features, this is optional
  curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
  curl_setopt($ch, CURLOPT_USERAGENT,
      "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
  $return = curl_exec($ch);

  // Retourne le numéro d'erreur de la dernière opération cURL.
  $curl_errno = curl_errno($ch);
  $curl_error = curl_error($ch);

  if ($curl_errno > 0) {
        echo "cURL Error ($curl_errno): $curl_error\n";
        $status['connected'] = false;
        $status['curl_errno'] = curl_errno($ch);
        $status['curl_error'] = curl_error($ch);
        exit; // mettre en veille en mode développement
     }
  else {
        //echo "Data received phase 1 : $return\n";
        $status['connected'] = true;
     }
  curl_close($ch);
  return $status;
}

Но так как я не эксперт по php, я не очень понимаю, почему это работает.

Любая подсказка?

Спасибо

Greg

PS: После разрешения полный код для управления печами Rika можно найти по https://github.com/iero/Rika-Stove.

1 ответ

Решение

Некоторые заметки:

  • Не кодируйте ваши данные с помощью urllib, позволять requests обрабатывать кодировку.
  • requests.session по умолчанию файлы cookie сохраняются в запросах, поэтому вам не нужно использовать cookies параметр.
  • requests следует перенаправления по умолчанию.
  • Вам не нужно подделывать User-Agent для этого сайта. Если вы хотите добавить несколько заголовков, вы можете сделать это в session объект, так что вам не придется использовать headers параметр для каждого запроса.

Код Python:

import requests

url = 'https://www.rika-firenet.com/'
url_login = url+'web/login'
s = requests.session()
#s.headers['User-Agent'] = 'Mozilla/5.0'
data = {'email':'myemail@mail.com', 'password':'mypwd'}
r = s.post(url_login, data)

print(r.url)
print('Log out' in r.text)
Другие вопросы по тегам