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

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

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

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

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

Включи опцию logdir (которая глючит), а лучше посмотри сниффером, что отправляется и что приходит.
Singularity
А сколько куки живут на том сайте?
odnochlen
Singularity
на том
На каком?
Seganapa
Сайт 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?
Seganapa
Путем долгого и мучительного сниффинга, пришел к выводу что 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 по умолчанию, исчезает…
odnochlen
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'}
)
Seganapa
odnochlen
Чет не пойму, у тебя кукисы из ответа пропадают?

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

Так я меняю содержимое куки и использую измененную в дальнейшем…
g.config['cookies']['logged_in'] = 'true'
del g.config['cookies']['PHPSESSID']
lorien
Поддержка кук в грабе сделана очень просто, например, не учитывается время жизни (полученная однажды кука будет отдаваться всё время, пока жив grab isntance), более того, смешиваются куки с разных сайтов :)

Выглядит ужасно, однако, этого хватает чтобы парсить практически все сайты уже много лет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB