Lecteur de code barre + liste de courses

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Avatar du membre
Bull_Eye
Messages : 10
Enregistré le : mer. 15 avr. 2020 15:52

Re: Lecteur de code barre + liste de courses

Message par Bull_Eye » lun. 25 mai 2020 15:47

Zephyre a écrit :
lun. 25 mai 2020 15:34
Énorme merci pour le détail je vais l'y lettre parcontre existent ils des douches que l'on peut connecter sans traficouillage ?
Oui évidemment.
J'aurais pu laisser la douchette tel-quel mais étant donné que j'ai utilisé un RPi Zero W, il me fallait donc l'adaptateur USB type A femelle vers micro-USB type B mâle.

Après on peut également utiliser un RPi normal, dans ce cas là, même pas besoin d'adaptateur. On se branche directement sur l'un des ports USB.
Si t'en chies, c'est que t'as pas les bon outils

Avatar du membre
Bull_Eye
Messages : 10
Enregistré le : mer. 15 avr. 2020 15:52

Re: Lecteur de code barre + liste de courses

Message par Bull_Eye » dim. 31 mai 2020 21:33

C'est partie pour la suite:
- Envoi vers liste de course Google Keep

On va donc maintenant envoyer notre nom de produit dans notre liste de course Google Keep.

Après avoir recherché sur mon moteur de recherche préféré s'il existait une API pour Google Keep, j'ai la mauvaise surprise de tomber sur ceci:
Info Wikipédia sur l'API Google Keep

Mais il suffit de continuer à chercher un peu pour tomber sur une API non officielle: Gkeepapi qui permet de faire ce que je veux.
Moi je prononce ça "Jéquipapi"
ça marche aussi à l'américaine "Dji-qui-pè-pi-aïe" :D

Bref, comme ça n'est pas officiel, Google peut décider du jour au lendemain de couper tout accès.

Après un peu de lecture, on va attaquer le code.

Il faut par contre utiliser PIP pour installer gkeepapi
Pip installe vos librairies en toute simplicité

Code : Tout sélectionner

sudo apt-get install python-pip
Il y aura une validation à faire avec un Y pendant l'installation

On installe ensuite gkeepapi

Code : Tout sélectionner

sudo pip install gkeepapi
gkeepapi permet de manipuler les notes. On peut en créer, les modifier, ajouter des éléments dans les notes, changer les couleurs etc.
Je vous encourage à bien consulter la documentation; c'est très complet.

Pour commencer on va manuellement créer des notes dans Google Keep. J'ai utilisé des listes avec cases à cocher.
Image

On va ensuite créer un programme pour se connecter à Google Keep et récupérer la liste des notes existantes
010_upload_gkeep.py

Code : Tout sélectionner

import gkeepapi

# Activation de l'api Google Keep
keep = gkeepapi.Keep()
username = 'moncomptegoogle@gmail.com'
password = 'monmotdepasse'

# Connexion au compte Google Keep
keep.login(username, password)

# Recuperation des notes
gnotes = keep.all()

# Affichage de la liste de notes
for gnote in gnotes:
	print (gnote.title)
	print (gnote.color)
Et on récupère:
pi@RPiscanner:~ $ sudo python 010_upload_gkeep.py
Ma liste 1
ColorValue.Blue
Ma liste 2
ColorValue.Purple
pi@RPiscanner:~ $
Mon GROS GROS problème se trouve ici. Je dois mettre mon mot de passe en clair dans mon programme python.
Si vous avez une solution pour gérer ça je suis preneur!!!
J'ai tenté d'utiliser Keyring mais il me demande un mot de passe Keyring pour accéder au mot de passe Google Keep à chaque démarrage du programme python. ça ne m'arrange pas parce que mon système doit être Headless
La documentation de gkeepapi indique qu'il est possible d'utiliser un Master Token mais il faut le protéger comme un mot de passe donc ça ne m'arrange pas non plus.
Ce Master Token est néanmoins utile car il permet de ne pas avoir à faire de multiples login sur le serveur Google Keep.
Je vais donc le récupérer puis l'utiliser pour la suite
011_upload_gkeep.py

Code : Tout sélectionner

import gkeepapi

# Activation de l'api Google Keep
keep = gkeepapi.Keep()
username = 'moncomptegoogle@gmail.com'
password = 'monmotdepasse'

# Connexion au compte Google Keep
keep.login(username, password)

# Recuperation du Master Token
mastertoken = keep.getMasterToken()
print (mastertoken)
Et on peut refaire notre premier code
012_upload_gkeep.py

Code : Tout sélectionner

import gkeepapi

# Activation de l'api Google Keep
keep = gkeepapi.Keep()
username = 'moncomptegoogle@gmail.com'
token = 'lkqjdsflkjfsqLKQSJFLKZEI98739485+='

# Connexion au compte Google Keep
keep.resume(username, token)

# Recuperation des notes
gnotes = keep.all()

# Affichage de la liste de notes
for gnote in gnotes:
	print (gnote.title)
	print (gnote.color)
Et on récupère:
pi@RPiscanner:~ $ sudo python 010_upload_gkeep.py
Ma liste 1
ColorValue.Blue
Ma liste 2
ColorValue.Purple
pi@RPiscanner:~ $
On voit donc que l'on a maintenant accès à Google Keep et aux notes.

On va maintenant ajouter des éléments à Ma liste 1
Pour ça il va nous falloir l'identifiant de la note en question. Il se trouve que l'identifiant est dans l'URL lorsque la note est sélectionnée.
Image

