Python: запрашивает файлы cookie входа в сеанс

Я намерен войти на сайт, а затем получить доступ к защищенному изображению из скрипта Python. У меня есть и легальный и рабочий доступ из браузера.

Это то, что у меня есть сейчас.

import requests

s = requests.Session()

s.get('*domain*')

r_login  =s.post('*domain*/user.php', headers={'cmd': 'login', 'loginname': '***', 'password': '***' })

print (s.cookies)
print (r_login.status_code)

r_img = s.get('*domain*/*protectedimage*.jpg')
print (r_img.status_code)
print (r.cookies)

print (s.cookies['PHPSESSID'])

Выход:

<<class 'requests.cookies.RequestsCookieJar'>[<Cookie PHPSESSID=664b0842085b847a04d415a22e013ad8 for *domain*/>]>
200
403
<<class 'requests.cookies.RequestsCookieJar'>[]>
664b0842085b847a04d415a22e013ad8

Я уверен, что смогу успешно войти в систему, потому что я однажды загрузил html-файл после этого, и он был в форме входа в систему. Но моя проблема в том, что мне кажется, что мой файл cookie PHPSESSID не проходит, поэтому я вернуть ошибку 403. Но у меня явно есть это в моем сеансе. Я также пытался добавить файл cookie вручную в свою строку "r_img", и это не имело никакого значения, я все еще получаю пустую ошибку CookieJar и ошибку 403. Было бы это невозможно только с модулем запросов? Я что-то проглядел? Извините, что я не совсем знаком с HTTP запросами.

Я использую Python 3.4 просто для ясности.


person Tigris    schedule 17.06.2014    source источник
comment
Скорее всего, вам следует устанавливать не файлы cookie, а данные POST. Файлы cookie будут установлены сервером, на который вы отправляете сообщения. Смотрите мой ответ.   -  person data    schedule 17.06.2014


Ответы (2)


Вы передаете данные формы в виде заголовков HTTP. Вместо этого форма входа POST должна отправлять элементы формы в качестве параметра data:

r_login = s.post('*domain*/user.php', 
                 data={'cmd': 'login', 'loginname': '***', 'password': '***' })

Проверьте возвращенное тело, а не только код состояния. Ваш POST-запрос был принят сервером (200 OK), но, поскольку информация для входа не была опубликована, body, скорее всего, сообщит вам что-то вроде "неверный логин, попробуйте еще раз".

Сервер, скорее всего, снова очистил файл cookie, увидев, что это не был действительный сеанс входа в систему, когда вы запрашивали изображение. Ответ 403, вероятно, содержит заголовок Set-Cookie для PHPSESSID с датой в прошлом, чтобы очистить его.

person Martijn Pieters    schedule 17.06.2014
comment
Прекрасно работает! Большое спасибо. Я не знал этого о почтовых методах. Все, что мне нужно было сделать, это просто изменить заголовки слов на данные. :) Теперь я могу скачать свой образ. file = open('myimg.jpg', 'wb') file.write(r_img.content) file.close() - person Tigris; 17.06.2014
comment
@Tigris: для загрузки (крупных) изображений рассмотрите возможность потоковой загрузки, чтобы не хранить всю загрузку в памяти. См. Как загрузить изображение с помощью запросов. - person Martijn Pieters; 17.06.2014
comment
Спасибо еще раз. К счастью, мне нужно было получить только несколько небольших изображений. :) - person Tigris; 17.06.2014

Попробуйте сделать это так:

Согласно документам python-requests. :

payload = {'cmd': 'login', 'loginname': '***', 'password': '***'}
url = '*domain*/user.php'
s.post(url, data=payload)
person data    schedule 17.06.2014
comment
Спасибо, более строгое соблюдение документации было бы одним из решений. - person Tigris; 17.06.2014
comment
@Tigris, не могли бы вы уточнить, почему вы приняли ответ Мартджина, а не мой? У нас точно такой же код и я ответил за 5 минут до него. - person data; 17.06.2014
comment
Да, мне жаль, что я не учел время при выборе, я оба отметил ваши ответы полезными, но Мартин также предоставил мне подробное объяснение. Мне действительно нужно было знать, что метод POST должен быть отправлен в параметре данных, этот бит решил мою проблему. - person Tigris; 17.06.2014