Como posso obter o URL da guia atual de uma extensão do Google Chrome?


Respostas:


215

Use chrome.tabs.query()assim:

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

Isso requer que você solicite acesso à chrome.tabsAPI no manifesto de extensão :

"permissions": [ ...
   "tabs"
]

É importante observar que a definição da sua "guia atual" pode diferir dependendo das necessidades da sua extensão.

A configuração lastFocusedWindow: truena consulta é apropriada quando você deseja acessar a guia atual na janela focada do usuário (normalmente a janela superior).

A configuração currentWindow: truepermite que você obtenha a guia atual na janela em que o código da sua extensão está atualmente em execução. Por exemplo, isso pode ser útil se sua extensão cria uma nova janela / pop-up (mudança de foco), mas ainda deseja acessar as informações da guia na janela em que a extensão foi executada.

Eu escolhi usar lastFocusedWindow: trueneste exemplo, porque o Google chama casos em que currentWindow nem sempre podem estar presentes .

Você pode refinar ainda mais a consulta da guia usando qualquer uma das propriedades definidas aqui: chrome.tabs.query


27
Por que o URL é sempre indefinido?
Nnm 31/05

2
Se o URL não estiver definido, tente recarregar sua extensão do chrome: // extensions Isso recarregará a configuração da extensão e aplicará a permissão "guias" recém-adicionada.
Flashbackzoo

2
url é indefinido porque stackoverflow.com/questions/28786723/... (resposta: fechar a janela ferramentas de desenvolvimento ou mudança para currentWindow vez de lastFocusedWindow)
kspearrin

2
Fiquei indefinido quando minha janela de ferramentas de desenvolvimento foi desencaixada. A ancoragem corrigiu o problema indefinido.
Fisu 6/03/2019

Isso não retorna o URL da variável para o chamador. Gostaria de uma função simples url = GetCurrentTabUrl () que retorna a URL da guia atual para o chamador. Aqui a variável está dentro da função de retorno de chamada. Posso passá-lo para outra função, mas torna a estrutura do código desconfortável. Eu também gostaria de evitar o uso de variáveis ​​globais. alguma ideia @thauburger?
Thierry Dalon

77

Aviso! chrome.tabs.getSelectedestá obsoleto . Por favor, use chrome.tabs.querycomo mostrado nas outras respostas.


Primeiro, você deve definir as permissões para a API no manifest.json:

"permissions": [
    "tabs"
]

E para armazenar a URL:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});

1
A razão pela qual é apenas para o pop-up (ação da página, ação do navegador) é porque você está enviando um "nulo" para o primeiro parâmetro. code.google.com/chrome/extensions/tabs.html#method-getSelected Os documentos afirmam que o primeiro parâmetro é windowId. Se você deseja usá-lo em opções ou página de segundo plano, precisará inserir o ID da janela ou você receberá a guia atual que é indefinida, opções respectivamente.
Mohamed Mansour

1
sim, funciona, mas não sei por que o método chrome.tabs.getSelected não pode ser encontrado no documento de referência.
swimmingfisher

Essa coisa não está funcionando para mim, chrome.tabs.getSelectedestá indefinida, devo perguntar em uma pergunta separada?
Mostafa Shahverdy

11
O chrome.tabs.getSelectedmétodo foi preterido, o método correto está listado nesta resposta abaixo .
Rob W

1
E como obter links de todas as abas abertas
Enve

48

Outras respostas assumem que você deseja conhecê-lo em um script pop-up ou em segundo plano.

Caso você queira saber a URL atual de um script de conteúdo , a maneira JS padrão se aplica:

window.location.toString()

Você pode usar propriedades de window.locationpara acessar partes individuais da URL, como host, protocolo ou caminho.


1
Ótima resposta. Tudo o que eu queria era window.location.hostver se eu estava no "stackoverflow.com" ou não.
Salyangoz

1
Na verdade, era isso que eu estava procurando. Fiquei tão envolvido com a mecânica da extensão que esqueci que você pode simplesmente pegar o URL da página com window.location.href.
felwithe

Isso requer uma match:"<all_urls>"situação na seção content_script e o Chrome não é recomendado <all_urls>.
McAn

@Tahtakafa Não, não é. Ele assume que um script de conteúdo já está em execução (seja por meio de uma permissão de host para essa página ou activeTab).
Xan

Certifique-se de executar isso no contentScript.jse não no background.js. Basta passar os dados filtrados do URL para a mensagem background.js. Exemplo: let message = { type: "fetchVideoDate", id: getVideoId() };onde getVideoId()contém uma execução de window.location.toString(). Caso contrário, você obterá alguns chrome://temp_background_file.htmldados. Observe também que às vezes messageé chamado request.
DavidHulsman

25

O problema é que chrome.tabs.getSelected é assíncrono. Este código abaixo geralmente não funcionará conforme o esperado. O valor de 'tablink' ainda será indefinido quando for gravado no console porque getSelected ainda não invocou o retorno de chamada que redefine o valor:

var tablink;
chrome.tabs.getSelected(null,function(tab) {
    tablink = tab.url;
});
console.log(tablink);

A solução é agrupar o código no qual você usará o valor em uma função e chamará o getSelected. Dessa forma, você sempre terá um valor definido, pois seu código terá que aguardar o valor ser fornecido antes de ser executado.

Tente algo como:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}

Agradecimentos para o código, isso funcionou para mim, "guias" precisa ser adicionado às permissões no arquivo manifest.json "pontuais": [ "tabs"]
Doug Molineux

Além disso, este funciona como um encanto: Obtendo janela atual em um pop-up (o Google Chrome extensão)
chemark

E, como para obter links de todas as abas abertas
ENVE

2
Eu tentei isso, mas ficando url indefinido por que isso?
Nnm 31/05

1

Olá, aqui está um exemplo do Google Chrome que envia por e-mail o site atual a um amigo. A idéia básica por trás é o que você deseja ... antes de tudo, busca o conteúdo da página (não é interessante para você) ... depois obtém o URL (<- boa parte)

Além disso, é um bom exemplo de código de trabalho, que eu prefiro mais do que ler documentos.

Pode ser encontrado aqui: Enviar por e-mail


1

Esta solução já foi testada.

definir permissões para a API no manifest.json

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

Na primeira função de chamada de carregamento. https://developer.chrome.com/extensions/tabs#event-onActivated

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

Na função de mudança de chamada. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

a função para obter o URL

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })


-2

Você tem que verificar isso .

HTML

<button id="saveActionId"> Save </button>

manifest.json

  "permissions": [
    "activeTab",
    "tabs"
   ]

JavaScript
O código abaixo salvará todos os URLs da janela ativa no objeto JSON como parte do clique do botão.

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);

Minha extensão do Chrome para salvar URLs nas janelas ativas é chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.