19-05-16 코멘트 추가:

현재 이 문제는 해결되었습니다. 따라서 아래의 방법을 사용할 필요는 없습니다. 참고: https://nomo.asia/406

출처 없이 자유롭게 인용, 수정, 배포하셔도 됩니다.


2019년 5월 15일 현재, 가끔 트위치에서 1080p 으로 재생하는 옵션이 없어지는 문제가 발생하고 있다.

결론부터 말하자면 비용을 절약하기 위해 한국에서만 실행되는 정책으로 추정된다. 이것은 추정이며 이 글에서는 이것이 옳다, 나쁘다를 논하지 않는다. 본 문서에서는 그 원인과 해결 방법에 대해 정리해보았다.

해결방법

1. 다음의 링크에 접속한다. https://nomomo.github.io/TwitchUniqueIdGenerator/


2. 버튼을 클릭하고 값이 생성되면 아래의 방법을 이용하여 해당 값을 적용한다.

1. 원하는 트위치 페이지 접속 후 F12 키를 눌러서 개발자 도구를 연다.
2. 저장소 또는 Application 탭을 연다. (엣지의 경우 디버거, debugger 탭)
3. 쿠키(Cookies) - twitch.tv 또는 player.twitch.tv 를 찾는다.
4. unique_id 라는 이름의 쿠키를 찾아 값(value)를 더블클릭한 후, 내용을 새롭게 생성된 unique_id 값으로 변경한다.
5. 새로고침 한다.



혹시라도 문제가 생기면 twitch.tv 의 쿠키와 캐시를 초기화하면 될 것이다.


위 방법을 사용하지 않더라도 쿠키 삭제를 반복하다보면 어느 순간 1080p 를 선택할 수 있게 된다. 포츈 쿠키의 확률은 3%로 추정되며, 이 때 10번 시도해서 한 번이라도 당첨될 확률은 26%, 20번 시도는 45%, 50번 시도는 78%, 100번 시도는 95% 이다. 당첨되면 다시 쿠키를 초기화하기 전까지는 계속 유효할 것이다.



아래는 문제의 원인과 해결 과정이므로 관심 있는 사람만 읽자.

스트림의 재생주소를 받아오는 과정

최대 화질이 720p인 재생주소와 1080p인 재생주소를 받아오는 과정에는 어떤 차이가 있을까?

일단 각 스트림의 재생주소를 받아오는 과정부터 이해해야한다.

1. OAuth 토큰 발급받기

일단 로그인하지 않은 경우에는 테스트해보지 않아서 잘 모르겠다.

로그인 한 경우 자연스럽게 로그인 때 발급받은 token이 있을거고 그 토큰 값을 계속 사용한다.


API를 이용해 직접 발급받을 수도 있다. https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/ 의 방법을 그대로 사용하면 된다.


https://id.twitch.tv/oauth2/authorize?client_id=<your client ID>&redirect_uri=<your registered redirect URI>&response_type=code&scope=<space-separated list of scopes>


위 결과의 응답은 아래와 같은 토큰값으로 나온다(예시). 이 토큰 값은 다음 단계에서 사용된다.


5ehuvq4u2iroxdldfepxz3pynic8fq

2. 채널 토큰 발급받기

트위치는 각 채널을 재생하기 전에도 토큰을 발급받아야 한다. 뭐라고 부르는지는 모르겠지만 일단 채널 토큰이라고 부르겠다.

아래와 같은 주소를 요청하여 해당 채널에 대한 토큰을 발급받을 수 있다.


https://api.twitch.tv/api/channels/채널명/access_token?need_https=true&oauth_token=위에서발급받은내로그인토큰값&platform=web&player_backend=mediaplayer&player_type=embed


player_backend 값의 종류로 내가 확인한 것은 mediaplayer, flash 가 있고 player_type 은 embed, site, popout, twitch_everywhere 가 있다. 더 있을 수도 있다.


위 호출의 응답은 아래와 같이 나온다. 이 채널 토큰 값과 sig 값은 다음 단계에서 사용된다.


sig: a3228b133a6e073cf748f1bab1232b9cbf6f6c3e

token: {"adblock":true,"authorization":{"forbidden":false,"reason":""},"blackout_enabled":false,"channel":"채널명","channel_id":채널아이디,"chansub":{"restricted_bitrates":[],"view_until":1924905600},"ci_gb":false,"geoblock_reason":"","device_id":"디바이스id","expires":1557908277,"game":"게임명","hide_ads":false,"https_required":true,"mature":false,"partner":false,"platform":"web","player_type":"site","private":{"allowed_to_view":true},"privileged":false,"server_ads":false,"show_ads":true,"subscriber":false,"turbo":false,"user_id":유저아디,"user_ip":"내아이피","version":2}

3. 채널 토큰을 이용해 플레이리스트 받기

일단 1080p가 안 되는, embed 플레이어에서 기본적으로 호출하는 경우는 아래와 같이 호출한다.


https://usher.ttvnw.net/api/channel/hls/채널명.m3u8?baking_bread=true&baking_brownies=true&baking_brownies_timeout=1050&fast_bread=true&p=5288583&player_backend=mediaplayer&playlist_include_framerate=true&reassignments_supported=true&rtqos=control&sig=cfbc1b3456f630f82dbcf1406ca7e6a6a8fb35d&token={"adblock":true,"authorization":{"forbidden":false,"reason":""},"blackout_enabled":false,"channel":"채널명","channel_id":채널아이디,"chansub":{"restricted_bitrates":[],"view_until":1924905600},"ci_gb":false,"geoblock_reason":"","device_id":"디바이스id","expires":1557908277,"game":"게임명","hide_ads":false,"https_required":true,"mature":false,"partner":false,"platform":"web","player_type":"site","private":{"allowed_to_view":true},"privileged":false,"server_ads":false,"show_ads":true,"subscriber":false,"turbo":false,"user_id":유저아디,"user_ip":"내아이피","version":2}&preferred_codecs=avc1&cdm=wv


위 호출의 응답으로 각 화질별 플레이리스트를 받아올 수 있는데 720p가 max 이다. 즉 source 가 없다.

참고로 여기서 받아온 플레이리스트는 팟플레이어 등에서 주소 열기(Ctrl+U)로 바로 재생가능한 주소를 포함하고 있다.


1080p 의 플레이리스트가 포함된 경우는 아래와 같이 호출하며, allow_source=true 가 추가된다. 그 외에 다른 인자들도 무슨 역할을 하는 것 같기는 한데, sig 값과 token 만 있으면 일단 호출된다.


https://usher.ttvnw.net/api/channel/hls/채널명.m3u8?allow_source=true&sig=cfbc1b3456f630f82dbcf1406ca7e6a6a8fb35d&token={"adblock":true,"authorization":{"forbidden":false,"reason":""},"blackout_enabled":false,"channel":"채널명","channel_id":채널아이디,"chansub":{"restricted_bitrates":[],"view_until":1924905600},"ci_gb":false,"geoblock_reason":"","device_id":"디바이스id","expires":1557908277,"game":"게임명","hide_ads":false,"https_required":true,"mature":false,"partner":false,"platform":"web","player_type":"site","private":{"allowed_to_view":true},"privileged":false,"server_ads":false,"show_ads":true,"subscriber":false,"turbo":false,"user_id":유저아디,"user_ip":"내아이피","version":2}&preferred_codecs=avc1&cdm=wv


정리

플레이리스트를 호출하는 옵션에 allow_source=true 가 있으면 1080p 에 해당하는 플레이리스트를 받아올 수 있다.

문제의 원인

그럼 저 allow_source=true 가 포함되는 경우와 그렇지 않은 경우는 어떤 차이가 있을까?

2019년 5월 15일 기준, 다음의 링크에서 아래의 내용을 확인할 수 있다. https://player.twitch.tv/js/player.bcb83a3db13d2d2927b0.js


allow_source 로 검색하다보면 아래와 같은 코드를 볼 수 있다.



allowCostSaving 이라는 변수가 true 이고 지역이 "KR" 인 경우, 플레이리스트를 호출하는 url 에서 "allow_source=true&" 라는 문자열을 "" 로 바꾸도록 하는 코드이다. 변수 이름에서 추정하자면 비용 절약을 위해서 지역이 한국인 경우 의도적으로 1080p 재생을 막도록 한 것으로 추정된다. VPN을 사용하면 정상적으로 1080p가 노출된다는 점에서 지역제한이 걸려있다고 추정은 했지만 코드에 이렇게 적혀있을 줄은 몰랐다.


하지만 VPN을 사용하지 않아도 1080p가 노출되는 유저가 분명 존재하고 있다.

그 이유는 위에서 allowCostSaving 값이 false 인 경우 1080p 가 노출될 것이기 때문이다.


allowCostSaving 값은 아래와 같은 메커니즘으로 결정된다.




  1. 각 유저가 최초 접속 시 deviceId 라는 값이 부여된다.
    예를 들어, 내 deviceId 값이 XXXXXXXXSPorwMCUlYQQWhFCjMKXbUB 라고 하자. (중복될까봐 일부분을 가림)
  2. deviceId 값의 hash 값을 Sha1 으로 계산한다.
    예제의 경우 hash 값은 25c6566bc334e4e42d00c384ede9fe9dc25a0776 가 된다.
  3. hash 값의 끝 4자리를 자른다.
    예제의 경우에는 0776 이 된다.
  4. 자른 문자열을 16진수로 보고 10진수로 변환한다. 이 값은 0~65535 의 값을 가질것이다.
    예제의 경우인 0776을 변환하면 1296이 된다.
  5. 위에서 변환된 값을 65536 로 나눈 값을 계산한다. 이 값은 0~1 의 값을 가질 것이다.
    예제의 경우 1296 / 65536 = 0.019 이다.
  6. 위에서 계산된 값이 0.03 보다 크면 allowCostSaving 값은 true 가 되어 지역코드가 "KR" 인 경우 source(1080p) 값이 노출되지 않는다.
    따라서 예제의 경우에는 0.019 < 0.03 이므로 1080p 가 노출된다.

0~1의 범위를 가지는 임의 값이 0.03 보다 작은 경우에만 노출되므로, 모든 유저 중 약 3%는 1080p 를 볼 수 있도록 되어있다.


저 deviceId 라는 값은 임의의 값으로 생성되어 unique_id 라는 이름의 쿠키에 저장되고, 쿠키가 지워지기 전까지는 해당 값을 계속 이용한다. 쿠키를 계속 초기화하다보면 되는 이유가 바로 3% 가챠에 걸렸기 때문이다.


그래서 쿠키를 지울거라면 다 지울 필요 없이 unique_id 라는 이름의 쿠키만 지워주면 된다.


테스트를 해보니 쿠키를 지울 필요 없이, 위 방식으로 계산된 값이 0.03 보다 작도록 직접 unique_id 값을 직접 만들어서 갈아치우면 정상적으로 1080p 옵션이 노출되는 것을 확인했다. 그래서 임의로 32자리 문자열을 생성하는 것을 계산된 값이 0.03 미만이 될 때까지 반복하도록 만들었다. 이렇게 만든 것이 맨 위의 해결 방법에 있는 링크이다.


※ 만약 아무 작업을 하지 않았는데도 1080p 옵션이 잘 보인다면 3% 가챠에 당첨되었거나, 브라우저가 오프라인 캐시로부터 이전 player를 불러오고 있어서 일 수 있다. 내가 이런 경우인지 확인을 원한다면 브라우저 캐시와 쿠키를 초기화해주면 된다. 그러면 97%의 확률로 최대 720p만 노출될 것이다.

  • 이전 댓글 더보기
  • ㅇㅇ 2019.05.15 23:22

    이렇게 감사인사라도 남겨야할거같네요 너무 감사합니다ㅠㅠ

  • 2019.05.15 23:27

    비밀댓글입니다

  • ㅇㅇ 2019.05.15 23:32

    트게더 스트리머 게시판에 퍼가도 될까요?

  • Favicon of https://nomo.asia 노모 2019.05.15 23:36 신고

    트수2님 남겨주신 댓글은 감사하긴 한데 걸리면 정책위반이라 삭제했습니다. 마음만 받겠습니다. ㄳ

  • ㅇㅇ 2019.05.15 23:38

    정말 정말 감사합니다.

  • MrH 2019.05.15 23:39

    정보 공유 감사합니다 :) 전 트위치사용하면 제일 화나는게 1080p, 60fps로 재생화면 계속 버퍼링걸리는게 정말 화딱지나더군요. 버퍼링 안걸릴때까지 새로고침 계속해서 한국서버쪽? 뭐 아무튼 그쪽으로 잡히면 안걸리던데 변경해주는 확장프로그램도 막히고해서 답답할따름입니다... 트위치는 진짜 장사할 생각이 없는건지

  • 고제봄 2019.05.16 00:02

    덕분에 해결했습니다!!! 감사합니다!!
    정보 공유 해도 될 지 여쭈어 볼려했는데 위에 답글 달아주셨군요 ㅎ_ㅎ
    출처 남기고 퍼가겠습니다
    용사님 감사합니다 :)

  • ㅇㅇ 2019.05.16 00:13

    ^^b

  • ㅇㅇ 2019.05.16 00:17

    선생님, 유니크 아이디값 복사해서 계속 붙여넣는데 id값이 자꾸 원래값으로 돌아가져서 720p만 유지됩니다. 이 방법을 쓰기전에 쿠키삭제를 했었는데 혹시 그것때문에 안 되는걸까요?

  • 2019.05.16 00:40

    비밀댓글입니다

    • Favicon of https://nomo.asia 노모 2019.05.16 11:19 신고

      그 경우는 잘 모르겠습니다.
      일반적으로 hash 값에 의미있는 정보를 노출시키지 않아서, 개인적인 생각으로는 말씀해주신 부분에서 의미를 찾기는 힘들 것 같습니다.
      중간에 34072894272 은 Video 생성 시 부여되는 고유 코드이기는 합니다.

      이번 글의 hash 키 같은 경우는 어떠한 텍스트(deviceId)에 랜덤성을 부여하기 위해서 Sha1 방식의 hash 키를 사용한 것으로 추정되어서 암호화 같은 것과는 상관이 없어보입니다.

  • ㅇㄴ 2019.05.16 01:25

    오페라 브라우저 쓰고있는데 F12눌러도 반응이 없어요ㅠ

  • dd 2019.05.16 01:52

    와 대박이네요 형님 감사합니다 엄청난 능력자....

  • ㅇㄴㅇㄹ 2019.05.16 01:52

    이걸로 1080이 뜨기는 하는데 개같은 KT라 버퍼때문에 볼 수가 없네요

  • ㅇㅇ 2019.05.16 02:02

    형님 대박입니다요..;한번에 되네 ..천재

  • 우와... 2019.05.16 04:52

    이곳에 현자가 있다는 소문을 듣고 왔습니다..과연 듣던대로 이군요..저와 같은 우매한 자가 질문을 하나 드려도 될까요..? 만약에 왠지 모를 이유로 1080이 되고 있는 상태이면서 아무것도 모르고 우매한 저와 같은 자는 캐시의 캐짜도 건들지 말고 그냥 가~만히 있는 것이 가장 무난한가요..? 가만 있다가 3% 얻어걸린것인가요..? 혹시나 다른 분들 처럼 720의 저주 라던지 어떤 그런 안좋은 일을 당하지 않기 위해서 실천할 수 있는 방법이라던지 있을까요..?

    • Favicon of https://nomo.asia 노모 2019.05.16 11:10 신고

      네 문제가 없으시면 그냥 그대로 계속 쓰시는 것이 제일 좋습니다.
      이런 일을 당하지 않기 위해 실천하실 수 있는 방법은 Alternate Player for Twitch.tv 같은 대체 플레이어를 사용하시면 해결되기는 합니다. (https://chrome.google.com/webstore/detail/alternate-player-for-twit/bhplkbgoehhhddaoolmakpocnenplmhf)

  • 2019.05.16 09:59

    비밀댓글입니다

  • 2019.05.16 10:36

    비밀댓글입니다

    • Favicon of https://nomo.asia 노모 2019.05.16 11:05 신고

      말씀하신 것은 충분히 가능합니다 ㅎ.ㅎ. 일단 다른 분이 플레이리스트를 가져오는 주소에 자동으로 allow_source=true 를 붙여주는(코드는 보지 않았지만) 확장기능을 만들어주신 것 같습니다.
      https://tgd.kr/22847457

      그리고 Alternate Player for Twitch.tv 라는 이름의 확장기능이 있습니다. (https://chrome.google.com/webstore/detail/alternate-player-for-twit/bhplkbgoehhhddaoolmakpocnenplmhf)
      이 확장기능을 사용하면 어제 문제가 있을 때에도 1080p 재생이 가능했는데, 이유는 확장기능 내에서 토큰 발급, 스트림 주소 가져오기 등을 모두 직접 수행하기 때문이고, 또한 기존 플레이어를 완전히 대체하도록 되어있습니다. 그리고 확장기능 내에서 플레이리스트를 요청하는 과정에서 allow_source=true 라는 옵션이 확장기능 내에 하드코딩 되어있기 때문에 해당 확장기능을 사용하면 1080p 옵션이 잘 보이는 것으로 보입니다. 이 확장기능을 예전에 뜯어본적이 있는데 변수명이 러시아어로 되어있어서 보기는 쉽지 않지만 관심이 있으시면 뜯어보시면 좋을 것 같습니다.

      여하튼... 이 외에 Streamlink(https://github.com/streamlink/streamlink)도 있고 이미 만들어진 것들이 많이 있어서, 토큰 발급과 플레이리스트를 가져오는 트위치 API 주소가 바뀌지 않는 이상 이것들은 계속 잘 동작할겁니다.

      제가 이번에 별도의 확장기능을 만들지 않은 것은 귀찮기도 하고 유저에게 무언가 설치하게 해야할만큼 복잡하지 않은 방법을 찾아서 입니다. 여튼 당장은 해결되었으니 추후 비슷한 문제가 생기면 최대한 수고가 적은 방법으로 함께 의논해보면 좋을 것 같습니다^^;; 댓글 남겨주셔서 감사합니다.

  • ㅇㅇ 2019.05.16 13:15

    안녕하세요. 궁금한게 있어서 질문드립니다.
    allowCostSaving 메커니즘에서 16진수를 10진수로 바꿔서 65536로 나누는
    이유가 있을까요? 뭔가 메모리가 절약되거나 그런건지... 아니면 테크니컬한 이유가 있는지...
    좋은 글 감사합니다.^^

    • Favicon of https://nomo.asia 노모 2019.05.16 14:06 신고

      코드에서 왜 그렇게 했는지 제가 코드를 작성한게 아니라 잘 모르겠습니다. 그냥 떠오르는대로 했거나 아니면 원래 저렇게 한 이유가 있었는데 다른 부분을 주석처리해서 저 부분만 남은게 아닐까요?
      어떤 문자열로부터 0~1 사이의 어떠한 고정된 숫자값을 얻어낼 수 있는 방법은 많고 지금 주어진 방법이 효율적인지를 떠나 애초에 클라이언트에서 돌아가기 때문에... 저는 잘 모르겠습니다.

  • 선생님 안녕하세요.. 2019.07.21 05:18

    5월달에 신세를 진 한 인터넷 인간입니다.. 포츈쿠키 당첨자인 저 였지만 720밖에 없다는 주위에서 얘기가 들리니 불안에 떨고 있다가 이곳에 오게 되었습니다..뭔가 굉장히 어려운 얘기가 써있구나 라는 느낌과 함께 음..일단 난 고화질 잘 나오니 쿠키는 삭제하지 않도록 해야겠군..하면서 걱정은 일단락되었는데..오늘 컴퓨터 관리 차원에서 디스크 정리를 누르려고 했는데 여기에 쿠키 삭제 항목이 있더군여..그래서 쿠키 이제 삭제해도 되는지 여쭈러 왓습니다..(죄송해여 컴알못 짜증나시죠..?ㅠㅠ)쿠키
    ..삭제해도돼요..?😢 저어 그리고 요즘 컴터찡 많이 느려졌는데 어떻게 관리해주면 좋을지 추천좀 해주실 수 있나여...ㅠㅠ(포맷은 소중한 파일을 많이 날리고 이제와서 다시 깔 수 있을지 없을지 자신없는 드라이버같은애들이 날라갈까봐 무섭답니다..영원히 컴퓨터에서 소리가 안날까 봐..(..) 그리고 백업 자료 옮겨넣어놓을 하드가 없는것도 한몫...)

    HELP!!
    (요약:쿠키삭제해도돼요..? 이제 트위치 화질 안낮아져요..?컴퓨터어떻게하면빨라져요?ㅠㅠ)

    • Favicon of https://nomo.asia 노모 2019.07.24 05:52 신고

      1. 본 글에 적은 증상은 현재는 해결되어서 브라우저 쿠키는 삭제하셔도 됩니다.

      2. 이제 트위치 화질은 안 낮아집니다. 다만 트위치에 의해 언제 또 이런 일이 다시 발생할 것인지는 모릅니다.

      3. Google Drive, Naver Cloud, Dropbox 등 웹클라우드 서비스에 파일을 분산하여 백업하시면 될 것 같습니다.
      직접 포맷 후 윈도우 설치를 하시고 3dp net, 3dp chip 과 같은 프로그램을 이용하여 드라이버를 잡으시거나
      파일 백업 후 근처 PC 수리점에 포맷과 드라이브 잡는 것만을 의뢰하시면 될 것 같습니다^^

  • ㅇㅇ 2019.09.22 00:07

    트위치 다른 방에 들어가면 화질이 자동으로 변하는데
    1080p로 고정시키는 방법은 없을까요?

Leave a comment
≪ Previous : 1 : ··· : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : ··· : 160 : Next ≫