logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 22-08-2023 09:08:57

joffrey575
Membre
Distrib. : Debian Bullseye
Inscription : 19-12-2016

Mise en oeuvre d'une matrice 4x4

Bonjour à tous,

Avez-vous déjà mis en oeuvre ce type de projet ?

J'ai suivi ce tuto pour mettre en oeuvre une sécurité à code.

https://raspberrypi-tutorials.fr/connec … code-lock/

J'ai donc acheté une :
-raspberry pi W V1.1
-matrice 4x4
-nape de fils

Lien d'achat pour la matrice 4x4.
https://www.amazon.fr/AZDelivery-Matrix … 15&sr=8-16

Après avoir installé l'OS, j'ai choisi 8 pins disponible du connecteur J8 du raspberry pi W V1.1.

Voici le schématique.
https://datasheets.raspberrypi.com/rpiz … matics.pdf

Dans le code pour l'identification des chiffres/lettres, j'ai donc modifié.

ROW = [31, 33, 35, 37] // ce sont les N° de PIN pas N° de GPIO
COLUMN = [32, 38, 36, 40] // ce sont les N° de PIN pas N° de GPIO



Ensuite, j'ai executé le code principale mais je n'obtiens pas le résultat attendu en python3.

Le code ci-dessous est en python2.7 ou python3 ?

Auriez-vous des pistes ou déjà essayé ce tuto ?

Merci d'avance.


import time
import RPi.GPIO as GPIO
from keypad import keypad
 
GPIO.setwarnings(False)
 
if __name__ == '__main__':
    # Initialize
    kp = keypad(columnCount = 4)
 
    # waiting for a keypress
    digit = None
    while digit == None:
        digit = kp.getKey()
    # Print result
    print digit
    time.sleep(0.5)
 
    ###### 4 Digit wait ######
    seq = []
    for i in range(4):
        digit = None
        while digit == None:
            digit = kp.getKey()
        seq.append(digit)
        time.sleep(0.4)
 
    # Check digit code
    print(seq)
    if seq == [1, 2, 3, '#']:
        print "Code accepted"

Hors ligne

#2 22-08-2023 12:28:52

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Mise en oeuvre d'une matrice 4x4

joffrey575 a écrit :

Ensuite, j'ai executé le code principale mais je n'obtiens pas le résultat attendu en python3.

Voir le tuto : Manuel du chocolat DF : « Ça marche pas ! » wink

En gros, ça serait pas mal de savoir si le script te renvoi une erreur, ou si il fonctionne, mais ne sort pas le résultat attendu (théoriquement, ça doit être la première solution vue la boulette qui s'y trouve).

joffrey575 a écrit :

Le code ci-dessous est en python2.7 ou python3 ?

Les deux mon adjudant ! (Et c'est probablement au moins un des bouts du problème wink )

print digit #python2
print(seq) #python3


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#3 23-08-2023 08:04:05

joffrey575
Membre
Distrib. : Debian Bullseye
Inscription : 19-12-2016

Re : Mise en oeuvre d'une matrice 4x4

Finalement je suis partie sur ce projet.

Il prend en compte une matrice 4x4.

https://peppe8o.com/connect-raspberry-p … des-input/
https://peppe8o.com/download/python/4x4MatrixKeypad.py

Maintenant je voulais récupérer le token renvoyé d'une commande linux.

os.system('rm cookies.txt')
arch = subprocess.check_output("curl -XPOST -c cookies.txt -d ...........")
print (arch)



Voici la sortie du print.

{"access_token":"eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ","access_token_expires":7200,"refresh_token":"eyJ0eXiJ9.eyVkz__N9kliGO4Q","refresh_token_expires":86400,"credentials":"auth=d}



Je voulais récupérer le résultat d'un split via le caractère ".

token_tmp = arch.split('"')



L'erreur retournée est la suivante, mais comment déclarer un objet type bytes ?

TypeError: a bytes-like object is required, not 'str'



Ensuite, l'idée est juste de récupérer l'access token.

token_auth = token_tmp[2]
print (token_tmp[2])



Merci pour vos retours.

Hors ligne

#4 23-08-2023 09:34:56

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : Mise en oeuvre d'une matrice 4x4

Le retour de check_output te renvoie un type <byte>, il faut le décoder, ici en utf-8 (implicitemtn ici))

>>> output=subprocess.check_output(("echo", "hello world!"))
>>> type(output)
<class 'bytes'>
>>> output_decoded = output.decode()
>>> type(output_decoded)
<class 'str'>



Faire un p'tit dictionnaire pour récuperer les données. on devrait s'en sortir avec des split, strip et une petite comprehension list.

>>> string = '''{"access_token":"eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ","access_token_expires":7200,"refresh_token":"eyJ0eXiJ9.eyVkz__N9kliGO4Q","refresh_token_expires":86400,"credentials":"auth=d}'''
>>> d = dict([[element.strip('"') for element in key_value.split(':')] for key_value in string.strip('{}').split(',')])
>>> print(d)
{'access_token': 'eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ', 'access_token_expires': '7200', 'refresh_token': 'eyJ0eXiJ9.eyVkz__N9kliGO4Q', 'refresh_token_expires': '86400', 'credentials': 'auth=d'}
>>> print(d['access_token'])
eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ


(la ligne se lit de "droite a gauche" : retirer les parenthèses, séparer avec les virgules => on obtient la liste des paires clé/valeur => on sépare les elements avec les : on retire les " => on obtient une liste de liste avec les paires clé/valeur => on transforme le tout en dictionnaire, (ça peut se faire en plusieurs ligne, mais flemme de tout recopier))


Pour l'aide en général, essaie de fournir l'erreur renvoyée par python, elles sont souvent assez explicites, et essaie de fournir un code fonctionnel, tout du moins qui renvoie bien l'erreur décrite, si on peut éviter de débugger des print...

Hors ligne

#5 23-08-2023 13:00:03

joffrey575
Membre
Distrib. : Debian Bullseye
Inscription : 19-12-2016

Re : Mise en oeuvre d'une matrice 4x4

Super, j'ai pu tester ce que tu m'a donné avec succès.

Une dernière chose, j'aimerais ajouter le token en question dans une chaine de caractère.
Le tout à envoyer dans une commande linux.

Est-ce que le code suivant partant d'une string (str) serait correct ?

path_begin = 'curl -XPOST http://domain/api/monitors/5.json?token='
path_token = token_auth
path_argu = ' -d '
path_end = 'Monitor[Function]=Modect&Monitor[Enabled]=1'
path_total = path_begin + path_token + path_argu + path_end
print (path_total)

os.system(path_total)



Merci beaucoup !

Hors ligne

#6 23-08-2023 16:18:29

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : Mise en oeuvre d'une matrice 4x4

Faut tester, quelques petits conseils:

- évite les espaces entre une fonction et la première parenthèse, ça fonctionne, mais c'est une convention forte de ne pas en mettre

print ("hello") => print("hello")


- utilise la fonction join plutôt que + et espaces, ça évite des erreurs bêtes d'espaces manquants

"curl" + " url" + " -d " + "arg" => ' '.join(("curl", "url", "-d", "arg")


- si besoin, utiliser le module subprocess plutôt qu'os.system, par exemple si tu veux récupérer les sorties standard ou d'erreur et pour te faciliter la vie avec les echappements de caractères spéciaux.

os.system("curl" + " url" + " -d " + "arg") => subprocess.check_output(["curl", "url", "-d", "arg"])

Hors ligne

#7 26-08-2023 14:58:05

joffrey575
Membre
Distrib. : Debian Bullseye
Inscription : 19-12-2016

Re : Mise en oeuvre d'une matrice 4x4

Mon but est dans cette partie d'extraire le token de la réponse au format json suivante.

{"access_token":"eyJ0eXAI1NiJ9.eyJpc3Mic3MifQ.DDY71FpHgQ","access_token_expires":7200,"refresh_token":"eyJ0eXiJ9.eyVkz__N9kliGO4Q","refresh_token_expires":86400,"credentials":"auth=d}



Sans sortir du programme car subprocess.check_output() faisait ceci sur retour d'erreur avec l'except en fin de programme.

Du coup, j'utilise comme on me l'a conseillé "subprocess.run()" mais le dictionnaire n'a plus l'air bon ! (voir sortie).

Mon code :

        response = subprocess.run(['curl', '-XPOST -c cookies.txt -d \"user=user&pass=password&stateful=1\" https://mondomain.org/api/host/login.json"'], capture_output=True, text = True);
       
        d = dict([[element.strip('"') for element in key_value.split(':',':')] for key_value in response.stdout.strip('{}').split(',')])

        token = d['access_token']



L'erreur renvoyée :

        d = dict([[element.strip('"') for element in key_value.split(':')] for key_value in response.stdout.strip('{}').split(',')])
ValueError: dictionary update sequence element #0 has length 1; 2 is required



On m'a conseillé d'utiliser en lieu et place de subprocess la lib urllib pour faire une requete HTTP.

J'ai essayé ce code :

        data = '-c cookies.txt -d "user=user&pass=mypassword&stateful=1'
        data = data.encode('ascii')
        q = Request('http://mondomain.org/api/host/login.json', data=data)

        a = urlopen(q).read()
        print(a)



Pour obtenir :

urllib.error.HTTPError: HTTP Error 401: Unauthorized



Si vous avez des idées, je suis preneur.

Merci et bon week-end !

Dernière modification par joffrey575 (26-08-2023 15:02:20)

Hors ligne

#8 26-08-2023 15:29:23

bendia
Chadministrateur
Distrib. : openSUSE Tumbleweed, Buster
Noyau : Linux 5.9.1-2-default + Linux 4.19.0-12-amd64
(G)UI : Gnome + Console et un peu Fluxbox
Inscription : 20-03-2012
Site Web

Re : Mise en oeuvre d'une matrice 4x4

'-c cookies.txt -d "user=user&pass=mypassword&stateful=1'

Il s'agit d'option passée à Curl en shell. De mémoire, le -c spécifie dans quel fichier stocker les cookies.

Avec urllib, il te faut simplement passer ton URL avec les arguments qui vont bien, puisque tu n'es plus avec curl dans un shell.

C'est donc ta variable data qui n'est pas bonne. Je suis un peu étonné qu'il faille une requête POST vu à quoi ressemble l'URL, mais sans certitude wink


Ben
___________________
La seule question bête, c'est celle qu'on ne pose pas.

Hors ligne

#9 26-08-2023 19:59:03

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : Mise en oeuvre d'une matrice 4x4

+1

Du coup je m'aperçois que j'ai bêtement répondu aux questions... roll
Je corrige quand même, donc oui plutôt passer par urllib pour plus de cohérence, (à moins que tu sois vraiment plus à l'aise avec curl, si c'est pour du bidouillage perso...)
POur tout ce qui est requêtes, je m'y connais pas trop, je passe la main pour ça

Puisque le retour de curl (ou via urllib?) est évidemment au format json, bah utiliser le module json pour avoir le dictionnaire:

parsed_datas = json.loads(response_de_curl)



Et pour débugger, mettre des print pour bien voir les variables que tu obtiens à chaque étape

Dernière modification par David5647 (26-08-2023 20:01:28)

Hors ligne

Pied de page des forums