Skip to content

Instantly share code, notes, and snippets.

@aont
Last active June 22, 2024 12:36
Show Gist options
  • Save aont/16e03efdb1127fdb5fdec5aaf54192e6 to your computer and use it in GitHub Desktop.
Save aont/16e03efdb1127fdb5fdec5aaf54192e6 to your computer and use it in GitHub Desktop.
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