YouTube 페이지 (Chrome 확장)에서 전환 후 실제 HTML 가져 오기

Ammar

모든 YouTube보기 페이지 (예 : https://www.youtube.com/watch?v=YisbVr69r7U ) 에서 스크립트를 실행해야하는 크롬 확장 프로그램을 작업 중입니다.

이 스크립트에서 동영상의 itag를 가져오고 싶습니다 (yt.config에있는 "url_encoded_fmt_stream_map"속성을 구문 분석하여 모든 YouTube 동영상 페이지에있는 스크립트에서 가져올 수 있음).

문제는 일부 페이지의 (document.body.innerHTML)을 구문 분석하여 해당 속성을 찾을 수 없다는 것입니다.

내 manifest.json은 다음과 같습니다.

{
  "manifest_version": 2,

  "name"            : "Test Extension",
  "version"         : "0.0",

  "background": {
    "scripts": ["background.js"]
  },

  "permissions": [
    "https://www.youtube.com/*", "tabs", "webNavigation"
  ]
}

YouTube에서 페이지 간 전환을 사용한다는 것을 알고 있습니다 (예를 들어 동영상을 시청할 동영상을 클릭하면 페이지 상단에 빨간색 막대가 나타나고 동영상 페이지가 나타남). webNavigation onHistoryStateUpdated 이벤트를 사용하여 페이지에서 스크립트를 실행합니다. 전환이 끝납니다.

background.js :

const r = /https:\/\/www\.youtube\.com\/watch\?v=(.*?)(&.*)?/;
chrome.webNavigation.onHistoryStateUpdated.addListener(function(details) {
    if(r.test(details.url))
        chrome.tabs.executeScript(details.tabId,{file:"script.js"});
});

및 script.js :

function getURLMap(bodyHTML) {
    var r = /"url_encoded_fmt_stream_map":"(.*?)"/;
    var matches = bodyHTML.match(r);
    return matches[1];
}

function getTags(fmts_info) {
    var tags = [];
    r = /itag=(.*?)\\u/;
    console.log(fmts_info[0]);
    for(var i = 0; i < fmts_info.length; i++) {
        matches = fmts_info[i].match(r);
        tags[i] = matches[1];
    }
    return tags;
}

console.log(getTags(getURLMap(document.body.innerHTML).split(',')));

확장 프로그램은 YouTube보기 페이지로 직접 이동하면 (크롬에서 새 탭을 열고 직접 말하면 https://www.youtube.com/watch?v=YisbVr69r7U ) 콘솔에 itag의 내용이 표시됩니다. 그 비디오를 올바르게. 문제는 전환 (예 : 동영상을 클릭하여 YouTube 색인 페이지에서 동영상 페이지로 이동)하여 YouTube보기 페이지로 이동할 때 발생합니다.이 경우 콘솔에 다음 오류가 있습니다.

Uncaught TypeError: Cannot read property '1' of null  script.js:4

내 script.js가 콘솔에 (document.body) 표시되도록 할 때 "url_encoded_stream_map"을 찾을 수 없습니다.

페이지의 전환을 처리하는 방법에 문제가있는 것 같습니다.

내 문제를 해결하기 위해 많은 것을 찾았지만 아무것도 효과가 없었습니다.

콘텐츠 스크립트를 사용해 보았지만 페이지가로드 될 때 페이지에 콘텐츠 스크립트가 삽입되고 전환이 정확할 때가 아닌 것 같습니다.

itag가있는 페이지의 실제 HTML을 얻고 싶습니다!

편집하다:

이것은 no로 중복되지 않는

이 manifest.json을 시도했습니다.

{
  "manifest_version": 2,

  "name"            : "Test Extension",
  "version"         : "0.0",

  "content_scripts": [{
      "matches": [ "*://*.youtube.com/*" ],
      "js": [ "script.js" ],
      "run_at": "document_start"
  }]
}

script.js :

document.addEventListener("spfdone", process);
document.addEventListener("DOMContentLoaded", process);

function getURLMap(bodyHTML) {
    var r = /"url_encoded_fmt_stream_map":"(.*?)"/;
    var matches = bodyHTML.match(r);
    return matches[1];
}

function getTags(fmts_info) {
    var tags = [];
    r = /itag=(.*?)\\u/;
    for(var i = 0; i < fmts_info.length; i++) {
        matches = fmts_info[i].match(r);
        tags[i] = matches[1];
    }
    return tags;
}

function process() {
    if (location.pathname != "/watch") {
        return;
    }
    console.log(getTags(getURLMap(document.body.innerHTML).split(',')));
}

하지만 문제가 해결되지 않았습니다!

wOxxOm

스크립트디버그 하면 url_encoded_fmt_stream_map사이트 내 탐색 후 문서의 아무 곳에도 추가되지 않는 것을 볼 수 있습니다. JS 사이트를 해킹하면 ytplayer.config이러한 경우 변수가 직접 업데이트 됨을 알 수 있습니다.

페이지 자체에 스크립트삽입 해야 합니다.

manifest.json의 모든 YouTube에서 실행되는 콘텐츠 스크립트를 선언합니다.

"content_scripts": [{
  "matches": [ "*://*.youtube.com/*" ],
  "js": [ "content.js" ],
  "run_at": "document_start"
}]

content.js :

function injectedCode() {
    document.addEventListener("spfdone", process);
    document.addEventListener("DOMContentLoaded", process);

    function process() {
        function getTags(fmts_info) {
            var tags = [];
            r = /itag=(\d+)/;
            for(var i = 0; i < fmts_info.length; i++) {
                var matches = fmts_info[i].match(r);
                if (matches)
                    tags.push(matches[1]);
            }
            return tags;
        }
        if (location.href.indexOf('watch?') < 0) {
            return;
        }
        var tags = getTags(ytplayer.config.args.url_encoded_fmt_stream_map.split(','));
        console.log(tags);
    }
}

function getFunctionText(f) {
    return f.toString().match(/\{[\s\S]*\}$/)[0];
}

document.documentElement.appendChild(document.createElement("script")).text =
    getFunctionText(injectedCode)

결과를 콘텐츠 스크립트로 다시 전달하려면 맞춤 이벤트를 사용 하거나 externally_connectable 을 사용하여 데이터를 확장 프로그램의 백그라운드 페이지 스크립트로 직접 보냅니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

POST 후 페이지에서 HTML 가져 오기

분류에서Dev

Chrome 확장 프로그램-페이지 업데이트 두 번 후 YouTube에서 제거됨

분류에서Dev

div에서 html 페이지 가져 오기 및 "body onload"실행

분류에서Dev

Youtube jquery 비디오 페이지 HTML 가져 오기

분류에서Dev

페이지가로드 된 후 HTML 정보 가져 오기

분류에서Dev

Java swt-스케일링 및 확대 / 축소 후 이미지에서 실제 x, y 좌표 가져 오기

분류에서Dev

JS로드 후 페이지의 HTML 콘텐츠 가져 오기

분류에서Dev

JS로드 후 페이지의 HTML 콘텐츠 가져 오기

분류에서Dev

Ruby에서 전체 HTML 페이지 (AJAX 응답 포함) 가져 오기

분류에서Dev

Selenium Chrome 드라이버에서 실제 XML 소스 가져 오기

분류에서Dev

로그인 후 PHP 페이지에서 결과 가져 오기

분류에서Dev

Chrome 확장-API에 정보 전달-Cors 400 가져 오기

분류에서Dev

Matlab에서 웹 페이지 html 및 css 코드 가져 오기

분류에서Dev

페이지 html android에서 URL 가져 오기

분류에서Dev

원격 HTML 페이지에서 콘텐츠 가져 오기

분류에서Dev

[JAVA] 웹 페이지에서 html 링크 가져 오기

분류에서Dev

확장에서 현재 페이지의 상위 페이지 가져 오기

분류에서Dev

Jquery Mobile에서 페이지 변경 후 라디오 버튼 값 가져 오기

분류에서Dev

Jquery Mobile에서 페이지 변경 후 라디오 버튼 값 가져 오기

분류에서Dev

Swift-메서드 반환 후 Firebase 실시간 데이터베이스에서 데이터 가져 오기

분류에서Dev

이전 페이지에서 ID 가져 오기

분류에서Dev

Woocommerce 장바구니 페이지에서 제품 소계 가져 오기

분류에서Dev

YouTube 오디오 및 비디오가 Chrome에서 동기화되지 않음

분류에서Dev

contao에 대한 후크 내에서 현재 페이지 URL 가져 오기

분류에서Dev

업데이트 / 삭제를 실행하기 전에 행 가져 오기

분류에서Dev

Zend 생성자에서 페이지 제목 가져 오기

분류에서Dev

Fluid-링크에서 페이지 제목 가져 오기

분류에서Dev

themeablebrowser Cordova / Phonegap에서 페이지 제목 가져 오기

분류에서Dev

themeablebrowser Cordova / Phonegap에서 페이지 제목 가져 오기

Related 관련 기사

  1. 1

    POST 후 페이지에서 HTML 가져 오기

  2. 2

    Chrome 확장 프로그램-페이지 업데이트 두 번 후 YouTube에서 제거됨

  3. 3

    div에서 html 페이지 가져 오기 및 "body onload"실행

  4. 4

    Youtube jquery 비디오 페이지 HTML 가져 오기

  5. 5

    페이지가로드 된 후 HTML 정보 가져 오기

  6. 6

    Java swt-스케일링 및 확대 / 축소 후 이미지에서 실제 x, y 좌표 가져 오기

  7. 7

    JS로드 후 페이지의 HTML 콘텐츠 가져 오기

  8. 8

    JS로드 후 페이지의 HTML 콘텐츠 가져 오기

  9. 9

    Ruby에서 전체 HTML 페이지 (AJAX 응답 포함) 가져 오기

  10. 10

    Selenium Chrome 드라이버에서 실제 XML 소스 가져 오기

  11. 11

    로그인 후 PHP 페이지에서 결과 가져 오기

  12. 12

    Chrome 확장-API에 정보 전달-Cors 400 가져 오기

  13. 13

    Matlab에서 웹 페이지 html 및 css 코드 가져 오기

  14. 14

    페이지 html android에서 URL 가져 오기

  15. 15

    원격 HTML 페이지에서 콘텐츠 가져 오기

  16. 16

    [JAVA] 웹 페이지에서 html 링크 가져 오기

  17. 17

    확장에서 현재 페이지의 상위 페이지 가져 오기

  18. 18

    Jquery Mobile에서 페이지 변경 후 라디오 버튼 값 가져 오기

  19. 19

    Jquery Mobile에서 페이지 변경 후 라디오 버튼 값 가져 오기

  20. 20

    Swift-메서드 반환 후 Firebase 실시간 데이터베이스에서 데이터 가져 오기

  21. 21

    이전 페이지에서 ID 가져 오기

  22. 22

    Woocommerce 장바구니 페이지에서 제품 소계 가져 오기

  23. 23

    YouTube 오디오 및 비디오가 Chrome에서 동기화되지 않음

  24. 24

    contao에 대한 후크 내에서 현재 페이지 URL 가져 오기

  25. 25

    업데이트 / 삭제를 실행하기 전에 행 가져 오기

  26. 26

    Zend 생성자에서 페이지 제목 가져 오기

  27. 27

    Fluid-링크에서 페이지 제목 가져 오기

  28. 28

    themeablebrowser Cordova / Phonegap에서 페이지 제목 가져 오기

  29. 29

    themeablebrowser Cordova / Phonegap에서 페이지 제목 가져 오기

뜨겁다태그

보관