Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 6
1

Авторизация на сайте с использованием средств языка python

15.02.2017, 18:54. Показов 5440. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер. Есть сайт с учётными записями студентов https://student.psu.ru
Проблема в том, что когда студентам преподаватели выставляют баллы за экзамены, об изменении баллов не приходит оповещение. Пришла в голову идея написать оповещалку. У сайта своего API нет. На питоне раньше никогда не писал. Первая проблема для меня: авторизация на сайте. Пробовал подключать requests и beautifulsoup и что-то делать (не исключаю, что всё это бред). Ничего хорошего не вышло. Выглядит это как-то так:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding: utf-8
import requests
#from BeautifulSoup import BeautifulSoup
 
class Etis(object):
    url = 'https://student.psu.ru/pls/stu_cus_et/stu.login'
 
    def auth(self):
        session = requests.Session()
        url = self.url
        params = {
            'p_redirect':u'stu.timetable',
            'p_username':u'логин_на_русском',
            'p_password':u'пароль_на_русском',
        }
        r = session.post(url, params)
        print(r.text)
 
if __name__ == '__main__':
    Etis = Etis()
    Etis.auth()

И было ещё несколько подобных попыток подобного рода:


Python
1
2
3
4
5
6
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
r = requests.get("https://student.psu.ru/pls/stu_cus_et/stu.login")
soup = BeautifulSoup(r.content)
print(soup.prettify())
Ни к чему хорошему это не привело. Во-первых, код страницы не отображает русские символы, что бы с разметкой я ни делал, такое только на этом сайте, пробовал на других с русским текстом - он отображается. Во-вторых, если посмотреть на первый код, он имеет параметры. Я так до конца и не разобрался как их узнать, поэтому возможно они не все там.
Хочу услышать какие-то комментарии, в правильном ли направлении я вообще двигаюсь. Большое спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2017, 18:54
Ответы с готовыми решениями:

Авторизация на сайте с использованием IdHTTP
Пытаюсь авторизоваться на почте: void __fastcall TForm1::Button1Click(TObject *Sender) {...

Авторизация на сайте с использованием Metamask
Привет! Есть вопрос касательно авторизации на сайте с использованием Metamask или EtherAuth....

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

Авторизация на сайте через Python
Здравствуйте! Нужно написать небольшой скрипт на сайт Nike RU. Он должен создавать много окон...

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

5
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
15.02.2017, 19:02 2
Intercross, bs не использую, а lxml все просто.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import lxml.html
import requests
 
name = 'ЛОГИН'
password = 'ПАРОЛЬ'
url = 'https://student.psu.ru/pls/stu_cus_et/stu.login'
 
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1',
    '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',
    'DNT':'1'
}
session = requests.session()
data = session.get(url, headers=headers).content
page = lxml.html.fromstring(data)
 
form = page.forms[0]
form.fields['p_username'] = name
form.fields['p_password'] = password
 
response = session.post(form.action, data=form.form_values())
print(response.text)
1
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 6
15.02.2017, 22:01  [ТС] 3
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import lxml.html
import requests
from urllib.parse import quote
 
name = 'ЛОГИН'
password = 'ПАРОЛЬ'
url = 'https://student.psu.ru/pls/stu_cus_et/stu.login'
 
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, br',
    'Accept-Language':'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
    'Cache-Control':'max-age=0',
    'Connection':'keep-alive',
    'Content-Length':'70',
    'Content-Type':'application/x-www-form-urlencoded',
    'Host':'student.psu.ru',
    'Origin':'https://student.psu.ru',
    'Referer':'https://student.psu.ru/pls/stu_cus_et/stu.login',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3013.0 Safari/537.36'
}
session = requests.session()
data = session.get(url, headers=headers).content
page = lxml.html.fromstring(data)
 
form = page.forms[0]
form.fields['p_redirect'] = 'stu.timetable'
form.fields['p_username'] = quote(name.encode('cp1251'))
form.fields['p_password'] = quote(password.encode('cp1251'))
 
response = session.post(form.action, data=form.form_values())
print(response.text)
немного изменил. пока не добавил в headers больше параметров, выдавало, что логин или пароль введён неправильно. в таком варианте кода программа запускается и дальше ничего не происходит. не отменить, ничего) так и должно быть?
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
15.02.2017, 23:36 4
Intercross, поле p_redirect менять не надо и есть ощущение, что ты перемудрил с
Цитата Сообщение от Intercross Посмотреть сообщение
quote(password.encode('cp1251'))
Более детально смогу помочь, только при наличии работающего логина и пароля.

Цитата Сообщение от Intercross Посмотреть сообщение
в таком варианте кода программа запускается и дальше ничего не происходит
А ничего по сути и не должно произойти (ну только внутренняя страница личного кабинета должна принтануться)
1
0 / 0 / 0
Регистрация: 05.02.2016
Сообщений: 6
16.02.2017, 17:21  [ТС] 5
alex925, отвечаю на счёт строчки quote(password.encode('cp1251')) и почему я так сделал.
Когда я в браузере смотрел какие запросы поступают при аутентификации в методе Post я увидел строчки:

Form Data
p_redirect:stu.timetable
p_username:%D1%FB%F0%F7%E8%EA%EE%E2
p_password:%EC%EC12345 (здесь пароль изменён)

Путём гуглинга, пришёл к выводу, что при
Python
1
2
3
4
name = 'Сырчиков'
password = 'мм12345'
print(quote(name.encode('cp1251')))
print(quote(password.encode('cp1251')))
как разу будет распечатано
%D1%FB%F0%F7%E8%EA%EE%E2
%EC%EC12345
но, к несчатью, это не работает. как и не работает, если не использовать кодировку и т.д.
Первый момент: если использовать тот, код, который я скинул выше, где я написал, что ничего не происходит, то там ничего не происходит в том плане, что ничего не выводится на печать. программа будто в бесконечном цикле что-то делает и ничего не выводит. Однако, методом проб и ошибок, если закомментировать строчку
Python
1
#'Content-Length':'70',
, то всё относительно заработает (выведет код html-страницы, в котором написано, что логин или пароль введены неправильно). Всё ещё актуальная проблема: как скормить русские символы. Предоставить свои я не могу. Возможно, скоро выпрошу у отчисленных одногруппников их учётные записи. Но немного повводил шаблонные логин и пароль и получилось зайти под test test. И что удивительно, то программа уже не выводит html-страницу с надписью "Введён неверный логин или пароль", то есть с латиницей всё ок. Причём, непонятный для меня момент. Если использовать тот мой код выше, где name = 'test' password = 'test' и не комментировать 'Content-Length', то программа всё ещё в бесконечном цикле. Если закомментировать, то всё ок. Причём закомментировать можно все поля headers. Вот так вот
0
2740 / 2339 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
17.02.2017, 18:50 6
Цитата Сообщение от Intercross Посмотреть сообщение
но, к несчатью, это не работает. как и не работает, если не использовать кодировку и т.д.
Попробуй вот так
Python
1
2
form.fields['p_username'] = quote(name.encode('utf8'))
form.fields['p_password'] = quote(password.encode('utf8'))
0
17.02.2017, 18:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2017, 18:50
Помогаю со студенческими работами здесь

Авторизация с использованием post запроса на сайте
Моя первая попытка авторизации на сайте. import requests def autoriz(): session =...

Не проходит авторизация на сайте с использованием httpwebrequest
проблема в том, что не логинется на сайте :( подскажите где ошибка. ps ранеток не слушаю, просто...

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

Авторизация на сайте через соцсети (Python Requests/HTML)
На сайте (скрин) необходимо пройти авторизацию. Конечно, как-нибудь можно ввести номер...

Как с использованием post запрос нажать на кнопку на сайте в python?
Мне надо нажать на кнопку на сайте. Я разобрался как это сделать с помощью selenium webdriver, но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru