Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 21, 2014 21:19:16

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

помогите пожалуйста разобраться с авторизацией при помощи скрипта. после чтения архива этого форума и гугления понял примерно следующее:
до появления библиотеки request использовалась библиотека urllib. обычно приходилось смотреть исходный код формы авторизации, составлять словарь, состоящий изадреса отправки формы, значения из скрытого поля, логина, пароля. но после появления библиотеки request авторизация стала проще(необходимы только пароль и логин). скрипт выглядит так

import urllib
import pprint
import re
import requests
import bs4
r = requests.get('http://forum.saransk.ru/', auth=('sergey', 'passpass'))
print(r.status_code)
print(r)
url = 'http://forum.saransk.ru/'
html = urllib.request.urlopen(url).read().decode('utf-8')
soup = bs4.BeautifulSoup(html)
signLink = soup.find('a', {'id': 'sign_in'})
if signLink:
    print(signLink.prettify())

как видите, здесь я авторизуюсь и проверяю при помощи парсера есть ли на странице ссылка “вход”. у авторизовавшегося пользователя её не должно быть. но в моём случае она есть. значит скрипт не работает. подскажите пожалуйста где я ошибся

вот что выводится на экран после запуска скрипта
>>> ================================ RESTART ================================
>>>
200
<Response >
<a href="http://forum.saransk.ru/index.php?app=core&amp;module=global&amp;section=login“ id=”sign_in“ title=”Войти">
Войти
</a>

Офлайн

#2 Фев. 22, 2014 02:25:01

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

авторизация через модуль request

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

Офлайн

#3 Фев. 22, 2014 06:38:22

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

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

Офлайн

#4 Фев. 22, 2014 09:05:07

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

авторизация через модуль request

Рабочий вариант (у меня работает):

from grab import Grab
g=Grab()
g.go("http://forum.saransk.ru/")
g.go(g.doc.select("//*[@id='sign_in']").attr("href"))
g.set_input_by_id("ips_username","Nickname")
g.set_input_by_id("ips_password","password")
g.submit()
Проверить под кем зашел, и зашел ли вообще:
print g.doc.select("//*[@id='user_link']").text()

PS Ох сорри неувидел, вам именно с помощью request надо?

Отредактировано noob_saibot (Фев. 22, 2014 09:14:57)

Офлайн

#5 Фев. 22, 2014 09:24:14

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

не обязательно с помощью request(я даже думаю, что с request сложнее будет запись). спасибо


UPD
погуглил и увидел, что grab работает только на 2 питоне. а у меня 3 версия(((

Отредактировано zlodiak (Фев. 22, 2014 10:13:50)

Офлайн

#6 Фев. 22, 2014 10:48:42

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

авторизация через модуль request

А у меня другая информация:
https://bitbucket.org/lorien/grab/issue/61/grab-python-3

Офлайн

#7 Фев. 22, 2014 11:41:17

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

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

Отредактировано zlodiak (Фев. 22, 2014 11:42:26)

Офлайн

#8 Фев. 22, 2014 11:51:39

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

авторизация через модуль request

1) Можете воспользоваться другими библиотеками.
2) Поставить питон 2.7
3) Поставить граб на 3.3.
На выбор
Вам же надо было только регистрацию, а тут проект?

Офлайн

#9 Фев. 22, 2014 19:27:41

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

всё оказалось до смешного просто. тут дела то на 5 минут))

так как вопрос популярный, то опубликую решение. может быть мой код поможет очередному вопрошающему

import pprint
import requests
import bs4
url = 'http://forum.saransk.ru/'
html = requests.get(url)
soup = bs4.BeautifulSoup(html.text)
loginForm = soup.find('form', {'id': 'login'})
hiddenAuthKey = soup.find('input', {'name': 'auth_key'})['value']
authData = {    
            'ips_username': 'йцукен',
            'ips_password': 'йцукен',
            'auth_key': hiddenAuthKey,
            'rememberMe': 1,
            'referer': 	'http://forum.saransk.ru/'
}
pprint.pprint(authData)
cookies = dict(invbf_session_id='2412121525sdg')
pprint.pprint(cookies)
req = requests.get(url, params=authData, cookies=cookies)
soup = bs4.BeautifulSoup(req.text)
signLinkNotLogged = soup.find('a', {'id': 'sign_in'})
if signLinkNotLogged:
    print('not_enter')
else:
    print('enter')


все недостающие данные брать из FF firebug. со вкладок “отправленные”

Отредактировано zlodiak (Фев. 22, 2014 19:28:54)

Офлайн

#10 Фев. 24, 2014 11:03:37

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

авторизация через модуль request

по этому вопросу я снова прошу помощи у вашего сообщества. в предыдущем сообщении я опубликовал код, с помощью которого можно авторизоваться на форуме типа IPB. но в этот код приходится каждый раз ручками вставлять id сессии. в нижеследующем коде я попытался автоматизировать этот процесс:

import pprint
import requests
import re
import shelve
import bs4
     
def scanning_posts():
    print('------------------------enter begin--------------------')
    url = 'http://forum.saransk.ru/'
    html = requests.get(url)
    pprint.pprint(html.headers)
    rawCookie = html.headers['Set-Cookie']
    cookie = re.search(r"invbf_session_id=(.*?);", rawCookie).group(1)
    pprint.pprint(cookie)
    html = requests.get(url)
    soup = bs4.BeautifulSoup(html.text)
    loginForm = soup.find('form', {'id': 'login'})
    hiddenAuthKey = soup.find('input', {'name': 'auth_key'})['value']
    authData = {    
                'ips_username': 'xxxxxx',
                'ips_password': 'xxxxxx',
                'auth_key': hiddenAuthKey,
                'rememberMe': 1,
                'referer': 	'http://forum.saransk.ru/'
    }
    #pprint.pprint(authData)
    print('\tlogin: ', authData['ips_username'])
    cookie = dict(invbf_session_id=cookie)
    req = requests.post(url, params=authData, cookies=cookie)
    soup = bs4.BeautifulSoup(req.text)
    signLinkNotLogged = soup.find('a', {'id': 'sign_in'})
    if signLinkNotLogged:
        print('------------------------enter failed--------------------')
scanning_posts()

проблема в том, что значение, которое получает и выводит мой скрипт:
pprint.pprint(cookie)
не совпадает с значением, которое я вижу через FF firebug

подскажите пожалуйста где я ошибся. что не так?..

Отредактировано zlodiak (Фев. 24, 2014 11:04:15)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version