Ignore o limite de pesquisa do LinkedIn jogando com a API

Limite


Existe uma restrição no LinkedIn - o limite de uso comercial . É muito provável que você, como eu, até recentemente, nunca tenha encontrado ou ouvido falar dele.



A essência do limite é que, se você usar a pesquisa de pessoas fora de seus contatos com muita frequência (não há métricas exatas, o algoritmo decide, com base em suas ações - com que frequência você pesquisou e adicionou pessoas), o resultado da pesquisa será limitado a três perfis, em vez de 1000 ( padrão 100 páginas, 10 perfis por página). O limite é redefinido no início de cada mês. Naturalmente, as contas premium não têm essa restrição .

Mas não faz muito tempo, em um projeto para animais de estimação, comecei a brincar muito com pesquisas no LinkedIn e de repente recebi essa restrição. Naturalmente, eu não gostei muito disso, porque não o usei para fins comerciais, então o primeiro pensamento foi estudar a restrição e tentar contorná-la.

[ Esclarecimentos importantes - os materiais deste artigo são apresentados apenas para fins informativos e educacionais. O autor não incentiva seu uso para fins comerciais. ]

Atualização importante - o LinkedIn levou em conta a vulnerabilidade e a corrigiu recentemente. O desvio e o plug-in não funcionam mais.



Estudamos o problema


Temos: em vez de dez perfis com paginação, a pesquisa retorna apenas três, após o qual um bloco com a “recomendação” de uma conta premium é inserido e abaixo estão perfis embaçados e não clicáveis.

Imediatamente, uma mão chega ao console do desenvolvedor para ver esses perfis ocultos - talvez possamos remover alguns estilos que colocam blues ou extrair informações do bloco na marcação. Mas, como esperado, esses perfis são apenas imagens de stub e não armazenam nenhuma informação.



Ok, agora vamos dar uma olhada na guia Rede e ver se os resultados de pesquisa alternativos retornaram e que retornam apenas três perfis realmente funcionam. Encontramos a consulta de seu interesse "/ api / search / blended" e olhamos para a resposta.



Os perfis vêm no array `included`, mas já existem 15 entidades nele.Nesse caso, os três primeiros são objetos com informações adicionais, cada objeto contém informações sobre um perfil específico (por exemplo, o perfil é um prêmio).



Os próximos 12 são perfis reais - resultados de pesquisa, dos quais apenas três serão mostrados para nós. Como você já pode adivinhar, mostra apenas aqueles que recebem informações adicionais (os três primeiros objetos). Por exemplo, se você pegar a resposta do perfil sem limite, 28 entidades aparecerão - 10 objetos com ext. informações e 18 perfis.

Resposta para perfil sem limite



Por que existem mais de 10 perfis, embora 10 sejam solicitados e eles não participam da exibição, mesmo na próxima página eles não serão - ainda não sei. Se você analisar o URL da solicitação, poderá ver essa contagem = 10 (quantos perfis retornar na resposta, no máximo 49).



Ficarei feliz em quaisquer comentários sobre este assunto.

Experimentando


Bem, a coisa mais importante agora sabemos ao certo: mais perfis aparecem na resposta do que nos mostram. Para que possamos obter mais dados, apesar do limite. Vamos tentar extrair a API, diretamente do console, usando buscar.



Espera-se que recebamos um erro 403. Isso ocorre devido à segurança. Aqui não enviamos um token CSRF ( CSRF na Wikipedia . Em poucas palavras, um token exclusivo é adicionado a cada solicitação, que é verificado no servidor quanto à autenticidade).



Ele pode ser copiado de qualquer outra solicitação bem-sucedida ou de cookies, onde é armazenado no campo 'JSESSIONID'.

Onde encontrar um token
Cabeçalho de outra solicitação:



Ou de cookies, diretamente através do console:



Tentamos novamente, desta vez, passamos as configurações para buscar, nas quais especificamos nosso token csrf como um parâmetro no cabeçalho.



Sucesso, obtemos todos os 10 perfis. : tada:

Devido à diferença de cabeçalhos, a estrutura da resposta é um pouco diferente da fornecida na solicitação original. Você pode obter a mesma estrutura se adicionar 'Accept:' application / vnd.linkedin.normalized + json + 2.1 'ao nosso objeto, próximo ao token csrf.
Resposta de amostra com cabeçalho adicionado


Mais sobre o cabeçalho Accept

O que vem a seguir?


Então você pode editar (com suas mãos ou automatizar) o parâmetro `start`, indicando o índice, a partir do qual receberemos 10 perfis (padrão = 0) de todo o resultado da pesquisa. Em outras palavras, incrementando-o em 10 após cada solicitação, obtemos a paginação usual, 10 perfis de cada vez.

