Informer périodiquement l'état de traitement de Raspberry Pi avec python → Google Spreadsheet → LINE

introduction

À propos de la raison pour laquelle j'ai décidé de faire ceci. J'ai décidé d'exécuter un petit traitement par lots sur le Raspberry Pi, mais lorsque j'exécutais le serveur pendant un long moment, pas seulement le Raspberry Pi, le serveur s'est arrêté sans le savoir. Il peut y avoir un événement. En outre, bien que le serveur lui-même fonctionne, il est possible que le traitement par lots commence à mousser pour une raison quelconque, mais il est difficile de se connecter et de vérifier tous les jours. Donc, j'étais heureux de pouvoir informer le smartphone du résultat si le traitement par lots est normal ou anormal sur le Raspberry Pi. S'il n'y a pas de notification, il peut être déterminé que quelque chose s'est mal passé avec le serveur. Une façon de le mettre en œuvre 1.Faites en sorte que Google Spreadsheet exécute un programme python qui met régulièrement à jour les données avec cron 2. IFTTT déclenche la notification LINE de la mise à jour de la feuille de calcul Google Cela semblait possible avec ce qui précède, alors je l'ai essayé. C'est un article appelé.

(1) Préparation à la publication sur Google Spread Sheet

-Accédez au Python Quickstart et procédez comme suit: --Cliquez sur le bouton "Activer l'API Google Sheets" et saisissez un nom de projet approprié. Enregistrez "credentials.json" localement --Installez une bibliothèque dédiée avec la commande suivante.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Concernant la préparation à la publication, elle est recommandée car elle est organisée de manière facile à comprendre dans les articles précédents. https://qiita.com/connvoi_tyou/items/7cd7ffd5a98f61855f5c

(2) Créer un programme pour publier sur Google Spread Sheet

Créez une feuille de calcul sur Google Drive à l'avance. Notez une partie de l'URL du fichier car vous devrez l'écrire dans votre programme.

https://docs.google.com/spreadsheets/d/<XXXXXXXXXXXXXXXXXXX>/edit#gid=zzzzzzzz
# "<XXXXXXXXXXXXXXXXXXX>"Faire une note du

Vers la feuille de calcul Google comme ci-dessous Je l'ai fait avec le nom "server_check.py".

server_check.py


from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
creds = None
if os.path.exists('token.pickle'):
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
        creds = flow.run_local_server(port=0)
    # Save the credentials for the next run
    with open('token.pickle', 'wb') as token:
        pickle.dump(creds, token)

service = build('sheets', 'v4', credentials=creds)

#Jusqu'à présent, c'est presque le même que celui décrit dans le guide fourni par google.
#Ci-dessous, remplissez les informations spécifiques à Spreadsheet.
spreadsheet_id = '<XXXXXXXXXXXXXXXXXXX>'
sheetname='Feuille 1'
range_ = sheetname

#Obtenir des informations sur la date
import datetime
_str_dt=datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")

#Remplacer les données à écrire dans les colonnes A, B et C
#La colonne A est la date, les colonnes B et C sont des chaînes de caractères arbitraires(Cette fois, remplacez une chaîne de caractères de test)
values = [
  [_str_dt,"Status-1","Status-2"]
]
body = {
  'values' : values
}

#Écrire dans une feuille de calcul
result=service.spreadsheets().values().append(spreadsheetId=spreadsheet_id,valueInputOption='RAW',range=range_,body=body).execute()
print(result)

Dans le programme ci-dessus, le message de test est quelque chose comme "Status-1". Lors de son fonctionnement, extrayez la sortie du fichier journal, Je pense qu'il sera ajouté au tableau des valeurs.

(3) Exécution du programme et autorisations du navigateur

Après avoir réparé les parties nécessaires, exécutez le programme python ci-dessus. ** À ce moment-là, le fichier "credentials.json" doit exister dans le même répertoire. ** ** En outre, la première fois que le programme est exécuté, l'authentification du navigateur est requise, il doit donc être exécuté dans un environnement GUI.

