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