http requestでGoogle DriveからファイルをDLする

##はじめに
前回、[Google SpreadsheetをURLダウンロードする](https://qiita.com/hotsprings/items/1730135ec4b7b8f40f99)
を紹介したのですが
色々穴があったので新しく投稿することにしました。

##なにがダメなのか?
個人のGoogle DriveではDL出来たのですが、GsuiteのものはDL出来ませんでした。
##### [プライベートのGoogle Drive]　　　　　[GsuiteのGoogle Drive]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/f3b89ad5-1a4e-f7b0-4c91-9756ff6fe3ef.png)

おいおい…

##事前準備
どうやらGsuiteのDrive fileにアクセスするためにはAPIを使用する必要があるようです。
アクセストークン、リフレッシュトークンの取得方法については
ハイダックさんの記事が非常にわかりやすいのでそちらを見ながら試してください。
[【UiPath×Gmail】GmailAPI初期設定～トークン取得](http://hiduac.com/googleapi_gettoken/)
※Google DriveのScopeは下記なので認証コード発行時は注意。
　https://www.googleapis.com/auth/drive

リフレッシュトークンを無事に取得出来たら、保存しておきましょう。
もし、orchestratorを使える環境ならば、アセットに記録しておくと良いでしょう。
トークンはアカウント毎に取得する必要があるので、ロボットごとの値にするなど注意が必要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/b5ef5889-5403-b34d-3a20-12b646f77363.png)

アセットを使用する際は下記のようにします。
これでOrchestratorに保存している値をロボットが取得することが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/582a05ae-ea08-4084-2b6f-f5192e8ebd23.png)

###ダウンロード手順
大まかな流れは以下になります。
1.リフレッシュトークンからアクセストークンを取得
2.アクセストークンを使用して、Google Driveからファイルの種類と名前を取得
3.アクセストークンを使用して、Google DriveからファイルをDLする

######1.リフレッシュトークンからアクセストークンを取得
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/2d884e68-5ad0-2721-0f2c-f417a128e313.png)
1-1.OC上のアセットに保存したクライアントID、クライアントシークレット、リフレッシュトークンを取得します。
※OCが無い場合は他の方法で大丈夫です。

1-2.Deserialize JSON
・JSON…JavaScript Object Notation。テキストベースのデータフォーマット。
・デシリアライズ…変換されたデータを、もとのデータ構造やオブジェクトに復元する処理や操作
・シリアライズ…データ構造やオブジェクトをバイト列に変換すること

用語読んでもなんのことやら…と感じるかもしれませんが、
この工程を入れることで下記のような文字列からピンポイントでデータを取得できるようになると思っていただければ大丈夫です。
{
  "access_token": "ABCDEFGHIJKLMNOPQRSTU",
  "expires_in": 3600,
  "scope": "https://www.googleapis.com/auth/drive",
  "token_type": "Bearer"
}

使用方法についてはUipath道場さんのページがわかりやすいです。
参考資料：[JSONファイルの読み込み](http://www.uipath-dojo.com/purpose/text_readjson.html)


1-3.Assign
To：access_token 
Value：responseJson.GetValue(“access_token”).ToString

これでresponseJsonと名付けられたJObjectからアクセストークンを取得できます。

#####2.アクセストークンを使用して、Google Driveからファイルの種類と名前を取得
取得したアクセストークンで、ファイルをDLしたいのですが、
ダウンロードする際、ファイルの種類によってエンドポイントやパラメータが変わるため
GoogleDriveFileIDを使用して、以下の情報を取得します。
・エンドポイント
・mime type
・ファイル名


![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/c4cd9226-4fff-654e-3192-49456c3c6215.png)
2-1.GoogleDriveFileID
説明の都合上、ここに配置していますが部品化する際などはargumentで渡してあげましょう。

2-2.http request
ここで各種情報を取得します。
設定は下記の通りです。これでResultに結果が入ります。

・EndPoint
"https://www.googleapis.com/drive/v2/files/"+GoogleDriveFileID+"?&access_token=&"
・Headers
Authorization   "Bearer "+ access_token
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/ccd68b8b-b8fc-ae6c-0c27-432ecf15e5e3.png)

・Result :　好きな変数
・StatusCode :　好きな変数

2-3.Deserialize JSON
ここは1-2と同様です。コピペで動きます。

2-4.Assign_DLFilename
ファイル名を入れたい変数(DLFilename)に入れます。
※ここで取得するtitleには拡張子は入りませんので注意してください。
ResponseJson.GetValue(“title”).ToString

2-5.Assign_FileType
ファイルタイプを入れたい変数(mimeType)に入れます。
ResponseJson.GetValue(“mimeType”).ToString

2-6.Switch
取得したmimeTypeによって、Google Docsか否か　や　拡張子を分岐させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/01c5b9c0-d9b7-6e01-e5ba-ce4dde3cf680.png)

MimeTypeについては下記を参照してください。
https://developers.google.com/drive/api/v3/mime-types

#####3.アクセストークンを使用して、Google DriveからDLする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/caa23b54-1495-71ed-5c03-5bce8e49e4e1.png)
このような処理でGoogle Docsかそれ以外かで分岐させます。
Google DocsとはDocumentation、Spreadsheet、slideなどです。

http requestの設定は下記の通りです。
違いは単純にEndpointだけです。ResourcePathの設定をお忘れなく。

〇Google Docs
"https://www.googleapis.com/drive/v3/files/"+GoogleDriveFileID+"/export?&access_token="

![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/ccd68b8b-b8fc-ae6c-0c27-432ecf15e5e3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/507417f8-3985-dfb9-aa96-f3ab7cec79ed.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/dc0215d5-123b-80b1-ec83-ebb29c73867b.png)


〇Google Docs以外
"https://www.googleapis.com/drive/v3/files/"+GoogleDriveFileID+"/?alt=media&access_token="

![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/ccd68b8b-b8fc-ae6c-0c27-432ecf15e5e3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/3848070a-950c-4fc3-2db8-1226450d35f6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/298686/d5afef32-74b1-beaa-9ba3-0b5a31dc10a2.png)

###注意点
実際にワークフローとして使用する際は、
各http requestの場所でStatusCodeで
200となっているものをTrue、それ以外をFalseにしてコントロールしてあげましょう。
また、ResourcePathの部分はフルパスにする必要がありますので、
DLFolder + DLFilenameなどにしてあげると良いでしょう。
古いファイルがあった場合、上書きされます。

###終わりに
これらの機能はUipathに限らず、http requestが使えるものならなんでも使用出来そうです。
また、途中のエンドポイントの書き方はとりあえず動けばOKって感じの方向けなので、
気になる方は各自、修正してください。
なにかの役に立てば幸いです。