Et le programme pour ajouter l'élément
013_upload_gkeep.py

Code : Tout sélectionner

import gkeepapi

# Activation de l'api Google Keep
keep = gkeepapi.Keep()
username = 'moncomptegoogle@gmail.com'
token = 'lkqjdsflkjfsqLKQSJFLKZEI98739485+='

# Connexion au compte Google Keep
keep.resume(username, token)

# Preparation des donnees
noteId = '1zSqXmEm0Z93XLf4xW3VaiK_ZiOCZIswPU6DlNhescwKa1WgPsHp8xTpX7RMvcfxUJND2'
productname = 'Saucisson'

# Recuperation de la note
gnote = keep.get(noteId)
gnote.add(productname, False, gkeepapi.node.NewListItemPlacementValue.Top) # Le nouvel element sera place en haut de la liste

# Synchronisation
keep.sync()
Et l'élément a été ajouté en haut de la liste:
Image

Voilà. Il nous reste maintenant à combiner tout ce qu'on a fait depuis le début tout en optimisant le programme pour faire fonctionner le scanner.
Pour info, il ne faut que 3 secondes pour que le produit s'affiche dans Google Keep.
Vous verrez également que j'ai ajouté un User Agent lorsque je me connecte sur Open Food Facts. C'est nécessaire pour qu'ils sachent qui se connecte chez eux.
014_upload_gkeep.py

Code : Tout sélectionner

import requests
import json
import gkeepapi


##########################################################################################
# FONCTION POUR RECUPERER LE CODE BARRE
##########################################################################################
def barcode_reader():
	code = ""
	done = False

	fp = open('/dev/hidraw0', 'rb')
	while not done:
			buffer = fp.read(8)
			for c in buffer:
				if ord(c) > 0:
					e = (ord(c)) + 19   # pour une raison inconnue, il y a un decallage de 19. 
					if e == 58:			# pour le 0, le scanner envoie 58. Il ne suit pas l'ASCII. Donc je le passe en 48
						e = 48
					if e != 59:			
						code = code + chr(e)
					if e == 59:
						done = True
	return code

##########################################################################################
# FONCTION POUR RECUPERER LE NOM SUR OPENFOODFACTS EN JSON
##########################################################################################

def off(off_result):

	url = 'https://world.openfoodfacts.org/api/v0/product/' + off_result + '.json'
	# Open Food Facts demande un headers avec quelques infos. Histoire de savoir a qui ils ont a faire
	headers = {'user-agent': 'Bull-Eye Scanner - Raspberry Pi - Version 1.0 - https://monsiteweb.com'}
	page = requests.get(url, headers = headers)
	data_url = (json.dumps(page.json(), indent=2, sort_keys=True))
	data_page = json.loads(data_url)
	if  (data_page['status']) == 1:
		name = (data_page['product']['product_name_fr'])
		
		return name
	else:
		name = 0
		return name
	
##########################################################################################
##########################################################################################
##########################################################################################



##########################################################################################
# FONCTION POUR ENVOYER LE RESULTAT SUR GOOGLE KEEP
##########################################################################################

def upload_keep(upload_keep_product_name, upload_keep_note):

	# Enregistrement du nom du produit dans la liste GooglKeep
	gnote = keep.get(upload_keep_note)
	list = gnote.text # Recuperation des elements de la note pour voir s'ils sont deja present. Si c'est le cas, on ne l'ajoute pas
	found = list.find(upload_keep_product_name)
	if found == -1:
		gnote.add(upload_keep_product_name, False, gkeepapi.node.NewListItemPlacementValue.Top)
		keep.sync()
	
	
##########################################################################################
##########################################################################################
##########################################################################################



##########################################################################################
# CODE FINAL
##########################################################################################

# Activation de l'API Google Keep
keep = gkeepapi.Keep()
username = 'moncomptegoogle@gmail.com'
token = 'lkqjdsflkjfsqLKQSJFLKZEI98739485+='

# Connexion au compte Google Keep
keep.resume(username, token)

# Boucle pour la recherche du nom du produit
while True:  
	barcode = barcode_reader()
	print (barcode)
	off_product_name = off(barcode)
	keep.sync(resync=True)
	
	if off_product_name == 0:
		print ("Le produit n'a pas ete trouve")
		upload_keep(barcode, '1uK-TX3sUyHsvgU8CZYG74GP8cDL7z_ZdMHJYKCCebxt8Vy6LmMKLR_Z8SUe9yw')
	else:
		upload_keep(off_product_name, '1zSqXmEm0Z93XLf4xW3VaiK_ZiOCZIswPU6DlNhescwKa1WgPsHp8xTpX7RMvcfxUJND2')
Et voilà ce que ça donne après avoir scanné quelques code-barres présent dans ma cuisine:
Image

Il ne restera plus qu'à faire démarrer le programme à l'allumage du RPi.
Pour ce qui est du mot de passe et du token en clair, n'hésitez pas à commenter si vous avez une solution!
PROGRAMMES3.zip
(3.06 Kio) Téléchargé 191 fois
Si t'en chies, c'est que t'as pas les bon outils

Zephyre
Messages : 6
Enregistré le : dim. 24 mai 2020 21:51

Re: Lecteur de code barre + liste de courses

Message par Zephyre » lun. 8 juin 2020 11:42

Top

Répondre

Retourner vers « Utilisateurs avancés »