Ben 11 місяців тому
батько
коміт
89a5bd2631
4 змінених файлів з 21 додано та 2457 видалено
  1. 0 0
      js/bundle.js
  2. 0 1154
      js/example.json
  3. 21 7
      js/info.js
  4. 0 1296
      js/ytb.html

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
js/bundle.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 1154
js/example.json


+ 21 - 7
js/info.js

@@ -56,8 +56,24 @@ getStringBetween = (string, needleStart, needleEnd, offsetStart = 0, offsetEnd =
     return string.substring(x + needleStart.length + offsetEnd, y + offsetStart);
 }
 
-getUrlFromSignature = (signatureCipher, baseContent) => {
+var cache = {}
+extractJSSignatureFunction = async (baseJsUrl, local) => {
+    console.log(`解析baseUrl: ${baseJsUrl}`);
+    if (cache[baseJsUrl]) {
+        console.log(`从缓存中获取JSSignatureFunction: ${baseJsUrl}`);
+        return cache[baseJsUrl];
+    }
+    const headers = {
+        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Safari/537.36',
+    }
+    const baseContent = await request('GET', baseJsUrl, null, headers, local);
     const decipher = getDecipherFunction(baseContent);
+    cache[baseJsUrl] = decipher;
+    return decipher;
+}
+
+getUrlFromSignature = async (signatureCipher, baseJsUrl, local) => {
+    const decipher = await extractJSSignatureFunction(baseJsUrl, local);
     const searchParams = {}
     for (const item of signatureCipher.split("&")) {
         const [key, value] = item.split('=');
@@ -113,11 +129,6 @@ detail = async (url, local) => {
         }
         const html = await request('GET', url, null, headers, local);
 
-        let baseJsUrl = `https://www.youtube.com${JSON.parse(html.match(/set\(({.+?})\);/)[1])["PLAYER_JS_URL"]}`
-        console.log(`解析baseUrl: ${baseJsUrl}`);
-
-        const baseContent = await request('GET', baseJsUrl, null, headers, local);
-
         let regex = /var ytInitialPlayerResponse\s*=\s*({.*?});/;
         let match = html.match(regex);
         if (!match || !match.length) {
@@ -136,11 +147,14 @@ detail = async (url, local) => {
             })
         }
 
+        let baseJsUrl = `https://www.youtube.com${JSON.parse(html.match(/set\(({.+?})\);/)[1])["PLAYER_JS_URL"]}`
+        console.log(`解析baseUrl: ${baseJsUrl}`);
+
         const formats = []
         for (let format of [].concat(ytInitialPlayerResponse["streamingData"]["formats"]).concat(ytInitialPlayerResponse["streamingData"]["adaptiveFormats"])) {
             console.log(`format: ${JSON.stringify(format)}`);
             if (!format["url"]) {
-                format["url"] = getUrlFromSignature(format["signatureCipher"], baseContent);
+                format["url"] = await getUrlFromSignature(format["signatureCipher"], baseJsUrl, local);
             }
             if (format["url"]) {
                 const {vcodec, acodec} = parseCodecs(format)

Різницю між файлами не показано, бо вона завелика
+ 0 - 1296
js/ytb.html


Деякі файли не було показано, через те що забагато файлів було змінено