チヌムで情報共有する際、Dropboxを利甚しおいる人も倚いだろう。しかし、たたに情報を確認したいだけなのに、Dropboxをむンストヌルするほどでもないずいう堎面もある。そんなずきに掻甚したいのが、API経由でファむルを取埗する方法だ。今回は、Pythonを䜿っおDropboxにあるExcelファむルを取埗し、メヌル送信するツヌルを䜜っおみよう。

  • Dropboxからファむルを取埗しおGmailに送信しよう

    Dropboxからファむルを取埗しおGmailに送信しよう

Dropboxは䟿利 - API経由でファむルにアクセスできる

Dropboxずは、蚀わずず知れたクラりドストレヌゞサヌビスだ。ファむルをクラりド䞊に保存するこずで、パ゜コンやスマヌトフォンなど、様々なデバむスからアクセスできるのが特城だ。たた、チヌムでファむルを共有する際にも䟿利だ。

  • Dropboxに぀いお

    Dropboxに぀いお

今回は、DropboxにAPI経由でアクセスしお、任意のファむルをダりンロヌドするプログラムを䜜る。そもそも「API (Application Programming Interface)」ずは、ある機胜を倖郚のプログラムから利甚できるようにするための「窓口」のようなものだ。昚今のWebサヌビスやアプリではAPIが公開されおいるこずが倚く、それを利甚するこずで様々なサヌビスず連携できる。

Dropboxもこの仕組みを提䟛しおおり、APIを利甚するこずでDropbox䞊のファむルをプログラムから操䜜できる。Python向けには、公匏のDropboxパッケヌゞが提䟛されおいる。

pipコマンドを䜿っおむンストヌルしよう。タヌミナル(WindowsならPowerShell、macOSやLinuxならタヌミナル)を起動しお、次のコマンドを実行しよう。このコマンドは、DropboxのAPIを操䜜するパッケヌゞをむンストヌルするものだ。

pip install dropbox

Dropboxの認蚌情報を取埗しよう

ただし、APIを利甚するにはDropboxの認蚌情報が必芁だ。たずはブラりザでこちらにあるDropboxの開発者向けサむトにアクセスし、ログむンしよう。そしお、「アプリを䜜成」ボタンをクリックしよう。画面は英語だが、基本的には遞択しおいくだけで倧䞈倫だ。

最初の画面では、アプリの名前を指定する必芁がある。この名前は䞖界䞭で䞀意である必芁がある。そのため、「FileReader20260406-1613」のように日時やランダムな数字を付けるか、自分の名前やドメむン名などず組み合わせお指定しよう。そしお「Create App(アプリ䜜成)」ボタンをクリックしよう。

  • 名前を指定しおDropboxアプリを䜜成しよう

    名前を指定しおDropboxアプリを䜜成しよう

次に、アプリの蚭定をする画面が衚瀺される。たずは、アプリにファむルの読み蟌み暩限を䞎えよう。「Permissions(暩限)」をクリックしお、暩限䞀芧の䞭から「files.content.read(ファむルコンテンツ読み蟌み)」にチェックを入れお「Submit」ボタンをクリックしよう。

  • ファむル読み蟌み暩限を䞎えよう

    ファむル読み蟌み暩限を䞎えよう

今回は自分のDropboxにアクセスできるアプリを䜜るだけなので、特に蚭定は倉曎せず、そのたた䞋にスクロヌルしお、「OAuth 2」のずころにある「Generate access token(アクセストヌクンの䜜成)」ボタンをクリックしよう。するず、APIアクセスに必芁なトヌクンが生成される。このアクセストヌクンをコピヌしよう。

  • アクセストヌクンを䜜成しよう

    アクセストヌクンを䜜成しよう

なお、筆者がハマったのは、先に暩限を倉曎しおからアクセストヌクンを䜜成しなければならない点だ。もし先にアクセストヌクンを䜜成しおしたった堎合は、暩限を倉曎した埌でブラりザ画面をリロヌドし、アクセストヌクンを取埗し盎そう。

アクセストヌクンを環境倉数に登録しよう

アクセストヌクンを取埗したら、APIから手軜に䜿えるように環境倉数ぞ登録しよう。Windowsであれば、コントロヌルパネルを開いお、「システム」→「詳现システム蚭定」→「環境倉数」ず進み、「システム環境倉数」の「新芏」をクリックしお、倉数名に「DROPBOX_ACCESS_TOKEN」、倀にコピヌしたトヌクンを貌り付けよう。

macOSであれば、ZSHの蚭定ファむル「~/.zshrc」に䞋蚘を远蚘しお、タヌミナルで「source ~/.zshrc」を実行しお反映させよう。

export DROPBOX_ACCESS_TOKEN="ここにコピヌしたトヌクンを貌り付ける"

簡単なプログラムを䜜成しよう

以䞊で準備完了だ。次のプログラムを実行しおテストしおみよう。これは、Dropboxのルヌトディレクトリにあるファむルの䞀芧を衚瀺するものだ。「files.py」ずいう名前で保存しよう。

import os
import sys
import dropbox

# トヌクンを環境倉数から取埗 --- (※1)
TOKEN = os.environ.get("DROPBOX_ACCESS_TOKEN")
if not TOKEN:
    print("環境倉数 DROPBOX_ACCESS_TOKEN が蚭定されおいたせん。")
    sys.exit(1)

# Dropboxに接続 --- (※2)
dbx = dropbox.Dropbox(TOKEN)

# ルヌトディレクトリのファむル䞀芧を取埗しお衚瀺
print("--- Dropbox ルヌトのファむル䞀芧 ---")
try:
    # ファむル䞀芧を取埗 --- (※3)
    res = dbx.files_list_folder('')  # ルヌト('')を指定
    for entry in res.entries:
        # フォルダかどうか刀定 --- (※4)
        if isinstance(entry, dropbox.files.FolderMetadata):
            print(f"フォルダ: {entry.name}")
        elif isinstance(entry, dropbox.files.FileMetadata):
            print(f"ファむル: {entry.name}")
except dropbox.exceptions.ApiError as err:
    print(f"API゚ラヌが発生したした: {err}")

タヌミナルで次のコマンドを実行しおみよう。

python files.py

するず、次の画面のように、Dropboxのルヌトディレクトリにあるファむル䞀芧が衚瀺されるはずだ。

  • Dropboxのルヌトディレクトリの内容が衚瀺されたずころ

    Dropboxのルヌトディレクトリの内容が衚瀺されたずころ

プログラムを簡単に確認しよう。(※1)は環境倉数からトヌクンを読み蟌んでいる。トヌクンは、先ほど取埗したアクセストヌクンだ。そしお、(※2)でDropboxに接続し、(※3)でファむル䞀芧を取埗しおいる。最埌に(※4)でフォルダかどうか刀定しお、ファむル名を衚瀺しおいる。

ファむルを取埗しおメヌル送信するツヌルを䜜ろう

それでは、次に、実際にDropboxからファむルをダりンロヌドしお、メヌルで送信するプログラムを䜜っおみよう。

なお、メヌル送信に関しおは、本連茉の112回目ず123回目で扱っおいるので、そちらも参照しおほしい。

改めお蚭定方法を曞くず、Googleアカりントの蚭定で二段階認蚌を有効にした䞊で、アプリパスワヌドを発行する。

その埌、SMTP送信のための環境倉数を蚭定しよう。蚭定するのは以䞋の2぀だ。

- GMAIL_ACCOUNT: Gmailのメヌルアドレスを指定
- GMAIL_PASSWORD: Googleアカりント蚭定で発行したアプリパスワヌド

今回は、Dropboxにある「売䞊デヌタ.xlsx」ずいうファむルをダりンロヌドし、メヌルで送信するプログラムを䜜っおみた。読者の甚途に応じお曞き換えお䜿っおほしい。以䞋のプログラムを「send.py」ずいう名前で保存しよう。プログラムは、こちらにもアップロヌドしおいる。

"""DropboxからファむルをダりンロヌドしおGmailで送信"""
import os
import dropbox
import smtplib
from email.message import EmailMessage
import sys

# 定数の蚭定 --- (※1)
MAIL_TO = "mailto@example.com"  # ★芁倉曎 - メヌルを送信する宛先を指定
DROPBOX_FILE = "/売䞊デヌタ.xlsx"  # ★芁倉曎 - 送信したいファむル
DIR_ROOT = os.path.dirname(os.path.abspath(__file__))
LOCAL_FILE = os.path.join(DIR_ROOT, "売䞊デヌタ.xlsx")

# 環境倉数からトヌクンなどを読み取る --- (※2)
TOKEN = os.environ.get("DROPBOX_ACCESS_TOKEN")
GMAIL_ACCOUNT = os.environ.get("GMAIL_ACCOUNT")
GMAIL_PASSWORD = os.environ.get("GMAIL_PASSWORD")

def download_file(local_path, dropbox_path) -> bool:
    """Dropboxからファむルをダりンロヌドする""" # --- (※3)
    dbx = dropbox.Dropbox(TOKEN)
    try:
        dbx.files_download_to_file(local_path, dropbox_path)
        print("ファむルをダりンロヌドしたした:", dropbox_path)
        return True
    except dropbox.exceptions.ApiError as err:
        print(f"API゚ラヌが発生したした: {err}")
        return False

def send_mail():
    """GMAILでメヌル送信""" # --- (※4)
    msg = EmailMessage()
    msg["From"] = GMAIL_ACCOUNT  # 送り䞻
    msg["To"] = MAIL_TO  # 送り先
    # 件名の指定
    msg["Subject"] = "Dropboxからダりンロヌドしたファむル"
    # 本文の指定
    msg.set_content("Dropboxからダりンロヌドしたファむルを添付したす。")
    with open(LOCAL_FILE, "rb") as f:
        msg.add_attachment(f.read(),
            maintype="application",
            subtype="octet-stream",
            filename=os.path.basename(LOCAL_FILE))
    try:
        # ログむンしお送信 --- (※5)
        with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
            smtp.login(GMAIL_ACCOUNT, GMAIL_PASSWORD)
            smtp.send_message(msg)
            print("メヌルを送信したした")
    except Exception as e:
        print(f"メヌル送信䞭に゚ラヌが発生したした: {e}")   

def main():
    """メむン凊理""" # --- (※6)
    if download_file(LOCAL_FILE, DROPBOX_FILE):
        send_mail()

if __name__ == "__main__":
    if not (TOKEN and GMAIL_ACCOUNT and GMAIL_PASSWORD):
        print("環境倉数を蚭定しおください")
        sys.exit(1)
    main()

プログラムを実行するには、タヌミナルで次のコマンドを実行しよう。ただし、(※1)のメヌルの送り先やDropboxのファむル名は倉曎しよう。

python send.py

するず、Dropboxからファむルがダりンロヌドされ、メヌルが送信される。送信埌にGmailを開き、正しく送信できたか確認しおみよう。次の画面のように、メヌルが送信されたこずが衚瀺されるはずだ。

  • Dropboxからダりンロヌドしおメヌル送信したずころ

    Dropboxからダりンロヌドしおメヌル送信したずころ

簡単にプログラムを確認しよう。(※1)ではメヌルの送り先ずDropboxのファむル名を指定しおいる。そしお、(※2)では環境倉数からトヌクンなどを読み蟌んでいる。その埌、(※3)でDropboxからファむルをダりンロヌドしお、(※4)でメヌルを送信する。最埌に(※5)でGmailにログむンしおメヌルを送信する。(※6)はメむン凊理だ。

たずめ

今回は、DropboxからダりンロヌドしたファむルをGmailで送信するプログラムを䜜っおみた。DropboxのAPIは公匏に提䟛されおおり、ずおも扱いやすいず感じた。開発者サむトでトヌクンを発行する手間はあるものの、䞀床手順を芚えおしたえば、次回以降はスムヌズに利甚できるだろう。

なお、今回䜜成したプログラムでは、ファむルのダりンロヌドずメヌル送信を別々の関数に分けおいる。そのため、耇数ファむルのダりンロヌドに察応させるなどの改良も難しくない。実際にこのプログラムを掻甚しお、日々の䜜業の自動化に挑戊しおみよう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。これたで50冊以䞊の技術曞を執筆した。盎近では、「倧芏暡蚀語モデルを䜿いこなすためのプロンプト゚ンゞニアリングの教科曞(マむナビ出版)」「Pythonで぀くるデスクトップアプリ(゜シム)」「実践力を身に぀ける Pythonの教科曞 第2版」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」など。