ক্রোম এক্সটেনশান থেকে বর্তমান পৃষ্ঠার উত্স এইচটিএমএল পাওয়া


86

আমার ক্রোম এক্সটেনশন রয়েছে। আমার বর্তমান পৃষ্ঠার HTML উত্স থেকে বিশ্লেষণ করা দরকার। আমি এখানে ব্যাকগ্রাউন্ড পৃষ্ঠাগুলি এবং সামগ্রীর স্ক্রিপ্টগুলির সাথে সমস্ত ধরণের সমাধান পেয়েছি তবে কেউই আমাকে সহায়তা করেনি। আমার এখন অবধি যা আছে তা এখানে:
প্রকাশ.জসন:

{
  "name": "Extension",
  "version": "1.0",
  "description": "Extension",
  "browser_action": {
    "default_icon": "bmarkred.ico",
    "popup": "Test.html"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["content.js"]
    }
  ],
  "background": {
    "page": "backgroundPage.html"
  },
  "permissions": [
    "cookies",
    "tabs",
    "http://*/*", 
    "https://*/*"
  ]
}

পটভূমি html:

<html>
<head>
<script type="text/javascript">
    try {
        chrome.tabs.getSelected(null, function (tab) {
            chrome.tabs.sendRequest(tab.id, {action: "getSource"}, function(source) {
                alert(source);
            });
        });
    }
    catch (ex) {
        alert(ex);
    }
</script>
</head>
</html>

সামগ্রী.js:

chrome.extension.onRequest.addListener(function(request, sender, callback) {
    if (request.action == "getSource") {
        callback(document.getElementsByTagName('html')[0].innerHTML);
    }
});

সতর্কতা সর্বদা সতর্কতা অবধারিত। এমনকি যদি আমি বিষয়বস্তুতে পরিবর্তন করি তবে js কলব্যাক ফাংশন ফাইল করে:

callback('hello'); 

এখনও একই ফলাফল। আমি কি ভুল করছি? সম্ভবত আমি এই ভুল পথে যাচ্ছে। হায় আমার সত্যিই এটি দরকার যখন ব্যবহারকারী এক্সটেনশন পপআপ খুলবে (এবং কেবল তখনই), আমার বর্তমান পৃষ্ঠার এইচটিএমএল প্রয়োজন যাতে আমি এটি বিশ্লেষণ করতে পারি। কোনও পরামর্শ?


একটি সমস্যা হ'ল আপনার ব্যাকগ্রাউন্ড পৃষ্ঠায় কোডটি তাত্ক্ষণিকভাবে চালানো হবে (সামগ্রী স্ক্রিপ্টগুলি ইনজেকশনের আগে)। একটি খুব অনুরূপ / সদৃশ প্রশ্ন আগে জিজ্ঞাসা করা হয়েছে; একটি নতুন গুগল ক্রোম ট্যাব খুলুন এ উত্তরটি দেখুন এবং উত্স পান
রব ডাব্লু

আপনার উত্তর রব জন্য ধন্যবাদ। আমি আপনার সংযুক্ত লিঙ্কে কোড বিভাগগুলি অনুলিপি করেছি তবে এটি এখনও কার্যকর হয় না। সমস্যাটি হ'ল আমার এক্সটেনশনটি একটি পপআপ এবং যখন ব্যবহারকারী আমার এক্সটেনশানটি খুলবে তখনই আমার এইচটিএমএল পাওয়া দরকার। উদাহরণস্বরূপ, যদি বর্তমান ট্যাবটি ফেসবুক ডট কম হয় তবে আমি যখন আমার এক্সটেনশানটি খুলি তখনই আমি আমার জেএস ফাইলটিতে এইচটিএমএল উত্সটি পুনরুদ্ধার করব (সামগ্রী লিপি বা পটভূমি পৃষ্ঠা নয়)।
মিঃ টি।

আপনার বর্তমান কোড সহ আপনার প্রশ্ন আপডেট করুন। কোডটিতে এমন মন্তব্য থাকতে হবে যা সমস্যাটিকে হাইলাইট করে।
রব ডাব্লু

উত্তর:


157

আপনি যে পৃষ্ঠায় উত্সটি পেতে চান তাতে একটি স্ক্রিপ্ট ইনজেক্ট করুন এবং এটিকে পপআপে বার্তা দিন ....

manifest.json

{
  "name": "Get pages source",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Get pages source from a popup",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": ["tabs", "<all_urls>"]
}

popup.html

<!DOCTYPE html>
<html style=''>
<head>
<script src='popup.js'></script>
</head>
<body style="width:400px;">
<div id='message'>Injecting Script....</div>
</body>
</html>

popup.js

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
    message.innerText = request.source;
  }
});

function onWindowLoad() {

  var message = document.querySelector('#message');

  chrome.tabs.executeScript(null, {
    file: "getPagesSource.js"
  }, function() {
    // If you try and inject into an extensions page or the webstore/NTP you'll get an error
    if (chrome.runtime.lastError) {
      message.innerText = 'There was an error injecting script : \n' + chrome.runtime.lastError.message;
    }
  });

}

window.onload = onWindowLoad;

getPagesSource.js

// @author Rob W <http://stackoverflow.com/users/938089/rob-w>
// Demo: var serialized_html = DOMtoString(document);

function DOMtoString(document_root) {
    var html = '',
        node = document_root.firstChild;
    while (node) {
        switch (node.nodeType) {
        case Node.ELEMENT_NODE:
            html += node.outerHTML;
            break;
        case Node.TEXT_NODE:
            html += node.nodeValue;
            break;
        case Node.CDATA_SECTION_NODE:
            html += '<![CDATA[' + node.nodeValue + ']]>';
            break;
        case Node.COMMENT_NODE:
            html += '<!--' + node.nodeValue + '-->';
            break;
        case Node.DOCUMENT_TYPE_NODE:
            // (X)HTML documents are identified by public identifiers
            html += "<!DOCTYPE " + node.name + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '') + (!node.publicId && node.systemId ? ' SYSTEM' : '') + (node.systemId ? ' "' + node.systemId + '"' : '') + '>\n';
            break;
        }
        node = node.nextSibling;
    }
    return html;
}

chrome.runtime.sendMessage({
    action: "getSource",
    source: DOMtoString(document)
});

@ গিল টানকুস আমার প্রথম পোস্টের জন্য দুঃখিত, মন্তব্যগুলিতে (আবার) পর্যাপ্ত মনোযোগ দিলেন না এবং রব ডব্লু যা বলেছিলেন তা পুনরায় সাজিয়ে শেষ করলেন। নতুন পোস্টে আপনার যা ইচ্ছা তা থাকা উচিত।
PAEz

ধন্যবাদ, আপনার উত্তরটি সত্যই সহায়ক ছিল, আমার সমস্যাটি হ'ল অন-ম্যাসেজ অ্যাসিঙ্ক্রোনাস হয়। আমার পপআপে, আমার কাছে অন্যান্য ধরণের অন্যান্য স্টাফ রয়েছে যা উত্স এইচটিএমএলে রিলে আছে। আমি কীভাবে উত্সটিকে একটি বৈশ্বিক ভারে সংরক্ষণ করতে পারি এবং কেবলমাত্র পৃষ্ঠা অনলোড ফাংশন দিয়েই চালিয়ে যেতে পারি?
মিঃ টি।

আমি মনে করি না আপনি পারবেন। আপনার হয় এটি কলব্যাক্স কোডে বা কোনও ফাংশনে রেখে এবং কলব্যাকে কল করতে হবে ... যদি কেবল জেএসের gotoকমান্ড থাকে? ; পি
PAEz

21
কেন কেবল ডম্টোস্ট্রিং ফাংশনের পরিবর্তে ডকুমেন্ট.ডোকমেন্টএলমেন্ট.উটার এইচটিএমএল এর মতো কিছু নয়?
ডিজেএফএম

@ ডিজেএফএম এটি বেশিরভাগ সময় সুন্দর থাকবে। আমি রব ডাব্লু এর ফাংশনটি পুরোপুরি যা বলতে পারি তার থেকে এটি সম্পূর্ণ ... উদাহরণস্বরূপ ডকটাইপটি দেয় যে আপনার সমাধানটি নয়, আপনার কেবল এইচটিএমএল অংশ পাচ্ছে।
PAEz

0

এখানে আমার সমাধান:

chrome.runtime.onMessage.addListener(function(request, sender) {
        if (request.action == "getSource") {
            this.pageSource = request.source;
            var title = this.pageSource.match(/<title[^>]*>([^<]+)<\/title>/)[1];
            alert(title)
        }
    });

    chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
        chrome.tabs.executeScript(
            tabs[0].id,
            { code: 'var s = document.documentElement.outerHTML; chrome.runtime.sendMessage({action: "getSource", source: s});' }
        );
    });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.