Найти - Пользователи
Полная версия: Авторизация на сайте
Начало » Python для новичков » Авторизация на сайте
1 2
theyoba
Всем привет!
Пытаюсь с помощью библиотеки Requests авторизоваться на одном сайте.

Передаю post-параметры:
params = { 'login':'%CC%F3%F5%E0', 'password':'123456qwerty'}
r2 = requests.post('http://www.******.ru/login/', data=params, headers=header2, allow_redirects=False, cookies=r.cookies, proxies=proxies)
через fiddler2 вижу что передается совсем не то
login=%25CC%25F3%25F5%25E0
то есть знак процента кодируется в %25.
Подскажите пожалуйста, как это можно обойти?
reclosedev
Нужно передавать исходную строку, requests сам закодирует
params = { 'login': '\xcc\xf3\xf5\xe0', ...

Я так понял, это ‘Муха’ в кодировке ‘cp1251’? Уверены что сервер в такой кодировке примет? Вроде обычно utf-8 используют. Тогда для Python 2.x:
params = { 'login': u'Муха', ...
odnochlen
cookies=r.cookies
Если нужна сессия - используй session.
theyoba
reclosedev
Если авторизаоваться на том сайте самому, через браузер, в качестве логина передается почему-то %CC%F3%F5%E0.
Если делать через utf-8, то передается в следующем виде:
login=%D0%9C%D1%83%D1%85%D0%B0
Если
params = { 'login': '\xcc\xf3\xf5\xe0', ...
то очень долго идет запрос post, а потом выдается следующая ошибка



odnochlen
Спасибо, почитаю про сессии.
odnochlen
Вот пример сессии

import requests
with requests.session() as s:
    resp = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
    print resp.text
    print resp.cookies
    resp = s.get('http://httpbin.org/cookies/set/sessioncooki/1')
    print resp.text
    print resp.cookies
    resp = s.get('http://httpbin.org/cookies')
    print resp.text
    print resp.cookies

Можно и так
s=requests.session()
s.get(...)

Посмотри сниффером, что на самом деле отправляется.

Насчет кодировки - интересно, а как браузер ее выбирает? По кодировке страницы?
theyoba
odnochlen
Посмотри сниффером, что на самом деле отправляется.
Так я же и смотрю через Fiddler2
theyoba
Если делать через utf-8, то передается в следующем виде:
login=%D0%9C%D1%83%D1%85%D0%B0
Если
params = { 'login': '\xcc\xf3\xf5\xe0', ...
то очень долго идет запрос post, а потом выдается следующая ошибка


Может есть какой-то способ экранировать знак %?
Пробовал ставить %%, вот так %%CC%%F3%%F5%%E0
декодирует все равно на %25%25CC%25%25F3%25%25F5%25%25E0
odnochlen
theyoba
то очень долго идет запрос post, а потом выдается следующая ошибка
Так он вообще ничего не отправляет или как?

То, что тебе нужно - закодировать параметр в нужной кодировке

Edit: хехехе, нашел
requests.post('http://www.******.ru/login/', data = {
        'login': u'Муха'.decode('cp1251'),
        #...
    },
    allow_redirects=False)


theyoba
odnochlen
хехехе, нашел
К сожалению, почему-то преобразует “Муху” в иероглифы
odnochlen
А ты в исходнике ничего не напортил? УМВР. Кодировка указана?
theyoba
odnochlen
В notepad++ посмотрел - преобразовано в UTF-8 без BOM.
в начале исходника прописано
# -*- coding: utf-8 -*-
И все равно ошибка, правда теперь другая Из-за этого программа дальше не выполняется и запрос не идет


А у вас прямо в Fiddler все хорошо выводит?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB