LINUX.ORG.RU

Не выходит залогиниться на ЛОРе с помощью скрипта

 , ,


1

2

Не могу понять, почему не выходит залогиниться. Перерыл кучу статей, протестил много подобных вариаций, но везде результат один: None. Остановился, на мой взгляд, на наиболее близком к решению.

from http.cookiejar import CookieJar
import urllib.request, urllib.parse
import re


cookie = CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

req = urllib.request.build_opener(cookie_handler)
req.add_header = [('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11')]
urllib.request.install_opener(req)

params = bytes(urllib.parse.urlencode({'nick':'kramh', 'passwd':'******'}), 'utf-8')
resp = req.open('http://linux.org.ru/index.jsp', params)

page = str(resp.read(), 'utf-8')

parse = re.search(r'kramh', page)
print(parse)



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

Пистон не знаю, но вот это вглядит подозрительно

page = str(resp.read(), 'utf-8')
parse = re.search(r'kramh', page)

У тебя на момент parse = re.search(r'kramh', page) запрос уже выполнился, и ответ пришел? Это же должен быть асинхронный код.

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

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

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

Я пол дня разбирался, прежде чем сюда отписать

kramh
() автор топика
from grab import Grab
g = Grab()
g.go('https://linux.org.ru/login.jsp')
g.doc.set_input('nick', 'kramh')
g.doc.set_input('passwd', '********')
g.doc.submit()
print(g.doc.select("/html/body/div[1]/div/ul/li[5]/a").text())
dnb ★★★★
()
Ответ на: комментарий от kramh

По твоей ссылке -

Из формы нам требуется адрес из тэга <form> и его аттрибут action, здесь он login.jsp, что значит адрес для отправки будет http://linux.org.ru/login.jsp

2012 год. за это время могло поменяться многое.

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

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

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

В нормальных языках любой web-запрос синхронный. Полезную работу делают параллельно в зеленом треде.

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

К питону это, в прочем, не относится, да.

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

Подскажи, пожалуйста, еще раз.


cookie = CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

req = urllib.request.build_opener(cookie_handler)
req.add_header = [('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11')]
urllib.request.install_opener(req)

params = bytes(urllib.parse.urlencode({'csrf':'02raQ4LUj1ihoVXDNUFGwA==', 'nick':'kramh', 'passwd':'******'}), 'utf-8')
resp = req.open('https://www.linux.org.ru/login.jsp', params)

page = str(resp.read(), 'utf-8')

parse = re.search(r'kramh', page)
print(parse)
Выводит вот такую ошибку: urllib.error.HTTPError: HTTP Error 403: Forbidden. Я, видимо, очень сильно накосячил с кодом, но хочется разобраться с этой авторизацией на urllib, потому что слишком уж много сил потратил, чтобы бросать эту библиотеку.

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

пользуйся requests

import requests
from requests.auth import HTTPBasicAuth
requests.get('https://linux.org.ru/login.jsp', auth=HTTPBasicAuth('Login', 'pass'))
Vidal
()
Ответ на: комментарий от pi11
from http.cookiejar import CookieJar
import urllib.request, urllib.parse
import re


url = 'https://www.linux.org.ru/login.jsp'

request = urllib.request.urlopen(url)
response_byte = request.read()
response = str(response_byte, 'utf-8')

parse = re.search(r'csrf', response)  
csrf = response[parse.end()+9:parse.end()+33]


cookie = CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)

req = urllib.request.build_opener(cookie_handler)
req.add_header = [('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.11) Gecko/20101012 Firefox/3.6.11')]
urllib.request.install_opener(req)

params = bytes(urllib.parse.urlencode({'csrf':csrf, 'nick':'kramh', 'passwd':'******'}), 'utf-8')
resp = req.open('https://www.linux.org.ru/login.jsp', params)

page = str(resp.read(), 'utf-8')

print(page)

Снова эта ошибка. Я ведь когда второй раз подключаюсь, то csrf уже другой будет, а POST передается во время открытия, т.е. для того чтобы это сделать, нужно сначала как-то открыть код, найти csrf, а потом сделать запрос post запрос, верно?

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

Как я понял, csrf связан с моими куками. Сейчас попробую это обойти

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

Тебе же рабочий вариант с Grab предлагали? Еще mechanize можешь глянуть.

Я ведь когда второй раз подключаюсь, то csrf уже другой будет, а POST передается во время открытия,

У тебя какая-то каша в голове. Первый раз когда ты открываешь страницу - ты получаешь csrf который сгенерировал движок сайта, - его отправляешь post запросом.

Первый запрос почему делаешь без установки кук? csrf не будет работать так.

НО! Лучше возьми высокоуровневую библиотеку, которая займется этим всем за тебя, раз нет четкого предтавления что там происходит.

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

Спасибо большое за терпение и помощь. Разобрался в большой степени лишь благодаря тебе :)

from http.cookiejar import CookieJar
import urllib.request, urllib.parse
import re


cookie = CookieJar()
cookie_handler = urllib.request.HTTPCookieProcessor(cookie)
req = urllib.request.build_opener(cookie_handler)
req.add_header = [('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3')]
urllib.request.install_opener(req)


resp_csrf = req.open('https://www.linux.org.ru/login.jsp')
resp_csrf = str(resp_csrf.read(), 'utf-8')

parse = re.search(r'csrf', resp_csrf)  
csrf = resp_csrf[parse.end()+9:parse.end()+33]
print(csrf)

params = bytes(urllib.parse.urlencode({'csrf':csrf, 'nick':'kramh', 'passwd':'***'}), 'utf-8')
resp = req.open('https://www.linux.org.ru//login_process', params)


page = str(resp.read(), 'utf-8')
print(page)


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

Если тебе для работы с сайтом нужно быть авторизованным на нем, то какую, блжад, полезную работу ты собрался делать, дожидаясь ответа сервера, число Пи вычислять? Не говоря о том, что она может оказаться бесполезной, если запрос окажется неудачным по каким-то причинам. На запертом автомобиле не уедешь, пока в него не сядешь.

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

Есть несколько тем про авторизацию на ЛОР'е, которые легко ищутся. Твоим путем — создавать новую — надеюсь, никто больше не пойдет :-).

Virtuos86 ★★★★★
()

берешь wireshark(tcpdump) и сравниваешь стандартный логин через браузер с твоим логином. не благодари.

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

Это ты по поводу ассинхронного запроса?

Как ты предлагаешь это решить? Есть идея с помощью таймера. Но только зачем тратить на это время, если скрипт и так выполняет свою задачу?

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

Спасибо. Его код явно получше моего будет

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

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

Например авторизацию на сотне других сайтов.

На запертом автомобиле не уедешь, пока в него не сядешь.

Да, это хороший повод заблокировать весь автотрафик. Пускай ждут.

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

Да, это хороший повод заблокировать весь автотрафик. Пускай ждут.

Какой автотрафик? Кто оставляет машину запертой на дороге?)

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

Ты достал уже. Анологии не понимаешь, хз как тебе объяснить. Любой код должен выполняться в расчете на то, что параллельно выполняется что-то еще, и не мешать этому.

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

Кто оставляет машину запертой на дороге

Твоя дорога — это поток выполнения, и делая блокирующий вызов, ты блокируешь, замораживаешь этот поток, ты останавливаешь весь трафик, ради одной машины.

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