Форум сайта python.su
Всем доброго дня!
Авторизуюсь на сайте при помощи Grab.
Затем мне нужно циклом отправлять один и тот-же Post запрос с периодичностью в 5 мин.
Отправка происходит как-то странно, то все нормально несколько раз отправляется, то при отправке второго Post запроса приходит ответ Logged False…
Т.е. как-то периодически срабатывает…
Что может быть? Проблема в куки или теряется сессия? Как я понял Grab автоматом куки получает и потом отправляет… Может ли быть такое, что мне в куки в ручную что-нибудь добавлять нужно?
В документации Grab про куки очень мало сказано.
Посоветуйте, будет ли толк если я куки в файл буду сохранять и при каждом запросе брать их оттуда?
Отредактировано Seganapa (Авг. 17, 2012 10:44:28)
Офлайн
В документации сказано, что объект граб сохраняет все параметры предыдущего запроса, кроме post.
Включи опцию logdir (которая глючит), а лучше посмотри сниффером, что отправляется и что приходит.
Офлайн
А сколько куки живут на том сайте?
Офлайн
SingularityНа каком?
на том
Офлайн
Сайт 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
Отредактировано Seganapa (Авг. 21, 2012 13:25:31)
Офлайн
Путем долгого и мучительного сниффинга, пришел к выводу что False нужно вручную менять на True, т.к. в полученных куках до этого запроса нигде нет true…
Теперь другой вопрос, есть у кого-нибудь пример с сохранением кукисов при помощи Grab и дальнейшим использованием их?
В документации http://grablib.org/docs/grab/cookies.html# мало инфы… Пробовал разные способы, но не срабатывает, выскакивают ошибки…
Пробовал так:
g = Grab(cookiefile='cookies.txt', headers=headers)
cookies={'logged_in': 'true'}
Если включены обе опции cookies и reuse_cookies, то запомненные кукисы будут объединяться с теми, что указаны в cookies.Но по факту в кукисах у меня остается только {'logged_in': ‘true’}, т.е. все остальное, что должен передавать reuse_cookies по умолчанию, исчезает…
Отредактировано Seganapa (Авг. 21, 2012 15:27:11)
Офлайн
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)
Офлайн
odnochlen
Чет не пойму, у тебя кукисы из ответа пропадают?
Офлайн
Проблема решена! Оказывается Grab хранит куки в словаре g.config
И можно делать с этим словарем что угодно…
Так я меняю содержимое куки и использую измененную в дальнейшем…
g.config['cookies']['logged_in'] = 'true' del g.config['cookies']['PHPSESSID']
Отредактировано Seganapa (Авг. 22, 2012 14:06:30)
Офлайн
Поддержка кук в грабе сделана очень просто, например, не учитывается время жизни (полученная однажды кука будет отдаваться всё время, пока жив grab isntance), более того, смешиваются куки с разных сайтов :)
Выглядит ужасно, однако, этого хватает чтобы парсить практически все сайты уже много лет.
Офлайн