- '일치시킨다' 표현을 '일부 저엔트로피 값만 맞춘다'로 정정
- ncloud.com host_permission 은 선언만 되어 있고 DNR 규칙은 chzzk.naver.com 한정임을 명시
- userAgentData.getHighEntropyValues 미구현으로 사이트 스크립트 TypeError 가 발생할 수 있음을 '알려진 위험' 에 추가
reset 이후 README 가 없어진 상태에서 코드 동작을 분석해 새로 작성.
- 동작 원리: JS (`content.js`) + HTTP 헤더 (`rules.json`) 두 레이어
Mac 위장 (UA, platform, userAgentData / user-agent, sec-ch-ua-platform)
- 설치 / 파일 구조 / 권한 정리
- 알려진 위험: "허용되지 않는 비정상적 접근" 팝업 실측 트리거 사실과
추가 핑거프린팅 신호(고엔트로피 CH, WebGL 등) 미위장 한계 명시
v1.2.0(JS UA 위장), v1.2.1(JS + 저엔트로피 HTTP 헤더 위장) 모두
치지직의 "허용되지 않는 비정상적 접근입니다" 팝업을 실측에서 트리거함이
확인됐다. 치지직은 고엔트로피 Client Hints, WebGL renderer, Canvas/Audio
등 다수의 핑거프린팅 신호를 추가로 보고 있으며, 클라이언트 확장만으로는
이를 일관되게 위장할 수 없다. 반복 접근 시 계정 제재 위험이 명시되어
있어 우회 시도 자체를 중단한다.
변경:
- content.js 삭제 (navigator.userAgent / platform / userAgentData 위장 제거)
- rules.json 삭제 (declarativeNetRequest 헤더 위장 규칙 제거)
- manifest.json: content_scripts / declarative_net_request / permissions /
host_permissions 전부 제거. 1.2.1 → 1.2.2, description 갱신
- popup.html / popup.js: 상태 안내만 표시. "Mac 위장 (1080p)" 등 우회 표현 제거
- README.md: 우회 기능 중단 사유 명시, 대안으로 그리드 정식 설치 / 720p 안내
검증:
- 콘솔에 [chzzk-bypass:*] 런타임 로그 발생하지 않음 (content.js 부재)
- nlog.js getHighEntropyValues 오류 본 확장에서 트리거 안 함
- manifest 누락 참조 없음 (rules.json / content.js 참조 전부 제거)
- timemachine.js 제거 및 manifest content_scripts 에서 빼냄
스트리머가 끈 타임머신은 서버 측 DVR 프로비저닝이 없어 cosmetic 우회만
가능했고, 클라이언트-사이드 상태 불일치가 치지직 비정상 접근 감지를
트리거해 "허용되지 않는 비정상적 접근입니다" 팝업 + 계정 제재 위험이
실측으로 확인되어 제거.
- content.js 의 navigator.userAgentData override 에 getHighEntropyValues /
toJSON 까지 일관된 Mac 값으로 구현. 기존엔 메서드가 없어서 nlog.js 가
Uncaught TypeError: e.getHighEntropyValues is not a function 을 던졌음.
- popup.html 의 "타임머신: 강제 활성화" 상태 항목 제거.
- README 를 현재 동작 (그리드 우회만) 에 맞춰 재작성, 타임머신 미지원
사유 명시.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 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)' 로 교체
발견: live-detail 의 outer boolean (timeMachineActive, timeMachinePlayback)
두 개를 true 로 만들어도 재생바가 안 뜸. 외부 자료
(jaesung9507/nvver playback.go) 확인 결과, 플레이어는 livePlaybackJson 내부의
meta.liveRewind / meta.duration / live.timeMachine 을 보고 UI 를 결정함.
이 필드들은 omitempty 라서 DVR ON 일 때만 응답에 존재.
수정:
- patchLiveDetailData 에서 livePlaybackJson 을 파싱해 meta.liveRewind=true,
meta.duration 보강 (1h 기본), live.timeMachine=true 주입 후 재직렬화.
- 깨진 live-playback-json 외부 호출은 이전 커밋에서 이미 제거됨.
근본적 한계 (README 에 명시):
- 이건 cosmetic 패치다. CDN 의 DVR window 는 스트리머가 타임머신을 켰을 때만
서버가 프로비저닝하므로, 스트리머가 꺼둔 라이브는 HLS 매니페스트에 과거
segment 자체가 없음. 재생바가 떠도 실제 seek 은 동작 안 할 가능성 높음.
- live-playback-json 엔드포인트가 timeMachine-off 채널에서 404 인 것도 같은
이유. Streamlink/ChzzkDownloader 도 timeMachineActive 일 때만 부름.
- 진짜 force-timemachine 은 서버 사이드(CDN) 의 결정이라 클라이언트에서
근본적으로 우회 불가.
manifest 버전 1.1.2 → 1.1.3, README 한계 명시.
문제: 사용자 콘솔에서 v1.1.1 의 XHR 후킹은 정상 작동(`forcing timeMachine
ON` 로그 확인)했으나 재생바는 안 떴음. 동시에 `live-playback-json`
엔드포인트가 v3.2/v3.1/v3/v2 전부 CORS+404 로 막혀 콘솔에 잡음만
양산했음. 두 플래그 (`timeMachineActive`/`timeMachinePlayback`) 만으로는
플레이어가 UI 를 안 띄우는 것으로 보임 → 다른 트리거 조사 중.
이번 커밋:
- 깨진 live-playback-json fetch 호출 코드 제거. 콘솔 잡음 해소.
- 진단용 덤프 추가: devtools 에서
localStorage.setItem('chzzk-bypass:debug','1')
후 새로고침하면 live-detail content 와 livePlaybackJson 파싱 결과를
통째로 콘솔에 찍어 어느 필드가 UI 트리거인지 들여다볼 수 있다.
플래그 두 개 set 동작은 유지. 실제 UI 트리거 메커니즘 파악되면 후속
커밋에서 정식 픽스.
문제: v1.1.0 의 fetch 후킹은 작동(`fetch hook installed` 로그 확인)했지만
실제 라이브 페이지에서 `forcing timeMachine ON` 로그가 한 번도 안 떴음.
콘솔 스택트레이스에 `XMLHttpRequest.send` 와 `xhr @ main.d2cbcc55.js` 가
반복 등장해 치지직 React 앱이 axios over XHR 로 live-detail 을 호출하는
것이 확인됨 → fetch 만 후킹한 v1.1.0 은 무용지물이었음.
수정:
- timemachine.js: XMLHttpRequest 의 open/setRequestHeader/send 를 후킹.
live-detail URL 이면 native send 대신 우리가 fetch 로 직접 요청을
날리고, 응답을 patchLiveDetailData 로 패치한 뒤 defineProperty 로
readyState/status/responseText/response/responseURL 등을 덮어쓰고
readystatechange/load/loadend 이벤트를 합성 발화. responseType
(text/json/arraybuffer/blob) 별 response 값도 맞춰 만든다.
- fetch 후킹도 유지 (혹시 일부 경로가 fetch 쓸 수 있음).
- 로그 메시지를 `hooks installed (fetch + XHR)` 로 변경하고 XHR 진입
지점에 `XHR live-detail intercepted for <channelId>` 진단 로그 추가.
- urlOf() 헬퍼로 string/Request/URL 입력을 일관 처리.
- manifest 버전 1.1.0 → 1.1.1.
- README 동작 방식 설명/확인 로그 갱신.
- rules.json: 빈 배열로 추가. manifest 의 declarative_net_request 가
참조하는 파일이 없어 확장 로드 자체가 실패하던 문제 해결.
- timemachine.js: live-detail URL 정규식이 `service/v3.2/...` 같은
마이너 버전 경로를 매칭하도록 `v\d+` → `v[\d.]+` 로 수정. 실제 치지직
공개 API 는 v3.2 를 사용 중 (참고: jaesung9507/nvver chzzk/live.go).
- timemachine.js: live-detail 응답 필드는 `timeMachine` 이 아니라
`timeMachineActive` 와 `timeMachinePlayback` 두 개. 둘 다 true 로
세팅해야 플레이어가 되감기 UI 를 띄운다. alreadyOn 판정도 두 플래그
AND 로 변경.
- PLAYBACK_JSON_VERSIONS 에 v3.2, v3.1 추가.
- timemachine.js: live-detail 응답을 fetch 후킹으로 가로채
timeMachineActive 를 true 로 만들고, live-playback-json 의 DVR
매니페스트로 livePlaybackJson 을 교체해 되감기 UI 와 실제 seek
동작을 살린다. 스트리머가 타임머신을 꺼둔 라이브에서도 동작.
- manifest.json: timemachine.js 를 content_scripts 에 추가하고
버전을 1.1.0 으로 올림. name/description 을 다기능에 맞게 갱신.
- popup.html: 타임머신 강제 활성화 상태 표시 항목 추가.
- README.md: 기능 설명, 설치 방법, 동작 확인 로그, 면책 명시.