IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Ping d'Url à caractère spéciaux


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Géomaticien
    Inscrit en
    Janvier 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 8
    Par défaut Ping d'Url à caractère spéciaux
    Bonjour,

    je souhaiterais créer un script permettant de tester (ping) des adresses de site pour vérifier si ces adresses fonctionnent toujours.
    je travaille en tant que géomaticien dans une collectivité et nous souhaitons rajouter des flux wms d'autres structures sur nos cartes.
    pour cela nous récupérons les flux via des url (http://www.sandre.eaufrance.fr/atlas...-0e0b0a2dc258&) qui comportent des caractères spéciaux.
    Or j'ai remarqué que certains fournisseur de flux les suppriment sans que je puisse le voir. il me faut vérifier à chaque fois manuellement chaque flux.
    j'essaye donc de développer un script permettant de pinger mes flux (url) pour voir si ils sont toujours actifs.
    en cherchant, j'ai trouvé ce script q
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    import sys
    import os
    import platform
    import subprocess
     
    plat = platform.system()
    scriptDir = sys.path[0]
    hosts = os.path.join(scriptDir, 'hosts.txt')
    hostsFile = open(hosts, "r")
    lines = hostsFile.readlines()
    if plat == "Windows":
        for line in lines:
            line = line.strip( )
            ping = subprocess.Popen(
                ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
            out, error = ping.communicate()
            print (out)
            print (error)
     
    for line in hosts:
        print(line.encode("cp1252", errors='replace').decode("cp850"))
     
    hostsFile.close()
    le soucis c'est que ce script ne reconnais pas les caractères spéciaux.
    vous sauriez comment y remédier?
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En utilisant urllib ça semble faire l'affaire non ? (Il y a peut-être mieux comme module)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from urllib.request import urlopen
    >>> urlopen("http://www.sandre.eaufrance.fr/atlas/srv/fre/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&ID=ebe55405-4307-4e05-b32a-0e0b0a2dc258&").read()
    b'<?xml version="1.0" encoding="UTF-8"?>\r\n<csw:GetRecordByIdResponse xmlns:csw="http://www.opengis.net/cat/csw/2.0.2">\r\n  <csw:SummaryRecord xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:geonet="http://www.fao.org/geonetwork" xmlns:dct="http://purl.org/dc/terms/">\r\n    <dc:identifier>ebe55405-4307-4e05-b32a-0e0b0a2dc258</dc:identifier>\r\n    <dc:title>Service web de visualisation cartographique (WMS) du r\xc3\xa9f\xc3\xa9rentiel des zones relatives aux ressources agricoles</dc:title>\r\n    <dc:type>service</dc:type>\r\n    <dc:subject>WMS</dc:subject>\r\n    <dc:subject>MAPSERVER</dc:subject>\r\n    <dc:subject>GEONETWORK</dc:subject>\r\n    <dc:subject>OSGeo</dc:subject>\r\n    <dc:subject>RAPPORTAGE</dc:subject>\r\n    <dc:subject>DIRECTIVE CADRE EAU</dc:subject>\r\n    <dc:subject>DCE</dc:subject>\r\n    <dc:subject>ZONE RELATIVE AUX USAGES AGRICOLES</dc:subject>\r\n    <dc:subject>CONCHYLICOLE</dc:subject>\r\n    <dc:subject>ZONAGE</dc:subject>\r\n    <dc:subject>FRANCE</dc:subject>\r\n    <dc:subject>FRANCE ENTIERE</dc:subject>\r\n    <dc:subject>GUADELOUPE</dc:subject>\r\n    <dc:subject>MARTINIQUE</dc:subject>\r\n    <dc:subject>GUYANE</dc:subject>\r\n    <dc:subject>REUNION</dc:subject>\r\n    <dc:subject>MAYOTTE</dc:subject>\r\n    <dc:subject>donn\xc3\xa9es ouvertes</dc:subject>\r\n    <dc:subject>Zones de gestion, de restriction ou de r\xc3\xa9glementation et unit\xc3\xa9s de d\xc3\xa9claration</dc:subject>\r\n    <dc:subject>Donn\xc3\xa9es de r\xc3\xa9f\xc3\xa9rences (r\xc3\xa9f\xc3\xa9rentiels, vocabulaire contr\xc3\xb4l\xc3\xa9)</dc:subject>\r\n    <dc:subject>Eaux souterraines (nappes d\xe2\x80\x99eau)</dc:subject>\r\n    <dc:subject>donn\xc3\xa9es ouvertes</dc:subject>\r\n    <dc:subject>Directive 2000/60/EC</dc:subject>\r\n    <dc:subject>Protected areas (Water Framework Directive)</dc:subject>\r\n    <dc:subject>Designated waters (Water Framework Directive)</dc:subject>\r\n    <dc:subject>Protection of economically significant aquatic species - freshwater fish designated waters (Water Framework Directive)</dc:subject>\r\n    <dc:format>GML</dc:format>\r\n    <dct:abstract>Le service web de visualisation cartographique (WMS) du r\xc3\xa9f\xc3\xa9rentiel des zones relatives aux ressources agricoles permet de consulter les r\xc3\xa9f\xc3\xa9rentiels g\xc3\xa9ographiques suivant:\r\n\r\n- Zones de production et de reparcage conchylicole\r\n\r\nLes sc\xc3\xa9narios d\'\xc3\xa9changes g\xc3\xa9ographiques sont diffus\xc3\xa9s via les fiches de m\xc3\xa9tadonn\xc3\xa9es de donn\xc3\xa9es et sur le site Sandre.</dct:abstract>\r\n  </csw:SummaryRecord>\r\n</csw:GetRecordByIdResponse>\r\n\r\n'
    >>> urlopen("http://www.sandre.eaufrance.fr/atlas/srv/fre/csw?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&ID=ebe55405-4307-4e05-b32a-0e0b0a2dc259&").read()
    #j'ai juste changé le dernier chiffre dans l'url pour avoir un truc bidon
    b'<?xml version="1.0" encoding="UTF-8"?>\r\n<csw:GetRecordByIdResponse xmlns:csw="http://www.opengis.net/cat/csw/2.0.2" />\r\n\r\n'
    Cdt !

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Sous Python 3, il suffit d'ajouter l'encodage comme argument à Popen ("cp850" pour la console de Windows):

    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #############################################################################
    def pingip(ip, encodage="cp850"):
        """envoie un ping à l'IP donné, et retourne la réponse
           sous forme d'une liste de lignes
           - encodage: cp850 par défaut (console Windows)
        """    
        commande = ["ping", ip]
        try:
            out, _ = subprocess.Popen(commande, 
                                      stdout=subprocess.PIPE, 
                                      stderr=subprocess.STDOUT,
                                      encoding=encodage).communicate()
        except (ValueError, OSError) as msgerr:
            return ("Erreur: {}".format(str(msgerr)))
     
        return out.splitlines()
    Réponse pour l'IP www.google.fr::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Envoi d'une requête 'ping' sur www.google.fr [2a00:1450:4007:80f::2003] avec 32 octets de données*:
    Réponse de 2a00:1450:4007:80f::2003*: temps=34 ms 
    Réponse de 2a00:1450:4007:80f::2003*: temps=33 ms 
    Réponse de 2a00:1450:4007:80f::2003*: temps=34 ms 
    Réponse de 2a00:1450:4007:80f::2003*: temps=33 ms 
     
    Statistiques Ping pour 2a00:1450:4007:80f::2003:
        Paquets*: envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
    Durée approximative des boucles en millisecondes :
        Minimum = 33ms, Maximum = 34ms, Moyenne = 33ms

  4. #4
    Membre régulier
    Homme Profil pro
    Géomaticien
    Inscrit en
    Janvier 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 8
    Par défaut
    bonjour et merci pour vos réponses,
    étant novice et en apprentissage sur python je suis un peu paumé.

    Donc
    j'ai bien intégré la ligne
    dans le subprocess, ce qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ping = subprocess.Popen(
                ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                encoding = "cp850",
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
    mais cela ne change rien j'ai comme message d'erreur qu'il ne ping pas le site.

    est-ce bien le bon endroit où j'ai mis l'encodage?

    je vous remets le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
     
    import sys
    import os
    import platform
    import subprocess
     
    plat = platform.system()
    scriptDir = sys.path[0]
    hosts = os.path.join(scriptDir, 'hosts.txt')
    hostsFile = open(hosts, "r")
    lines = hostsFile.readlines()
    if plat == "Windows":
        for line in lines:
            line = line.strip( )
            ping = subprocess.Popen(
                ["ping", "-n", "1", "-l", "1", "-w", "100", line],
                encoding = "cp850",
                stdout = subprocess.PIPE,
                stderr = subprocess.PIPE
            )
            out, error = ping.communicate()
            print (out)
            print (error)
     
     
    hostsFile.close()
    encore merci de votre aide

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 697
    Par défaut
    Salut,

    Le ping d'une URL comme (http://www.sandre.eaufrance.fr/atlas...-0e0b0a2dc258&) plante à tous les coups car ping ne sait agir que sur des hôtes (éventuellement www.sandre.eaufrance.fr).

    De plus les noms de hôtes (ou plus généralement de domaines) sont des chaines de caractères ASCII pour qu'on n'ait pas de problème particulier...

    Ce que vous pourriez vérifier par vous même en ouvrant un terminal et en lançant votre ping directement.

    Tout çà pour dire qu'on ne peut pas "pinger un flux" on peut juste faire une requête HTTP sur l'URL (et l'encoding des URL n'a rien à voir avec l'encoding des chaines de caractères).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre régulier
    Homme Profil pro
    Géomaticien
    Inscrit en
    Janvier 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 8
    Par défaut
    OK, merci
    du coup il faut que je me dirige plus vers une requête des URL qui m’intéressent.
    perso du moment que je sais si l'url est accessible cela me va.

    vous auriez des exemples de requete, que j'adapte à mes besoins?

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 697
    Par défaut
    Citation Envoyé par tos66000 Voir le message
    vous auriez des exemples de requete, que j'adapte à mes besoins?
    L'exemple donné par LeNarvalo devrait le faire (et tous ceux que vous allez trouver en cherchant un peu sur Internet aussi).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre régulier
    Homme Profil pro
    Géomaticien
    Inscrit en
    Janvier 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 8
    Par défaut
    Bonjour et merci pour votre aide!

    ça fonctionne bien.
    j'ai pour cela récupéré ce script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from urllib.request import Request, urlopen
    from urllib.error import URLError
    req = Request(someurl)
    try:
        response = urlopen(req)
    except URLError as e:
        if hasattr(e, 'reason'):
            print('We failed to reach a server.')
            print('Reason: ', e.reason)
        elif hasattr(e, 'code'):
            print('The server couldn\'t fulfill the request.')
            print('Error code: ', e.code)
    else:
        print('everything is fine')
    je cherche maintenant à gérer ma liste d'URL via un fichier texte pour éviter de devoir retoucher le script à chaque fois.
    vous pensez que c'est possible?

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 697
    Par défaut
    Salut,

    Citation Envoyé par tos66000 Voir le message
    vous pensez que c'est possible?
    C'est ce que faisait déjà le script précédent à partir du fichier hosts.txt...

    Si vous voulez programmer quelque chose, il faut prendre le temps d'apprendre à programmer ou rémunérer quelqu'un qui fera le boulot.

    note: le boulot du programmeur se terminant avec la livraison d'un programme qui marche, on peut penser qu'il suffit d'écrire ou de trouver les lignes magiques qui...
    En fait, l'écriture du code, c'est juste 10 à 30% du boulot.
    En amont, il y a la mise en forme du besoin, le choix des techniques et outils pour réaliser la solution,...
    Si ce travail là n'a pas été fait, écrire du code ne sert pas à rien mais presque.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre régulier
    Homme Profil pro
    Géomaticien
    Inscrit en
    Janvier 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2021
    Messages : 8
    Par défaut
    effectivement,
    je le remarque bien! c'est bien pour ça que j'essaye de former dessus en attendant ma formation officielle.

    en tout cas merci pour vos conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récupérer caractères spéciaux dans l'url
    Par thewaterkidny dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/08/2007, 09h58
  2. les caractères spéciaux dans l'url, c'est mal !
    Par _gargamel_ dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/05/2007, 16h03
  3. [MySQL] transmettre via url des chaînes de caractères spéciaux
    Par xenos dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/02/2007, 02h16
  4. Caractères spéciaux dans URL
    Par memento80 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 15/08/2006, 17h29
  5. [Win32][D7] Convertir caractères spéciaux en code URL (HTML)
    Par Benjamin GAGNEUX dans le forum Delphi
    Réponses: 7
    Dernier message: 17/05/2006, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo