LINUX.ORG.RU

Жмакнуть кнопку из скрипта

 , , ,


1

1

Приветствую, Лор!

Нужно залогиниться на stackoverflow и добавить в избранное некий вопрос, а так же сделать его voteup. Всё это нужно сделать из скрипта на питоне.

У SO есть api, но уж больно у них там как-то мутно с Oauth авторизацией, которую я не осилил.

Пытаюсь делать необходимые запросы при помощи requests, предварительно посмотрев как их сделать в chrome dev tools.

Авторизоваться получилось следующим кодом:

#!/usr/bin/env python
import requests


USERNAME = 'логин'
PASSWORD = 'пасворд'
LOGINURL = 'https://stackoverflow.com/users/login?returnurl=http://stackoverflow.com/'

session = requests.session()
req_headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
}
auth_credential = {
    'email': USERNAME,
    'password': PASSWORD
}
r = session.post(LOGINURL, data=auth_credential, headers=req_headers)
print(r.text)

Авторизоваться получается успешно. Далее пытаюсь жмакнуть звездочку какого-нибудь вопроса. Очевидно, что там ajax и прочая магия и запрос , которым я пытаюсь это сделать не работает:

...
js_header = {
    'Content-Type': 'application/json'
}
fav = session.post('http://stackoverflow.com/posts/9548729/favorite', headers=js_header)
print(fav.text)

В ответ получаю: «Suspicious request - Stack Overflow»

Есть варианты как решить мою задачу, или придется осиливать Oauth?



Последнее исправление: b0c0813f (всего исправлений: 2)

Собственно, вот так пытаюсь посмотреть и повторить действие, которое происходит, после того как жмешь на звездочку:

скрин

b0c0813f
() автор топика

Есть варианты как удобнее удалить гланды через жопу, или придется осиливать Oauth?

Deleted
()

Переход на жирные браузеры/браузерные движки решит проблему с AJAX и прочей скриптотой.

Поэтому selenium.

Если нужен headless, то смотреть на костыли вида http://elementalselenium.com/tips/38-headless или http://elementalselenium.com/tips/46-headless-ghostdriver

Если не принципиален питухон, то можно взять PhantomJS с JS или любыми языками, конпилирующимися в него.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо за советы, посмотрю потом на селениум с xvfb. Питухон не принципиален, принципиально задачу решить.

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

b0c0813f
() автор топика
Ответ на: комментарий от Deleted

Есть варианты как удобнее удалить гланды через жопу, или придется осиливать Oauth?

Не, я его понимаю, почему ему это дело не нравится. Я так понимаю, ему придётся заводить специальный домен под этот скрипт и поднимать на нём сервер для авторизации. А может и вообще все запросы через него гнать.

proud_anon ★★★★★
()
Ответ на: комментарий от b0c0813f

Спасибо за советы, посмотрю потом на селениум с xvfb.

Посмотри ещё на ихнее Javascript SDK тогда.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

У нормальных сайтов есть средства выдачи персональных токенов для личного пользования. Ну а SO сишарпдебилы писали.

Deleted
()

Решил себя заплюсовать?

anonymous
()

Тебе нужна библиотека mechanize. Или какой-нибудь phantomjs. Но лучше осилить oauth.

ei-grad ★★★★★
()

питон нормально с селениумом работает, даже всвязке с фантомом

Dred ★★★★★
()

Очевидно, что там ajax и прочая магия

Магия, не магия, но в итоге всё равно оно пуляет какой-то запрос. Неужели нельзя тупо поглядеть в консольке содержимое запроса и скопировать его с точностью до запятой? Т.е. все заголовки, куки и т.п. хренотень.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Спасибо за мысль!

Скопировал через менюшку 'copy as cURL' в chrome dev tools, получилось вот, что:

curl 'http://stackoverflow.com/posts/28996409/favorite' \
-H 'Cookie: __qca=P0-1148813672-1420833729554; usr=t=1IlsRYgHpEiq&s=UT1h17hXuUib; acct=t=qWOiuSBAEM%2b8ZmWQWLNXIJC3bOsc018Z&s=dmSNaWlPm%2f7pLHSO6iDL6ZC5rD5qJANS; _gat=1; _ga=GA1.2.294649423.1420833730' \
-H 'Origin: http://stackoverflow.com' \
-H 'Accept-Encoding: gzip, deflate' \
-H 'Accept-Language: en-US,en;q=0.8' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'Accept: application/json, text/javascript, */*; q=0.01' \
-H 'Referer: http://stackoverflow.com/questions/28996409/google-form-spreadsheet-update-script' \
-H 'X-Requested-With: XMLHttpRequest' \
-H 'Connection: keep-alive' \
--data 'fkey=7d051b14fa9c8684da85ccc6ec1200a8' \
--compressed

С загаловками и прочим всё понятно, появляется еще некий fkey. При беглом осмотре, оно вроде как при помощи джаваскрипта формируется(чтоб узнать как, предположу, что сначала придется деобфусцировать джаваскрипт)

Риторический вопрос конечно, но вот думаю, если воткну это значение fkey в скрипт, он заработает на другом хосте, с этой переменной?

b0c0813f
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.