Форум сайта python.su
0
Всем привет.Столкнулся с проблемой, которая проистекает из нехватки знаний, но как в гугле поискать не знаю.
Пишу прогу которой нужны куки для авторизации + множество других параметров.
Косяк в том, что я не могу передать кук, ну никак не выходит, смотрю tshark'ом
и не вижу, что кук передается
кусок кода:
def get_page(self): cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), urllib2.HTTPHandler()) if self.page: return self.page sms_login_page = 'http://coolsite.ru/login/' post = urllib.urlencode({ 'loginForm' : self.logform, 'phone' : self.phone, 'password': self.password, #'javax.faces.ViewState': self.get_javax_value(), 'javax.faces.partial.ajax': 'true', 'javax.faces.source': 'j_idt27', 'javax.faces.partial.execute': 'all', 'javax.faces.partial.render': '' }) headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0', 'Accept': 'application/xml, text/xml, */*; q=0.01', 'Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest', 'Referer': 'http://coolsite.ru/login/', } print headers conn = urllib2.Request(sms_login_page, post, headers) f = opener.open(conn) #print f.read() return self.page
Офлайн
0
Тащем-то решил для себя.
Выделил в отдельную функцию получение кука.
def get_cookie(self): #Возвращает remixsid из куки if self.cookie: return self.cookie host = 'http://coolstie.ru/login/' post = urllib.urlencode({'javax.faces.ViewState' : self.get_javax_value()}) headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0', 'Accept': 'application/xml, text/xml, */*; q=0.01', 'Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest', 'Referer': 'http://coolsite.ru/login/', } conn = urllib2.Request(host, "", headers) data = urllib2.urlopen(conn) cookie_src = data.info().get('Set-Cookie') self.cookie = re.sub(r'(expires=.*?;\s|path=\/;\s|domain=\.coolsite\.ru(?:,\s)?)', '', cookie_src) return self.cookie
Офлайн
52
Да прибудет с вами requests :)
Офлайн
173
В вашем коде ошибка в том, что CookieJar - локальная переменная. Чтобы куки сохранялись при последующих запросах, нужно чтобы CookieJar использовался тот же, т.е. его нужно сохранить, например, как атрибут экземпляра (self.cj). Или сохранять opener.
fata1exСогласен. Намного удобнее и больше возможностей.
Да прибудет с вами requests
import requests global_headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0', 'Accept': 'application/xml, text/xml, */*; q=0.01', 'Accept-Language': 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate',} additional_headers = { 'X-Requested-With': 'XMLHttpRequest', 'Referer': 'http://coolsite.ru/login/', } s = requests.Session(headers=global_headers) r = s.post('http://httpbin.org/post', headers=additional_headers, data={'login': 'login', 'password': 'password'}) print r.content
Отредактировано reclosedev (Май 30, 2012 17:37:35)
Офлайн
0
reclosedev
Спасибо за ответ.
У меня тут новая вводная.
При каждом запросе к сайту тот генерит некую переменную
javax.faces.ViewState ее нужно передавать в виде post-запроа вместе с паролем и логином.
Я сначала разнес все в разные функции, типа одна для кука, одна для этой пременной, сейчас нужно все переделывать.
requests
Офлайн
173
boris_bladehttp://python-requests.org/
requests
Что это?
Офлайн
0
Уже нашел в репозитории.
Сейчас гляну, что выйдет.
Офлайн
0
Ну вот столкнулся с проблемой, она вспылал еще раньше конечно, но может кто подскажет решение.
Мне нужно некий параметр, который генерируется заново при каждом обращении к страничке, ловить регуляркой и подставлять в post-запрос.
регулярка у меня уже есть, все готово.
def javalue_parser(value=None): javalue = re.findall(r'name="javax" id="javax" value="(.*?)"') print javalue[0] return javalue
my_post_req = req.post('http://server.ru/login/', data={'phone': '+11(123)45-222-111', 'javax': "%s" % javalue_parser() })
Отредактировано boris_blade (Май 30, 2012 19:44:11)
Офлайн
173
Поступайте как браузер:
- GET страницу логина,
- выдираем нужные значения из формы,
- POST на страницу логина со всеми значениями.
Стоит помнить, что парсить HTML регуляркой - неудобно (это если мягко говорить). Для этого есть lxml и на крайняк BeautifulSoup.
Для вашей задачи, возможно проще будет применить mechanize. Он и формы отправляет и куки хранит. Хотя все тоже самое можно сделать и с requests + lxml.
Если все-таки остановитесь на requests, имейте ввиду, чтобы сохранялись куки и заголовки (как в моем примере) нужно использовать requests.Session (меня смутило req.post в коде).
Офлайн
-2
fata1exИли grab. Выкинь встроенные сетевые модули, они не питонические, не умеют работать с проксями, а какой-то из них даже сертификаты проверять не умеет. requests базируется на httplib и с проксями тоже не дружит.
Да прибудет с вами requests :)
reclosedevПоследний раз, когда я им пользовался, он глючил. Он не умер еще?
на крайняк BeautifulSoup.
reclosedevВ общем случае - неправда, особенно если не иметь отношения к веб-разработке.
Стоит помнить, что парсить HTML регуляркой - неудобно (это если мягко говорить).
Офлайн