Script upload sur pix.toile-libre.org

Bonjour!
Je suis parti dans la configuration de rox, qui prend du temps mais en vaut la peine. Maintenant que le fstab a la liste des uuid de mes périphériques, je suis parti dans les actions personnalisées.
J’ai donc des dossiers contenant mes scripts : ~/Documents/Scripts et dedans, des dossiers video, image et texte.
Ces dossiers sont liés dans ~.config/rox.sourceforge.net/SendTo , comme ça, tout scripts placés dans les premiers sont automatiquements dans les seconds.
Bref, je cherche à créer un script d’upload d’images sur pix.toile-libre.org. Cependant, je suis totalement perdu! Je ne sais pas par où commencer à chercher!
Vous avez une idée de la façon de procéder?

:006

Ca devrait être quelque chose dans ce goût là :

[code]#!/usr/bin/perl

usr strict;
use warnings;
use HTTP::Lite;

my $http = HTTP::Lite->new;
my %vars = (
“MAX_FILE_SIZE” => “5120000”,
“img” => [ “$ARGV[1]” ]
);
$http->prepare_post(%vars);
$req = $http->request(“http://pix.isalo.org/?action=upload”)
or die “Unable to get document: $!”;
say 'req: '.$req;
say $http->body();[/code]

Je ne l’ai jamais fais et je ne l’ai absolument pas testé (j’ai particulièrement des doutes au sujet de la gestion du fichier (img)).
Il faudrait creuser cette page et la documentation de CPAN :
lwp.interglacial.com/ch05_07.htm

Houla, tu me sors du perl cash toi :slightly_smiling: . Merci quand même, je vais essayer de comprendre :slightly_smiling:

Le shell m’amuse de moins en moins.

Tu peut regarder du coté de curl sinon.

Mais si tu veut vraiment comprendre, commence par regarder le fonctionnement des requêtes POST.

Bah du coup, là j’épluche la doc python. Ton programme m’a dirigé vers les modules http, et il semble bien que ce soit le POST qui me soit utile. Enfin je farfouille, mais mon manque de conaissance sur le fonctionnement d’internet est très handicapant.
Donc je te fais confiance, je file chercher à comprendre les requêtes POST.

Voilà le mini truc que j’ai en python, et bien sûr, ça ne marche pas :

[code]try:
import sys
import urllib.request, urllib.parse

except ImportError as err:
print (“Couldn’t load module. {0}”.format(err))
sys.exit(2)

def main():

params = urllib.parse.urlencode({'action' : 'upload' ,'img' : 'toto.jpg'})
params = params.encode('utf-8')
f = urllib.request.urlopen('http://pix.toile-libre.org', params)
print(f.read().decode('utf-8'))

return 0

if name == ‘main’:
main()
[/code]
Attention, c’est du python3. Je ne comprend pas pourquoi, car lorsque je regarde la source de la page pix.toile-libre.org, ce devrait être les bons paramètres :

<h3>Envoyez votre image !</h3> <a class="help" href="?action=help">Aide ?</a> <input name="MAX_FILE_SIZE" value="15360000" type="hidden" /> <input name="img" size="30" type="file" /> <input value="Envoyer" type="submit" />
Et même en regardant les sources du programme qu’ils utilisent, je ne m’en sort pas : pix.toile-libre.org/pix-1.1.tar.gz

Je pense que tu ne requête pas la bonne url (tu as oublié le ?action=upload).

même avec ce changement ça ne donne rien (j’ai fait plusieurs essais quand même avant de venir me plaindre :wink: ).
Il semblerait que le champ img doit être considéré différement, car ce n’est pas du texte mais un fichier que je dois ouvrir avant… Pas facile tout ça, je vais continuer mes tests .

Même avec curl je n’y arrive pas :confused:

curl --form img=@toto.jpg --form Envoyer=submit http://pix.toile-libre.org?action=upload

[quote=“thuban”]Même avec curl je n’y arrive pas :confused:

curl --form img=@toto.jpg --form Envoyer=submit http://pix.toile-libre.org?action=upload [/quote]
Il manque le MAX_FILE_SIZE.

Ça ne marche pas mieux avec le MAX_FILE_SIZE en fait…

C’est bon je m’en suis sorti avec l’aide de mont sur python, et retour à python 2.
À votre avis, une fois l’upload effectué, quel serait le meilleur moyen d’avertir l’utilisateur de l’adresse de son image? Je vais pas faire du gtk rien que pour ça quand même?

[quote=“thuban”]C’est bon je m’en suis sorti avec l’aide de mont sur python, et retour à python 2.
À votre avis, une fois l’upload effectué, quel serait le meilleur moyen d’avertir l’utilisateur de l’adresse de son image? Je vais pas faire du gtk rien que pour ça quand même?[/quote]
Ça dépend de ce que tu veux faire.

Allez cette fois je dis que c’est bon. Je ne vais pas imposer à quelqu’un d’utiliser gtk ou plus lourd avec ce script.
Pour ma part, je lance le script, puis je récupère sa sortie que j’affiche avec gxmessage.
Vous pouvez faire de même avec zenity, xmessage ou autre…

Pour fonctionner, le script requiert le paquet python-poster

Alors, le script :

[code]#!/usr/bin/env python

-- coding:Utf-8 --

Fichier: pix.py

Cree le 08 juin 2011 18:52:52

Derniere modification: 08 juin 2011 18:52:52

“”"

Auteur : thuban (thuban@singularity.fr)
licence : GNU General Public Licence

Description : Permet d’uploader une image sur pix.toile-libre.org
Pratique en utilisation avec un gestionnaire de fichier

“”"

try:
import sys
import os
import urllib2
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
import re

except ImportError as err:
print (“Couldn’t load module. {0}”.format(err))
sys.exit(2)

def verif(argument):
image = argument
if (os.path.isfile(image)):
return image
else:
print(“Commande ou fichier invalide”)
sys.exit(2)

def affiche(adresses):
print('Afficher l’image : ’ + adresses[0])
print('Accéder à l’image : ’ + adresses[1])
print('Insérer la miniature dans un forum : ’ + adresses[2])
print('Insérer l’image dans un forum : ’ + adresses[3])
print('Insérer la miniature à votre site : ’ + adresses[4])
print('Insérer l’image à votre site : ’ + adresses[5])

def main():
image = verif(sys.argv[1])

# upload de l'image
register_openers()
with open(image, 'rb') as img:
    d, h = multipart_encode({'MAX_FILE_SIZE' : 15360000, 'img' : img})
    req = urllib2.Request('http://pix.toile-libre.org/?action=upload', d, h)
    f = urllib2.urlopen(req).read()

    adresses=re.findall(r'<textarea>(.*?)</textarea>', f)
    affiche(adresses)

return 0

if name == ‘main’:
main()

vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4

[/code]

Pour ma part, je lance ce programme via un gestionnaire de fichier, et affiche le retour dans gxmessage :

Salut,
Joli travail.
C’était pour toile libre seulement ? :wink: :smiley:

Non, pas seulement, comme ton pix ressemble beaucoup à toile-libre, ça s’adapte facilement :
isalo.org/wiki.debian-fr/ind … pix_de_lol <---- LIEN

J’ai voulu faire pareil avec ton pastebin (tant que j’y était), mais ça se complique avec le captcha :slightly_smiling:, du coup ça reste sur toile-libre :
thuban.toile-libre.org/index.php … libre-org/

[quote=“thuban”]Non, pas seulement, comme ton pix ressemble beaucoup à toile-libre, ça s’adapte facilement :
isalo.org/wiki.debian-fr/ind … pix_de_lol <---- LIEN

J’ai voulu faire pareil avec ton pastebin (tant que j’y était), mais ça se complique avec le captcha :slightly_smiling:, du coup ça reste sur toile-libre :
thuban.toile-libre.org/index.php … libre-org/[/quote]

Salut,
Oui j’ai vu.
Pour le pastebin, mes essais sans captcha se sont révélés douloureux… J’ai été spammé par des infâmes qui ne m’ont pas lâchés. :075

Oui je comprend bien, je ne blâme pas ton choix d’avoir mis des captchas. Je n’ai juste pas envie pour l’instant d’ajouter à ce genre de script la reconaissance de captchas :slightly_smiling: . Ceci dit, ce serait un bon apprentissage!

Tu crois que c’est possible ? Le but des captchas n’est pas justement d’empêcher les bots (qui sont des scripts) ?

Oui, bien sûr que c’est possible. Par exemple, il y a déja ceci de tout prêt : code.google.com/p/tesseract-ocr/ <— LIEN