Open mlgns opened 4 years ago
У меня нет Tele2 номера. Это кто-то контрибутил. Попробуй починить и прислать pull-request.
Теле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 ))) все будут только довольны.
У теле2 за бэком для сайта стоит keycloak. Можно к нему непосредственно обращаться, чтобы получать токены по логину/паролю и рефрешить его потом. Вот, например, юзер портал, где можно залогиниться через номер и пароль от сайта: https://sso.tele2.ru/auth/realms/tele2-b2c/account
Посмотрел работу вебсайта, 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.
Посмотрел работу вебсайта, access токен живёт 4 часа, а вот refresh токен уже бессмертный, получить по нему access и новый refresh (а старый будет работать и дальше) можно таким запросом:
Через какое то время выдает:
"statusCode": 400,
"body": {
"error": "invalid_grant",
"error_description": "Offline user session not found"
},
@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);
далее открываем ЛК не авторизованным юзером, не выполняя вход в консоле браузера делаем
(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](https://user-images.githubusercontent.com/520814/103031263-8f6df800-456e-11eb-8eff-031586dee52c.png)
![Снимок экрана в 2020-12-23 22-28-02](https://user-images.githubusercontent.com/520814/103031271-939a1580-456e-11eb-98aa-aaf90741af93.png)
**UPDATE** еще один момент возможно что access_token/refresh_token связаны с сессией в ЛК. Т.е. если сессия "протухла" юзер долго не появлялся, то сессия "зачищается" со всеми `access_token/refresh_token` было разок когда долгое время не "опрашивался ЛК". Сейчас проверка баланса стоит частая и сессия не успевает "протухать"
@estin у меня работало день или два, потом как раз получилось как в UPDATE. Проверка была раз в час
@gapaus извини, еще раз спокойно глянул как у меня работает. а работает оно так
access_token/refhresh_token
+ остальные кукиaccess_token
протухает, выпускаю новый по refresh_token
refresh_token
полученный первый раз. возможно именно в этом делоНу и конечно у меня получается есть "пользовательская активность на сайте".
Самое простое с чего можно начать это:
refhresh_token
и убедится что ни кто больше не авторизуется ни на сайте, не в мобильном приложение в этот аккаунте
Теле2 опять поменяла доступ к их API. Есть ли какая-то возможность восстановить или обойти как-то опять? Из функционала нужна всего лишь проверка баланса) Спасибо!
При необходимости могу скинуть все ошибки и их характер.