J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!

Objectif

Recevez des e-mails de Gmail avec Line Bot et envoyez des messages non lus à l'expéditeur et soumis à Line.

Environnement de développement

référence

Vérifier les e-mails Gmail avec Python

Code source

main.py


from flask import Flask, request, abort
 
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, LocationMessage, VideoMessage,
    FollowEvent, UnfollowEvent, PostbackEvent, TemplateSendMessage,
    ButtonsTemplate, CarouselTemplate, CarouselColumn, PostbackTemplateAction
)
from linebot.exceptions import LineBotApiError

import os
import json
import sys
import re

import Gmail 
 
app = Flask(__name__)

YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
 
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
 
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    text = event.message.text
    user_id = event.source.user_id
    if 'Email' in text:
      mail = Gmail.GmailAPI()
      # get the reply message
      messages = mail.process_message()
      # reply
      line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=str(messages))
        )

if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

Lorsque le Bot reçoit un message contenant la chaîne «mail», il récupère le message non lu de Gmail et y répond.

Gmail.py


from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools

class GmailAPI:
    def __init__(self):
        # If modifying these scopes, delete the file token.json.
        self._SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'

    def ConnectGmail(self):
        store = file.Storage('token.json')
        creds = store.get()
        if not creds or creds.invalid:
            flow = client.flow_from_clientsecrets('credentials.json', self._SCOPES)
            creds = tools.run_flow(flow, store)
        service = build('gmail', 'v1', http=creds.authorize(Http()))

        return service

    def GetMessageList(self):

        # connect to API
        service = self.ConnectGmail()

        MessageList = []

        query = 'is:unread'

        # get all the messages (maximum=20)
        messageIDlist = service.users().messages().list(userId='me',maxResults=20,q=query).execute()

        # if no messages, stop return error
        if messageIDlist['resultSizeEstimate'] == 0: 
            return 'error'
        # Get information about the mails
        for message in messageIDlist['messages']:
            row = {}
            MessageDetail = service.users().messages().get(userId='me',id=message['id']).execute()
            for header in MessageDetail['payload']['headers']:
                # get the senders of the messages
                if header['name'] == 'From':
                    row['from'] = header['value']
                # get the subject of the messages
                elif header['name'] == 'Subject':
                    row['subject'] = header['value']
            MessageList.append(row)
        return MessageList

    def process_message(self):
        messagelist = self.GetMessageList()
        # If there is no messages new, reply 'No message'
        if messagelist == 'error':
            reply = 'No message'
            return reply 

        # make reply message
        reply = ''
        for mlist in messagelist:
            from_name = mlist['from'].split('<')[0] + ':'
            sub = '「' + mlist['subject'] + '」'
            message = '{}\n{}'.format(from_name, sub)
            reply += message 
            reply += '\n\n'
        return reply

À l'aide de l'API Gmail, GetMessageList obtient l'expéditeur et le sujet du courrier non lu, et process_message les convertit en une chaîne de caractères lors de la réponse et le renvoie.

résultat

Screenshot_20200531-181629905 (1)_1.jpg J'ai effacé le nom de l'expéditeur, mais j'ai pu obtenir le nom et le titre et répondre!

À propos du futur

Je voudrais mettre en œuvre les deux suivants à l'avenir.

Recommended Posts

J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai essayé de faire LINE BOT avec Python et Heroku
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
Je souhaite envoyer un message de Python à LINE Bot
[Python] J'ai fait un décorateur qui ne semble pas avoir d'utilité.
J'ai créé une application Web en Python qui convertit Markdown en HTML
J'ai créé un bot Discord en Python qui se traduit quand il réagit
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un Bot LINE avec Serverless Framework!
Made Mattermost Bot avec Python (+ Flask)
[Python] J'ai créé un robot qui me dit la température actuelle lorsque j'entre un nom de lieu sur LINE
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
Une histoire à laquelle j'étais accro après la communication SFTP avec python
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai créé une VM qui exécute OpenCV pour Python
J'ai créé un module Python pour traduire les commentaires
J'ai créé une bibliothèque python qui fait rouler le rang
Les débutants en Python ont créé un chat BOT alors j'ai essayé de résumer comment le faire
J'ai fait un texte Python
J'ai fait un robot discord
J'ai créé un package pour filtrer les séries chronologiques avec python
[Python] J'ai essayé de laisser LINE BOT répondre aux prévisions météo
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
Création d'un toolver qui crache le système d'exploitation, Python, les modules et les versions d'outils à Markdown
J'ai fait un Line-bot avec Python!
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux connaître la météo avec LINE bot avec Heroku + Python
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai créé un robot Twitter qui marmonne le Pokémon capturé par #PokemonGO
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai fait un bot mou qui m'informe de la température
J'ai créé Chatbot en utilisant l'API LINE Messaging et Python (2) ~ Server ~
[python] J'ai créé une classe qui peut écrire rapidement une arborescence de fichiers
J'ai créé un robot Line qui devine le sexe et l'âge d'une personne à partir de l'image
J'ai créé un générateur brouillé qui encode vos phrases préférées de UTF-8 à Shift-JIS (cp932) en Python
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
J'ai créé un conteneur Docker pour utiliser JUMAN ++, KNP, python (pour pyKNP).
J'ai fait un générateur de mot de passe pour enseigner Python3 aux enfants (bonus) * Complètement refait
Depuis que j'ai commencé à travailler à des moments différents, j'ai créé un Bot qui me dit l'heure de quitter le travail
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
J'ai créé un outil pour parcourir automatiquement plusieurs sites avec Selenium (Python)
J'ai fait un compteur de caractères avec Python
J'ai fait Othello pour enseigner Python3 aux enfants (2)