- timemachine.js 헤더에서 'live-playback-json 매니페스트 교체로 실제 seek 살린다' 설명을 제거하고 cosmetic UI-only 패치임을 명시 - README 파일 구조: 'fetch 후킹' -> 'fetch + XHR 후킹' - README 동작 확인 로그: 'livePlaybackJson swapped for DVR manifest' (현재 코드에 없는 문자열) 를 실제 출력되는 'inner livePlaybackJson meta/live patched (liveRewind, duration, timeMachine)' 로 교체
95 lines
4.3 KiB
Markdown
95 lines
4.3 KiB
Markdown
# Chzzk Bypass
|
|
|
|
치지직(CHZZK) 시청 환경을 개선하는 Chrome / Edge / Whale 용 확장 프로그램 (Manifest V3).
|
|
|
|
## 기능
|
|
|
|
### 1. 그리드 우회 (1080p 시청)
|
|
|
|
`navigator.userAgent`, `navigator.platform`, `navigator.userAgentData` 를 Mac 으로
|
|
위장해, 치지직이 윈도우에서 1080p 시청 시 요구하는 그리드(Grid) 설치 없이 1080p
|
|
화질을 시청할 수 있게 합니다.
|
|
|
|
구현: `content.js`
|
|
|
|
### 2. 타임머신 강제 활성화 (되감기 UI, cosmetic)
|
|
|
|
스트리머가 타임머신을 끄고 방송 중인 라이브에서도 플레이어의 되감기 (seek) 바
|
|
UI 를 띄우려 시도합니다.
|
|
|
|
동작 방식:
|
|
|
|
1. `api.chzzk.naver.com/service/v3.2/channels/{id}/live-detail` 응답을
|
|
`window.fetch` 와 `XMLHttpRequest` 양쪽에서 가로챕니다. 치지직 React 앱은
|
|
axios 기반이라 실제 요청이 XHR 로 나가므로 XHR 후킹이 필수입니다.
|
|
2. 응답 본문의 `content.timeMachineActive`, `content.timeMachinePlayback`
|
|
두 플래그를 `true` 로 만듭니다.
|
|
3. 내부의 `livePlaybackJson` (JSON 문자열) 을 파싱해서 `meta.liveRewind = true`,
|
|
`meta.duration` 보강, `live.timeMachine = true` 를 주입한 뒤 다시 직렬화합니다.
|
|
이 필드들이 플레이어가 seek 바 UI 를 켤지 결정하는 트리거입니다.
|
|
|
|
> **중요한 한계 (반드시 읽으세요)**
|
|
>
|
|
> 이건 **UI 만 켜는 cosmetic 패치** 입니다. 치지직의 DVR window 는 스트리머가
|
|
> 타임머신을 켰을 때만 CDN 이 프로비저닝하기 때문에, 스트리머가 꺼둔 라이브의
|
|
> HLS 매니페스트에는 과거 시점의 segment 자체가 존재하지 않습니다. 따라서:
|
|
>
|
|
> - **재생바가 떠도 실제 되감기는 동작하지 않을 가능성이 매우 높습니다** (누르면
|
|
> live edge 로 튕기거나 segment not found 가 뜸).
|
|
> - 진짜 되감기를 살리려면 CDN 이 만들어 둔 DVR 매니페스트가 있어야 하는데,
|
|
> `service/v1/channels/{id}/live-playback-json` 엔드포인트는 스트리머가 타임머신을
|
|
> 켜둔 채널에서만 200 을 돌려주고 꺼둔 채널에서는 404 입니다 (실측 확인).
|
|
>
|
|
> 참고:
|
|
> [Streamlink chzzk 플러그인](https://github.com/streamlink/streamlink/blob/master/src/streamlink/plugins/chzzk.py)
|
|
> 도 `timeMachineActive` 가 true 일 때만 `live-playback-json` 을 부릅니다.
|
|
> [Choonholic/ChzzkDownloader](https://github.com/Choonholic/ChzzkDownloader)
|
|
> 의 `--stream force-timemachine` 옵션도 마찬가지로 서버-사이드 (CORS 무관)
|
|
> 에서 동일 엔드포인트를 강제로 두드릴 뿐, 서버가 DVR 을 안 만들었다면 똑같이
|
|
> 실패합니다.
|
|
|
|
구현: `timemachine.js`
|
|
|
|
#### 진단 모드
|
|
|
|
응답 구조를 직접 들여다보고 싶으면 devtools 콘솔에서:
|
|
|
|
```js
|
|
localStorage.setItem('chzzk-bypass:debug', '1')
|
|
```
|
|
|
|
치고 새로고침하면 `[chzzk-bypass:timemachine] DEBUG live-detail content after patch: {...}`
|
|
로 패치된 content + `livePlaybackJson` 파싱 결과가 통째로 찍힙니다.
|
|
|
|
## 설치
|
|
|
|
1. 이 저장소를 `git clone` 또는 ZIP 다운로드해 임의의 폴더에 둡니다.
|
|
2. Chrome 계열 브라우저에서 `chrome://extensions` 접속.
|
|
3. 우상단 **개발자 모드** 활성화.
|
|
4. **압축해제된 확장 프로그램을 로드합니다** 클릭 → 위 폴더 선택.
|
|
5. 치지직(`https://chzzk.naver.com`) 새로고침.
|
|
|
|
## 파일 구조
|
|
|
|
```
|
|
manifest.json 확장 정의 (MV3)
|
|
content.js 그리드 우회 (UA / platform / UA-CH 위장)
|
|
timemachine.js 타임머신 강제 활성화 (fetch + XHR 후킹)
|
|
popup.html/css/js 툴바 팝업
|
|
icons/ 확장 아이콘
|
|
```
|
|
|
|
## 동작 확인
|
|
|
|
브라우저 devtools 콘솔에서 다음 로그를 확인할 수 있습니다.
|
|
|
|
- `[chzzk-bypass:timemachine] hooks installed (fetch + XHR)` — 후킹 성공
|
|
- `[chzzk-bypass:timemachine] XHR live-detail intercepted for <channelId>` — XHR 가로채기 진입
|
|
- `[chzzk-bypass:timemachine] forcing timeMachine ON for <channelId>` — 패치 적용
|
|
- `[chzzk-bypass:timemachine] inner livePlaybackJson meta/live patched (liveRewind, duration, timeMachine)` — 내부 매니페스트 메타 패치 성공
|
|
|
|
## 면책
|
|
|
|
본 확장은 학습 및 개인 사용 목적의 우회 도구입니다. 사용에 따른 모든 책임은
|
|
사용자에게 있으며, 치지직 약관 및 관련 법령을 준수하여 사용하시기 바랍니다.
|