Найти - Пользователи
Полная версия: авторизация через модуль request
Начало » Python для новичков » авторизация через модуль request
1
zlodiak
помогите пожалуйста разобраться с авторизацией при помощи скрипта. после чтения архива этого форума и гугления понял примерно следующее:
до появления библиотеки 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>
PanovSergey
Потому что не смотря на то что вы пробовали авторизоваться есть ссылка на странице которую вы ищете. Авторизация там походу просто не работает, по крайней мере мне не удалось войти ни запросом, ни формой, не помогло даже сбросить пароль.
zlodiak
сама авторизация там работает. я несколько лет тем форумом пользуюсь, авторизуюсь каждый день. сейчас вот решил попробовать авторизоваться при помощи скрипта…
noob_saibot
Рабочий вариант (у меня работает):
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 надо?
zlodiak
не обязательно с помощью request(я даже думаю, что с request сложнее будет запись). спасибо


UPD
погуглил и увидел, что grab работает только на 2 питоне. а у меня 3 версия(((
noob_saibot
А у меня другая информация:
https://bitbucket.org/lorien/grab/issue/61/grab-python-3
zlodiak
я читал. это не официальный релиз. мало ли там какие глюки возможны. если в ходе работы над проектом что-нибудь всплывёт, то мне с моими знаниями придётся закрыть проект
noob_saibot
1) Можете воспользоваться другими библиотеками.
2) Поставить питон 2.7
3) Поставить граб на 3.3.
На выбор
Вам же надо было только регистрацию, а тут проект?
zlodiak
всё оказалось до смешного просто. тут дела то на 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
по этому вопросу я снова прошу помощи у вашего сообщества. в предыдущем сообщении я опубликовал код, с помощью которого можно авторизоваться на форуме типа 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

подскажите пожалуйста где я ошибся. что не так?..
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