web-dev-qa-db-fra.com

999 Code d'erreur sur HEAD request to LinkedIn

Nous utilisons une boucle HEAD request dans une application PHP pour vérifier la validité des liens génériques. Nous vérifions le code d'état juste pour nous assurer que le lien l'utilisateur a entré est valide. Les liens vers tous les sites Web ont réussi, à l'exception de LinkedIn.

Bien que cela semble fonctionner localement (Mac), lorsque nous tentons la demande de l'un de nos serveurs Ubuntu, LinkedIn renvoie un code d'état 999. Pas une demande d'API, juste une simple boucle comme nous le faisons pour tous les autres liens. Nous avons essayé sur plusieurs machines différentes et essayé de modifier l'agent utilisateur, mais pas de dés. Comment puis-je modifier notre boucle pour que les liens de travail retournent un 200?

Un échantillon HEAD request:

curl -I --url https://www.linkedin.com/company/linkedin

Exemple de réponse sur une machine Ubuntu:

HTTP/1.1 999 Request denied
Date: Tue, 18 Nov 2014 23:20:48 GMT
Server: ATS
X-Li-Pop: prod-lva1
Content-Length: 956
Content-Type: text/html

Pour répondre un peu mieux à @ alexandru-guzinschi. Nous avons essayé de masquer les agents utilisateurs. Pour résumer nos essais:

  • Machine Mac + Mac UA => fonctionne
  • Machine Mac + UA Windows => fonctionne
  • Machine distante Ubuntu + (pas de changement UA) => échoue
  • Machine distante Ubuntu + Mac UA => échoue
  • Machine distante Ubuntu + Windows UA => échoue
  • Machine virtuelle locale Ubuntu (sur Mac) + (pas de changement UA) => échoue
  • Machine virtuelle locale Ubuntu (sur Mac) + Windows UA => fonctionne
  • Machine virtuelle locale Ubuntu (sur Mac) + Mac UA => fonctionne

Alors maintenant, je pense qu'ils bloquent toutes les demandes de boucles qui ne fournissent pas d'autre UA et également bloquent les fournisseurs d'hébergement?

Existe-t-il un autre moyen de vérifier si un lien vers linkedin est valide ou s'il mènera à leur page 404, à partir d'une machine Ubuntu utilisant PHP?

29
charltoons

Il semble qu'ils filtrent les demandes en fonction de l'agent utilisateur:

$ curl -I --url https://www.linkedin.com/company/linkedin | grep HTTP
HTTP/1.1 999 Request denied

$ curl -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" -I --url https://www.linkedin.com/company/linkedin | grep HTTP
HTTP/1.1 200 OK
19

J'ai trouvé la solution de contournement, importante pour définir l'en-tête de codage d'acceptation:

curl --url "https://www.linkedin.com/in/izman" \
--header "user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" \
--header "accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" \
--header "accept-encoding:gzip, deflate, sdch, br" \
| gunzip
9
Andrey Izman

Le proxy fonctionnerait, mais je pense qu'il existe un autre moyen de le contourner. Je vois que depuis AWS et d'autres nuages, il est bloqué par IP. Je peux émettre la demande de ma machine et cela fonctionne très bien.

J'ai remarqué que dans la réponse du service cloud, il retourne du JS que le navigateur doit exécuter pour vous amener à une page de connexion. Une fois sur place, vous pouvez vous connecter et accéder à la page. La page de connexion est uniquement pour ceux qui accèdent via une IP bloquée.

Si vous utilisez un client sans tête qui exécute JS, ou allez directement au lien suivant et fournissez les informations d'identification d'un utilisateur linkedin, vous pourrez peut-être le contourner.

3
dmarlow

On dirait que LinkedIn filtre à la fois l'agent utilisateur et l'adresse IP. J'ai essayé cela à la maison et à partir d'un nœud Digital Ocean:

curl -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" -I --url https://www.linkedin.com/company/linkedin

De chez moi, j'ai obtenu un 200 OK, de DO j'ai obtenu 999 refusés ...

Vous avez donc besoin d'un service proxy comme HideMyAss ou autre (je ne l'ai pas testé, je ne peux donc pas dire s'il est valide ou non). Ici est une bonne comparaison des services proxy.

Ou vous pouvez configurer un proxy sur votre réseau domestique, par exemple utiliser un Raspberry Pi pour proxy vos demandes. Ici est un guide à ce sujet.

3
olefrank