Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2012 21:01:17

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

PyCurl, Cookie, Auth

Совсем недавно познакомился с библиотекой PyCurl, до него использовал urllib, со страшным

cookieJar = cookielib.CookieJar()
кукиконтейнером.
Просто бальзам на душу, и всё достаточно логично и просто, и к тому же раньше имел опыт с работой cURL на PHP.
Посмотрел все примеры, что шли вместе с библиотекой, честно, использовал гугл, но не нашёл ответа на вопрос.

Я авторизуюсь на некий сайт, http://example.com, посылаю POST-запрос с помощью курла и проверяю на наличие определенного тега на сайте:
...
def connect(hash):
        curl.setopt(pycurl.URL, 'http://example.com/')
        curl.setopt(pycurl.WRITEFUNCTION, data.write)
        curl.setopt(pycurl.FOLLOWLOCATION, 1)
        curl.setopt(pycurl.COOKIEJAR, "/tmp/cookie.txt")
        curl.setopt(pycurl.COOKIEFILE, "/tmp/cookie.txt")
        curl.setopt(pycurl.POSTFIELDS, 'auth_token='+hash+'&login='+login+'&password='+password)
        curl.setopt(pycurl.POST, 1)
        curl.perform()
        if re.search('href="/logout"', data.getvalue()):
            print 'Auth is successful!'
...
Весь код замечательно интерпретируется и выполняется (хотя и долго):.
После того как я произвёл авторизацию, мне необходимо зайти на определённую страницу:
http://example.com/somebody
и нажать на ней определённую кнопку (кнопка выполняет java-script, типо like)
Включаю сниффер, нажимаю на кнопку, вижу POST-запрос по ссылке:
http://example.com/clicks/somebody/020304050/add
020304050 - это какая-то запись, по которой мы кликнули
В POST-дата один параметр - auth_token, который необходим и для авторизации, я его спарсил и он у меня hash-ом назван.
В headers-куча параметров, что-то вроде :
'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0',
'Accept: text/javascript',
'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://example.com/somebody',
'Content-Length: 69',
'Cookie:' ???????
'Pragma: no-cache',
'Cache-Control: no-cache'
Вот и незнаю как сюда куки впихнуть(тобиш в хидер)
При авторизации просто - curl.setopt(pycurl.COOKIEFILE, “/tmp/cookie.txt”) - показал паспорт и все.
Вот мой код( не рабочий, т.к не знаю как в хидер куку впихнуть):
data.truncate(0) # чищу data = StringIO.StringIO()
            curl.setopt(pycurl.URL, 'http://example.com/clicks/somebody/020304050/add')
            curl.setopt(pycurl.WRITEFUNCTION, data.write)
            curl.setopt(pycurl.COOKIEFILE, "/tmp/cookie.txt")
            curl.setopt(pycurl.HTTPHEADER, ['User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko/20100101 Firefox/11.0',
'Accept: text/javascript',
'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://example.com/somebody',
'Content-Length: 69',
'Cookie:',
'Pragma: no-cache',
'Cache-Control: no-cache'])
            curl.setopt(pycurl.POSTFIELDS, 'auth_token='+hash)
            curl.setopt(pycurl.POST, 1)
            curl.perform()
            print data.getvalue()
Извините, возможно, надо было в работу с Network, но судя по статистике, здесь больше вероятность получить ответ :)



Отредактировано doublex (Апрель 12, 2012 21:07:55)

Офлайн

#2 Апрель 13, 2012 13:00:00

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyCurl, Cookie, Auth

Пара советов:
1)

curl.setopt(pycurl.COOKIEJAR, "/tmp/cookie.txt")
curl.setopt(pycurl.COOKIEFILE, "/tmp/cookie.txt")
поменяй на:
curl.setopt(pycurl.COOKIELIST, "")
2) Посмотри grab - обертка над pycurl, очень удобная, там и разберешься как куки выставить.

По поводу твоего-кода. Вообще куки должны сами автоматом подставляться и нормально отрабатывать, но да, бывает JS мешает этому. Установить куки можно так
curl.setopt(pycurl.COOKIE, 'mycookie')
В grab-e еще проще.



Отредактировано plusplus (Апрель 13, 2012 13:00:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version