Last active
June 22, 2024 12:36
-
-
Save aont/16e03efdb1127fdb5fdec5aaf54192e6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var video = document.getElementsByTagName("video")[0]; | |
video.pause(); | |
var INNERTUBE_API_KEY = ytcfg.data_.INNERTUBE_API_KEY | |
var INNERTUBE_CONTEXT = ytcfg.data_.INNERTUBE_CONTEXT | |
var DELEGATED_SESSION_ID = ytcfg.data_.DELEGATED_SESSION_ID; | |
// https://gist.github.com/eyecatchup/2d700122e24154fdc985b7071ec7764a | |
async function getSApiSidHash(SAPISID, origin) { | |
function sha1(str) { | |
return window.crypto.subtle.digest("SHA-1", new TextEncoder("utf-8").encode(str)).then(buf => { | |
return Array.prototype.map.call(new Uint8Array(buf), x=>(('00'+x.toString(16)).slice(-2))).join(''); | |
}); | |
} | |
const TIMESTAMP = Math.floor(Date.now()*1e-3); | |
const digest = await sha1(`${TIMESTAMP} ${SAPISID} ${origin}`); | |
return `${TIMESTAMP}_${digest}`; | |
} | |
var sleep = ms => new Promise(res => setTimeout(res, ms)) | |
async function ytApi(endpoint, object) { | |
var SAPISID = document.cookie.split('SAPISID=')[1].split('; ')[0] | |
var SAPISIDHASH = await getSApiSidHash(SAPISID, 'https://www.youtube.com'); | |
// var visitorData = INNERTUBE_CONTEXT["client"]["visitorData"]; | |
// var result = await fetch(`${endpoint}?key=${INNERTUBE_API_KEY}&prettyPrint=false`, { | |
var result = await fetch(`${endpoint}?prettyPrint=false`, { | |
method: "POST", | |
headers: { | |
"Authorization": `SAPISIDHASH ${SAPISIDHASH}`, | |
"Content-Type": 'application/json', | |
"x-goog-authuser": "0", | |
"x-goog-pageid": DELEGATED_SESSION_ID, | |
// "x-goog-visitor-id": "", | |
// "x-origin": "https://www.youtube.com", | |
// "x-youtube-bootstrap-logged-in": "true", | |
// "x-youtube-client-name": "1", | |
// "x-youtube-client-version": "2.20240614.01.00" | |
}, | |
body: JSON.stringify({context: INNERTUBE_CONTEXT, ...object}), | |
mode: "same-origin" | |
}) | |
return await result.json() | |
} | |
while (true) { | |
/* | |
console.info("fetch HTML") | |
var fetchResult = await fetch("https://www.youtube.com/watch?v=&list=LL"); | |
var htmlText = await fetchResult.text(); | |
var vyide = "var ytInitialData = "; | |
var vyideBeginPos = htmlText.indexOf(vyide); | |
var vyideEndPos = htmlText.indexOf("};", vyideBeginPos); | |
var ytInitialDataText = htmlText.slice(vyideBeginPos+vyide.length, vyideEndPos+1); | |
// console.log(ytInitialDataText); | |
var ytInitialData = JSON.parse(ytInitialDataText); | |
console.log(ytInitialData); | |
var contents = ytInitialData.contents.twoColumnWatchNextResults.playlist.playlist.contents; | |
*/ | |
console.log("browse"); | |
var browseResponse = await ytApi("/youtubei/v1/browse", {"bid": "ANyPxKoUYFN_u7oNe2WwYJ78Vv193DSaOknVVWN26rKR86-SrPPqlix9fD2XcZTNZU8w6sMOR-OGT-oPwEgUBQDDT19bJ3kisw", "browseId": "VLLL", "params": "wgYCCAA%3D"}); | |
console.info({browseResponse}); | |
try { | |
var contents = browseResponse.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents[0].itemSectionRenderer.contents[0].playlistVideoListRenderer.contents; | |
} catch(error) { | |
var isrContents = browseResponse.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents[0].itemSectionRenderer.contents; | |
console.warn({isrContents}); | |
throw error; | |
} | |
// var videoIdList = []; | |
if(contents.length==0) { break; } | |
for(var content of contents) { | |
try { | |
// var videoId = content.playlistPanelVideoRenderer.navigationEndpoint.watchEndpoint.videoId | |
var videoId = content.playlistVideoRenderer.videoId | |
console.info(videoId) | |
var removelikeResponse = await ytApi("/youtubei/v1/like/removelike", {"bid": "ANyPxKpY3QVrGZIBVqjedI2NHyp9y9x6dZmV_p2SC1wO2WOioc_jY4PgWij-73oi4Fx1iEbn11shRusOPIFl2jL2QjEMD6lZEg", "target": {"videoId": videoId}}); | |
console.info({removelikeResponse}); | |
// break; | |
} catch(error) { | |
console.warn({error, content}); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment