Подтвердить что ты не робот

Отправка сообщения на chrome-расширение с веб-страницы

Я хочу отправить сообщение с консоли случайной веб-страницы на мое расширение chrome. chrome.extension.sendMessage не работает.

4b9b3361

Ответ 1

В соответствии с официальными документами вы должны использовать postMessage в отправителе и message прослушиватель событий в приемнике.

Вот пример:

Ваш сайт page.html

var data = { type: "FROM_PAGE", text: "Hello from the webpage!" };
window.postMessage(data, "*");

Содержимое script: (введено с помощью chrome.tabs.executeScript(tabid, {code:...)

window.addEventListener("message", function(event) {
    // We only accept messages from ourselves
    if (event.source != window)
        return;

    if (event.data.type && (event.data.type == "FROM_PAGE")) {
        console.log("Content script received message: " + event.data.text);
    }
});

Здесь page.html (который не является частью расширения) отправляет сообщения самому себе, которые перехватываются и проверяются контентом script. Обратное возможно с помощью аналогичных средств.

Чтобы перейти от содержимого script к расширению, вам нужно будет использовать одну из доступных методов передачи сообщений.

Он выглядит сложным, и он несколько сложный, но все это mumbo-jumbo очень безопасно.

Ответ 2

Вот цитата из последней http://developer.chrome.com/extensions/messaging.html. Теперь гораздо проще поддерживать эту функцию, вот как:

Отправка сообщений с веб-страниц

Подобно обмену сообщениями с расширенным расширением, ваше приложение или расширение могут получать и отвечать на сообщения с обычных веб-страниц. Чтобы использовать эту функцию, вы должны сначала указать в своем manifest.json, с какими веб-сайтами вы хотите общаться. Например:

"externally_connectable": {
  "matches": ["*://*.example.com/*"]
}

Это предоставит API сообщений на любую страницу, которая соответствует указанным вами шаблонам URL. Шаблон URL должен содержать как минимум домен второго уровня, то есть шаблоны имен хостов, такие как ",".com ",".co.uk "и".appspot.com" и <all_urls > запрещены. На веб-странице используйте API-интерфейс runtime.sendMessage или runtime.connect для отправки сообщения конкретному приложению или расширению. Например:

// The ID of the extension we want to talk to.
var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";

// Make a simple request:
chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
  function(response) {
    if (!response.success)
      handleError(url);
  });

Из вашего приложения или расширения вы можете прослушивать сообщения с веб-страниц через API-интерфейсы runtime.onMessageExternal или runtime.onConnectExternal, аналогичные межсетевым обмена сообщениями. Только веб-страница может инициировать соединение. Вот пример:

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.url == blacklistedWebsite)
      return;  // don't allow this web page access
    if (request.openUrlInEditor)
      openUrl(request.openUrlInEditor);
  });

Ответ 3

Вы можете переключиться на контекст выполнения JS вашего контента script, используя меню <page context> в нижней части консоли JS-разработчиков для разработчиков страниц, затем используйте chrome.runtime.sendMessage и другие API chrome.* так же, как и в content script.

enter image description here

Ответ 4

Чтобы разработать, проблема с chrome.runtime.sendMessage(...) заключается в том, что вы должны указать их как externally_connectable, который не принимает глобальный подстановочный символ, такой как "https:///". Поэтому, если вы хотите, чтобы вы использовали стиль postMessage . Итак, что вам нужно сделать, это захватить сообщение из окна в текстовом документе, а затем из текстового файла, вы можете отправить его в другом месте (при желании, например, в background.js и т.д.).

Таким образом, на обычной веб-странице или в инжектированном источнике, который вы вставляете на обычную страницу, из вашего contentcript.js отправьте сообщение, подобное этому:

window.postMessage({ type: "FROM_PAGE_TO_CONTENT_SCRIPT", 
     text: "Hello from the webpage!" }, "*");

ex, вы можете добавить его к такой кнопке:

document.getElementById("theButton").addEventListener("click",
    function() {
  window.postMessage({ type: "FROM_PAGE_TO_CONTENT_SCRIPT", 
     text: "Hello from the webpage!" }, "*");
}, false);

Затем, чтобы зафиксировать его в файле contentscript.js и "отправить его" остальной части расширения:

Единственное предостережение заключается в том, что вы хотите только "выбрать" сообщения, которые, по-видимому, вам нравятся:

window.addEventListener("message", function(event) {
  // We only accept messages from this window to itself [i.e. from any iframes]
  if (event.source != window)
    return;

  if (event.data.type && (event.data.type == "FROM_PAGE_TO_CONTENT_SCRIPT")) {        
    chrome.runtime.sendMessage(event.data); // send to rest of extension, or could just send event.data.payload
  } // else ignore messages seemingly not sent to yourself
}, false);

Ответ 5

В дополнение к @hewigovens, у меня недостаточно очков для комментариев... Я объясняю @renatoargh и @sbichenko Если вы отправляете сообщение с веб-страницы по умолчанию -

1) веб-страницу должна указываться в манифесте. например:.

"externally_connectable": {
  "matches": ["http://abcde/abcde/main.aspx*"]
}

2) background.js(справочная страница) кроме вызова с onMessageExternal, например. (вызов расширения):

var host_name = "com.my_chrome_extension.com";
 chrome.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) {
    chrome.runtime.sendNativeMessage(host_name, {"run":message});
    sendResponse({"success": "success"});
    return true;
});