Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2021-05-31T18:14:32+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Python Requests & Bottle : Problème d'upload, message #2348072021-05-31T18:14:32+02:00guillaumez/@guillaumezhttps://zestedesavoir.com/forums/sujet/15402/python-requests-bottle-probleme-dupload/?page=1#p234807<p>Solution de Gustavi sur discord :</p>
<p>Sur le client:
r = requests.post("<a href="http://localhost/upload%22">http://localhost/upload"</a>, files={"newfile": f.read()})</p>Python Requests & Bottle : Problème d'upload, message #2348062021-05-31T17:53:54+02:00guillaumez/@guillaumezhttps://zestedesavoir.com/forums/sujet/15402/python-requests-bottle-probleme-dupload/?page=1#p234806<p>Hello, du coup j’ai un soucis qui m’a fait perdre pas mal de temps aujourd’hui.
Je souhaite uploader des fichiers automatiquement via le module requests.</p>
<p>J’ai essayé de tourner le code dans tous les sens sans arriver a faire ce que je veux.
Je parvient à upload un fichier via un naviguateur mais pas via mon script client qui utilise requests</p>
<p>En suivant des forums j’ai essayer pas mal de choses, notamment d’upload sur <a href="https://httpbin.org/post">https://httpbin.org/post</a> plutôt que sur mon serveur,
ça fonctionne sur httpbin… Mais pas sur mon serveur <img src="/static/smileys/svg/1f606.svg" alt="x)" class="smiley"> alors voilà je vous présente un échantillons de mon code, qui me pose soucis:</p>
<p>Pour le server:</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span><span data-count="29"></span><span data-count="30"></span><span data-count="31"></span><span data-count="32"></span><span data-count="33"></span><span data-count="34"></span><span data-count="35"></span><span data-count="36"></span><span data-count="37"></span><span data-count="38"></span><span data-count="39"></span></div><pre><code class="hljs language-py"><span class="hljs-comment">#!/usr/bin/env python3</span>
<span class="hljs-keyword">from</span> cheroot <span class="hljs-keyword">import</span> wsgi
<span class="hljs-keyword">from</span> cheroot.ssl.builtin <span class="hljs-keyword">import</span> BuiltinSSLAdapter
<span class="hljs-keyword">from</span> beaker.middleware <span class="hljs-keyword">import</span> SessionMiddleware
<span class="hljs-keyword">from</span> bottle <span class="hljs-keyword">import</span> (
route,
response,
run,
redirect,
request,
static_file,
ServerAdapter,
default_app,
)
<span class="hljs-keyword">import</span> os
os.system(<span class="hljs-string">"mkdir downloaded"</span>)
<span class="hljs-meta">@route("/upload1")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">upload1</span>():</span>
<span class="hljs-keyword">return</span>(<span class="hljs-string">"\
<form method='post' action='/upload' enctype='multipart/form-data'>\
<input type='file' name='newfile'>\
<input type='submit' value='Submit'>\
</form>"</span>)
<span class="hljs-meta">@route('/upload', method="POST")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">upload</span>():</span>
print(<span class="hljs-string">"bup"</span>)
<span class="hljs-comment"># get the 'newfile' field from the form</span>
newfile = request.files.get(<span class="hljs-string">'newfile'</span>)
print(newfile)
save_path = os.path.join(<span class="hljs-string">"downloaded"</span>, newfile.filename)
newfile.save(save_path)
<span class="hljs-keyword">return</span> <span class="hljs-string">"ok"</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
run(app=default_app(), host=<span class="hljs-string">"0.0.0.0"</span>, port=<span class="hljs-number">80</span>, debug=<span class="hljs-literal">True</span>, reloader=<span class="hljs-literal">True</span>)
</code></pre></div>
<p>Pour le client :</p>
<div class="hljs-code-div hljs-code-py"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span></div><pre><code class="hljs language-py"><span class="hljs-comment">#!/usr/bin/env python3</span>
<span class="hljs-keyword">import</span> requests
os.system(<span class="hljs-string">"echo 'blablabla' >> test.txt"</span>)
<span class="hljs-keyword">with</span> open(<span class="hljs-string">"test.txt"</span>,<span class="hljs-string">"rb"</span>) <span class="hljs-keyword">as</span> f:
r = requests.post(<span class="hljs-string">"http://localhost/upload"</span>, data=f.read())
print(r)
</code></pre></div>
<p>Voilà l’erreur en elle même, lors du premier Bup j’utilise mon client pour envoyer le fichier file.txt (echec) lors du second bup j’utilise mon naviguateur pour upload le fichier (ok):</p>
<figure><img src="/media/galleries/14949/57281033-d8ad-46f6-be29-2504449e3514.png" alt="image.png"><figcaption>image.png</figcaption></figure>
<p>Merci d’avance. Je suis disponible en vocal sur discord si quelqu’un à envie de m’aider.</p>Utiliser le module requests pour envoyer des infos en POST, message #1932632018-11-18T18:59:22+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193263<p><a href="/membres/voir/Situphen/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Situphen</span></a>, j’ai édité pendant que tu écrivais. Le problème venait bien des inputs manquants (bizarrement, pas _method). Il m’en manquait trois: rememberMe, et deux autres cachés (dont un vide). Mais ça marche maintenant, merci !</p>Utiliser le module requests pour envoyer des infos en POST, message #1932622018-11-18T18:54:05+01:00Situphen/@Situphenhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193262<p>Ah, c’est peut-être parce que tu n’envoies pas <code><input type="hidden" name="_method" value="POST"/></code> dans ta requête POST, et donc ça fait une erreur 400. Regarde aussi s’il n’y a pas d’autres champs que tu ne mets pas dans ta requête POST.</p>
<blockquote>
<p>Donc d’après l’explication wikipedia, cette clé reste valide quelques minutes. La question que je me pose est donc si elle change entre ma requête GET pour l’isoler, et ma requête POST qui l’envoie. Je suis tenté de dire que oui, et que c’est le soucis, mais je n’en sais rien.</p>
</blockquote>
<p>Je ne vois pas pourquoi elle changerait. En fait, avec ton script tu fais le même comportement que lorsque tu te connectes avec ton navigateur, tu fais une requête GET sur la page de connexion, puis tu fais une requête POST sur la page d’authentification du formulaire.</p>Utiliser le module requests pour envoyer des infos en POST, message #1932602018-11-18T18:36:30+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193260<p>Édit : c’est résolu ! Voir plus bas. Merci !</p>
<p>Merci pour la réponse.</p>
<blockquote>
<p>Es-tu sûr</p>
</blockquote>
<p>Ça semble ok. En dessous, <code>hiddenkeyin</code></p>
<p><code><form action="/fra/users/check_login" id="UserLoginForm" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="POST"/><input type="hidden" name="data[_Token][key]" value="1ab777751d5c524c9f85230338119dc06be0258e9493a890dd940b0195c07549606ebddda67f8caa7d92dab6c5011b7b22f7b4126bcc57526b1932287c44733d" id="Token1963811480"/></div><div md-whiteframe="1" id="login-form"></code></p>
<p>Et ici, <code>key</code></p>
<p><code>1ab777751d5c524c9f85230338119dc06be0258e9493a890dd940b0195c07549606ebddda67f8caa7d92dab6c5011b7b22f7b4126bcc57526b1932287c44733d</code></p>
<p>Donc d’après l’explication wikipedia, cette clé reste valide quelques minutes. La question que je me pose est donc si elle change entre ma requête GET pour l’isoler, et ma requête POST qui l’envoie. Je suis tenté de dire que oui, et que c’est le soucis, mais je n’en sais rien.</p>
<p>Pour BeautifulSoup, c’est bon à savoir, mais puisque j’essaie d’apprendre, je vais me concentrer sur requests pour l’instant. Déjà que mon python de base est pas génial… Mais merci pour l’information !</p>
<p>Et merci encore pour l’aide.</p>
<hr>
<p>Édit : J’ai réussi ! En gros, il fallait que je mette tous les inputs, même ceux a priori inutiles (rememberMe) et les <strong>deux</strong> cachés. Ça donne (sans commentaires cette fois, c’est presque le même code)</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">import</span> requests
sentence = <span class="hljs-string">"Un réacteur nucléaire produit autant d'énergie que plus de mille éoliennes."</span>
login_url = <span class="hljs-string">"https://tatoeba.org/swe/users/login"</span>
check_login_url = <span class="hljs-string">"https://tatoeba.org/swe/users/check_login"</span>
add_sentence_url =<span class="hljs-string">"https://tatoeba.org/swe/sentences/add_an_other_sentence/"</span>
selectedLang=<span class="hljs-string">"fra"</span>
value=sentence
data={<span class="hljs-string">'selectedLang'</span>:selectedLang,<span class="hljs-string">'value'</span>:value}
s=requests.Session()
r0=s.get(url=login_url)
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> r0.text.split(<span class="hljs-string">"\n"</span>):
<span class="hljs-keyword">if</span> (line.find(<span class="hljs-string">"hidden"</span>)!=<span class="hljs-number">-1</span> <span class="hljs-keyword">and</span> line.find(<span class="hljs-string">"UserLoginForm"</span>)!=<span class="hljs-number">-1</span>):
hiddenkeyin=line
<span class="hljs-keyword">if</span> (line.find(<span class="hljs-string">"hidden"</span>)!=<span class="hljs-number">-1</span> <span class="hljs-keyword">and</span> line.find(<span class="hljs-string">"TokenFields"</span>)!=<span class="hljs-number">-1</span>):
Tokenline=line
<span class="hljs-keyword">for</span> attribute <span class="hljs-keyword">in</span> hiddenkeyin.split():
<span class="hljs-keyword">if</span> <span class="hljs-string">"value"</span> <span class="hljs-keyword">in</span> attribute:
key=attribute[<span class="hljs-number">7</span>:<span class="hljs-number">-1</span>]
<span class="hljs-keyword">for</span> attribute <span class="hljs-keyword">in</span> Tokenline.split():
<span class="hljs-keyword">if</span> <span class="hljs-string">"value"</span> <span class="hljs-keyword">in</span> attribute:
token=attribute[<span class="hljs-number">7</span>:<span class="hljs-number">-1</span>]
<span class="hljs-keyword">break</span>
connexion={<span class="hljs-string">'data[User][username]'</span>:<span class="hljs-string">"Rockaround"</span>,<span class="hljs-string">'data[User][password]'</span>:<span class="hljs-string">"password"</span>,<span class="hljs-string">'data[_Token][key]'</span>:key,<span class="hljs-string">'data[User][rememberMe]'</span>:<span class="hljs-string">"0"</span>,<span class="hljs-string">'data[_Token][fields]'</span>:token,<span class="hljs-string">'data[_Token][unlocked]'</span>:<span class="hljs-string">''</span>}
r1=s.post(url=check_login_url,data=connexion)
r=s.post(url=add_sentence_url,data=data)
print(r1.url)
print(r1)
print(r.url)
print(r)
</code></pre></div>
<p>Un très gros merci pour l’aide. J’aurais pu chercher très longtemps sinon. <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Utiliser le module requests pour envoyer des infos en POST, message #1932562018-11-18T17:43:16+01:00Situphen/@Situphenhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193256<blockquote>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-comment">#Ça semble marcher, mais peut-être pas du tout pythonique. Je prends les conseils.</span>
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> r0.text.split(<span class="hljs-string">"\n"</span>):
<span class="hljs-keyword">if</span> (line.find(<span class="hljs-string">"hidden"</span>)!=<span class="hljs-number">-1</span> <span class="hljs-keyword">and</span> line.find(<span class="hljs-string">"UserLoginForm"</span>)!=<span class="hljs-number">-1</span>):
hiddenkeyin=line
<span class="hljs-keyword">for</span> attribute <span class="hljs-keyword">in</span> hiddenkeyin.split():
<span class="hljs-keyword">if</span> <span class="hljs-string">"value"</span> <span class="hljs-keyword">in</span> attribute:
key=attribute[<span class="hljs-number">7</span>:<span class="hljs-number">-1</span>]
</code></pre></div>
</blockquote>
<p>Es-tu sûr de bien récupérer le <code>value</code> de <code><input type="hidden" name="data[_Token][key]" value="a0e7e962ecd015f798911dc8f1a0798c38a6140c5187874654c15aa0211398f934890dcb165840c7d262760058a061619dcd4771fe06f62b5af484926bb12cee" id="Token860200558"/></code> et non pas <code><input type="hidden" name="_method" value="POST"/></code> qui est sur la même ligne ?</p>
<p>Ta méthode est assez rudimentaire mais en l’améliorant un peu ça doit pouvoir faire le job. Si tu veux plus de facilité tu peux passer par <a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc/">BeautifulSoup</a> qui permet de rechercher facilement une balise HTML puis de chercher parmi ses balises enfant. Par exemple tu pourrais rechercher le <code><form id="UserLoginForm"></code> puis recherche le <code><input name="data[_Token][key]"></code> à l’intérieur de ce formulaire, comme ça tu es sûr d’avoir la bonne balise. Ceci dit, c’est peut-être prendre un bazooka pour tuer une mouche.</p>
<blockquote>
<p>Par contre, je ne suis pas sûr de voir l’intérêt de cette clé, si on peut de toute façon la récupérer.</p>
</blockquote>
<p>Je cite l<a href="https://fr.wikipedia.org/wiki/Cross-site_request_forgery">a page Wikipédia sur les attaques CSRF</a> :</p>
<figure><blockquote>
<p>Utiliser des jetons de validité dans les formulaires : faire en sorte qu’un formulaire posté ne soit accepté que s’il a été produit quelques minutes auparavant : le jeton de validité en sera la preuve. Le jeton de validité doit être transmis en paramètre et vérifié côté serveur.</p>
</blockquote><figcaption>Wikipédia</figcaption></figure>Utiliser le module requests pour envoyer des infos en POST, message #1932452018-11-18T16:24:21+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193245<p>Encore une fois merci pour la réponse. Je n’avais pas du tout vu l’input caché, merci.</p>
<p>Maintenant, j’arrive à faire ma requête pour récupérer la clé, pas de soucis, mais ça ne marche toujours pas. Je copie mon code en dessous (password a bien entendu été changé, mais il est correct dans le script, vérifié).</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">import</span> requests
<span class="hljs-comment">#Phrase à insérer</span>
sentence = <span class="hljs-string">"Un réacteur nucléaire produit autant d'énergie que plus de mille éoliennes."</span>
<span class="hljs-comment">#Différentes url utiles</span>
login_url = <span class="hljs-string">"https://tatoeba.org/fra/users/login"</span>
check_login_url = <span class="hljs-string">"https://tatoeba.org/fra/users/check_login"</span>
add_sentence_url =<span class="hljs-string">"https://tatoeba.org/fra/sentences/add_an_other_sentence/"</span>
<span class="hljs-comment">#Arguments pour ajouter une phrase</span>
selectedLang=<span class="hljs-string">"fra"</span>
value=sentence
data={<span class="hljs-string">'selectedLang'</span>:selectedLang,<span class="hljs-string">'value'</span>:value}
<span class="hljs-comment">#Création de ma session</span>
s=requests.Session()
<span class="hljs-comment">#Récupération de la page pour pouvoir en extraire la clé cachée.</span>
r0=s.get(url=login_url)
<span class="hljs-comment">#Ça semble marcher, mais peut-être pas du tout pythonique. Je prends les conseils.</span>
<span class="hljs-keyword">for</span> line <span class="hljs-keyword">in</span> r0.text.split(<span class="hljs-string">"\n"</span>):
<span class="hljs-keyword">if</span> (line.find(<span class="hljs-string">"hidden"</span>)!=<span class="hljs-number">-1</span> <span class="hljs-keyword">and</span> line.find(<span class="hljs-string">"UserLoginForm"</span>)!=<span class="hljs-number">-1</span>):
hiddenkeyin=line
<span class="hljs-keyword">for</span> attribute <span class="hljs-keyword">in</span> hiddenkeyin.split():
<span class="hljs-keyword">if</span> <span class="hljs-string">"value"</span> <span class="hljs-keyword">in</span> attribute:
key=attribute[<span class="hljs-number">7</span>:<span class="hljs-number">-1</span>]
<span class="hljs-comment">#Création de l'argument pour se connecter</span>
connexion={<span class="hljs-string">'data[User][username]'</span>:<span class="hljs-string">"Rockaround"</span>,<span class="hljs-string">'data[User][password]'</span>:<span class="hljs-string">"password"</span>,<span class="hljs-string">'data[_Token][key]'</span>:key}
<span class="hljs-comment">#quelques tests</span>
r1=s.post(url=check_login_url,data=connexion)
r2=s.post(url=login_url,data=connexion)
r=s.post(url=add_sentence_url,data=data)
</code></pre></div>
<p><code>r1</code> et <code>r2</code> retourne une erreur 400.</p>
<p><code>r</code> retourne un code 200, mais avec une redirection vers la page de login.</p>
<p>Il semblerait donc que je me trompe toujours. Ai-je bien géré les <code>data[User][username]</code> ? Se pourrait-il que la clé cachée ait changée entre mon <code>GET</code> et mon <code>POST</code> ?</p>
<p>En tout cas, j’aime bien ta manière de répondre : elle aide, mais elle me laisse réfléchir et (avec du bol) progresser. Là par exemple, j’ai mis un bon moment à comprendre que je ne pouvais pas récupérer la clé cachée dans le code source et l’inscrire en dur dans le script. Par contre, je ne suis pas sûr de voir l’intérêt de cette clé, si on peut de toute façon la récupérer.</p>Utiliser le module requests pour envoyer des infos en POST, message #1932352018-11-18T14:24:57+01:00Situphen/@Situphenhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193235<blockquote>
<p>Ensuite, j’ai regardé le code source de la page de login. Déjà, il semblerait que le formulaire renvoie vers une autre page <code>action="/fra/users/check_login"</code>. C’est sur celle-là qu’il faut que j’envoie mes infos?</p>
</blockquote>
<p>Oui, c’est exact !</p>
<blockquote>
<p>Normalement, si j’ai tout suivi, c’est ce <code>name</code> qui est envoyé. Mais là, ça ne semble pas être une variable classique. Qu’est-ce ? Et comment puis-je l’utiliser dans mon petit script ?</p>
</blockquote>
<p>Si je ne me trompe pas, ça permet que les valeurs de <code>data[User][username]</code> et <code>data[User][password]</code> soient automatiquement transformées en un dictionnaire ou une autre structure de données :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py">data = {
<span class="hljs-string">'User'</span>: {
<span class="hljs-string">'username'</span>: <span class="hljs-string">''</span>,
<span class="hljs-string">'password'</span>: <span class="hljs-string">''</span>
}
}
</code></pre></div>
<p>Mais pour toi ça ne change strictement rien par rapport à une variable classique <code>foo-bar</code>. <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
<hr>
<p>En fait pour garder la même session, il faut commencer par écrire ça au début du fichier :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">import</span> requests
session = requests.session()
</code></pre></div>
<p>Puis ensuite tu peux faire tes requêtes GET ou POST :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span></div><pre><code class="hljs language-py">session.get(url)
session.post(url, data)
</code></pre></div>
<p>Pour une requête POST, <code>url</code> correspond à la valeur de l’attribut <code>action</code> de la balise <code><form></code> (enfin pas exactement, il faut rajouter la partie <code>https://tatoeba.org</code>) et <code>data</code> est un dictionnaire qui contient chaque attribut <code>name</code> avec sa valeur. Pour toi ça va donner quelque chose comme ça :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py">url = <span class="hljs-string">'https://tatoeba.org/fra/users/check_login'</span>
data = {
<span class="hljs-string">'data[User][username]'</span>: <span class="hljs-string">'...'</span>,
<span class="hljs-string">'data[User][password]'</span>: <span class="hljs-string">'...'</span>,
<span class="hljs-string">'...'</span>: <span class="hljs-string">'...'</span>
}
</code></pre></div>
<p>Une difficulté que tu vas probablement rencontrer est que dans le formulaire il y a un champ caché qui contient un token. Ce token est unique et, si le site web est bien fait, il est nécessaire de l’avoir pour envoyer la requête :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-html"><span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"hidden"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"data[_Token][key]"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"fc40bc57dab6cd58ecdcd7ed634b6896c10d64d7a2e338d685514cf318f0a87488392f0548fd1831a4350104176645629b5e6d4eb12834607c27980617d8c2ca"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"Token764596425"</span>/></span>
</code></pre></div>
<p>Il va donc falloir faire ces étapes pour se connecter :</p>
<ol>
<li>Envoyer une requête sur <code>https://tatoeba.org/fra/users/login</code></li>
<li>Trouver la valeur de <code>data[_Token][key]</code> dans le formulaire de connexion (attention, il y a plusieurs formulaires sur cette page)</li>
<li>Envoyer ta requête POST avec la valeur de <code>data[_Token][key]</code> et tes identifiants</li>
</ol>Utiliser le module requests pour envoyer des infos en POST, message #1932342018-11-18T13:54:07+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193234<p>Merci, c’est exactement le type de réponse qui m’aide.</p>
<p>J’ai donc été lire un peu la doc sur <code>requests.Session()</code>, et même si tout n’est pas clair pour moi, je crois comprendre le principe.</p>
<p>Ensuite, j’ai regardé le code source de la page de login. Déjà, il semblerait que le formulaire renvoie vers une autre page <code>action="/fra/users/check_login"</code>. C’est sur celle-là qu’il faut que j’envoie mes infos?</p>
<p>Le second point, c’est que je ne trouve pas le nom des variables que je dois envoyer. Si je regarde le code des champs, ça donne</p>
<p><code><input name="data[User][username]" maxlength="20" type="text" id="UserUsername" required="required" class="md-input"></code></p>
<p>Normalement, si j’ai tout suivi, c’est ce <code>name</code> qui est envoyé. Mais là, ça ne semble pas être une variable classique. Qu’est-ce ? Et comment puis-je l’utiliser dans mon petit script ?</p>
<p>Merci !</p>Utiliser le module requests pour envoyer des infos en POST, message #1932172018-11-17T23:04:49+01:00Situphen/@Situphenhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193217<p>Alors, je ne suis pas sûr que ça réponde à ta question, mais j’ai déjà fait un script pour aller chercher mes notes de cours sur un site où il faut être authentifié et je suis passé par ces étapes :</p>
<ol>
<li>Demander à <code>requests</code> que les requêtes soient faites dans une même session (c’est-à-dire en gardant les cookies)</li>
<li>Se connecter en envoyant une requête POST sur la page d’authentification (pour toi, <code>https://tatoeba.org/fra/users/login</code>) avec ses identifiants</li>
<li>Faire mes requêtes</li>
</ol>Utiliser le module requests pour envoyer des infos en POST, message #1932112018-11-17T20:22:06+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11607/utiliser-le-module-requests-pour-envoyer-des-infos-en-post/?page=1#p193211<p>Bonsoir,</p>
<p>Je me suis mis/remis au python dernièrement, et pour m’entraîner, je voulais écrire un script pour me simplifier l’utilisation d’un site que j’utilise régulièrement, <a href="https://tatoeba.org">https://tatoeba.org</a>.</p>
<p>L’idée que j’avais, c’était de pouvoir avoir un fichier texte avec une phrase par ligne, et d’automatiser l’envoi. De cette manière, je pourrai contribuer même sans internet.</p>
<p>Pour commencer, de manière la plus simple possible, j’ai juste une phrase en dur dans le code. J’ai décidé d’utiliser le module <code>requests</code>, qui semble permettre de faire ce que je veux. Je me suis renseigné un peu auprès du créateur du site, et apparement, les phrases sont ajoutées sur l’url <code>https://tatoeba.org/swe/sentences/add_an_other_sentence</code> en méthode POST avec les paramètres suivants :</p>
<ul>
<li>selectedLang: ISO code de la langue de la phrase</li>
<li>value: texte de la phrase</li>
</ul>
<p>De là, j’ai écrit quelques lignes, ainsi</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">import</span> requests
sentence = <span class="hljs-string">"Je ne sais pas programmer."</span>
tato_url = <span class="hljs-string">"https://tatoeba.org/swe/sentences/add_an_other_sentence"</span>
selectedLang=<span class="hljs-string">"fra"</span>
value=sentence
data={<span class="hljs-string">'selectedLang'</span>:selectedLang,<span class="hljs-string">'value'</span>:value}
r=requests.post(url=tato_url,data=data)
</code></pre></div>
<p>En faisant <code>print(r.url)</code>, j’obtiens <code>https://tatoeba.org/fra/users/login</code>, que j’interprête comme quoi il faut que j’envoie un cookie.</p>
<p>L’ennui, c’est que je ne suis pas sûr que ce soit le soucis, et que je ne parviens pas à trouver le cookie en question. Il y en a 6, dont un qui s’appelle <code>CakeCookie[User]</code>, mais son contenu est une longue chaîne de caractères, mon pseudo ne semble pas y être. Une fois trouvé, j’imagine qu’il me suffira d’ajouter/modifier ces lignes.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span></div><pre><code class="hljs language-py">cookies=dict(MyUsername=<span class="hljs-string">"Username"</span>,MyPassword=<span class="hljs-string">"password"</span>)
r=requests.post(url=tato_url,data=data,cookies=cookies)
</code></pre></div>
<p>Mes questions:</p>
<ol>
<li>Est-ce que je me trompe du tout au tout ?</li>
<li>Comment faire pour le cookie ?</li>
<li>Y a-t-il une manière plus simpe ou plus pythonesque de faire ?</li>
<li>Aurais-je du poster dans le forum de dev web ?</li>
</ol>
<p>Merci !</p>Récupération d'url(s) de résultats de recherches Google, message #1809472018-05-27T17:51:30+02:00ache/@achehttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180947<p>C’est une URL <a href="https://en.wikipedia.org/wiki/Percent_encodind">Percent-coded</a> pour pouvoir l’utiliser comme valeur dans un <em>query string</em> (la partie après le ? dans l’URL).</p>
<p>|urllib| gère ça très bien. Normalement il te convertit ça en dico et tu récupères la valeur de la clé ’q’ et tu as l’URL directement.</p>Récupération d'url(s) de résultats de recherches Google, message #1809442018-05-27T17:21:01+02:00rezemika/@rezemikahttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180944<p>Ah, en effet, c’est Google qui fournit des liens qui font des redirections vers ces URL. Apparemment, le module <code>urllib</code> fournit une fonction pour les parser (<a href="https://stackoverflow.com/a/28328919">voir ici</a>), ça m’a l’air de convenir à ton usage. <img alt=";)" src="/static/smileys/clin.png"></p>
<p>Par contre, j’ai l’impression qu’il y a encore quelques transformations à faire sur l’URL pour pouvoir faire une requête avec…</p>Récupération d'url(s) de résultats de recherches Google, message #1809412018-05-27T17:04:00+02:00Rached/@Rachedhttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180941<p>Salut ! En effet ça fonctionne, je récupère bien l’URL mais disons "morcellée". Elle se trouve entre /url?q= et &sa=U&ved=0ahUKEwi..... alors que j’aimerais seulement récupérer l’url. Je pense utiliser les expressions régulières pour palier à se problème.</p>Récupération d'url(s) de résultats de recherches Google, message #1809332018-05-27T14:38:17+02:00rezemika/@rezemikahttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180933<p>Salut !</p>
<p>Qu’est-ce que ça donne avec ceci ? Normalement, tu peux accéder à n’importe quel attribut d’un tag HTML de cette façon avec BeautifulSoup.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kn">import</span> <span class="nn">requests</span>
<span class="kn">import</span> <span class="nn">bs4</span>
<span class="n">URL</span> <span class="o">=</span> <span class="s2">"https://www.google.fr/search?q=pablo+picaso&oq=pablo+picaso"</span>
<span class="k">with</span> <span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">URL</span><span class="p">)</span> <span class="k">as</span> <span class="n">webpage</span><span class="p">:</span>
<span class="n">parse</span> <span class="o">=</span> <span class="n">bs4</span><span class="o">.</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">webpage</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="s2">"lxml"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">h3</span> <span class="ow">in</span> <span class="n">parse</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s2">"h3"</span><span class="p">,</span> <span class="n">attrs</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"class"</span><span class="p">:</span><span class="s2">"r"</span><span class="p">}):</span>
<span class="hll"> <span class="k">print</span><span class="p">(</span><span class="n">h3</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'a'</span><span class="p">)[</span><span class="s2">"href"</span><span class="p">])</span>
</span></pre></div>
</td></tr></table></div>Récupération d'url(s) de résultats de recherches Google, message #1809302018-05-27T12:51:14+02:00Rached/@Rachedhttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180930<p>Re’. Finalement je compte laisser à plus tard ce petit bout de code, je pense pouvoir récupérer l’url avec des expressions régulières bien qu’il me semble que ce genre de pratique est interdite sur Google je vais peut être me pencher sur <a href="http://duckduckgo.com">duckduckgo.com</a> qui semble plus flexible. </p>
<p>Merci pour votre aide ! </p>Récupération d'url(s) de résultats de recherches Google, message #1809152018-05-26T17:47:45+02:00WinXaito/@WinXaitohttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180915<p>Je ne savais pas, autant pour moi. </p>Récupération d'url(s) de résultats de recherches Google, message #1809142018-05-26T17:46:40+02:00ache/@achehttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180914<p>CustomSearch ne permet pas de chercher sur l’entièreté du Web mais seulement sur un nombre de site restrein (custom).</p>Récupération d'url(s) de résultats de recherches Google, message #1809132018-05-26T17:38:39+02:00WinXaito/@WinXaitohttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180913<figure>
<blockquote>
<p>Quel API ?</p>
</blockquote>
<figcaption><a href="https://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180910">ache</a></figcaption>
</figure>
<p><code>https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=017576662512468239146:omuauf_lfve&q=lectures</code></p>
<p>Nous donnes:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="err">...</span>
<span class="p">{</span>
<span class="nt">"kind"</span><span class="p">:</span> <span class="s2">"customsearch#result"</span><span class="p">,</span>
<span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Lectures"</span><span class="p">,</span>
<span class="nt">"htmlTitle"</span><span class="p">:</span> <span class="s2">"\u003cb\u003eLectures\u003c/b\u003e"</span><span class="p">,</span>
<span class="nt">"link"</span><span class="p">:</span> <span class="s2">"https://www.cis.upenn.edu/~cis160/current/lectures.html"</span><span class="p">,</span>
<span class="nt">"displayLink"</span><span class="p">:</span> <span class="s2">"www.cis.upenn.edu"</span><span class="p">,</span>
<span class="nt">"snippet"</span><span class="p">:</span> <span class="s2">"Lectures are held in CHEM102 every Tuesday and Thursday from 1:30-3:00 PM. \nWhile lecture attendance is not mandatory, it is highly recommended that you ..."</span><span class="p">,</span>
<span class="nt">"htmlSnippet"</span><span class="p">:</span> <span class="s2">"\u003cb\u003eLectures\u003c/b\u003e are held in CHEM102 every Tuesday and Thursday from 1:30-3:00 PM. \u003cbr\u003e\nWhile \u003cb\u003electure\u003c/b\u003e attendance is not mandatory, it is highly recommended that you&nbsp;..."</span><span class="p">,</span>
<span class="nt">"cacheId"</span><span class="p">:</span> <span class="s2">"k9487vOAo70J"</span><span class="p">,</span>
<span class="nt">"formattedUrl"</span><span class="p">:</span> <span class="s2">"https://www.cis.upenn.edu/~cis160/current/lectures.html"</span><span class="p">,</span>
<span class="nt">"htmlFormattedUrl"</span><span class="p">:</span> <span class="s2">"https://www.cis.upenn.edu/~cis160/current/\u003cb\u003electures\u003c/b\u003e.html"</span><span class="p">,</span>
<span class="nt">"pagemap"</span><span class="p">:</span> <span class="p">{</span>
<span class="nt">"metatags"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">"viewport"</span><span class="p">:</span> <span class="s2">"width=device-width, initial-scale=1.0"</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">},</span>
<span class="nt">"labels"</span><span class="p">:</span> <span class="p">[</span>
<span class="p">{</span>
<span class="nt">"name"</span><span class="p">:</span> <span class="s2">"lectures"</span><span class="p">,</span>
<span class="nt">"displayName"</span><span class="p">:</span> <span class="s2">"Lectures"</span><span class="p">,</span>
<span class="nt">"label_with_op"</span><span class="p">:</span> <span class="s2">"more:lectures"</span>
<span class="p">}</span>
<span class="p">]</span>
<span class="p">}</span><span class="err">,</span>
<span class="err">...</span>
</pre></div>
</td></tr></table></div>
<p>Avec plusieurs entrées de ce type.</p>Récupération d'url(s) de résultats de recherches Google, message #1809102018-05-26T17:20:03+02:00ache/@achehttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180910<p>Quel API ?</p>Récupération d'url(s) de résultats de recherches Google, message #1809092018-05-26T17:10:23+02:00WinXaito/@WinXaitohttps://zestedesavoir.com/forums/sujet/10774/recuperation-durls-de-resultats-de-recherches-google/?page=1#p180909<p>Ne serait il pas plus simple de passer par l’api de Google ?</p>