ついに新年号が発表されました。今年は令和元年になるのですね。
慣れていないのでまだ変な感じがしますが、気持ちを新たに、新年度も頑張っていきたいと思います!
Cloud Automaterのハンズオンでは、使用する認証情報の配布にboxを用いており、認証情報のアップロードはこれまで手動で行なっていたため、自動化を進めています。
前回のインターンで実際に準備をしていくと、自動化できると嬉しいなぁと改めて感じるところが多かったので、頑張っていきたいと思います!
box APIを使える環境を整える
boxにデータを格納するため、初めにAPIを使える環境を整えます。
まず、boxの開発者ツールからカスタムアプリを作成します。普段、ファイルをやり取りしているboxの開発者ツールを使うことは、少しワクワクしました。
今回はOAuth認証を選択したので、ユーザーのコンテンツにアクセスするためにトークン、クライアントID、クライアント機密コードを使用していきます。OAuth認証を選択した際のboxの開発者トークンは60分ごとに更新されるので注意が必要です。
次にboxのsdkをダウンロードします。
とりあえず、APIを実行できるか確認するために、ユーザーIDを出力してみます。
from boxsdk import OAuth2, Client
auth = OAuth2(
client_id='XXXXXXXX',
client_secret='XXXXXXXXXXX',
access_token='XXXXXXXXXX',
)
client = Client(auth)
user = client.user().get()
print('The current user ID is {0}'.format(user.id))
無事、ユーザーIDが出力されました。APIを実行できることが分かったので、次のステップです。
特定のファイルをアップロードする
boxのAPIリファレンスを参考に、ファイルをアップロードするプログラミングを作成していきます。
リファレンスには
folder_id = '22222'
uploaded_file = client.folder(folder_id).upload('/path/to/file.pdf')
とあるので、先ほどのコードと合わせていきます。
今回はOAuth認証ということで、IDなどの情報を提示する必要があります。そこで、.envファイルを作成します。
.envファイルを使ってみる
GitHub上にはAPIキーなどの環境変数は公開してはいけません。なので、envファイルとして形だけGitHub上に上げます。
.envファイルを読み込むために、pythonではpython-dotenvを使います。
import os
from boxsdk import OAuth2, Client
from os.path import join, dirname
from dotenv import load_dotenv
from pathlib import Path # python3 only
env_path = Path('.') / '.env'
load_dotenv(dotenv_path=env_path)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
ID = os.getenv("ID")
SECRET = os.getenv("SECRET")
TOKEN = os.getenv("TOKEN")
auth = OAuth2(
client_id='ID',
client_secret='SECRET',
access_token='TOKEN',
)
client = Client(auth)
folder_id = 'XXXXXXXXX'
uploaded_file = client.folder(folder_id).upload('test.py')
ダブルコーテーションを入れてしまったことによって、エラーが発生します。また余分な部分が入っていたため、最終的に数行削る形になりました。
ファイルの最後の改行が抜けていたり、改行の場所がおかしかったり、いろいろ突っ込みどころがあったのですが、すごく細かく見てくださいました・・・
import os
from boxsdk import OAuth2, Client
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
ID = os.getenv("ID")
SECRET = os.getenv("SECRET")
TOKEN = os.getenv("TOKEN")
auth = OAuth2(
client_id=ID,
client_secret=SECRET,
access_token=TOKEN,
)
client = Client(auth)
folder_id = 'XXXXXXXX'
uploaded_file = client.folder(folder_id).upload('test.py')
最終的に、このようなかたちになりました。この課題が終わり、次に進もうとしていました。
すると、社員さんからコメントが入りました。
最初の方はコードの中でprint(ID)
とかprint(auth)
を実行して意図したものが入っているか確認しながらやるとスムーズだと思います!
あとcurlとかでも実行してみるようにするとAPIの使い方の問題かSDKの問題か切り分けできると思うので試してみると良いかもしれません🙋♀️
こちらは、今日は試すことができなかったのですが、社員さんに聞くだけではなく、自分でも確かめながら進めていきたいと思います!
リンクを知っている全員にファイルを公開する
共有リンクを作成するコードは、このような形のようです。
shared_link_url = client.file(file_id='11111').get_shared_link()
先ほどのコードも、うまく活用していきます。上のコードのclient.fileは今回のuploaded_fileに当たるので、そちらを変更します。
import os
from boxsdk import OAuth2, Client
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
ID = os.getenv("ID")
SECRET = os.getenv("SECRET")
TOKEN = os.getenv("TOKEN")
auth = OAuth2(
client_id=ID,
client_secret=SECRET,
access_token=TOKEN,
)
client = Client(auth)
folder_id = 'XXXXXXXXX'
uploaded_file = client.folder(folder_id).upload('test.py')
shared_link_url = uploaded_file.get_shared_link()
リンクを取得することはできたのですが、リンクの公開範囲を設定することができていませんでした。
そこで、GitHubのsdkを見てみます。公開範囲をopenに変更することで、リンクを知っている人のみ公開に変更できるようです!
import os
from boxsdk import OAuth2, Client
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
ID = os.getenv("ID")
SECRET = os.getenv("SECRET")
TOKEN = os.getenv("TOKEN")
auth = OAuth2(
client_id=ID,
client_secret=SECRET,
access_token=TOKEN,
)
client = Client(auth)
folder_id = 'XXXXXXXXX'
uploaded_file = client.folder(folder_id).upload('test.py')
shared_link_url = uploaded_file.get_shared_link(access="open")
このように変更し、公開範囲を限定することができました!!
優しい先輩になりたいです。
先週はお休みをいただいていたので、GitHubでもPythonでも、小さいミスをして、意外と途中てこずってしまいました。
見てくださってる社員さんが「細かく指摘してごめんね」と謝ってくださったのですが、むしろこちらとしてはそんなに細かく見てくださってありがたい限りです・・・
私も先輩となったら、このようにやさしく接することができる先輩になりたいなぁと思っています。
株式会社サーバーワークスでは一緒に働く仲間を募集しています