Android now generates valid poTokens
This commit is contained in:
@@ -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
@@ -8,6 +8,9 @@ export default defineConfig({
|
||||
plugins: [
|
||||
SvelteKitPWA({
|
||||
injectRegister: 'inline',
|
||||
workbox: {
|
||||
maximumFileSizeToCacheInBytes: 4000000
|
||||
},
|
||||
manifest: {
|
||||
description: 'Modern material design for Invidious.',
|
||||
theme_color: '#8936FF',
|
||||
|
||||
Reference in New Issue
Block a user