DnevnikRuAPI icon indicating copy to clipboard operation
DnevnikRuAPI copied to clipboard

Токен

Open crtmitchn opened this issue 1 year ago • 2 comments

В нынешних реалиях зайти лог+пасс нереально, т.к. дн.ру форсит госуслуги. Где токен-то взять? Обыскал всех куков и не нашёл

crtmitchn avatar Sep 24 '24 17:09 crtmitchn

Не знаю где его искать в DevTools, но можешь воспользоваться этим скриптом:

import requests
from pydnevnikruapi.dnevnik.exceptions import DiaryError
from urllib.parse import urlparse, parse_qs


cookies = {
    'a_r_p_i':       "",
    'c_e_a_p':       "",
    'dnevnik_rr':    "",
    'dnevnik_sst':   "",
    'dnevnik_sst':   "",
    'DnevnikAuth_a': "",
    'DnevnikAuth_l': "",
}

LOGIN_URL = "https://login.dnevnik.ru/login/"
RETURN_URL = (
    "https://login.dnevnik.ru/oauth2?response_type="
    "token&client_id=bb97b3e445a340b9b9cab4b9ea0dbd6f&scope=CommonInfo,ContactInfo,"
    "FriendsAndRelatives,EducationalInfo"
)


def get_token(cookies):
    token = requests.get(LOGIN_URL, params={
        "ReturnUrl": RETURN_URL}, allow_redirects=True, cookies=cookies)

    parsed_url = urlparse(token.url)
    query = parse_qs(parsed_url.query)
    result = query.get("result")

    if result is None or result[0] != "success":
        raise DiaryError("Что-то не так с авторизацией")

    if token.status_code != 200:
        raise DiaryError(
            "Сайт лежит или ведутся технические работы, использование api временно невозможно"
        )

    token = parsed_url.fragment[13:-7]
    return token


token = get_token(cookies)

print(token)


# Можешь раскомментировать чтоб протестить

# from pydnevnikruapi.dnevnik import dnevnik
# dn = dnevnik.DiaryAPI(token=token)
# print(dn.get_school())

В cookies вставь значения из DevTools -> Хранилище -> Куки -> https://dnevnik.ru (DevTools -> Приложение -> Хранилище -> Файлы cookie -> https://dnevnik.ru в Chrome). В консоли выведется твой токен. У меня, во всяком случае, работает :)

изображение

Изменено

Они что-то поменяли, теперь нужно брать куки из поддомена login.dnevnik.ru, например, https://login.dnevnik.ru/oauth2/. И достаточно всего двух: DnevnikAuth_a и DnevnikAuth_l.

ginqus avatar Dec 06 '24 18:12 ginqus

О, спасибо! Попробую, как доберусь до компа

crtmitchn avatar Dec 31 '24 18:12 crtmitchn

Сделал сайт для получения токена https://androsovpavel.pythonanywhere.com/

Sirop12 avatar May 17 '25 10:05 Sirop12

LOGIN_URL = "https://login.dnevnik.ru/login/" RETURN_URL = ( "https://login.dnevnik.ru/oauth2?response_type=" "token&client_id=bb97b3e445a340b9b9cab4b9ea0dbd6f&scope=CommonInfo,ContactInfo," "FriendsAndRelatives,EducationalInfo"

Откуда был взят client_id?

Sirop12 avatar Aug 16 '25 17:08 Sirop12

LOGIN_URL = "https://login.dnevnik.ru/login/" RETURN_URL = ( "https://login.dnevnik.ru/oauth2?response_type=" "token&client_id=bb97b3e445a340b9b9cab4b9ea0dbd6f&scope=CommonInfo,ContactInfo," "FriendsAndRelatives,EducationalInfo"

Откуда был взят client_id?

Точно не помню, но, похоже, отсюда: pydnevnikruapi/constants.py

ginqus avatar Aug 16 '25 18:08 ginqus

подскажите, возможно ли сейчас получать токен дневника из log:pass госуслуг?

setteroftrends avatar Oct 28 '25 18:10 setteroftrends