// ==UserScript== // @name Chzzk_Clips: Unblock clips // @namespace Chzzk_Clips: Unblock clips // @version 1.0.0 // @description clips 목록 & 상세(detail?optionalProperties) API에서 privateUserBlock 해제 // @author DOGJIP // @match https://chzzk.naver.com/* // @match https://*.chzzk.naver.com/* // @grant none // @require https://unpkg.com/xhook@latest/dist/xhook.min.js // @icon https://www.google.com/s2/favicons?sz=64&domain=chzzk.naver.com // @downloadURL none // ==/UserScript== (function() { 'use strict'; xhook.after((request, response) => { const url = request.url; let patched = false; // 1) 목록 API: /clips?filterType=ALL if (url.includes('/clips?') && url.includes('filterType=ALL')) { try { const json = JSON.parse(response.text); if (json.content && Array.isArray(json.content.data)) { json.content.data.forEach(clip => { clip.privateUserBlock = false; if (clip.blindType) clip.blindType = null; }); response.text = JSON.stringify(json); patched = true; } } catch (e) { //console.error('[Chzzk_Clips] 목록 패치 실패:', e); } } // 2) 상세 API: detail?optionalProperties=... if (url.includes('/clips/') && url.includes('detail?optionalProperties=')) { try { const json = JSON.parse(response.text); if (json.content && json.content.optionalProperty) { json.content.optionalProperty.privateUserBlock = false; // 필요하면 blindType 도 해제 if (json.content.optionalProperty.blindType) { json.content.optionalProperty.blindType = null; } response.text = JSON.stringify(json); patched = true; } } catch (e) { //console.error('[Chzzk_Clips] 상세 패치 실패:', e); } } }); //console.log('Chzzk_Clips :: 완전 차단 해제 스크립트 로드됨'); })();