最近画像共有系のSNS、Instagram(インスタグラム)を使い始めました。
このサービスも他のSNSと同様にAPIが用意されているので、さっそくVBAから使ってみたいと思います。
Client ID他の取得
APIを利用するにはClient IDやClient Secretといった情報が必要になるので、まずは開発者向けサイトから必要な情報を取得します。
- 「Manage Clients」をクリックし、WebサイトのURLや電話番号と言った項目を入力し、「Sign up」ボタンをクリックします。
- Manage Clients画面が表示されたら「Register a New Client」ボタンをクリックします。
- アプリケーション名などの項目を入力し、「Register」ボタンをクリックします。
- 登録が無事に終わると、Client IDやClient Secretが表示されるので、メモ帳にでも控えておきます。



VBAからの呼び出し
準備ができたら、いよいよAPIの呼び出しです。
InstagramのAPIもMicrosoft GraphなどのAPIと同様、
code(authorization)取得
↓
access token取得
↓
エンドポイントにリクエストを投げて結果を取得
といった利用手順になっています。
下記コードでは「/users/self/media/recent」にリクエストを投げ、返ってきた結果から画像ファイルだけを指定フォルダーに保存する処理を行います。
Option Explicit
Public Sub SampleInstagramAPI()
'サンプル - Instagram API呼び出し
'※ ScriptControlを使っているため、32ビット環境のみ対応
'※ リダイレクト URIをlocalhostにしている場合は、ローカルサーバー(XAMPP他)の起動が必要な場合があります。
Dim url_auth As String
Dim url_token As String
Dim url_api As String
Dim url As String
Dim q As String
Dim code As String
Dim js As String
Dim access_token As String
Dim dat As Variant
Dim ary As Variant, ary2 As Variant
Dim item As Object, items As Object
Dim images As Object
Dim fol As String
Dim file As String
Dim v As Variant
Dim i As Long
Dim data, [type], standard_resolution 'JSONパース用ダミー
Const READYSTATE_COMPLETE = 4
'**********************************************************************
'クライアント ID, クライアント シークレット, リダイレクト URI
Const client_id As String = "(クライアント ID)"
Const client_secret As String = "(クライアント シークレット)"
Const redirect_uri As String = "(リダイレクト URI)"
'**********************************************************************
'画像ファイルの保存先選択
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "画像ファイルの保存先フォルダーを選択してください。"
.AllowMultiSelect = False
.InitialFileName = CreateObject("Shell.Application") _
.Namespace(0).Self.Path & Application.PathSeparator 'デスクトップ
If .Show = True Then
fol = .SelectedItems(1)
Else
Exit Sub
End If
End With
fol = AddPathSeparator(fol)
'authorization code取得
code = "" '初期化
url_auth = "https://api.instagram.com/oauth/authorize/?response_type=code" & _
"&redirect_uri=" & EncodeURL(redirect_uri) & _
"&client_id=" & client_id
With CreateObject("InternetExplorer.Application")
.Visible = True
.AddressBar = False
.MenuBar = False
.StatusBar = False
.Toolbar = False
.Width = 600
.Height = 480
.Navigate url_auth
While .ReadyState <> READYSTATE_COMPLETE Or _
.Busy = True Or _
(StrComp(Left(.LocationURL, Len(redirect_uri)), redirect_uri) <> 0)
DoEvents
Wend
q = .document.parentWindow.Location.Search
q = Mid(q, 2) '"?"削除
ary = Split(q, "&")
For i = LBound(ary) To UBound(ary)
ary2 = Split(ary(i), "=")
If LCase(ary2(0)) = "code" Then
code = ary2(1)
Exit For
End If
Next
.Quit
End With
If Len(Trim(code)) < 1 Then Exit Sub
'access token取得
js = "": access_token = "" '初期化
url_token = "https://api.instagram.com/oauth/access_token"
dat = "grant_type=authorization_code" & _
"&code=" & code & _
"&client_id=" & client_id & _
"&client_secret=" & client_secret & _
"&redirect_uri=" & EncodeURL(redirect_uri)
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "POST", url_token, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.send dat
Select Case .Status
Case 200: js = .responseText
End Select
End With
If Len(Trim(js)) < 1 Then Exit Sub
js = "(" & js & ")"
With CreateObject("ScriptControl")
.Language = "JScript"
access_token = .CodeObject.eval(js).access_token
End With
If Len(Trim(access_token)) < 1 Then Exit Sub
'Instagram APIを呼び出して画像ファイル保存
js = "" '初期化
url_api = "https://api.instagram.com/v1/users/self/media/recent/?access_token=" & access_token
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "GET", url_api, False
.send
Select Case .Status
Case 200: js = .responseText
End Select
End With
If Len(Trim(js)) < 1 Then Exit Sub
js = "(" & js & ")"
With CreateObject("ScriptControl")
.Language = "JScript"
Set items = .CodeObject.eval(js).data
For Each item In items
Select Case item.type
Case "image" '画像のみ処理
Set images = item.images
url = images.standard_resolution.url
v = Split(url, "/")
file = LCase(v(UBound(v)))
file = Left(file, InStr(file, ".jpg") + 3)
DownloadFile url, fol & file
End Select
Next
End With
MsgBox "処理が終了しました。", vbInformation + vbSystemModal
End Sub
Private Sub DownloadFile(ByVal url As String, ByVal SaveFilePath As String)
Dim req As Object
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Set req = Nothing '初期化
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
If req Is Nothing Then Exit Sub
req.Open "GET", url, False
req.send
Select Case req.Status
Case 200
With CreateObject("ADODB.Stream")
.type = adTypeBinary
.Open
.Write req.responseBody
.SaveToFile SaveFilePath, adSaveCreateOverWrite
.Close
End With
Case Else
MsgBox "エラーが発生しました。" & vbCrLf & _
"ステータスコード:" & req.Status, _
vbCritical + vbSystemModal
Exit Sub
End Select
End Sub
Private Function EncodeURL(ByVal Target As String) As String
'URLエンコード
With CreateObject("ScriptControl")
.Language = "JScript"
EncodeURL = .CodeObject.encodeURIComponent(Target)
End With
End Function
Private Function AddPathSeparator(ByVal s As String) As String
If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92)
AddPathSeparator = s
End Function
コードの実行
上記コードを実行すると、下記の流れで処理が行われます。
- 画像ファイルを保存するフォルダーを選択します。
- Instagramの認証画面が表示されるので、ユーザーネームとパスワードを入力し「ログイン」ボタンをクリックします。
- 承認画面が表示されたら「Authorize」ボタンをクリックします。
- API呼び出しが無事に行われると、画像ファイルが1.で指定したフォルダーにダウンロードされます。



おわりに
以前は好きなスコープを設定できたらしいのですが、現在ではAPIの呼び出しはサンドボックスモードで行われ、一部制限が掛かっています。
・Sandbox Mode – Instagram Developer Documentation
https://www.instagram.com/developer/sandbox/
審査を通過すればライブモードに切り替えることができますが、なかなか厳しい審査のようですね。
・超厳しい 【Instagram API 】の審査基準 を翻訳してまとめてみた
http://www.ie-kau.net/entry/2016/01/26/%E8%B6%85%E5%8E%B3%E3%81%97%E3%81%84_%E3%80%90Instagram_API_%E3%80%91%E3%81%AE%E5%AF%A9%E6%9F%BB%E5%9F%BA%E6%BA%96_%E3%82%92%E7%BF%BB%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF
ただ、制限はあれどある程度の範囲であればAPIを自由に呼び出せるので、なかなか遊び甲斐があるだろうと思います。

















この記事へのコメントはありません。