Une fois exécuté, le navigateur sera lancé et la page de confirmation du compte Google sera affichée. Accordez les droits d'accès en fonction de l'écran. (En chemin, un avertissement sur une page non sécurisée s'affiche, mais il continue) Lorsqu'un caractère tel que «Le flux d'authentification est terminé. Vous pouvez fermer cette fenêtre.» Est affiché dans le navigateur, le paramètre est terminé.

Lorsque l'accès est accordé, la feuille de calcul doit avoir une entrée ajoutée (valeur entrée dans la première ligne). Il crée également un fichier "token.pickle" dans le même répertoire que le programme. Avec ce fichier, la prochaine fois que vous ignorez l'authentification de votre navigateur, la ligne sera ajoutée.

(4) Paramètres de notification dans IFTTT

  1. L'application IFTTT est requise, si elle n'est pas installée et configuration initiale
  2. Créez une applet avec "Créez vos propres applets à partir de zéro"
  3. Ce (déclencheur) est "Google Sheets" -> "Nouvelle ligne ajoutée à la feuille de calcul"
  4. Entrez les informations de feuille créées dans (2)
  5. Cette (action) est "LIGNE" -> "Envoyer un message"
  6. Le destinataire "reçoit une notification de LINE Notify 1: 1"
  7. Personnalisez le corps du message

Où je suis resté coincé

Lorsque le navigateur ne peut pas être ouvert dans l'environnement d'exécution du programme

Le but ultime cette fois était d'exécuter le programme cible à partir de la tarte à la framboise, mais la tarte à la framboise n'avait pas d'environnement GUI (fonctionnant généralement avec une connexion SSH). Même si j'exécute "server_check.py" sur la tarte aux framboises, le navigateur ne peut pas être ouvert, je ne peux donc pas définir les autorisations.

Dans un tel cas, si vous exécutez le même programme dans un autre environnement GUI et placez le fichier "token.pickle" généré sur le serveur cible, vous pouvez probablement aussi exécuter le programme sur CUI. En exécutant le même programme sur mon Mac et en envoyant le token.pickle généré à la tarte aux framboises, je peux maintenant l'exécuter également à partir de la tarte aux framboises.

J'obtiens une erreur lors de l'exécution d'un programme

Parfois, j'ai eu une erreur lorsque j'ai exécuté le programme.

[root@localhost python]# python server_check.py 
Traceback (most recent call last):
  File "server_check.py", line 17, in <module>
    creds.refresh(Request())
  File "/usr/local/lib/python3.7/site-packages/google/oauth2/credentials.py", line 182, in refresh
    self._scopes,
  File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 248, in refresh_grant
    response_data = _token_endpoint_request(request, token_uri, body)
  File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 124, in _token_endpoint_request
    _handle_error_response(response_body)
  File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 60, in _handle_error_response
    raise exceptions.RefreshError(error_details, response_body)
google.auth.exceptions.RefreshError: ('invalid_scope: Some requested scopes were invalid. {invalid=[a, c, d, e, g, h, i, l, m, ., /, o, p, r, s, t, u, w, :]}', '{\n  "error": "invalid_scope",\n  "error_description": "Some requested scopes were invalid. {invalid\\u003d[a, c, d, e, g, h, i, l, m, ., /, o, p, r, s, t, u, w, :]}",\n  "error_uri": "http://code.google.com/apis/accounts/docs/OAuth2.html"\n}')
[root@localhost python]# 

Je ne sais pas quelle était l'erreur, mais je l'ai résolue en recréant "token.pickle". Pour le recréer, supprimez simplement "token.pickle" et exécutez le programme. Cependant, faites attention à l'environnement CUI dans lequel vous ne pouvez pas ouvrir le navigateur car il sera à nouveau configuré à partir du navigateur.

Au fait, je ne sais pas pourquoi cela se produit, mais d'un point de vue personnel, je pense qu'une erreur s'est produite au moment suivant.

--Lorsque le programme est considérablement rénové --Lorsque vous exécutez un autre programme pour vous authentifier

en conclusion

Avec cela, j'ai commencé à remarquer tôt lorsque le traitement par lots était anormal ou lorsque le serveur s'est arrêté, mais je suis un peu fatigué que LINE arrive tous les jours. En fait, je voulais informer LINE lorsqu'une anomalie a été détectée (le serveur a détecté une anomalie ou il n'y a pas eu de contact programmé) dans le style "aucune nouvelle est une preuve saine", mais c'est le prochain problème. Alors c'est tout.

Recommended Posts

Informer périodiquement l'état de traitement de Raspberry Pi avec python → Google Spreadsheet → LINE
Notifier LINE de la température corporelle du thermomètre BLE avec la tarte à la râpe # 1
Consigner périodiquement les valeurs des capteurs d'environnement Omron avec Raspberry Pi
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Mesurer la température du processeur de Raspeye avec Python
Prenez la valeur du thermo-hygromètre SwitchBot avec Raspberry Pi
Obtenez l'état de fonctionnement de JR West avec Python
Exploitons GPIO de Raspeye avec Python CGI
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
Accédez aux feuilles de calcul Google en utilisant python avec raspberry pi (pour vous-même)
Google recherche la chaîne sur la dernière ligne du fichier en Python
Utilisez vl53l0x avec RaspberryPi (python)
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Bases du traitement d'images binarisées par Python
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
Sortie CSV des données d'impulsion avec Raspberry Pi (vérifier l'entrée analogique avec python)
Vérifier l'existence du fichier avec python
Effectuez périodiquement un traitement arbitraire avec Python Twisted
Notifier LINE des informations de localisation (Google map) avec GPS Multi-Unit SORACOM Edition
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Dessin avec Matrix-Reinventor of Python Image Processing-
Enregistrement des valeurs du capteur d'environnement Omron avec Raspberry Pi (type USB)
L'histoire du traitement A du blackjack (python)
Lisez les données du lecteur NFC connecté à Raspberry Pi 3 avec Python et envoyez-les à openFrameworks avec OSC
Statut de chaque système de traitement Python en 2020
python> print> Est-il redirigé uniquement à la fin du processus?> Exécuter avec -u
Travailler avec le GPS en Python pour Raspberry Pi 3
Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python
Essayez d'utiliser le processeur à 4 cœurs du Raspberry Pi 2 avec Parallel Python
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
Discord bot raspberry pi zéro avec python [Note]
Envoyer un message à LINE avec Python (LINE Notify)
Préparer l'environnement d'exécution de Python3 avec Docker
Mathématiques Todai 2016 résolues avec Python
[Note] Exportez le html du site avec python.
Afficher le résultat du traitement de la géométrie en Python
Calculez le nombre total de combinaisons avec python
Vérifiez la date du devoir de drapeau avec Python
Traitement d'image? L'histoire du démarrage de Python pour
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Observez le groupe de météores Futago avec RaspberryPi4
Sonnez le buzzer en utilisant python sur Raspberry Pi 3!
[Python] Dépannage avant d'accéder à Google Spreadsheet avec gspread
Convertir le code de caractère du fichier avec Python3
Une doublure qui produit 10000 chiffres de rapport de circonférence avec Python
[Python] Déterminez le type d'iris avec SVM
Connectez-vous à MySQL avec Python sur Raspberry Pi
Suivi GPS avec Raspeye 4B + BU-353S4 (Python)
Divers mémorandums lors de l'utilisation du sdk de l'API de messagerie LINE avec Python (2.7.9) + Google App Engine
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Extraire le tableau des fichiers image avec OneDrive et Python
Utilisez le capteur d'éclairement numérique TSL2561 avec Raspberry Pi
Apprenez Nim avec Python (dès le début de l'année).
Visualisons la pièce avec tarte aux râpes, partie 1
Comment utiliser Raspeye Relay Module Python
Détruire l'expression intermédiaire de la méthode sweep avec Python
Essayez de déboguer Python sur Raspberry Pi avec Visual Studio.
Détecter l'état de port du masque avec OpenCV et Raspberry Pi
Visualisez la gamme d'insertions internes et externes avec python
Calculer le coefficient de régression d'une analyse de régression simple avec python