blomqvist icon indicating copy to clipboard operation
blomqvist copied to clipboard

Problem z wtyczka canal plus vod

Open Piotreklabaj opened this issue 2 years ago • 70 comments

Witam po przelogowaniu we wtyczce cały czas wyskakuje błąd logowania i nie pokazuje kanałów. Wstawiam logi https://paste.kodi.tv/zafosirefi

Piotreklabaj avatar Dec 15 '22 17:12 Piotreklabaj

Potwierdzam, u mnie ten sam problem.

praspp avatar Dec 15 '22 22:12 praspp

Chyba @hevet poprawiał błąd logowania https://github.com/mbebe/blomqvist/issues/852#issuecomment-1336124593

Cinek77 avatar Dec 16 '22 10:12 Cinek77

Patrzyłem na ta wtyczkę i dalej jest problem czekamy

Piotreklabaj avatar Dec 16 '22 13:12 Piotreklabaj

Chyba @hevet poprawiał błąd logowania https://github.com/mbebe/blomqvist/issues/852#issuecomment-1336124593

@hevet poprawił logowanie w v1.7.5.8. https://github.com/mbebe/blomqvist/issues/852#issuecomment-1322014255 Aktualny problem z autentykacją dotyczy najnowszej wersji wtyczki 1.7.5.9.

@hevet, @mtr81, czy możecie pomóc? Najlepiej uwzględniając wersję od @mtr81 z poprawkami "Strony głównej" i EPG na kanałach TV z dn. 04.12.2022. https://github.com/mbebe/blomqvist/issues/850#issuecomment-1336467405

praspp avatar Dec 16 '22 15:12 praspp

To trzeba chyba napisać do BOK Canal+ by tak często zmian nie robili :P

Cinek77 avatar Dec 16 '22 16:12 Cinek77

Wersja https://github.com/mbebe/blomqvist/issues/852#issuecomment-1322014255 jest identyczna z wersja 1.7.5.9 w repo, wiec logowanie jest tez takie samo.

mbebe avatar Dec 17 '22 21:12 mbebe

Wersja #852 (comment) jest identyczna z wersja 1.7.5.9 w repo, wiec logowanie jest tez takie samo.

I właśnie w tej wersji 1.7.5.9 z repo @mbebe nie działa obecnie autentykacja. Prosiłem tylko, aby przy naprawie wtyczki wziąć pod uwagę poprawki od @mtr81 z tej wersji https://github.com/mbebe/blomqvist/issues/850#issuecomment-1336467405

praspp avatar Dec 17 '22 22:12 praspp

U mnie taki sam problem jak u autora tematu - błąd logowania i nie pokazuje kanałów. Wtyczka zainstalowana na "czystym" Kodi 19.4 na Android TV.

sydney1981 avatar Dec 18 '22 17:12 sydney1981

Z tego co wiem od @mtr81 problem z logowaniem jest dość złożony by go naprawić.

hevet avatar Dec 18 '22 18:12 hevet

Okej, więc nie pozostaje nic innego jak poczekać, aż ktoś wpadnie na jakieś rozwiązanie tego problemu. Dzięki chłopaki za dobrą robotę tak przy okazji:)

sydney1981 avatar Dec 18 '22 18:12 sydney1981

