CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Comportement différent en Python et PHP

deaqdugookhefh
deaqdugookhefh
Niveau 3
30 mars 2023 à 16:49:37

Script en python qui fonctionne

from urllib.parse import quote
import requests

url = 'https://www.linkedin.com/voyager/api/voyagerSearchDashReusableTypeahead?decorationId=com.linkedin.voyager.dash.deco.search.typeahead.ReusableTypeaheadCollection-32&keywords=Suisse&q=type&query=(typeaheadUseCase:JOBS)&type=GEO&typeaheadFilterQuery=(geoSearchTypes:List(POSTCODE_1,POSTCODE_2,POPULATED_PLACE,ADMIN_DIVISION_1,ADMIN_DIVISION_2,COUNTRY_REGION,MARKET_AREA,COUNTRY_CLUSTER))'

headers = {
    "csrf-token": "ajax: 0",
}
cookies = {
    'JSESSIONID': 'ajax: 0',
    'li_at': 'BQEDARua7D0Ew29xAAABhzIxw5oAAAGHVj5Hmk0AFmgI8qwNpksZyifSdgT5aIvWCVjOZB5fnefoB3sYuvgc0SlwmrBSGXfdXKOpZsL54bF1aXc5NqX15_HgjNP8af_1SG283S6t1vZG76lBbixX0m6K'
}

r = requests.get(url, cookies=cookies, headers=headers, timeout=5)
response = r.json()

# Parse links
found_links = list()
for post in response['elements']:
    print(post['title']['text'])

DACH
Switzerland
Suisse, Grézet-Cavagnan, Nouvelle-Aquitaine, France
Sächsische Schweiz-Osterzgebirge, Saxony, Germany
Central Switzerland, Switzerland
Suisse, Ygos-Saint-Saturnin, Nouvelle-Aquitaine, France
Suisse, Maclas, Auvergne-Rhône-Alpes, France
Sächsische Schweiz, Saxony, Germany
Village Suisse, Geneva, Switzerland
Village Suisse, Fribourg, Switzerland
Cité Suisse, Agadir, Souss-Massa, Morocco
La Suisse, Chamole, Bourgogne-Franche-Comté, France
Le Chalet Suisse, Bonnières, Hauts-de-France, France
La Petite Suisse, Saint-Pierre-du-Regard, Normandy, France
Maison Suisse, Bréau, Île-de-France, France
Le Suisse, Saint-Loubès, Nouvelle-Aquitaine, France
La Suisse, Bouligneux, Auvergne-Rhône-Alpes, France
La Suisse, Pugey, Bourgogne-Franche-Comté, France
Le Chalet Suisse, Fuveau, Provence-Alpes-Côte d'Azur, France
Le Suisse, Issel, Occitanie, France

___________

Script équivalent en PHP qui ne fonctionne pas

<?php

$url = 'https://www.linkedin.com/voyager/api/voyagerSearchDashReusableTypeahead?decorationId=com.linkedin.voyager.dash.deco.search.typeahead.ReusableTypeaheadCollection-32&keywords=Suisse&q=type&query=(typeaheadUseCase:JOBS)&type=GEO&typeaheadFilterQuery=(geoSearchTypes:List(POSTCODE_1,POSTCODE_2,POPULATED_PLACE,ADMIN_DIVISION_1,ADMIN_DIVISION_2,COUNTRY_REGION,MARKET_AREA,COUNTRY_CLUSTER))';

$headers = [
    'csrf-token' => 'ajax: 0'
];

$cookies = [
    'JSESSIONID' => 'ajax: 0',
    'li_at' => 'BQEDARua7D0Ew29xAAABhzIxw5oAAAGHVj5Hmk0AFmgI8qwNpksZyifSdgT5aIvWCVjOZB5fnefoB3sYuvgc0SlwmrBSGXfdXKOpZsL54bF1aXc5NqX15_HgjNP8af_1SG283S6t1vZG76lBbixX0m6K'
];

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_COOKIE, http_build_query($cookies, '', '; '));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
curl_close($curl);

print_r($response);

?>

CSRF check failed

Comment ça se fait ? J'y ai passé mon aprem et je tourne en rond.

Sur Linkedin, le serveur vérifie que l'en-tête csrf-token ait la même valeur que le cookie JSESSIONID. Si la valeur est différente, il retourne un « CSRF check failed ». Comme c'est le cas avec le second script. Mais pourtant c'est trivial, je pige vraiment pas. Le token li_at est correct (* je l'ai modifié sur jvc donc il ne marchera pas pour vous), je passe les mêmes cookies, le même header, la même URL... C'est un problème d'encodage de l'en-tête ?

godrik
godrik
Niveau 30
30 mars 2023 à 17:01:38

regarde la requete directement pour voir ce qu'il se passe sur le canal HTTP.
(Il y a certainement une option de curl et request qui peuvent dumper la communication.)

Izeopmgfl
Izeopmgfl
Niveau 3
30 mars 2023 à 19:00:17

Bien vu, je n'y avais pas pensé. Si jamais ça aide quelqu'un un jour, le dump de CURL :

curl_setopt($curl, CURLOPT_VERBOSE, true);
$streamVerboseHandle = fopen('logs.txt', 'w+');
curl_setopt($curl, CURLOPT_STDERR, $streamVerboseHandle);

Et comment il faut renseigner les headers. :pf:

curl_setopt($curl, CURLOPT_HTTPHEADER, array('csrf-token: a'));

Merci godrik !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment