VB.netでニコニコ静画に有る画像の拡張子を特定する方法

お久しぶりです。
今回はニコニコ静画に使えるネタを紹介します。

静画のAPI(一部)
殆どPIRA Blog参考にしました(http://pita.s374.xrea.com/blog/archives/94

※ココに書いてある[画像番号]とはim0000のimを取った0000の事を言う

原型サイズ http://seiga.nicovideo.jp/image/source?id=[画像番号]
表示用のサイズ http://lohas.nicoseiga.jp/img/[画像番号]l
http://lohas.nicoseiga.jp/thumb/[画像番号]i
サムネイル http://lohas.nicoseiga.jp/img/[画像番号]s
http://lohas.nicoseiga.jp/thumb/[画像番号]q アス比そのまま
http://lohas.nicoseiga.jp/thumb/[画像番号] アス比変わる

ニコニコから取れる画像の形式はjpg,png,gifの三種類
だが拡張子が付いてない

どの画像がどの拡張子かを判別する方法は2つ
①保存するときレスポンスヘッダのContent-Typeを見て判断する (昔この方法だった)
②画像のバイナリー文字列の先頭の文字で判断する (今回はこの方法)

こちらのサイトを参考しました
PNG, GIF, JPEG のバイナリーデータなどについて | ヨモツネット
http://www.yomotsu.net/wp/?p=504

ファイル先頭の文字列
バイナリー文字列 デコード後
PNG 89 50 4E 47 臼NG
GIF(89a) 47 49 46 38 39 61 GIF89a
GIF(87a) 47 49 46 38 37 61 GIF87a
JPEG FF D8 FF .リ.

こうなっているので簡単に判別ができる
ね?簡単でしょ?

以下ソース

        Dim url As String = "http://seiga.nicovideo.jp/image/source?id=[画像番号]"

        Dim wc As New System.Net.WebClient
        wc.Headers.Add("Cookie", "user_session=ユーザーセッション")

        Dim imageByte As Byte() = wc.DownloadData(url)
        Dim str As String = Nothing

        For index = 0 To 5
            Dim hoge As String = Convert.ToString(imageByte(index), 16) '16進数に変換
            str = str & " " & hoge
        Next
        str = str.ToUpper() 'すべて大文字にする
        Console.WriteLine("→" & str)

        If str.StartsWith(" 89 50 4E 47") = True Then
            Console.WriteLine("PNG")
        End If


        If str.StartsWith(" 47 49 46 38 39 61") = True Then
            Console.WriteLine("GIF(89a)")
        End If


        If str.StartsWith(" 47 49 46 38 37 61") = True Then
            Console.WriteLine("GIF(87a)")
        End If


        If str.StartsWith(" FF D8 FF") = True Then
            Console.WriteLine("JPEG")
        End If

VB.netでユニコードエスケープ(u~)を読めるようにしてみる

よくJSONなどで使われてる
「u5143u6c17u3067u3059u304buff1fuff01」
こんな奴。

ニコ動のAPIでエラーで帰ってる奴にこれが使われてたので、頑張って調べた結果…

分からなかった!(´・ω・`)

なので、5zjさんに教えてもらいましたw
コード

'u3042(あ)からuを抜いた文字列を入れる
Dim hoge As String = "3042"
Dim intData As Integer = Convert.ToInt32(hoge, 16)
Dim mozi As String = ChrW(intData)

終わり。

次は長い文字列から直してみる
作り方は簡単!文字列をuで区切ればいいだけ!
で、こうなった

        Dim mes As String = ""
        Dim txt As String = "u5143u6c17u3067u3059u304buff1fuff01"
        Dim stArrayData As String() = Split(txt, "u")

        For Each stData As String In stArrayData
            If stData.Length = 4 Then
                Dim intData As Integer = Convert.ToInt32(stData, 16)
                Dim mozi As String = ChrW(intData)
                'Console.WriteLine(mozi)
                mes = mes & mozi
            End If
        Next
        Console.WriteLine(mes)

実行すると、「元気ですか?!」って出てきてくるはずです。

出てきたら、終わりです。ありがとうございました。

余談で、

Dim hoge As String() = txt.Split(CChar("u"))

Dim hoge As String() = Split(txt, "u")

で結果が違った…気づくのに結構時間が掛かった…orz