Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2012 10:41:34

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab и куки

Всем доброго дня!
Авторизуюсь на сайте при помощи Grab.
Затем мне нужно циклом отправлять один и тот-же Post запрос с периодичностью в 5 мин.

Отправка происходит как-то странно, то все нормально несколько раз отправляется, то при отправке второго Post запроса приходит ответ Logged False…

Т.е. как-то периодически срабатывает…

Что может быть? Проблема в куки или теряется сессия? Как я понял Grab автоматом куки получает и потом отправляет… Может ли быть такое, что мне в куки в ручную что-нибудь добавлять нужно?

В документации Grab про куки очень мало сказано.
Посоветуйте, будет ли толк если я куки в файл буду сохранять и при каждом запросе брать их оттуда?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 17, 2012 10:44:28)

Офлайн

#2 Авг. 17, 2012 12:51:00

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Grab и куки

В документации сказано, что объект граб сохраняет все параметры предыдущего запроса, кроме post.

Включи опцию logdir (которая глючит), а лучше посмотри сниффером, что отправляется и что приходит.

Офлайн

#3 Авг. 17, 2012 23:54:03

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Grab и куки

А сколько куки живут на том сайте?

Офлайн

#4 Авг. 18, 2012 17:33:59

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Grab и куки

Singularity
на том
На каком?

Офлайн

#5 Авг. 21, 2012 13:24:11

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab и куки

Сайт ru.grepolis.com

Как видно из сниффера, для авторизации необходимо отправить ряд Post и Get запросов…
Куки обрабатываю автоматом.

Сделал тестовый акк на Grepolis
Вот код:

from collections import OrderedDict
from grab import Grab
import re
import json
import time, random
headers = {
           'User-Agent'  :  'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0',
           'Accept'  :  'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'Accept-Language'  :  'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
           'Accept-Encoding'  :  'gzip, deflate',
           'Connection'  :  'keep-alive',
           }
#1
url = 'http://ru.grepolis.com'
g = Grab(headers=headers)
g.go(url)
#2
name = 'Tartang'
password = '7TXzMQvUZt3qUqh'
urlTo_start_page = 'http://ru.grepolis.com/start/index?action=login_from_start_page'
json_arg = json.dumps(OrderedDict([
                                   ("name", name), 
                                   ("password", password), 
                                   ("passwordhash", ""), 
                                   ("autologin", False)],
                                    ))
#print json_arg
g.setup(post={'json':json_arg}, referer='http://ru.grepolis.com')
g.go(urlTo_start_page) # будет сгенерирован POST-запрос
urlTo_start_page_next = 'http://ru.grepolis.com/start/index?action=fetch_news'
g.setup(post={'json':"{}"}, referer='http://ru.grepolis.com', headers = {'X-Requested-With'  :  'XMLHttpRequest'})
g.go(urlTo_start_page_next) # будет сгенерирован POST-запрос
urlTo_login_to_game = 'http://ru.grepolis.com/start?action=login_to_game_world'
g.setup(post=[
              ('world' , 'ru11'), 
              ('facebook_session',''), 
              ('facebook_login',''), 
              ('gift_key',''),    
              ('portal_sid',''), 
              ('name'  ,  'Tartang'), 
              ('password'  ,  '7TXzMQvUZt3qUqh')
             ], referer='http://ru.grepolis.com')
g.go(urlTo_login_to_game) # будет сгенерирован POST-запрос
#-----------------------------------------------------------------------------------------------
p = re.compile('csrfToken\"\:\"(.*?)\"\,\"')
token = p.findall(g.response.body)
token = token[0]
#print token
p = re.compile('\"notification_last_requested_id\":(.*?)\,\"')
nlreq = p.findall(g.response.body)
nlreq = nlreq[0]  
#print nlreq
timef = int(time.time()*1000)
#print timef
data = 'http://ru11.grepolis.com/game/data?action=get&town_id=51543&h=%s&json={"types":[{"type":"progressable"},{"type":"buildings"},{"type":"powers"},{"type":"units"},{"type":"l10n"},{"type":"grepolympiaDisciplines"},{"type":"grepolympiaTraining"},{"type":"shopItems"},{"type":"awards"},{"type":"frontendBridge"},{"type":"map","param":{"x":9,"y":4}},{"type":"bar"},{"type":"playerprogress"}]}&_=%s' %(token, nlreq)
g.setup(headers = {'X-Requested-With'  :  'XMLHttpRequest'}, referer = 'http://ru11.grepolis.com/game/index?login=1')
g.go(data)
print g.response.cookies

После последнего запроса куки должны быть такого вида:
Cookie: sid=ecix0ssrblwk484o880gw8k4o; cid=1115109364; logged_in=true

А у меня получается так:
Cookie: PHPSESSID=0vrelroepparpg5setuufo8g11; sid=7pebv4lbrz8kw48o8o8804cso; logged_in=false; cid=1619514323

Заголовки последнего запроса
КАК ДОЛЖНО БЫТЬ

XIH}&_=1345543516022 HTTP/1.0
Host: ru11.grepolis.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/plain, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Connection: Keep-Alive
X-Requested-With: XMLHttpRequest
Referer: http://ru11.grepolis.com/game/index?login=1
Cookie: sid=ecix0ssrblwk484o880gw8k4o; cid=1115109364; logged_in=true


КАК У МЕНЯ

XIH}&_=0 HTTP/1.1
Host: ru11.grepolis.com
Referer: http://ru11.grepolis.com/game/index?login=1
Cookie: PHPSESSID=0vrelroepparpg5setuufo8g11; sid=7pebv4lbrz8kw48o8o8804cso; logged_in=false; cid=1619514323
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Keep-Alive: 300
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0
Accept-Charset: utf-8,windows-1251;q=0.7,*;q=0.5
Connection: keep-alive
X-Requested-With: XMLHttpRequest


Почему у меня передается logged_in=false?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 21, 2012 13:25:31)

Офлайн

#6 Авг. 21, 2012 15:19:12

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab и куки

Путем долгого и мучительного сниффинга, пришел к выводу что False нужно вручную менять на True, т.к. в полученных куках до этого запроса нигде нет true…

Теперь другой вопрос, есть у кого-нибудь пример с сохранением кукисов при помощи Grab и дальнейшим использованием их?
В документации http://grablib.org/docs/grab/cookies.html# мало инфы… Пробовал разные способы, но не срабатывает, выскакивают ошибки…
Пробовал так:

g = Grab(cookiefile='cookies.txt', headers=headers)

Пишет No such file or directory: ‘cookies.txt’

Хотя файл cookies.txt лежит в том же каталоге что и скрипт…

Думал в запросе добавить опцию
cookies={'logged_in': 'true'}
В документации написано:
Если включены обе опции cookies и reuse_cookies, то запомненные кукисы будут объединяться с теми, что указаны в cookies.
Но по факту в кукисах у меня остается только {'logged_in': ‘true’}, т.е. все остальное, что должен передавать reuse_cookies по умолчанию, исчезает…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 21, 2012 15:27:11)

Офлайн

#7 Авг. 21, 2012 17:24:14

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Grab и куки

Seganapa
Теперь другой вопрос, есть у кого-нибудь пример с сохранением кукисов при помощи Grab и дальнейшим использованием их?
Обьект grab сохраняет куки. Если надо между запусками - берем и пишем в файл, в грабе даже есть функция для этого.

Seganapa
Пишет No such file or directory: ‘cookies.txt’

Хотя файл cookies.txt лежит в том же каталоге что и скрипт…
Бог знает, какой каталог граб считает текущим. ЛУчше так:
PATH = os.path.join(os.path.basename(sys.argv[0]))
g = Grab(cookiefile=os.path.join(PATH, 'cookies.txt'), headers=headers)

Чет не пойму, у тебя кукисы из ответа пропадают?

g.setup(post={'json':"{}"}, referer='http://ru.grepolis.com', headers = {'X-Requested-With'  :  'XMLHttpRequest'})
g.go(urlTo_start_page_next) # будет сгенерирован POST-запрос
Так не красиво. Настройки, которые играют роль для одного запроса, лучше в нем же и указывать.

g.go(urlTo_start_page_next, post={'json':"{}"}, 
    referer='http://ru.grepolis.com', 
    headers={'X-Requested-With' : 'XMLHttpRequest'}
)

Отредактировано odnochlen (Авг. 21, 2012 21:15:49)

Офлайн

#8 Авг. 22, 2012 08:25:32

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab и куки

odnochlen
Чет не пойму, у тебя кукисы из ответа пропадают?

В том то и дело, что если бы я получил куки с logged_in : true, Grab бы эту строку дальше и отправлял. Вот я и не пойму, в полученных куках logged_in : false, а браузер после редиректа начинает отправлять true… Как такое может быть?



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#9 Авг. 22, 2012 14:06:09

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

Grab и куки

Проблема решена! Оказывается Grab хранит куки в словаре g.config
И можно делать с этим словарем что угодно…

Так я меняю содержимое куки и использую измененную в дальнейшем…

g.config['cookies']['logged_in'] = 'true'
del g.config['cookies']['PHPSESSID']



—————————————————————–
Изучаю и параллельно использую Python 2.7

Отредактировано Seganapa (Авг. 22, 2012 14:06:30)

Офлайн

#10 Сен. 13, 2012 18:18:00

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Grab и куки

Поддержка кук в грабе сделана очень просто, например, не учитывается время жизни (полученная однажды кука будет отдаваться всё время, пока жив grab isntance), более того, смешиваются куки с разных сайтов :)

Выглядит ужасно, однако, этого хватает чтобы парсить практически все сайты уже много лет.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version