Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tentative de transcription d'une ligne de commande « Curl » Í  l'aide de « urllib3 ».

2 réponses
Avatar
Valrik
Bonjour Í  tous,

je suis grand débutant en Python, Json et Graphql. Mes questions, donc,
pourront peut-être vous paraÍ®tre naͯves.

Je tente actuellement de programmer une petite application en lignes de
commandes (CLI) permettant de visualiser la grille des programmes de
Radio France. Openapi de Radio France, m'a fourni une clé afin de
pouvoir me connecter sur leur serveur Graphql.

Il existe également un « terrain de jeux » sur
https://openapi.radiofrance.fr/ avec des exemples. Il y a possibilité de
copier la requête et cela donne pour l'un des exemples :

curl 'https://openapi.radiofrance.fr/v1/graphql?x-token=clé_que_je_ne_peux_pas_rendre_publique_pour_l'instant' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: https://openapi.radiofrance.fr' --data-binary '{"query":"{\n diffusionsOfShowByUrl(url: \"https://www.franceculture.fr/emissions/fictions-theatre-et-cie\", first: 10) {\n\t edges {\n cursor\n node {\n id\n title\n url\n published_date\n podcastEpisode {\n url\n title\n }\n }\n }\n }\n}"}' --compressed

À noter que cela fonctionne correctement dans un terminal.

J'ai tenté tant bien que mal de transcrire cette commande en Python et
voilÍ  ce que cela donne :

import urllib3

data_binary='{"query":"{\n diffusionsOfShowByUrl(url: \"https://www.franceculture.fr/emissions/fictions-theatre-et-cie\", first: 10) {\n\t edges {\n cursor\n node {\n id\n title\n url\n published_date\n podcastEpisode {\n url\n title\n }\n }\n }\n }\n}"}'

http = urllib3.PoolManager()

r = http.request(
'GET',
'https://openapi.radiofrance.fr/v1/graphql?x-token=clé_que_je_ne_peux_pas_rendre_publique_pour_l'instant',
headers={
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/json',
'Accept': 'application/json',
'Connection': 'keep-alive',
'DNT': '1', # Obsolète.
'Origin': 'https://openapi.radiofrance.fr'
}
)

print(r.data)

Cela me retourne :
b'Must provide query string.'

Ce qui est plutÍ´t logique puisque il n'y a aucune requête Graphql ! ;-)

J'ai tenté de trouver la transcription correcte de celle-ci sur
Internet, épluché la page Man de Curl, coder « Í  l'arrache »… rien n'y
fait !

Je n'est également rien trouvé sur « --compressed », mais je dois avouer
que j'ai fait beaucoup moins de recherche.

Et bien voilÍ , je pense avoir fait le tour de la question. Il ne me
reste plus qu'Í  vous remercier de votre attention. :-)

2 réponses

Avatar
Alain Ketterlin
Valrik writes:
je suis grand débutant en Python, Json et Graphql. Mes questions, donc,
pourront peut-être vous paraÍ®tre naͯves.

Je n'ai aucune idée de ce qu'est graphql.
curl 'https://openapi.radiofrance.fr/v1/graphql?x-token=clé_que_je_ne_peux_pas_rendre_publique_pour_l'instant' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: https://openapi.radiofrance.fr' --data-binary '{"query":"{n diffusionsOfShowByUrl(url: "https://www.franceculture.fr/emissions/fictions-theatre-et-cie", first: 10) {nt edges {n cursorn node {n idn titlen urln published_daten podcastEpisode {n urln titlen }n }n }n }n}"}' --compressed
À noter que cela fonctionne correctement dans un terminal.

OK.
import urllib3
data_binary='{"query":"{n diffusionsOfShowByUrl(url: "https://www.franceculture.fr/emissions/fictions-theatre-et-cie", first: 10) {nt edges {n cursorn node {n idn titlen urln published_daten podcastEpisode {n urln titlen }n }n }n }n}"}'

Tu ne fais jamais rien de ces données, alors qu'il me semble qu'elles
doivent partir vers le serveur (en tout cas, c'est ce que fait curl).
http = urllib3.PoolManager()
r = http.request(
'GET',

S'il y a des données Í  transmettre, il faut bien qu'elles soient quelque
part. Avec GET, ce serait dans l'uri.
Mais si j'en crois ta commande curl, c'est en POST qu'elles sont
envoyées (Í  cause de --data-binary), et c'est du JSON. Jette un oeil Í 
https://urllib3.readthedocs.io/en/stable/user-guide.html#json
'https://openapi.radiofrance.fr/v1/graphql?x-token=clé_que_je_ne_peux_pas_rendre_publique_pour_l'instant',
headers={
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/json',
'Accept': 'application/json',
'Connection': 'keep-alive',
'DNT': '1', # Obsolète.
'Origin': 'https://openapi.radiofrance.fr'
}
)
Je n'est également rien trouvé sur « --compressed », mais je dois avouer
que j'ai fait beaucoup moins de recherche.

Moi je fais "man curl" et je trouve :
| --compressed
| (HTTP) Request a compressed response using one of the algorithms
| curl supports, and save the uncompressed document. If this
| option is used and the server sends an unsupported encoding,
| curl will report an error.
|
Mes 2 cents.
-- Alain.
Avatar
Valrik
Merci pour ta réponse. :-)
Alain Ketterlin writes:
Je n'ai aucune idée de ce qu'est graphql.

C'est protocole qui permet de télé-charger uniquement les données qu'on
désire, Í  l'inverse d'un serveur web qui transfert toute la page. D'o͹
une économie de trafique. Et puis, cela doit être pratique pour
l'élaboration d'un client lourd.
Voir https://fr.wikipedia.org/wiki/GraphQL
Tu ne fais jamais rien de ces données, alors qu'il me semble qu'elles
doivent partir vers le serveur (en tout cas, c'est ce que fait curl).

Ben, comme je l'ai écrit, je les ai placées un peu partout… Mais, rien Í 
faire… Je n'arrive Í  rien ! Soit des message d'erreurs de la part de
l'interpréteur Python, soit le serveur Graphql me répond que le lui
raconte n'importe quoi ! L'exemple que j'ai donné, consistait en une
requête vide. Et lÍ , le serveur me répond : « Bien, mais avec des
données se serait mieux ! ».
r = http.request(
'GET',

S'il y a des données Í  transmettre, il faut bien qu'elles soient quelque
part. Avec GET, ce serait dans l'uri.

Je vais essayer de ce coté lÍ .
Mais si j'en crois ta commande curl, c'est en POST qu'elles sont

J'ai essayé ça aussi, mais la combinatoire devient énorme. Je n'ai donc
sans doute pas testé toutes les possibilités.
envoyées (Í  cause de --data-binary), et c'est du JSON. Jette un oeil Í 

Non, ça ressemble Í  du JSON, mais c'est du Graphql.
https://urllib3.readthedocs.io/en/stable/user-guide.html#json

DéjÍ  un peu épluché et c'est avec cela que j'ai d'ailleurs progressé.
Je n'est également rien trouvé sur « --compressed », mais je dois avouer
que j'ai fait beaucoup moins de recherche.

Moi je fais "man curl" et je trouve :

En fait, j'évoquais la transcription en Python de cette option.
Merci encore. :-)