Partage
  • Partager sur Facebook
  • Partager sur Twitter

ValueError: input to from_text() must be a string

Sujet résolu
    29 juillet 2023 à 18:03:08

    Bonjour ! :-°

    J'essaye de créer une application web à travers le framework Django afin de récupérer les entrées de la zone DNS d'un domaine pour les afficher, avec la possibilité de copier/coller chaque entrée à l'aide du module pyperclip (mais ça c'est pour un autre moment).

    Pour cela, j'ai créé cette classe et ces fonctions :

    class DnsLookup:
    
        def __int__(self, domain_name: str):
            self.domain_name = domain_name
    
        def dns_lookup(self, domain_name: str):
    
            # On récupère les DNS
            # print(domain)
    
            n = dns.name.from_text(domain_name)
    
            dn = dns.resolver.query(n, 'ns')
    
            list_ns = []
            for rdata in dn:
                ns = rdata.to_text()
                list_ns.append(ns)
    
            no_listens = str(list_ns)
    
            # On récupère le champ A du domaine
    
            n = dns.name.from_text(domain_name)
    
            a = dns.resolver.query(n, 'A')
    
            list_a = []
            for rdata in a:
                domain_a = str(rdata.to_text())
                list_a.append(domain_a)
    
            no_liste_a = str(list_a)
    
            # On récupère le champ A du s-domaine
    
            s_n = dns.name.from_text('www.'+domain_name)
    
            s_a = dns.resolver.query(s_n, 'A')
            list_sa = []
    
            for rdata in s_a:
                sdomain_a =  rdata.to_text()
                list_sa.append(sdomain_a)
    
            no_listen_sa = str(list_sa)
    
            # On récupère le champ AAAA du domaine
    
            n = dns.name.from_text(domain_name)
    
            aaaa = dns.resolver.query(n, 'AAAA')
    
            list_aaaa = []
            for rdata in aaaa:
                domain_aaaa =  rdata.to_text()
                list_aaaa.append(domain_aaaa)
    
            # On récupère le champ AAAA du s-domaine
    
            no_liste_aaaa = str(list_aaaa)
            n = dns.name.from_text('www.'+domain_name)
    
            s_aaaa = dns.resolver.query(n, 'AAAA')
            list_saaaa = []
            for rdata in s_aaaa:
                sdomain_aaaa =  rdata.to_text()
                list_saaaa.append(sdomain_aaaa)
    
            no_liste_saaaa = str(list_saaaa)
    
            # On récupère les champs TXT du domaine
    
            n = dns.name.from_text(domain_name)
    
            txt = dns.resolver.query(n, 'TXT')
            list_txt = []
            for rdata in txt:
                domain_txt =  rdata.to_text()
                list_txt.append(domain_txt)
    
            no_liste_txt = str(list_txt)
    
            # On récupère les champs MX du domaine
    
            n = dns.name.from_text(domain_name)
    
            mx = dns.resolver.query(n, 'MX')
            list_mx = []
            for rdata in mx:
                domain_mx = rdata.to_text()
                list_mx.append(domain_mx)
    
            no_liste_mx = str(list_mx)
    
            domain_whois = whois.whois(domain_name)
    
            return \
                "Serveurs DNS : " + no_listens, \
                "Adresse IPv4 de " + domain_name + " : " + no_liste_a,\
                "Adresse IPv4 de www." + domain_name + " : " + no_listen_sa,\
                "Adresse IPv6 de " + domain_name + " : " + no_liste_aaaa,\
                "Adresse IPv6 de www." + domain_name + " : " + no_liste_saaaa,\
                "Champs TXT : " + no_liste_txt,\
                "Serveurs MX : " + no_liste_mx,\
                # "WHOIS:" + domain_whois



    La récupération des données fonctionnent mais pourtant, j'ai une erreur dans mon terminal : 

      File "C:\Users\drdos\OneDrive\Bureau\Hugzy_Toolbox\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
        response = get_response(request)
                   ^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\drdos\OneDrive\Bureau\Hugzy_Toolbox\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\drdos\OneDrive\Bureau\Hugzy_Toolbox\src\toolbox\views.py", line 12, in search_dns
        resultat = DnsLookup.dns_lookup('', domain_name)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\drdos\OneDrive\Bureau\Hugzy_Toolbox\src\api\main.py", line 17, in dns_lookup
        n = dns.name.from_text(domain_name)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "C:\Users\drdos\OneDrive\Bureau\Hugzy_Toolbox\venv\Lib\site-packages\dns\name.py", line 825, in from_text
        raise ValueError("input to from_text() must be a string")
    ValueError: input to from_text() must be a string
    

    Voici la fonction search_dns présente dans mon fichier views.py

    def search_dns(request):
        domain_name = request.POST.get("domain_name")
    
        resultat = DnsLookup.dns_lookup('', domain_name)
    
        return render(request,'toolbox/index.html', {'domain': resultat})

    Je ne comprends pas trop le message d'erreur. 

    J'ai fait un type(domain_name) avant d'utiliser n = dns.name.from_text(domain_name) et pourtant ça me retourne bien que c'est un str. Une idée ? :D

    D'ailleurs, je ne vois pas trop l'utilité de mon __init__ pour le coup .. 

    En effet, ça m'oblige à passer deux paramètres dans ma fonction dns_lookup alors que je n'ai besoin que d'un seul paramètre qui est le nom de domaine. 

    Merci ! 



    -
    Edité par Rudeus 29 juillet 2023 à 18:06:33

    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2023 à 18:27:14

      Un type str n'est pas forcément un nom de domaine valide (suivant les caractères qu'il contient et que vous ne montrez pas).

      Pour ce qui est de l'__init__, il sert d'autant moins qu'écrit __int__ on n'y passe jamais. Si vous n'avez besoin que d'une fonction, pourquoi fabriquer une class?

      -
      Edité par mps 29 juillet 2023 à 19:48:57

      • Partager sur Facebook
      • Partager sur Twitter
        29 juillet 2023 à 19:55:35

        Merci pour ta réponse ! En effet je n’avais pas vu que je m’étais trompé sur l’orthographe de l’init.

        Il est possible que j’ai besoin d’autres fonctions plus tard donc c’est pour ça que j’ai créé une classe.

        Je ne comprends pas votre réponse par rapport au str. 

        Actuellement, le code retourne une erreur au niveau de l’affichage si le domaine n’est pas valide. 

         Y a t’il un moyen de fixer cette erreur du coup ? Je ne vois pas du tout pour le coup ! 

        • Partager sur Facebook
        • Partager sur Twitter
          29 juillet 2023 à 23:18:32

          Rudeus a écrit:

          Actuellement, le code retourne une erreur au niveau de l’affichage si le domaine n’est pas valide. 

           Y a t’il un moyen de fixer cette erreur du coup ? Je ne vois pas du tout pour le coup ! 


          Si le nom du domaine n'est pas valide (pourquoi ne pas montrer à quoi il ressemble?) et que ça génère une exception, ça se gère avec try...except.
          • Partager sur Facebook
          • Partager sur Twitter
            30 juillet 2023 à 13:39:40

            Le try except ne risque pas de en plus rien afficher ? 

            Car actuellement, l'erreur est présente même si le nom de domaine est valide, la récupération des données et l'affichage de ces dernières fonctionnent correctement malgré l'erreur. 

            • Partager sur Facebook
            • Partager sur Twitter
              30 juillet 2023 à 15:56:49

              A vous de faire la part des choses entre ce que retourne votre fonction à l'appelant en cas d'erreur (ou pas) et ce que doit en faire l'appelant dans ce cas. Ce sont 2 sujets séparés.
              • Partager sur Facebook
              • Partager sur Twitter

              ValueError: input to from_text() must be a string

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown