📁
F# - HTTP で Google Drive API を利用する
序文
Google Drive API の .NET 用クライアントライブラリ Google.Apis.Drive.v3 [↗] に uploadType [↗] を設定する方法が見当たらなかったので HTTP から直接利用する方法を調べてみました。
概要
- F# で アクセストークン を取得する方法の紹介。
事前準備
認可コードの取得
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&client_id=🐣
&redirect_uri=urn:ietf:wg:oauth:2.0:oob&
scope=https://www.googleapis.com/auth/drive&access_type=offline
- URL の
🐣
をクライアント ID に書き換える。 - URL をブラウザで開く。
- 開いたページを進めると認可コードが表示される。
リフレッシュトークンの取得
RefreshToken.fsx
let bodyJson =
"""{
"client_id": "🐣",
"client_secret": "😎",
"grant_type": "authorization_code",
"code": "🦑",
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"access_type": "offline"
}"""
let content =
new System.Net.Http.StringContent(
bodyJson,
System.Text.Encoding.UTF8,
@"application/json"
)
let request =
new System.Net.Http.HttpRequestMessage(
System.Net.Http.HttpMethod.Post,
"https://www.googleapis.com/oauth2/v4/token",
Content = content
)
let client = new System.Net.Http.HttpClient()
let response = client.Send(request)
client.Dispose()
printfn "%s"
<| response.Content.ReadAsStringAsync().Result
-
RefreshToken.fsx
ファイルを作る。 - ソースコードの絵文字を書き換える。
記号 | 書き換え先 |
---|---|
🐣 |
クライアント ID |
😎 |
クライアントシークレット |
🦑 |
認可コード |
- ターミナルでコマンドを実行する。
PowerShell
dotnet fsi RefreshToken.fsx
- 出力された JSON の
"refresh_token"
の値を記録する。
アクセストークンの取得
Program.fs
let regex =
new System.Text.RegularExpressions.Regex(
@"^{\n ""access_token"": ""(.*?)""",
System.Text.RegularExpressions.RegexOptions.Compiled
)
let bodyJson =
"""{
"client_id": "🐣",
"client_secret": "😎",
"grant_type": "refresh_token",
"refresh_token": "🍎"
}"""
let refresh () =
let content =
new System.Net.Http.StringContent(
bodyJson,
System.Text.Encoding.UTF8,
@"application/json"
)
let request =
new System.Net.Http.HttpRequestMessage(
System.Net.Http.HttpMethod.Post,
"https://www.googleapis.com/oauth2/v4/token",
Content = content
)
let client = new System.Net.Http.HttpClient()
let response = client.Send(request)
client.Dispose()
if response.IsSuccessStatusCode then
let resultJson = response.Content.ReadAsStringAsync().Result
let accessToken = regex.Match(resultJson).Groups.[1].Value
Some(accessToken)
else
None
-
Program.fs
ファイルを作る。 - ソースコードの絵文字を書き換える。
記号 | 書き換え先 |
---|---|
🐣 |
クライアント ID |
😎 |
クライアントシークレット |
🍎 |
リフレッシュトークン |
使用例
- フォルダを作成する関数
createFolder
。 - 失敗時に前の項目で作った
refresh
を呼び出している。
Program.fs
let mutable accessToken = ""
let rec createFolder name =
let bodyJson =
$"""{{
"mimeType": "application/vnd.google-apps.folder",
"name": "{name}"
}}"""
let content =
new System.Net.Http.StringContent(
bodyJson,
System.Text.Encoding.UTF8,
@"application/json"
)
let parameters = "uploadType=multipart"
let request =
new System.Net.Http.HttpRequestMessage(
System.Net.Http.HttpMethod.Post,
$"https://www.googleapis.com/drive/v3/files?{parameters}",
Content = content
)
request.Headers.Add("Authorization", $"Bearer {accessToken}")
let client = new System.Net.Http.HttpClient()
let response = client.Send(request)
client.Dispose()
if not response.IsSuccessStatusCode then
let newToken = refresh()
if newToken.IsSome then
accessToken <- newToken.Value
createFolder name
Discussion