ExcelのVBAでニコニコ動画APIを読み込んでみる

ちょっとExcelでニコニコ動画のAPIを読み込みたいと思ったので、試してみました。

まずは、下記のようなシートを用意。
VBA実行前
作りたいのは、A列の2行目以降に動画IDを書いて、その左側にその動画の情報を書き込んでいくというもの。

VBAはほとんど触ったことがないので、Rangeプロパティだとか、Offsetプロパティだとかの概念がよく分かってなかったのですが、なんとか作ることができました。

Sub nico()
    Dim xdoc As Object
    Dim url As String
    Dim a_col As Range
    Dim a_end As Integer
    
    Set a_col = Range("A2", Range("A1").End(xlDown)) 'A列の動画IDをすべて選択
    
    Set xdoc = CreateObject("MSXML2.DOMDocument")
    xdoc.async = False
    
    For Each cell In a_col
        url = "http://ext.nicovideo.jp/api/getthumbinfo/" & cell.Value
        If (xdoc.Load(url) = False) Then
            MsgBox "アクセス失敗:" & cell.Offset(0, 0).Value
            Exit Sub
        End If
        
        For Each obj In xdoc.DocumentElement.SelectNodes("//thumb")
            cell.Offset(0, 1).Value = obj.SelectNodes("//title").Item(0).Text           'タイトル
            cell.Offset(0, 2).Value = obj.SelectNodes("//thumbnail_url").Item(0).Text   'サムネイルURL
            cell.Offset(0, 3).Value = obj.SelectNodes("//view_counter").Item(0).Text    '再生数
            cell.Offset(0, 4).Value = obj.SelectNodes("//comment_num").Item(0).Text     'コメント数
            cell.Offset(0, 5).Value = obj.SelectNodes("//mylist_counter").Item(0).Text  'マイリスト数
            If obj.SelectNodes("//user_id").Length = 1 Then
                cell.Offset(0, 6).Value = obj.SelectNodes("//user_id").Item(0).Text     'ユーザーID
            End If
            If obj.SelectNodes("//tag[@category]").Length = 1 Then
                cell.Offset(0, 7).Value = obj.SelectNodes("//tag[@category]").Item(0).Text  'カテゴリータグ
            End If
            Dim tag_i As Integer
            tag_i = 1
            For Each Tag In obj.SelectNodes("//tag")
                cell.Offset(0, tag_i + 7).Value = Tag.Text  'タグ
                tag_i = tag_i + 1
            Next
        Next
    Next
    Columns("B").AutoFit    'B列は自動的に幅調整
End Sub

XPathにはあまりなれてないのですが、属性で判断するカテゴリータグを取得したいということもあり、XPathを利用することに。
19行目で動画情報が取得できたかどうかの可否、25行目でユーザーIDがあるかどうかの可否、28行目でカテゴリータグがあるかどうかの可否を調べて条件分けしてます(動画情報が取得できたどうかは、If文じゃなくて、For Each文を使ってるので、間違ったつかいかたかもしれません)。

というわけで、実行してみました。
VBA実行後
相変わらず、カテゴリーがうまく取得できていないところがありますが、他は問題なくいけたようです。
ありえない動画ID(この例では、sm1とaiueo)は動画情報を取得していませんし、ユーザーIDやカテゴリーも見つからなかったものは飛ばしているよう。数値のみの動画IDの動画情報もうまく取得できました。
今気づいたんですが、カテゴリータグってタグの一番目とは限らないんですね。てっきり、一番目なのかと・・・。ということは、カテゴリーが取得できない場合、一番目のタグを見て判断するという方法は使えないのか・・・。

ところで、自分が使ってるExcelはExcel2010なのですが、Excel2013だとWEBSERVICE関数なんていう便利なものがあるよう(参考:Excel 2013で追加された「WEBSERVICE」関数を使って、マクロを使わずWeb APIを利用する。 | 初心者備忘録)
何これ。すごい便利そう。

コメント

タイトルとURLをコピーしました