Все ники заняты
Апрель 7, 2007 21:42:02
Windows XP SP2, ActivePython 2.5.
import urllib
f = urllib.urlopen("http://***/***.php")
Открываемая страничка читает куки. Если её открывать в браузере, я оказываюсь залогиненным. Если открывать вышеописанным способом - нет. Соответственно, содержимое странички совсем не то, что мне надо :).
Можно ли как-то использовать свои куки, открывая урл из Питона?
xonix
Апрель 8, 2007 00:49:16
Используй urllib2.urlopen, там возможно задать header'ы.
Пример из стандартной доки:
import urllib2
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
r = urllib2.urlopen(req)
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
Как установить куки, думаю сам разберешься ))
slivlen
Апрель 8, 2007 09:43:54
Все ники заняты
Апрель 8, 2007 12:10:06
Спасибо.
Насколько я понял, есть вроде два способа решения проблемы: использовать модуль “ClientCookie” (v0.3.5 beta от 2003-05-27), или использовать модуль “cookielib”, который есть в поставке Питона от ActiveState. Второй способ мне кажется лучше, т.к. не требует установки дополнительных вещей. Если я понял неверно, разъясните, please.
И я не понял, как установить куки, используя cookielib. В конструкторе urllib2.Request есть два последних параметра, которые вроде надо использовать для установки куков. Как правильно заполнить эти параметры, я не понял.
Все ники заняты
Апрель 8, 2007 12:26:31
# -*- coding: cp1251 -*-
import cookielib
import urllib
import urllib2
import time
import string
# получаем дату 3 дня назад от текщей:
date = time.localtime(time.time() - 60*60*24*3)
# преобразуем дату в формат ГГГГ-ММ-ДД:
date = str(date[0]) + "-" + string.zfill(str(date[1]), 2) + "-" + string.zfill(str(date[2]), 2)
# задаём параметры для передачи открываемой страничке методом POST:
params = urllib.urlencode({'posts_less' : 1, 'registered_before' : date, 'order_by': 'registered'})
# создаём объект запроса:
req = urllib2.Request('http://forum.***/admin_users.php?action=find_user', params)
# ЗДЕСЬ НАДО КАК-ТО ИСПОЛЬЗОВАТЬ КУКИ?
# ...
# получаем файловый объект странички:
f = urllib2.urlopen(req)
print unicode(f.read(), 'cp1251')
xonix
Апрель 9, 2007 02:54:32
Проботайте хорошенько протокол HTTP… Куки передаются как заголовки запроса, => задавать их примерно так:
# ЗДЕСЬ НАДО КАК-ТО ИСПОЛЬЗОВАТЬ КУКИ?
req.add_header("Cookie", "param1=val1; param2=val2; param3=123")
# получаем файловый объект странички:
П.С. По кукам проботайте вот эту статейку, чтоб все прояснилось
http://www.citforum.ru/internet/html/cookie.shtml
slivlen
Апрель 9, 2007 08:40:19
Все ники занятыcookielib позволяет автоматизировать работу с cookie. Если при запросе страницы выдается куки, то он будет сохранен и отправлен при следующем запросе. Также он позволяет использовать куки от браузера. Если требуется сразу передать куки(не получая его заранее), то можно воспользоваться примером
xonix в предыдущем посте или использовать метод set_cookie класса
CookieJar(ИМХО второй вариант сложнее, но удобнее, тк при следующих запросах куки будет отправляться автоматически).
Все ники заняты
Апрель 9, 2007 13:50:05
Спасибо, статью про куки перечитал (я её и раньше видел). Однако, там всё описывается не в приложении к Питону, поэтому всё равно есть вопросы.
Да, куки наверное требуется передать сразу (не получая их заранее). Только что именно передавать, чтобы воспользоваться примером от xonix? Открываемая страничка, кстати - административная часть форума PunBB :). Сами куки в браузере (IE) хранятся в виде текстовых файлов, формат которых непонятен (там внутри белиберда). Соответственно, что именно надо написать в качестве имён параметров и их значений, не ясно. Я догадываюсь, что это должны быть как минимум имя пользователя и хэш пароля, только где их взять? Есть ли способ выяснить состав куков и их значения?
Или лучше будет открыть вначале страничку авторизации, и послать ей методом POST имя пользователя и пароль (они мне конечно известны)? Как тогда в этом случае получить от сервера заголовки с куками, чтобы применить их потом для открытия уже нужной мне странички? Please, придумайте примеры кода для моего случая…
Цель всего действа - автоматизировать на клиенте некоторые действия со страничками, которые обычно выполняются интерактивно.
P.S. Извините за то, что прошу так разжёвывать - я новичок в Питоне, да ещё и английский практически не знаю, изголяюсь с ПРОМТ'ом :(.
slivlen
Апрель 9, 2007 14:35:13
Все ники заняты
Я догадываюсь, что это должны быть как минимум имя пользователя и хэш пароля, только где их взять? Есть ли способ выяснить состав куков и их значения?
Посмотри значения кукисов в firefox.
P.S. А зачем в кукисах хеш пароля хранить? Там id сессии скорее всего.
Все ники заняты
Апрель 10, 2007 11:57:04
Спасибо, передать куки так, как советовал xonix, получилось. Действительно, в куках один параметр “pun_bb” - похоже на id сессии. Я просто открыл текстовый файл куки в кеше IE и скопировал нечеловеческий идентификатор в свой код - всё заработало.
Однако, насколько я понимаю, если я интерактивно сделаю “выйти-войти”, этот идентификатор изменится, т.к. будет новая сессия. Следовательно, мой скрипт станет негодным.
Всё же очень прошу примера (буквально несколько строк), как получить от сервера заголовки с куками.
Тогда я открою вначале урл со страничкой авторизации, пошлю ей методом POST имя пользователя и пароль, и получу нужные мне куки для открытия в скрипте других страничек.