Jak najbardziej czapki z głów, miejmy nadzieję że problem niedługo zostanie rozwiązany. Bądź co bądź c+ broni się rękami i nogami aby to nie działało :( i żeby korzystać z oficjalnych aplikacji

tluczus avatar Dec 18 '22 22:12 tluczus

Cześć chłopaki udało się rozwiązać problem?czy jeszcze walczycie?Pozdrawiam serdecznie

Piotreklabaj avatar Dec 28 '22 10:12 Piotreklabaj

Nie ma na razie prostego rozwiązania na naprawę logowania.

hevet avatar Dec 28 '22 13:12 hevet

Oki dzięki za info pozdrawiam.A można zobaczyć na wtyczkę sportowa?bo wideo działa a live wyskakuje błąd odtwarzania.Logi dziś wstawię pozdrawiam

Piotreklabaj avatar Dec 29 '22 08:12 Piotreklabaj

Sprawdzcie czy znow nie trzeba poprawic regexa do autentykacji, jesli dobrze pamietam to go poprawialem ostatnim razem po zmianach na stronie c+. Niemam jak sam sprawdzic bo niemam konta u nich.

linia 797 w main.py

authresponse = re.findall('window\.__data\s*=\s*({.*?});.*?window.app_config',response.text,re.DOTALL)

Jak wysylacie logi to nalezy wlaczyc debug logging w Kodi bo inaczej nic nie widac jakie bledy sa.

Mariusz89B avatar Jan 01 '23 19:01 Mariusz89B

Nie. Nie chodzi o to. W sumie to wiadomo o co, tylko nie wiadomo jak to zautomatyzować.

mtr81 avatar Jan 01 '23 19:01 mtr81

@mtr81 jaki jest dokladnie problem, moze bede wstanie pomoc?

Mariusz89B avatar Jan 01 '23 19:01 Mariusz89B

Trzeba podać ciasteczko, które musi przejść autoryzację. Autoryzacja odbywa się poprzez wysłanie na serwer POST-em danych, które dostarcza pewien wredny skrypt. Przedmiotowy skrypt okresowo się zmienia.

mtr81 avatar Jan 01 '23 20:01 mtr81

Problem jest w cookie _abck https://www.zenrows.com/blog/bypass-akamai#akamais-sensor-data

tam jest wysylany podwojnie fingerprint i po drugim razie , jesli jest true _abck jest jakby otwarte - zmiana jest m.in. z .....5604A3~-1~YAAQ..... .......AA2325~0~YAAQ...... jesli jest w _abck ~0~ tzn., ze ciastko jest poprawne i je mozna wyslac podczas logowania. :-/

mbebe avatar Jan 02 '23 21:01 mbebe

Generalnie, tak na szybko, to najlepiej skopiować w/w ciastko z przeglądarki do wtyczki (koniecznie sprawdzając czy skrypt odpowiedzialny za zamieszanie odpali się na www). Potem zalogować się we wtyczce i uwalić ponowne przelogowanie przy wejściu do wtyczki,żeby nie sypało błędem. Zrobiłem tak z dwa tygodnie temu. Od tego momentu wtyczka działa.

mtr81 avatar Jan 02 '23 21:01 mtr81

@mtr81 Podpowiesz, w jakie miejsce w strukturze plików wtyczki powinienem wkopiować to ciastko i jak wyłączyć przelogowanie?

praspp avatar Jan 03 '23 00:01 praspp

Takie rzeczy to tylko na priv. Nie chcę tu mieszać, bo nie każdy to ogarnie.

mtr81 avatar Jan 03 '23 04:01 mtr81

Delete

praspp avatar Jan 03 '23 09:01 praspp

Jak można prosić tak troszkę jaśniej było by fajnie.Pozdrawiam

Piotreklabaj avatar Jan 03 '23 10:01 Piotreklabaj

Takie rzeczy to tylko na priv. Nie chcę tu mieszać, bo nie każdy to ogarnie.

@mtr81 To ja też poproszę o pomoc: marcin.szczepanski1995 (at) gmail.com

marcin-szczepanski avatar Jan 03 '23 10:01 marcin-szczepanski

Problem jest w cookie _abck https://www.zenrows.com/blog/bypass-akamai#akamais-sensor-data

tam jest wysylany podwojnie fingerprint i po drugim razie , jesli jest true _abck jest jakby otwarte - zmiana jest m.in. z .....5604A3~-1~YAAQ..... .......AA2325~0~YAAQ...... jesli jest w _abck ~0~ tzn., ze ciastko jest poprawne i je mozna wyslac podczas logowania. :-/

Tak, zgadza sie. jedynie _abck nalezy zweryfikowac za pomoca VAC i wtedy pojawia sie response. Wyglada na to ze kod ponizej dziala, tylko jak wydostac sensor data?

EDIT: Ok zeby wydostac sensor data trzeba rozwiazac Akamai Javascript challenge, moze byc trudno.

import requests
import re

sess = requests.Session()

headers = {
    'authority': 'logowanie.pl.canalplus.com',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'accept-language': 'sv',
    'dnt': '1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Linux; Android 11; sdk_gphone_x86 Build/RSR1.201013.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 pass_sso',
}

response = sess.get(
    'https://logowanie.pl.canalplus.com/login',
    headers=headers,
    verify=False
)

cookies = response.cookies.get_dict()
#for k, v in cookies.items():
    #print(f'{k}: {v}\n')

vac_regex = re.compile(r'<script type="text/javascript"  src="([^"]+)')
r = vac_regex.search(response.text)
vac = r.group(1) if r else ''

akamai_regex = re.compile(r'<script type="text/javascript" src="(.*?)"  defer></script>')
r = akamai_regex.search(response.text)
akamai = r.group(1) if r else ''

execution_regex = re.compile(r'execution" value="([^"]+)')
r = execution_regex.search(response.text)
execution = r.group(1) if r else ''

#print(f'execution: {execution}')
#print(f'akamai: {akamai}')
#print(f'vac: {vac}')

if execution:
    cookies = {
        'LAST_LOGIN_PAGE_SERVICE_ID': cookies['LAST_LOGIN_PAGE_SERVICE_ID'],
        'canal+app': cookies['canal+app'],
        'TS016c93a3': cookies['TS016c93a3'],
        'bm_sz': cookies['bm_sz'],
        'dcsource': 'direct',
        'dcmedium': 'none',
        'dcid': 'none',
        'dctraffic': 'direct / none',
        '_abck': cookies['_abck'],
        'ak_bmsc': cookies['ak_bmsc'],
    }

    headers = {
        'authority': 'logowanie.pl.canalplus.com',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-language': 'sv',
        'dnt': '1',
        'origin': 'https://logowanie.pl.canalplus.com',
        'referer': 'https://logowanie.pl.canalplus.com/login',
        'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Linux; Android 11; sdk_gphone_x86 Build/RSR1.201013.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.106 Mobile Safari/537.36 pass_sso',
    }

    vac_response = sess.get(
        f'https://logowanie.pl.canalplus.com{vac}',
        cookies=cookies,
        headers=headers,
        verify=False
    )

    akamai_response = sess.get(
        f'{akamai}',
        cookies=cookies,
        headers=headers,
        verify=False
    )

    ### Wydaje mi sie ze to JS z akamai_response nalezy rozwiazac i wprowadzic jako sensor_data fingerprint.

    data = '{"sensor_data":"xxx"}'

    vac_post_response = sess.post(
        f'https://logowanie.pl.canalplus.com{vac}',
        cookies=cookies,
        headers=headers,
        data=data,
        verify=False
    )

    cookies = {
        'LAST_LOGIN_PAGE_SERVICE_ID': cookies['LAST_LOGIN_PAGE_SERVICE_ID'],
        'canal+app': cookies['canal+app'],
        'TS016c93a3': cookies['TS016c93a3'],
        'bm_sz': cookies['bm_sz'],
        'dcsource': 'direct',
        'dcmedium': 'none',
        'dcid': 'none',
        'dctraffic': 'direct / none',
        '_abck': vac_post_response.cookies.get_dict()['_abck'],
        'ak_bmsc': cookies['ak_bmsc'],
    }

    data = {
        'username': 'xxx',
        'password': 'xxx',
        'execution': execution,
        '_eventId': 'submit',
        'geolocation': '',
        }

    response = sess.post('https://logowanie.pl.canalplus.com/login', cookies=cookies, headers=headers, data=data, verify=False)
    print(response)

Mariusz89B avatar Jan 03 '23 10:01 Mariusz89B

@Mariusz89B zrobiłem kilka eksperymentów z użyciem adblocka i czystymi ciasteczkami.

  1. Jestem w stanie zalogować się (w przeglądarce) jeśli zablokuje dostęp do skryptów akamai (nawet nie są pobierane).
  2. Zablokowanie dostępu do skryptu vac powoduje, że logowanie się nie udaje (błąd access denied)

Flow wygląda mniej więcej tak:

  1. GET login --> w odpowiedzi dostajemy cookies _abck
  2. GET vac script
  3. GET akamai --> zablokowane przez adblocka
  4. POST vac script z sensor_data --> w odpoweidzi nowy cookies _abck
  5. Klikając login wszystko działa.

POST leci ze skryptu VAC pobrany w pkt 2, a przynajmniej tak to wygląda w stack trace przy żądaniu POST.

SBPrime avatar Jan 06 '23 20:01 SBPrime

@SBPrime jak generujesz wartość sensor_data?

mtr81 avatar Jan 06 '23 21:01 mtr81

Nie generowałem nic to był prosty test z użyciem firefox'a. Przeglądarka ściągnęła skrypt vac, potem go odpaliła a on zrobił posta z sensor_data. Mam zamiar przelecieć ten skrypt przy użyciu js2py, może coś ciekawego z tego wyniknie. Martwi mnie to, że skrypt sam w sobie robi posta :(

SBPrime avatar Jan 06 '23 21:01 SBPrime

Pytałem, bo myślałem, że udało ci się przełożyć ten skrypt na PY3...

mtr81 avatar Jan 06 '23 21:01 mtr81