À 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é.
-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
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.
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.
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.
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
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.