Création de Linebot et partage de fichiers avec Python

introduction

Je voudrais vous présenter comment utiliser l'API Dropbox en Python et comment ajouter une fonction de transmission de fichiers à Linebot. Cette fois, nous allons créer un Linebot qui vous enverra des images de calendrier mensuel via Dropbox.

↓ comme ça Linebot参照.jpg

En ce qui concerne la création de Linebot lui-même, il existe de nombreux sites utiles, je vais donc l'omettre ici.

J'ai commencé LINE Bot avec Python [Jusqu'à ce que vous implémentiez le bot LINE avec Flask et que vous le déployez sur heroku] (https://qiita.com/suigin/items/0deb9451f45e351acf92)

De quoi avez-vous besoin?

Langage: python 3.7.4 Bibliothèque (Linebot): Flask 1.1.1, line-bot-sdk 1.16.0, Bibliothèque (Dropbox): dropbox 9.5.0

Installation de la bibliothèque

Installez avec les trois commandes pip suivantes.

pip install Flask
pip install line-bot-sdk
pip install dropbox

C'est une pratique lorsque l'installation est terminée.

Pratique (avec Dropbox)

Tout d'abord, je vais vous présenter comment utiliser facilement l'API Dropbox. Pour vous inscrire en tant que développeur Dropbox et obtenir un jeton d'accès, veuillez consulter la Procédure d'inscription des développeurs de l'application Dropbox API.

Dans ce qui suit, vous pouvez télécharger des images à l'aide de l'API Dropbox et créer des liens partagés. Téléchargez les images de votre calendrier préféré sur Internet et renommez-les en 1.jpg, 2.jpg, ... dans l'ordre.

import dropbox
import os

#1.Utilisation de l'API Dropbox
DBX_ACCESS_TOKEN = ***********************
dbx = dropbox.Dropbox(DBX_ACCESS_TOKEN)

#2.Téléchargez des fichiers sur Dropbox et créez des liens partagés
for month in range(1,13):
  local_path = '%s.jpg' %month
  dbx_path = "/" + local_path
 
  #2-1.Téléchargement de fichier (Explication 1)
  f = open(local_path, 'rb')
  dbx.files_upload(f.read(),dbx_path, mode=dropbox.files.WriteMode.overwrite)
  f.close()
  
  #2-2.Création d'un lien partagé (Explication 2)
  setting = dropbox.sharing.SharedLinkSettings(requested_visibility=dropbox.sharing.RequestedVisibility.public)
  try:       
    link = dbx.sharing_create_shared_link_with_settings(path=dbx_path, settings=setting)
  except:
    print("Déjà partagé.")
 else:
    url = link[0].url
    print(url)

Explication 1 Par défaut, le mode de files_upload est WriteMode.add. Dans ce cas, si un fichier portant le même nom que le fichier à télécharger existe déjà, il sera enregistré avec le nom de fichier (1). Si vous souhaitez écraser, réglez le mode sur écraser.

Commentaire 2 Dans SharedLinkSettings, il existe trois types de méthodes de partage: public, team_only et password (un mot de passe est requis pour l'accès). De plus, vous pouvez décider de la date limite de partage, du mot de passe, etc.

Si vous voulez en savoir plus, [Dropbox for Python] Veuillez consulter (https://dropbox-sdk-python.readthedocs.io/en/latest/index.html).

Incorporation dans Linebot

À l'aide du lien partagé créé dans la procédure ci-dessus, créez un Linebot qui renvoie le lien partagé en réponse au message. La plupart du code ci-dessous est exemples GitHub line-bot-sdk-python Est le même que celui décrit.

from flask import Flask, request, abort
import os
import dropbox
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

DBX_ACCESS_TOKEN = ***********************
dbx = dropbox.Dropbox(DBX_ACCESS_TOKEN)
#----------------------------Explication d'ici 1
values = []
for month in range(1,13):
  local_path = '%s.jpg' %month
  dbx_path = "/" + local_path

  link = dbx.sharing_list_shared_links(path=dbx_path).links
  url = link[0].url
  url = url.replace('www.dropbox','dl.dropboxusercontent').replace('?dl=0','')
  values.append(url)

keys = [1,2,3,4,5,6,7,8,9,10,11,12]
pic_id = dict(zip(keys, values))
#----------------------------Explication jusqu'à ici 1

#Obtenir des variables d'environnement
YOUR_CHANNEL_ACCESS_TOKEN = ***********************
YOUR_CHANNEL_SECRET = ***********************

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

@app.route("/")
def hello_world():
    return "hello world!"

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

#----------------------------Explication 2 d'ici
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    words = [12,11,10,9,8,7,6,5,4,3,2,1]
    text = event.message.text
    for word in words:
        msg = 'calendrier' + str(word)
        if msg in text:
            a = word - 1
            key = keys[a]
            line_bot_api.reply_message(
            event.reply_token,[
            TextSendMessage(text = key + 'C'est un calendrier mensuel!'),
            TextSendMessage(text = pic_id[key])
            ])
#----------------------------Explication jusqu'à ici 2

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

Explication 1 Créez un dictionnaire qui relie le mois du calendrier à l'URL. sharing_list_shared_links (path = dbx_path) .links renvoie un tableau contenant des informations sur le fichier en plus des liens dans le chemin correspondant. (Le lien est stocké en premier.) url.replaced change «www.dropbox» dans le lien partagé en «dl.dropboxusercontent» et supprime «? Dl = 0». Il s'agit du processus requis pour afficher le lien partagé sur le navigateur.

Commentaire 2 L'instruction if se branche conditionnellement pour que Linebot envoie un lien image en fonction du message. (Voir l'image en haut de la page d'accueil) Si vous enregistrez [1,2, ... 12] en mots dans l'ordre à partir de janvier, "Calendrier 1" sera lu en premier lorsque vous enverrez le message "Calendrier Décembre". Le calendrier de janvier est de retour de Linebot. Par conséquent, les mots sont stockés sous la forme [12,11, ... 1].

Si vous voulez en savoir plus, [Dropbox for Python] (https://dropbox-sdk-python.readthedocs.io/en/latest/index.html),[line-bot-sdk-python] Veuillez consulter (https://line-bot-sdk-python.readthedocs.io/en/stable/index.html).

référence

Linebot J'ai commencé LINE Bot avec Python [Jusqu'à ce que vous implémentiez le bot LINE avec Flask et que vous le déployez sur heroku] (https://qiita.com/suigin/items/0deb9451f45e351acf92)

Dropbox Procédure d'enregistrement du développeur de l'application API Dropbox [Utilisez l'API Dropbox pour télécharger des fichiers, créer des liens partagés et obtenir des liens partagés] (https://qiita.com/Fortinbras/items/f77984e5a7c2b3045473)

** Document officiel ** [Dropbox for Python] (https://dropbox-sdk-python.readthedocs.io/en/latest/index.html) [line-bot-sdk-python] (https://line-bot-sdk-python.readthedocs.io/en/stable/index.html)

Recommended Posts

Création de Linebot et partage de fichiers avec Python
LINE-Bot [0] en Python
Traitement de fichiers en Python
Manipulation de fichiers avec Python
Manipulation de chemin de fichier / dossier en Python
Enregistrez le fichier binaire en Python
Créer un fichier binaire en Python
Créer un fichier
ORC, opérations de fichier Parquet en Python
Création d'interface graphique en python avec tkinter 2
Contrôle exclusif avec fichier de verrouillage en Python
Création d'interface graphique en python à l'aide de tkinter partie 1
Convertir un fichier psd en png en Python
Ecrire le fichier O_SYNC en C et Python
Lisez le fichier ligne par ligne avec Python
Lisez le fichier ligne par ligne avec Python
Accès exclusif aux fichiers entre les processus en Python
[GPS] Créer un fichier kml avec Python
[Python] Lire la ligne spécifiée dans le fichier
Quadtree en Python --2
Python en optimisation
CURL en Python
Fichier python de script
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
Traitement de fichiers Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python