Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3709 > unrolled thread

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

Started byValrik <nospam@valrik.invalid>
First post2022-01-20 01:20 +0100
Last post2022-02-05 00:28 +0100
Articles 5 — 2 participants

Back to article view | Back to fr.comp.lang.python


Contents

  Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ». Valrik <nospam@valrik.invalid> - 2022-01-20 01:20 +0100
    Re: Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ». Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2022-01-20 18:25 +0100
      Re: Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ». Valrik <nospam@valrik.invalid> - 2022-01-21 01:21 +0100
        Re: Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ». Valrik <nospam@valrik.invalid> - 2022-01-21 03:21 +0100
          Re: Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ». Valrik <nospam@valrik.invalid> - 2022-02-05 00:28 +0100

#3709 — Tentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ».

FromValrik <nospam@valrik.invalid>
Date2022-01-20 01:20 +0100
SubjectTentative de transcription d'une ligne de commande « Curl » à l'aide de « urllib3 ».
Message-ID<87lezbntpp.fsf@s02.forall>
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.  :-)

[toc] | [next] | [standalone]


#3710

FromAlain Ketterlin <alain@universite-de-strasbourg.fr.invalid>
Date2022-01-20 18:25 +0100
Message-ID<87h79ypbeo.fsf@universite-de-strasbourg.fr.invalid>
In reply to#3709
Valrik <nospam@valrik.invalid> 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) {\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.

OK.

> 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}"}'

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.

[toc] | [prev] | [next] | [standalone]


#3711

FromValrik <nospam@valrik.invalid>
Date2022-01-21 01:21 +0100
Message-ID<87czkmlz0p.fsf@s02.forall>
In reply to#3710
Merci pour ta réponse.  :-)

Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> 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.   :-)

[toc] | [prev] | [next] | [standalone]


#3712

FromValrik <nospam@valrik.invalid>
Date2022-01-21 03:21 +0100
Message-ID<878rv9n80y.fsf@s02.forall>
In reply to#3711
Bon j'ai fini par trouver !  :-))

Il fallait « échapper » les « \n, ", \t » et autres joyeusetés avec un «
\ ». Cela donne :

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}\"}'

puis au cœur de la requête :

r = http.request(
    'POST', # Ton intuition était la bonne !
    'https://openapi.radiofrance.fr/v1/graphql?x-token=b0b8d190-44b8-449f-b3fc-62cf10d3c461',
    body= data_binary, # « body= », trouvé dans la doc. Déjà utilisé, mais mal.
    headers={…

Ça devrait aller mieux maintenant… jusqu'à la prochaine difficulté.  ;-)


Merci encore.

[toc] | [prev] | [next] | [standalone]


#3746

FromValrik <nospam@valrik.invalid>
Date2022-02-05 00:28 +0100
Message-ID<87k0eafbzm.fsf@s02.forall>
In reply to#3712
Valrik <nospam@valrik.invalid> writes:

> Bon j'ai fini par trouver !  :-))
>
> Il fallait « échapper » les « \n, ", \t » et autres joyeusetés avec un «
> \ ». Cela donne :
>
> 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}\"}'
>
> puis au cœur de la requête :
>
> r = http.request(
>     'POST', # Ton intuition était la bonne !
>     'https://openapi.radiofrance.fr/v1/graphql?x-token=b0b8d190-44b8-449f-b3fc-62cf10d3c461',
>     body= data_binary, # « body= », trouvé dans la doc. Déjà utilisé, mais mal.
>     headers={…
>
> Ça devrait aller mieux maintenant… jusqu'à la prochaine difficulté.  ;-)
>
>
> Merci encore.

Ya encore plus simple en fait : il suffit de formater la requête en «
raw ». Ex :
data_binary= r'{"query":"{\n  brands {\n    title\n     description\n}\n}\n"}'

[toc] | [prev] | [standalone]


Back to top | Article view | fr.comp.lang.python


csiph-web