Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Не работает скрипт Tele2 #28

Open
mlgns opened this issue Apr 25, 2020 · 8 comments
Open

Не работает скрипт Tele2 #28

mlgns opened this issue Apr 25, 2020 · 8 comments

Comments

@mlgns
Copy link

mlgns commented Apr 25, 2020

Теле2 опять поменяла доступ к их API. Есть ли какая-то возможность восстановить или обойти как-то опять? Из функционала нужна всего лишь проверка баланса) Спасибо!

При необходимости могу скинуть все ошибки и их характер.

@svetlyak40wt
Copy link
Owner

У меня нет Tele2 номера. Это кто-то контрибутил. Попробуй починить и прислать pull-request.

@estin
Copy link

estin commented Aug 21, 2020

Теле2 теперь просит капчу.
Для себя сделал cywad где автоматизировал браузер для получения баланса Tele2, и не только Tele2, и теперь увы...
Возможно я и задолбил Tele2 так как что бы перейти на форму ввода пароля, надо ввести номер на который уйдет смс-ка, я там указывал все нули )
И это работало около года )

Для себя можно сделать так

  • входим в личный кабинет
  • берем в куках access_token

Токен вроде должен жить долго, если не долго то надо обновлять его по refresh_token (так же из кук)

Далее

import requests

if __name__ == '__main__':
    number = '7<phone number>'
    token = '<access token from cookies>'
    response = requests.get(
        url='https://my.tele2.ru/api/subscribers/{}/balance'.format(number),
        headers={'Authorization': 'Bearer {}'.format(token)},
    )
    balance = response.json().get('data', {}).get('value', None)
    print("{} - {}".format(number, balance))

Tele2, если читаете, дайте апи по логину и паролю для получения информации о состояния счета и только read-only )))
все будут только довольны.

@Tmin10
Copy link
Contributor

Tmin10 commented Sep 26, 2020

У теле2 за бэком для сайта стоит keycloak. Можно к нему непосредственно обращаться, чтобы получать токены по логину/паролю и рефрешить его потом. Вот, например, юзер портал, где можно залогиниться через номер и пароль от сайта: https://sso.tele2.ru/auth/realms/tele2-b2c/account

@Tmin10
Copy link
Contributor

Tmin10 commented Oct 11, 2020

Посмотрел работу вебсайта, access токен живёт 4 часа, а вот refresh токен уже бессмертный, получить по нему access и новый refresh (а старый будет работать и дальше) можно таким запросом:

POST https://sso.tele2.ru/auth/realms/tele2-b2c/protocol/openid-connect/token
grant_type: refresh_token
client_id: digital-suite-web-app
refresh_token: old_refresh_token

Но лучше посмотреть авторизацию приложения, там нет капчи и скорее всего можно обменять логин и пароль на токены. В приложении используется certificate pinning для защиты, но сертификат просто валяется в apk.

@gapaus
Copy link

gapaus commented Dec 23, 2020

Посмотрел работу вебсайта, access токен живёт 4 часа, а вот refresh токен уже бессмертный, получить по нему access и новый refresh (а старый будет работать и дальше) можно таким запросом:

Через какое то время выдает:

"statusCode": 400,
  "body": {
    "error": "invalid_grant",
    "error_description": "Offline user session not found"
  },

@estin
Copy link

estin commented Dec 23, 2020

@gapaus
надо рефрешить access_token используя refresh_token как указал на это Tmin10
отправляя запрос на https://voronezh.tele2.ru/auth/realms/tele2-b2c/protocol/openid-connect/token
Т.е. один раз получаем пару access_token/refresh_token и далее: сохраняем, обновляем, используем до тех пор пока и тут Tele2 не прикроет лазейку.

У меня работает с 29 октября без особых проблем след конструкция (автоматизация браузера)

  • логинемся в личный кабинет
  • открываем консоль и выполняем команду (получаем все куки ЛК для работы)
(function(d) {
    script = d.createElement('script');
    script.type = 'text/javascript';
    script.async = true;
    script.onload = function() {
        console.log(JSON.stringify(Cookies.get(), null, 2));
    };
    script.src = 'https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js'; 
    d.getElementsByTagName('head')[0].appendChild(script);
})(document);
  • копируем содержимое и сохраняем
  • ВАЖНО что бы больше в ЛК не происходил логин по номеру телефона иначе refresh_token выпустится новый и надо будет процедуру повторить
  • далее открываем ЛК не авторизованным юзером, не выполняя вход в консоле браузера делаем
(function () {
window.cookiesData = {<тут объект что получили выше>};

    const injectCookiesAndReload = () => {
        (function(d) {
            script = d.createElement('script');
            script.type = 'text/javascript';
            script.async = true;
            script.onload = function() {
                Object.entries(window.cookiesData).forEach(function (i) {Cookies.set(i[0], i[1], { path: '/', expires: 365 });});
                location.reload();
            };
            script.src = 'https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js'; 
            d.getElementsByTagName('head')[0].appendChild(script);
        })(document);
    };

    if (new Date(JSON.parse(atob(window.cookiesData.access_token.split('.')[1])).exp - 1000) < new Date()) {
        // token expired, refresh it
        return fetch("https://voronezh.tele2.ru/auth/realms/tele2-b2c/protocol/openid-connect/token", {
            "headers": {
                "accept": "application/json, text/plain, */*",
                "accept-language": "en,ru-RU;q=0.9,ru;q=0.8,en-US;q=0.7",
                "content-type": "application/x-www-form-urlencoded",
                "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                "sec-fetch-site": "same-origin"
            },
            "referrer": "https://voronezh.tele2.ru/lk?pageParams=askForRegion%3Dtrue",
            "referrerPolicy": "no-referrer-when-downgrade",
            "body": "grant_type=refresh_token&client_id=digital-suite-web-app&refresh_token=" + window.cookiesData.refresh_token,
            "method": "POST",
            "mode": "cors",
            "credentials": "include"
        }).then((response) => {
            return response.json();
        }).then(data => {
            window.cookiesData.access_token = data.access_token;
            window.cookiesData.refresh_token = data.refresh_token;

            injectCookiesAndReload();
        });
    } else {
        injectCookiesAndReload();
    }

})();

Со стороны этот "странный" подход использую, как уже писал выше, в https://github.com/estin/cywad
Снимок экрана в 2020-12-23 22-27-42
Снимок экрана в 2020-12-23 22-28-02

UPDATE еще один момент возможно что access_token/refresh_token связаны с сессией в ЛК. Т.е. если сессия "протухла" юзер долго не появлялся, то сессия "зачищается" со всеми access_token/refresh_token было разок когда долгое время не "опрашивался ЛК". Сейчас проверка баланса стоит частая и сессия не успевает "протухать"

@gapaus
Copy link

gapaus commented Dec 23, 2020

@estin у меня работало день или два, потом как раз получилось как в UPDATE.
Проверка была раз в час

@estin
Copy link

estin commented Dec 24, 2020

@gapaus извини, еще раз спокойно глянул как у меня работает.
а работает оно так

  • один раз залогинился и получил access_token/refhresh_token + остальные куки
  • когда access_token протухает, выпускаю новый по refresh_token
  • важно что полученные новые токены по refresh не сохраняю, и не использую повторно, т.е. всегда использую только один и тот же refresh_token полученный первый раз. возможно именно в этом дело

Ну и конечно у меня получается есть "пользовательская активность на сайте".

Самое простое с чего можно начать это:

  • пользоваться только один и тем же refhresh_token и убедится что ни кто больше не авторизуется ни на сайте, не в мобильном приложение в этот аккаунте
  • повторять попытки запроса несколько раз, очень возможно что есть какой-то сбой-или-лаг у tele2
  • далее попытаться делать пользовательскую активность на сайте, глянуть запросы браузера и повторить часть из них, возможно это будет "продлевать" сессию

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants