Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/06/2015, à 15:54

Yoannjap

Aide pour un script de récupération fichier sur Frovo.com

Bonjour chers amis !

Voici le plan de ma demande d'aide roll :
1. Ce qui m'amène à vous demander de l'aide ;
2. Ce que je souhaiterai pouvoir faire ;
3. Traduction en français de ce que je voudrais que le script exécute ;
4. Ce que j'ai déjà tenté et là où je demande de l'AIDE !

〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰


Là je vais demander une grande aide et effort communautaire de votre part. Déjà par la lecture de ma requête. Non altruistes s'abstenir ! (mais être ici réduit déjà les risques de rencontrer des non altruistes big_smile)
Avant toute chose, je suis ouvert à toute critique, demande de précison, etc.

1. CE QUI M'AMÈNE À VOUS DEMANDER DE L'AIDE
Je suis développeur et créateur d'un deck open source pour l'apprentissage de l'Anglais-Français thématique. Depuis cinq ans, j'y passe un temps monstrueux et ce bénévolement. Alors comme ce travail s'améliore depuis des années, je ne pouvais pas faire autrement que d'en faire profiter les gens big_smile, gratuitement et librement.

***

Dans ce deck, je sonorise les mots et expressions à apprendre par des enregistrements de prononciation du mot. En 2014, j'ouvrais donc un topic pour demander de l'aide sur la création d'un script pour récupérer en un clin d'œil les fichiers audio d'un site de dictionnaire anglophone connu.
Et là, Nesthib, un gars passant sur ce forum, m'a lancé une pépite d'or et m'a aidé de la manière la plus altruiste (et productive !) qui soit. Grâce à lui, j'ai pu avancer beaucoup plus vite dans mon propre projet bénévole. Et grâce à lui est née l'envie d'en apprendre bien plus sur le « langage bash ».

***

Toutefois, le PROBLÈME est le suivant : aujourd'hui, dans l'avancement de mon travail, je ne peux plus me permettre d'utiliser les fichiers audio de ce site. J'ai appelé cette semaine leur service Rights and Permissions (en anglais, (sic.) yikes) et leur ai demandé s'il y avait un moyen d'utiliser, dans le cadre d'un projet open source, libre et gratuit, à l'objectif d'apprentissage, leurs fichiers audio. Mon interlocuteur m'a cordialement (sans ironie) répondu que non, que la politique de la boîte empêchait cela. Grooooooooos Bad sad

2. CE QUE JE SOUHAITERAI POUVOIR FAIRE ;

Dans la vie, les problèmes qui paraissent les plus insurmontables sont souvent ceux qui donnent aux fous le plus envie de les surmonter. Mais les fous ont beau être fous, ils ont besoin d'aide.

Ok, là je me dis, je ne reviens pas non plus à zéro. Je connais le site communautaire Forvo.com. Un site sur lequel des gens (comme moi par exemple) enregistrent dans leur langue maternelle la prononciation de mots que d'autres utilisateurs demandent d'obtenir dans une langue qui n'est pas la leur. Un site d'entraide, quoi.
Ok mon souhait est donc la création d'un nouveau script permettant d'automatiser la tâche de requête de vocabulaire par le biais du site Forvo.com.

3. TRADUCTION EN FRANÇAIS DE CE QUE JE VOUDRAIS QUE LE SCRIPT EXÉCUTE ;
Je voudrais donc que le script fasse ceci :
        — 1 — Dans le terminal, j'indique l'alias de la commande renvoyant à ce script (ex. : "forvo") suivi du mot que je recherche (ex. : "hello")
        — 2 — Là, le script recherche dans forvo.com les occurrences en anglais du terme hello (résultats ici)
        — 3 — Ok, maintenant, je veux qu'il m'affiche dans le terminal les résultats de toutes les prononciations disponibles en anglais britannique, autrement dit celles prononcées par des « royaume-uniens » (ce que le site forvo référence). Dans le cas où il n'y aurait aucun résultat, je voudrais qu'il m'amène au point 6 (cf. plus bas — 6 — )
        — 4 — Voyant affichés ces résultats, classés par un numéro, le terminal me demande d'indiquer le numéro du résultat que je souhaite.
        — 5 — Imaginons je tape "2" comme numéro, là le script fait deux choses successives : a) il me lit le fichier audio à la volée (avec mplayer par exemple) et me propose dans la foulée d'accepter (taper Y) ou de refuser (taper N). b) si je refuse en tapant N, il revient aux différents résultats numérotés. Si j'accepte en tapant Y, il me télécharge dans /home le fichier audio choisi et le convertit au format OGG.
        — 6 — Retour à l'étape 3, en imaginant qu'il n'y ait aucun résultat pour le mot recherché (ex. le mot que je recherche est "bonjourjenesuispasunfou"). Là je voudrais que le script exécute automatiquement ceci : avec mon identifiant et pseudo, le script fait la requête suivante au site : il envoie une demande de prononciation du mot en question aux autres utilisateurs (ce que l'on peut faire manuellement sur le site, je précise), en anglais, et avec le tag 'British accent', puis confirme la requête. (voici l'URL de la demande de prononciation d'un mot : http://fr.forvo.com/word-add/, même s'il faut avoir un compte sur le site pour pouvoir voir la page complète).

4. CE QUE J'AI DÉJÀ TENTÉ ET LÀ OÙ JE DEMANDE DE L'AIDE !
Je n'ai pas rien essayé, mais mes compétences sont limitées. Et là les limites sont trop importantes pour moi.
Je vous remets donc ma tentative de script-test, qui s'arrête... seulement à l'étape 2 hmm

#!/bin/bash

WORD=$1
URL="http://fr.forvo.com/word/$1/#en"
URLCONTENT="`wget -q -O - $URL`"
URLCONTENT_RoyaumeUni="`wget -q -O - $URL | sed -n '/Royaume-Uni/p'`"


if [[ $URLCONTENT = *"Royaume-Uni"* ]]
then
echo $(tput setaf 3)$URLCONTENT_RoyaumeUni$(tput sgr 0)
echo -n $URL | xclip -selection clipboard
else
echo $(tput setaf 3)"Aucune prononciation disponible en anglais britannique."$(tput sgr 0)
fi





# | sed 's/.*"dateTaken":"//' | sed 's/ .*//' | sed 's/^[ \t]*//;s/[ \t]*$//' | sed '$!N; /^\(.*\)\n\1$/!P; D'

〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰〰

Pour ceux qui arrivent là, un premier grand merci pour votre patience (m'avoir lu jusqu'au bout ! smile)
Je sais que je demande une grande aide. Vraiment, je m'en rends bien compte.
Je ne veux pas faire ça comme une politique de la carotte, sincèrement, mais quoi qu'il se passe je remercierai comme il se doit les gens qui m'ont aidé, et auront donc aidé une communauté de plus de 350 000 utilisateurs de ce deck Anki, sur la page d'accueil.

MERCI.

Dernière modification par Yoannjap (Le 24/06/2015, à 08:35)

Hors ligne

#2 Le 23/06/2015, à 17:06

erresse

Re : Aide pour un script de récupération fichier sur Frovo.com

Bonjour,

Tu signales dans ton message que Nesthib t'as aidé précédemment, et je te confirme qu'il fréquente toujours le forum.
Il aide principalement pour les problèmes de scripts, notamment bash, et tu pourrais peut-être essayer de le contacter par courriel (s'il en a indiqué la possibilité dans son profil) ou via les administrateurs du forum. Connaissant déjà ce que tu as développé, il saura certainement dans quelle mesure c'est adaptable à un autre site "fournisseur"...
Cela dit, il semble que les informations existent et sont disponibles sur le site "forvo.com", il doit donc être possible de s'y connecter et d'en télécharger des fichiers (au format MP3 proposé). Ta demande me paraît réalisable.


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#3 Le 23/06/2015, à 19:35

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

@ erresse : Oui, merci pour ce conseil, je n'avais pas osé, mais c'est fais, je l'ai contacté pour quémander son aide. En revanche, si quelqu'un d'autre a une piste ou un début de solution, je suis plus que preneur !!

Dernière modification par Yoannjap (Le 23/06/2015, à 19:35)

Hors ligne

#4 Le 24/06/2015, à 16:22

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Personne n'a d'idée ? de piste ?

Je ne chôme pas pendant ce temps, j'ai fait quelques recherche, et j'ai trouvé cette idée de script déjà réalisée, mais alors je n'y comprends rien... hmm
[EDIT] : j'ai aussi trouvé ce script, sur l'étape de prononciation, mais il n'a pas l'air de marcher, même quand je remplace mo USERNAME et mon PASSWORD. Mais ça peut être une piste

Dernière modification par Yoannjap (Le 24/06/2015, à 16:24)

Hors ligne

#5 Le 26/06/2015, à 14:27

texom512

Re : Aide pour un script de récupération fichier sur Frovo.com

Attends, mais programmer un tel outil en Bash, c'est juste du suicide ! Tu ne pourras sans doute pas y parvenir. Bash c'est pour faire de petits scripts, pas ça wink. Si tu tiens vraiment à faire des programmes comme celui-ci, utilise un vrai langage de programmation comme Python. Celui-ci a l'avantage d'être très simple, mais aussi très puissant. Voilà d'ailleurs un excellent cours : http://fr.openclassrooms.com/informatiq … -en-python. Concernant ton outil, j'ai moi-même tenté quelque chose :

__author__ = 'texom512'
__license__ = 'CC-BY-SA'

import requests
import wget
import shutil
import os
import lxml.html

from pygame import mixer
from bs4 import BeautifulSoup

login = 'TON_LOGIN'
password = 'TON_MP'
files_dst = 'DESTINATION_DES_AUDIOS'  # par exemple "/home/joannjap/audios"

session = requests.Session()


def play_audio(audio):
    mixer.init()
    mixer.music.load(audio)
    mixer.music.play()


def connexion():
    payload = {'login': login, 'password': password, 'remember': 'on'}
    session.post('http://fr.forvo.com/login/', payload)


def search_word(word):
    word = word.replace(' ', '_').lower()

    response = session.get('http://fr.forvo.com/word/{}/#en'.format(word))
    BeautifulSoup(response.text).prettify()
    doc = lxml.html.document_fromstring(response.text)

    audios = []
    i = 1
    for elem in doc.xpath("//div[@class='word']/ul/li"):
        infos = elem.xpath(".//span[@class='country']")[0].text[1:-1]
        country = infos.split()[2]
        if country == 'Royaume-Uni':
            try:
                person = elem.xpath("./a")[0].text.strip()
                sexe = infos.split()[0]

                try:
                    votes = elem.xpath(".//p[@class='votes']/a")[0].text
                except IndexError:
                    votes = elem.xpath(".//p[@class='votes']")[0].text.strip()

                print('{}) {}, {}, {}'.format(i, person, sexe, votes))
            except:
                print("Erreur : Un audio n'a pas pu être affiché !")

            download = 'http://fr.forvo.com' + elem.xpath(".//div[@class='download']/a/@href")[0]
            audios.append((i, download))

            i += 1

    return audios


def main():
    word_to_search = input('Quel mot voulez-vous rechercher : ')
    audios = search_word(word_to_search)

    name = {}
    for i, audio in audios:
        try:
            save_name = wget.download(audio, '/tmp')
            name[i] = save_name + '.mp3'
            os.rename(save_name, name[i])

            play_audio(name[i])

        except ValueError:
            print("Erreur : Un audio n'a pas pu être lu !")

    while True:
        audio_to_save = input('Quel audio voulez-vous sauvegarder (q pour quitter) : ')
        if audio_to_save == 'q':
            break

        assert type(audio_to_save) == int
        mp3 = pyglet.media.load(name[audio_to_save])
        mp3.play()
        pyglet.app.run()
        confirmation = input("Êtes-vous sûr de voiloir conserver cette audio (o/n) : ")
        if confirmation == 'o':
            shutil.move(name[i], files_dst + '/' + word)
            break


if __name__ == '__main__':
    main()

Malheureusement ce code ne marche pas. En effet : réaliser un script comme celui-ci est en pratique très compliqué. Surtout dans ce cas, car le site n'affiche pas toujours les audios de la même façon et il utilise aussi un procédé spécial qui rend très difficile le téléchargement pourtant nécessaire pour pouvoir lire les audios. Moi je te conseille de laisser tomber, surtout que je ne suis pas sûr que ce script te fera vraiment gagné du temps... Ce que tu peux faire en revanche, c'est un script qui récupère les audios de Google (il y en a mais seulement dans la version anglaise) et si le mot n'existe pas il le prends de Google Traduction.

Bon courage !

Dernière modification par texom512 (Le 26/06/2015, à 14:29)

Hors ligne

#6 Le 26/06/2015, à 15:41

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Merci beaucoup pour ton aide texom512 smile

Pour le programme Python, c'est une idée, mais cela me demanderait une capacité d'apprentissage à laquelle je ne peux pour l'instant consacrer de temps...
Mais je suis trop entêté pour laisser complètement tomber, et je prends précisémment Forvo car les fichiers audio sont sous licence Creative commons. Alors que google c'est sous droit d'auteur privatif!

Merci à toi en tout cas

Hors ligne

#7 Le 26/06/2015, à 16:48

texom512

Re : Aide pour un script de récupération fichier sur Frovo.com

Yoannjap a écrit :

Pour le programme Python, c'est une idée, mais cela me demanderait une capacité d'apprentissage à laquelle je ne peux pour l'instant consacrer de temps...

À long terme cela te fera gagné bien plus de temps. Je te le garantie à 200% ! Crois-en mon expérience, moi aussi à une époque j'utilisais Bash, j'ai perdu mon temps...

Dernière modification par texom512 (Le 26/06/2015, à 16:48)

Hors ligne

#8 Le 30/06/2015, à 11:58

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Ok, je comprends la philo, apprendre à pêcher le poisson en apprenant à manier une cane à pêche plutôt que de chercher à pêcher le poisson avec les mains smile

Hors ligne

#9 Le 02/07/2015, à 01:22

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Est-ce que quelqu'un aurait juste une idée de la(des) commande(s) à utiliser ainsi que leurs options pour réussir à télécharger sur un site avec authentification nécessaire?
Car sur Forvo.com j'ai un compte avec username et password.

Sur Firefox, je peux télécharger le mp3 du mot hello (prononcé par TopQuark) grâce à l'URL http://fr.forvo.com/download/mp3/hello/en/174441
Comment faire par le biais du terminal ?

Hors ligne

#10 Le 02/07/2015, à 10:08

melixgaro

Re : Aide pour un script de récupération fichier sur Frovo.com

salut,

Puisque ça semble être pour la bonne cause, voilà un script qui fait tout ce que tu veux sauf l'étape 6. C'est en bash tongue ça pourrait être plus joli mais je n'ai pas vraiment le temps d'améliorer. Bon courage pour la suite.

Tu l'enregistres, par exemple dans vocal.sh, tu le rends exécutable

chmod u+x vocal.sh

puis tu cherches un mot ainsi

./vocal.sh "nuclear"

Le script te dira s'il manque des dépendances. J'ai testé sur quelques mots, ça a l'air ok mais je ne garantis rien. Tu récupères un ogg directement, nommé mot.ogg.

#!/bin/bash

user_agent="Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0"

word="${1}"

if [[ "$(which base64)" == "" ]]
then
    echo "Installer base64 svp"
    echo "Pour ubuntu: sudo apt-get install base64"
    exit 1
fi

if [[ "$(which mplayer)" == "" ]]
then
    echo "Installer mplayer svp"
    echo "Pour ubuntu: sudo apt-get install mplayer"
    exit 1
fi

results="$(wget -U "${user_agent}" "http://fr.forvo.com/word/${word}/#en" -q -O - | sed -e :a -e '$!N; s/\n/ /; ta' | sed 's/<a *class=.play./\n\0/g' | sed 's/<.li>*<li>/\n/g' | sed 's/<.article>/\n\0\n/g' | grep -i "^ *<a *class=.play" | grep -i "royaume-uni")"
if [[ "${results}" == "" ]]
then
    echo "Aucun résultat"
    exit 1
fi

n_results=$(wc -l <<< "${results}")

list=()

i=0
while read line
do
    user="$(echo "${line}" | sed 's+.*par[[:space:]]*\(<a *href=./user/[^>]*.>\)*\([^<^\t^ ]*\)\(<.a>\)*.*<span class=.from.*+\2+g')"
    desc="$(echo "${line}" | sed 's+.*<span class=.from.>(\([^)]*\)).*+\1+g')"
    voice="$(echo "${desc}" | awk -F " - " '{print $1}')"
    country="$(echo "${desc}" | awk -F " - " '{print $2}')"
    audios="$(echo "${line}" | sed "s/.*Play([0-9]*,\(\( *'[^']*',*\)*\)).*/\1/g" | sed "s/'//g")"
    mp3="http://audio.forvo.com/mp3/$(echo "${audios}" | awk -F ',' '{print $1}' | base64 -d)"
    ogg="http://audio.forvo.com/ogg/$(echo "${audios}" | awk -F ',' '{print $2}' | base64 -d)"
    list[i]="${user}|${voice}|${country}|${mp3}|${ogg}"
    i=$((i+1))
done <<< "${results}"

display_menu()
{
    clear
    i=0
    for line in "${list[@]}"
    do
	IFS=\| read user voice country mp3 ogg <<< "${line}"
    	echo "${i}) ${user} (${voice}, ${country})"
	i=$((i+1))
    done
    echo "q) Quitter"
    echo
}

while true
do
    display_menu
    read -p"Your choice? " choice
    case "${choice}" in
	"q")
	    exit 0
	    ;;
	[0-9]*)
	    if [[ ${choice} -ge n_results ]]
	    then
		echo "Choix invalide"
	    else
		IFS=\| read user voice country mp3 ogg <<< "${list[${choice}]}"
		echo "Lecture de ${user}"
		mplayer "${ogg}" 2> /dev/null 1> /dev/null
		echo
		read -p"Télécharger(y/N)?" answer
		if [[ ${answer} == 'y' ]]
		then
		    wget -q -U "${user_agent}" "${ogg}" -O "${word}.ogg"
		    exit 0
		fi	
	    fi
	    ;;
	*)
	    echo "Choix invalide"
	    ;;
    esac    
done

Dernière modification par melixgaro (Le 02/07/2015, à 21:22)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#11 Le 02/07/2015, à 21:03

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Merci beaaaaucoup pour ce travail, une merveille ce script smile

Bon je ne vois pour l'instant qu'un problème : l'exemple avec 'hello', le 17) a un soucis...

Hors ligne

#12 Le 02/07/2015, à 21:20

melixgaro

Re : Aide pour un script de récupération fichier sur Frovo.com

ah oui en effet.
je corrige le script de mon premier message tout de suite


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#13 Le 02/07/2015, à 21:23

melixgaro

Re : Aide pour un script de récupération fichier sur Frovo.com

voilà, c'est corrigé !


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#14 Le 02/07/2015, à 22:20

k3c

Re : Aide pour un script de récupération fichier sur Frovo.com

il y a plein de programmes pour faire du scraping comme toi, regarde par exemple

http://scrapy.org/


Archlinux sur Xiaomi Air 13

Hors ligne

#15 Le 03/07/2015, à 02:44

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Merci une nouvelle fois melixgaro, ton rude et excellent boulot va faire gagner au projet d'Anki un temps MONSTRE. Tu en es l'une des briques (où le ciment big_smile), et tu es indiqué dans mes forts remerciements de la page d'accueil du projet. Souhaites-tu par hasard que je cite en URL ton mail ou autre page perso?? C'est avec grand plaisir que je ferais ça.
---

Si quelqu'un d'autre (qui tombera par hasard sur ce forum) a un jour la lueur pour la toute dernière (et non moins rude) étape 6, je serais preneur^^, sinon, je me contenterai avec joie de ce script-pépite.

Quant à Scrapy, je ne connaissais pas, mais ça m'a l'air plutôt fameux comme procédé, merci pour le tip!
---
Thanks a million, même si les remerciements ne dépasseront jamais l'altruisme communautaire (désolé, mais quand je reçois de telles aides pour un projet auquel je consacre moi-même des milliers d'heures, à destination de milliers d'usagers, je pars rapidement dans l'emphase... cool)

Dernière modification par Yoannjap (Le 03/07/2015, à 02:46)

Hors ligne

#16 Le 03/07/2015, à 06:28

melixgaro

Re : Aide pour un script de récupération fichier sur Frovo.com

pas de problème. merci pour la citation, mais tes remerciements suffisent amplement wink


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#17 Le 03/07/2015, à 11:54

Banip

Re : Aide pour un script de récupération fichier sur Frovo.com

Pour ton étape 6 il faudrait pouvoir voir comment se passe une demande, car il est possible d'envoyer une requête HTTP avec curl mais je ne sais pas faire, peut être une piste à creuser

Cordialement

Hors ligne

#18 Le 03/07/2015, à 13:13

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

@Banip : http://www.forvo.com/word-add/ est l'adresse URL d'une demande d'ajout de mot. Il faut avoir enregistré un compte pour y avoir accès. Je ne sais pas en quel langage est programmé cette page web. Mais version navigateur web, il faut d'abord remplir le champ « mot », ensuite cliquer sur « ajouter un mot » pour confirmer. Ensuite deux nouveaux champs apparaissent. Le premier, « Langue » affiche une liste déroulante où l'on clique sur la langue « Anglais (en) » dans mon cas. Le dernier champ « Tags » permet de remplir ses tags, le mien étant « British accent ». Il faut pour confirmer la requête recliquer sur « Ajouter un mot ». Voilà, comment traduire cette requête en bash ?

Hors ligne

#19 Le 03/07/2015, à 13:27

Banip

Re : Aide pour un script de récupération fichier sur Frovo.com

Voilà pour le moment la piste que je vais creuser de mon coté

curl -U user:password --data "word=camarche&id_lang=49&tags=" http://fr.forvo.com/word-add/

J'aimerais bien ajouté un mot mais... il faut que le site n'ait pas ce mot dans ces donnés.. Je vais essayer de trouver un mot à ajouter

Cordialement

Hors ligne

#20 Le 03/07/2015, à 14:36

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Merci!! C'est un début. J'ai essayé tout seul (en dehors du script de melixgaro) la commande (d'un mot qui ne peut exister) :

curl -U yoannjap:monmotdepasse --data "word=fzefzefzezeffze&id_lang=49&tags=British_accent" http://fr.forvo.com/word-add/

Je fais Entrée, ça ne me met pas de message d'erreur. Mais lorsque je vais vérifier sur le site web sur Firefox si ce mot apparaît bien dans mes requêtes postées (ce qui se passe normalement), ça n'a pas eu l'air de marcher...

Hors ligne

#21 Le 03/07/2015, à 16:08

Banip

Re : Aide pour un script de récupération fichier sur Frovo.com

Bon je me suis fait un compte pour étudier le site

Effectivement il manque un étape dans la commande que je t'ai donné

curl -U user:password --data "word=$WORD&id_lang=$ID_LANG&tags=" http://fr.forvo.com/word-add/

Le problème est que pour faire un POST il faut un fichier cible or dans l'url du site on tombe sur /word-add/

Je pense qu'il doit y avoir des redirections ou des réécritures d'url mais théoriquement si on trouve le script a utiliser on pourra finir l'étape 6.

Si jamais d'autre personne passe par là, il faudrait fouiller dans le code du site pour trouver le script svp (mes connaissance restent limité)

Hors ligne

#22 Le 21/07/2015, à 14:20

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Qu’est-ce qui ne va plus dans l’enchaînement de caractère de cette commande :

user=”$(echo “${line}” | sed ‘s+.*	[[:space:]]*\(<a *href=./user/[^>]*.>\)*\([^<^\t^ ]*\)\(<.a>\)*.*<span class=.from.*+\2+g’)”

Pour retrouver le nom “dorabora” dans cette page source : view-source:http://fr.forvo.com/word/survey/


Meeerci!

Au cas où, je vous remets le script entier :

#!/bin/bash

user_agent=”Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0”

word=”${1}”

fvg=/usr/local/bin/forvoget2.sh	

if [[ “$(which base64)” == “” ]]
then
    echo “Installer base64 svp”
    echo “Pour ubuntu: sudo apt-get install base64”
    exit 1
fi

if [[ “$(which mplayer)” == “” ]]
then
    echo “Installer mplayer svp”
    echo “Pour ubuntu: sudo apt-get install mplayer”
    exit 1
fi

results=”$(wget -U “${user_agent}” “http://fr.forvo.com/word/${word}/#en” -q -O - | sed -e :a -e ‘$!N; s/\n/ /; ta’ | sed ‘s/<a *class=.play./\n\0/g’ | sed ‘s/<.li>*<li>/\n/g’ | sed ‘s/<.article>/\n\0\n/g’ | grep -i “^ *<a *class=.play” | grep -i “royaume-uni”)”
if [[ “${results}” == “” ]]
then
    echo “Aucun résultat”
    exit 1
fi

n_results=$(wc -l <<< “${results}”)

list=()

i=0
while read line
do
    user=”$(echo “${line}” | sed ‘s+.*	[[:space:]]*\(<a *href=./user/[^>]*.>\)*\([^<^\t^ ]*\)\(<.a>\)*.*<span class=.from.*+\2+g’)”
    desc=”$(echo “${line}” | sed ‘s+.*<span class=.from.>(\([^)]*\)).*+\1+g’)”
    voice=”$(echo “${desc}” | awk -F “ - “ ‘{print $1}’)”
    country=”$(echo “${desc}” | awk -F “ - “ ‘{print $2}’)”
    audios=”$(echo “${line}” | sed “s/.*Play([0-9]*,\(\( *’[^’]*’,*\)*\)).*/\1/g” | sed “s/’//g”)”
    mp3=”http://audio.forvo.com/mp3/$(echo “${audios}” | awk -F ‘,’ ‘{print $1}’ | base64 -d)”
    ogg=”http://audio.forvo.com/ogg/$(echo “${audios}” | awk -F ‘,’ ‘{print $2}’ | base64 -d)”
    list[i]=”${user}|${voice}|${country}|${mp3}|${ogg}”
    i=$((i+1))
done <<< “${results}”

display_menu()
{
    clear
    i=0
    for line in “${list[@]}”
    do
	IFS=\| read user voice country mp3 ogg <<< “${line}”
    	echo “${i}) ${user} (${voice}, ${country})”
	i=$((i+1))
    done
    echo “q) Quitter”
    echo
}

while true
do
    display_menu
    read -p”Your choice? “ choice
    case “${choice}” in
	“q”)
	    exit 0
	    ;;
	[0-9]*)
	    if [[ ${choice} -ge n_results ]]
	    then
		echo “Choix invalide”
	    else
		IFS=\| read user voice country mp3 ogg <<< “${list[${choice}]}”
		echo $(tput setaf 5)”Lecture de la prononciation de ${user}”$(tput sgr 0)
		mplayer “${ogg}” 2> /dev/null 1> /dev/null
				url0=”http://fr.forvo.com/word/$word/#en”

AUTEURURL=”http://fr.forvo.com/user/$user/”
TITREIMAGE=”`wget -U -q -O - $url0 | sed -n ‘/<title>/p’ | sed ‘s/.*<title>//’ | sed ‘s/<\/title>.*//’ | sed ‘s/^[ \t]*//;s/[ \t]*$//’ | sed ‘$!N; /^\(.*\)\n\1$/!P; D’`”
CCURL=”`wget -q -O - “http://fr.forvo.com/license/” | sed -n ‘/<a href=”http:\/\/creativecommons.org\/licenses\//p’ | sed ‘s/.*<a href=”//’ | sed ‘s/”>.*//’ | sed ‘s/deed.*//’ | sed ‘s/^[ \t]*//;s/[ \t]*$//’ | sed ‘$!N; /^\(.*\)\n\1$/!P; D’`”
TITRECC=”`wget -q -O - $CCURL | sed -n ‘/value=”CC BY/p’ | sed ‘s/.*value=”//’ | sed ‘s/”\/>.*//’ | sed ‘s/^[ \t]*//;s/[ \t]*$//’ | sed ‘$!N; /^\(.*\)\n\1$/!P; D’`”
IMAGE_ATTRIBUTION=’<a href=”’$url0’”><i>’$TITREIMAGE’</i></a>, by <a href=”’$AUTEURURL’”>’$user’</a>, unknown date, licensed under <a href=”’$CCURL’”>’$TITRECC’</a>’



				echo “Licence attribution HTML code :”; echo $(tput setaf 3)$IMAGE_ATTRIBUTION$(tput sgr 0)
				echo -n $IMAGE_ATTRIBUTION | xclip -selection clipboard
		echo
		read -p”Écouter à nouveau la prononciation(y/N)?” answer
		if [[ ${answer} == ‘y’ ]]
		then
		mplayer “${ogg}” 2> /dev/null 1> /dev/null
		exit 0
		fi	
	    fi
	    ;;
	*)
	    echo “Choix invalide”
	    ;;
    esac    
done

Hors ligne

#23 Le 21/07/2015, à 15:19

k3c

Re : Aide pour un script de récupération fichier sur Frovo.com

Tu ne veux pas utiliser Python et BeautifulSoup pour faire ce genre de choses ?

Je te poste un exemple ce soir


Archlinux sur Xiaomi Air 13

Hors ligne

#24 Le 21/07/2015, à 15:43

Yoannjap

Re : Aide pour un script de récupération fichier sur Frovo.com

Merci pour ta réponse, mais non pour le moment, je ne sais pas du tout coder en Python. Et mes heures de bénévolat sur le projet Anki en tant que tel sont déjà trop chronophage. Quelqu’un a-t-il une idée pour la ligne du bash ?

Hors ligne

#25 Le 22/07/2015, à 09:59

claudius01

Re : Aide pour un script de récupération fichier sur Frovo.com

Bonjour,

texom512 a écrit :

Attends, mais programmer un tel outil en Bash, c'est juste du suicide !
Bash c'est pour faire de petits scripts, pas ça.
Si tu tiens vraiment à faire des programmes comme celui-ci, utilise un vrai langage de programmation comme Python.

Entièrement d'accord avec texom512

Yoannjap a écrit :

Merci pour ta réponse, mais non pour le moment, je ne sais pas du tout coder en Python.

Yoannjap, si tu tiens vraiment à conserver bash + sed + awk et consorts, aide les et toi par la même occasion en déléguant le parsing d'une page html bien formée au moyen de Xpath.
Maintenant, si la page html à analyser est mal formée, la 1ère chose à faire est de la rendre ... conforme (cf. Well-formed XML document ;-)

Hors ligne