Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2012 14:38:12

boris_blade
От:
Зарегистрирован: 2009-09-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

авторизация и cookie

Всем привет.Столкнулся с проблемой, которая проистекает из нехватки знаний, но как в гугле поискать не знаю.

Пишу прогу которой нужны куки для авторизации + множество других параметров.
Косяк в том, что я не могу передать кук, ну никак не выходит, смотрю 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


В моем понимании
f = opener.open(conn) должен как раз сформировать запрос и автоматически добавить кук, но этого не происходит.
Просмотрел в гугле десятки примеров, но так и не понимаю в чем у меня косяк.



Офлайн

#2 Май 30, 2012 15:38:31

boris_blade
От:
Зарегистрирован: 2009-09-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

авторизация и cookie

Тащем-то решил для себя.
Выделил в отдельную функцию получение кука.


       
 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

Правда в таком случае я не понимаю для чего вообще существует библиотека cookielib
и на кой нужен opener.



Офлайн

#3 Май 30, 2012 15:41:36

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

авторизация и cookie

Да прибудет с вами requests :)



Офлайн

#4 Май 30, 2012 17:32:21

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

авторизация и cookie

В вашем коде ошибка в том, что 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)

Офлайн

#5 Май 30, 2012 18:30:09

boris_blade
От:
Зарегистрирован: 2009-09-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

авторизация и cookie

reclosedev

Спасибо за ответ.
У меня тут новая вводная.
При каждом запросе к сайту тот генерит некую переменную
javax.faces.ViewState ее нужно передавать в виде post-запроа вместе с паролем и логином.
Я сначала разнес все в разные функции, типа одна для кука, одна для этой пременной, сейчас нужно все переделывать.



requests

Что это?



Офлайн

#6 Май 30, 2012 18:33:31

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

авторизация и cookie

boris_blade
requests

Что это?
http://python-requests.org/

Офлайн

#7 Май 30, 2012 18:39:40

boris_blade
От:
Зарегистрирован: 2009-09-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

авторизация и cookie

Уже нашел в репозитории.
Сейчас гляну, что выйдет.



Офлайн

#8 Май 30, 2012 19:43:28

boris_blade
От:
Зарегистрирован: 2009-09-28
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

авторизация и cookie

Ну вот столкнулся с проблемой, она вспылал еще раньше конечно, но может кто подскажет решение.

Мне нужно некий параметр, который генерируется заново при каждом обращении к страничке, ловить регуляркой и подставлять в 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()
                        })


Соответственно мне нужно полученное значение из функции отправить как post, но вот беда
я не знаю что погуглить для реализации.



Отредактировано boris_blade (Май 30, 2012 19:44:11)

Офлайн

#9 Май 30, 2012 20:03:56

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

авторизация и cookie

Поступайте как браузер:
- GET страницу логина,
- выдираем нужные значения из формы,
- POST на страницу логина со всеми значениями.

Стоит помнить, что парсить HTML регуляркой - неудобно (это если мягко говорить). Для этого есть lxml и на крайняк BeautifulSoup.

Для вашей задачи, возможно проще будет применить mechanize. Он и формы отправляет и куки хранит. Хотя все тоже самое можно сделать и с requests + lxml.

Если все-таки остановитесь на requests, имейте ввиду, чтобы сохранялись куки и заголовки (как в моем примере) нужно использовать requests.Session (меня смутило req.post в коде).

Офлайн

#10 Май 31, 2012 02:07:37

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

авторизация и cookie

fata1ex
Да прибудет с вами requests :)
Или grab. Выкинь встроенные сетевые модули, они не питонические, не умеют работать с проксями, а какой-то из них даже сертификаты проверять не умеет. requests базируется на httplib и с проксями тоже не дружит.

reclosedev
на крайняк BeautifulSoup.
Последний раз, когда я им пользовался, он глючил. Он не умер еще?

reclosedev
Стоит помнить, что парсить HTML регуляркой - неудобно (это если мягко говорить).
В общем случае - неправда, особенно если не иметь отношения к веб-разработке.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version