Nesta fase, eu tinha dados e liberdade suficientes para continuar trabalhando no projeto de estimação. Mas foi um pecado não tentar exibir esses dados imediatamente, pois eles estão à mão. Em Ember, que é usado na frente, não vamos subir. O JQuery foi conectado ao site e, escavando o conhecimento da sintaxe básica na memória, você pode criar o seguinte em alguns minutos.

Código JQuery
/*  ,             */ const createProfileBlock = ({ headline, publicIdentifier, subline, title }) => { $('.search-results__list').append( `<li class="search-result search-result__occluded-item ember-view"> <div class="search-entity search-result search-result--person search-result--occlusion-enabled ember-view"> <div class="search-result__wrapper"> <div class="search-result__image-wrapper"> <a class="search-result__result-link ember-view" href="/in/${publicIdentifier}/"> <figure class="search-result__image"> <div class="ivm-image-view-model ember-view"> <img class="lazy-image ivm-view-attr__img--centered EntityPhoto-circle-4 presence-entity__image EntityPhoto-circle-4 loaded" src="http://www.userlogos.org/files/logos/give/Habrahabr3.png" /> </div> </figure> </a> </div> <div class="search-result__info pt3 pb4 ph0"> <a class="search-result__result-link ember-view" href="/in/${publicIdentifier}/"> <h3 class="actor-name-with-distance search-result__title single-line-truncate ember-view"> ${title.text} </h3> </a> <p class="subline-level-1 t-14 t-black t-normal search-result__truncate">${headline.text}</p> <p class="subline-level-2 t-12 t-black--light t-normal search-result__truncate">${subline.text}</p> </div> </div> </div> <li>` ); }; //  ,      const fetchProfiles = () => { //  const csrf = 'ajax:9082932176494192209'; //    ,   const settings = { headers: { 'csrf-token': csrf } } //  ,       const url = `https://www.linkedin.com/voyager/api/search/blended?count=10&filters=List(geoRegion-%3Ejp%3A0,network-%3ES,resultType-%3EPEOPLE)&origin=FACETED_SEARCH&q=all&queryContext=List(spellCorrectionEnabled-%3Etrue,relatedSearchesEnabled-%3Etrue)&start=${nextItemIndex}`; /*  ,        ,       10 */ fetch(url, settings).then(response => response.json()).then(data => { data.elements[0].elements.forEach(createProfileBlock); nextItemIndex += 10; }); }; //      $('.search-results__list').find('li').remove(); //     $('.search-results__list').after('<button id="load-more">Load More</button>'); //     $('#load-more').addClass('artdeco-button').on('click', fetchProfiles); //        window.nextItemIndex = 0; 


Se você fizer isso diretamente no console da página de pesquisa, ele adicionará um botão que carrega 10 novos perfis a cada vez que você clica e os renderiza uma lista. Obviamente, token e URL antes desta alteração para o necessário. O bloco de perfil conterá um nome, posição, localização, um link para o perfil e uma imagem de esboço.



Conclusão


Assim, com o mínimo de esforço, conseguimos encontrar um ponto fraco e recuperar nossa busca sem restrições. Foi o suficiente para analisar os dados e seu caminho, analisar a própria consulta.

Não posso dizer que esse é um problema sério para o LinkedIn, porque não representa ameaça. O máximo é o lucro perdido devido a essas "rodadas", o que permite não pagar pelo prêmio. Talvez essa resposta do servidor seja necessária para que as outras partes do site funcionem corretamente ou isso é simplesmente preguiça dos desenvolvedores, falta de recursos que não permitem o bom desempenho. (A restrição apareceu em janeiro de 2015, antes que esse limite não fosse).

PS


PS antigo
Naturalmente, o código jQuery é um exemplo bastante primitivo de recursos. No momento, criei uma extensão para o navegador para atender às minhas necessidades. Ele adiciona botões de controle e renderiza perfis completos com fotos, um botão de convite e conexões gerais. Além disso, coleta dinamicamente filtros de locais, empresas e outras coisas, recebe um token de cookies. Portanto, você não precisa codificar nada. Bem, ele adiciona campos de configurações adicionais, como "quantos perfis solicitar por vez, até 49".



Ainda estou trabalhando neste complemento e pretendo colocá-lo em domínio público. Escreva se estiver interessado.


Por demanda popular, coloque o complemento em acesso aberto, criei um complemento para o navegador e o publiquei para uso geral (gratuito e mesmo sem mineradores). Lá, não apenas a funcionalidade de desvio de limite é implementada, mas também outras comodidades. Visualize e faça o download aqui - adam4leos.imtqy.com

Como esta é uma versão alfa, sinta-se à vontade para me escrever sobre bugs, idéias e até uma interface chique e idiota . Eu continuo desenvolvendo o complemento e periodicamente publicarei novas versões.

Atualização importante - o LinkedIn levou em conta a vulnerabilidade e a corrigiu recentemente. O desvio e o plug-in não funcionam mais.

Source: https://habr.com/ru/post/pt462167/


All Articles