Android now generates valid poTokens

This commit is contained in:
WardPearce
2024-09-20 04:04:47 +12:00
parent ce1762a966
commit 3aa8de1970
3 changed files with 19077 additions and 9 deletions
+54 -9
View File
@@ -6,12 +6,50 @@ export interface PoTokens {
po_token: string;
}
const headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-US;q=0.9',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)',
};
// Inspired by https://github.com/YunzheZJU/youtube-po-token-generator & https://github.com/YunzheZJU/youtube-po-token-generator
export async function getPoToken(): Promise<PoTokens> {
let visitorData: string;
return new Promise((resolve, reject) => {
const messageListener = async (data: any) => {
await InAppBrowser.removeAllListeners();
await InAppBrowser.close();
resolve(data);
if (!data.po_token) {
visitorData = data.visitor_data;
const injectPlayer = await fetch('/po-token-youtube/inject.js');
await InAppBrowser.executeScript({
code: (await minify(`
window.onPoToken = (poToken) => {
window.mobileApp.postMessage({po_token: poToken});
}
ytcfg.set({
'INNERTUBE_CONTEXT': {
...ytcfg.get('INNERTUBE_CONTEXT'),
client: {
...ytcfg.get('INNERTUBE_CONTEXT').client,
visitorData: "${visitorData}",
},
},
'VISITOR_DATA': "${visitorData}",
'IDENTITY_MEMENTO': {
'visitor_data': "${visitorData}",
},
})
${await injectPlayer.text()}`)).code as string
});
} else if (visitorData && data.po_token) {
await InAppBrowser.removeAllListeners();
await InAppBrowser.close();
resolve({ visitor_data: visitorData, po_token: data.po_token });
}
};
const closeListener = async () => {
@@ -19,10 +57,12 @@ export async function getPoToken(): Promise<PoTokens> {
};
const urlChangeListener = async () => {
// Code must be minified to ensure runs correctly.
await InAppBrowser.executeScript({
code: (await minify(`const originalOpen = XMLHttpRequest.prototype.open;
code: (await minify(`const headers = {"accept": "${headers.accept}", "accept-language": "${headers['accept-language']}", "user-agent": "${headers['user-agent']}"};
Object.defineProperty(window.navigator, 'userAgent', { value: headers["user-agent"], writable: false });
const originalOpen = XMLHttpRequest.prototype.open;
const originalSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.open = function (method, url) {
@@ -33,10 +73,14 @@ XMLHttpRequest.prototype.open = function (method, url) {
XMLHttpRequest.prototype.send = function (body) {
const xhr = this;
if (this._url.includes("/youtubei/v1/player")) {
for (const [key, value] of Object.entries(headers)) {
this.setRequestHeader(key, value);
}
this.addEventListener("load", function () {
try {
const postJson = JSON.parse(body);
window.mobileApp.postMessage({visitor_data: postJson.context.client.visitorData, po_token: postJson.serviceIntegrityDimensions.poToken});
window.mobileApp.postMessage({visitor_data: postJson.context.client.visitorData});
} catch (error) {
console.error("Error parsing request body:", error);
}
@@ -67,11 +111,12 @@ attemptClickPlayButton();
setTimeout(() => {
reject(new Error('Timeout trying to pull Po tokens'));
InAppBrowser.removeAllListeners();
}, 10000);
}, 20000);
InAppBrowser.openWebView({
url: 'https://www.youtube.com/embed/4UdEFmxRmNE',
title: 'Pulling po tokens'
url: 'https://www.youtube.com/embed/jNQXAC9IVRw',
title: 'Pulling po tokens',
headers: headers
});
});
}
File diff suppressed because it is too large Load Diff
+3
View File
@@ -8,6 +8,9 @@ export default defineConfig({
plugins: [
SvelteKitPWA({
injectRegister: 'inline',
workbox: {
maximumFileSizeToCacheInBytes: 4000000
},
manifest: {
description: 'Modern material design for Invidious.',
theme_color: '#8936FF',