【VB.net】CookieGetterSharpの使い方

①どっかからHalCookieGetterSharpを持ってきます。

②今のライブラリを追加します。
『プロジェクト』→『参照の追加』→参照タブからさっき持ってきたライブラリを追加します。

③クラスの外に

  Imports Hal.CookieGetterSharp

っと書きます

④次にクッキーを取ってくるコードを書きます

       '使うブラウザに応じて"GoogleChrome3"の部分を書き換えます。
       Dim cg = CookieGetter.CreateInstance(BrowserType.GoogleChrome3)
        If cg.Status.IsAvailable = False Then
            MessageBox.Show("ブラウザが確認できませんでした。")
            Exit Sub
        End If

        '"http://live.nicovideo.jp/"で使われるクッキーの"user_session"の値を取得します。
        Dim collection = cg.GetCookieCollection(New Uri("http://live.nicovideo.jp/"))
        Dim userSession = collection("user_session")

        Console.WriteLine(userSession.Value)

⑤VS2010以下の人は終わりです。
 後は煮るなり焼いたりゴニョゴニョします。

 VS2010以上の人は引き続き続きます

⑥.NET Framework 4だと動かないので、.NET Framework 3.5に落とします
 『プロジェクト』→『(何とか)のプロパティ』→『詳細コンパイル オプション』
  →『対象のフレームワーク(すべての構成)』→『.NET Framework 3.5』にします。

終わりです。

以上使い方でした。

ニコニコ生放送のコメント取ってみようぜ!3

Cookieを渡して getplayerstatus を取る方法

        Dim wc As New WebClient
        wc.Headers.Add("Cookie", "user_session=" & UserSessionValue)
        Dim enc As Encoding = Encoding.UTF8

    Dim liveID As String = "lv36190498"
        Dim data As Byte() = wc.DownloadData("http://live.nicovideo.jp/api/getplayerstatus?v=" & liveID)
        Dim res As String = enc.GetString(data)

        '0幅文字が含まれてるので消す(消さないと動かない)
        res = res.Replace("", "")

        Dim status = XDocument.Parse(res)
        threadId = status...<ms>...<thread>.Value
        messageServerPort = status...<ms>...<port>.Value
        messageServerAddress = status...<ms>...<addr>.Value

UserSessionValueの中に自分のユーザーセッションを記入してください、
自分は、Hal.CookieGetterSharpを使用しました。
CookieGetterSharpの使い方はいつか書きたいなーっと思ってます。

次は、コメントサーバーの仕様について書いて行きたいと思います。
自分の勝手な憶測なので、間違ってたらごめんなさい…

ニコニコ生放送のコメント取ってみようぜ!2

作るのに参考にしたサイト
とある技術の備忘録 – C#でニコ生からコメント取得
http://d.hatena.ne.jp/r7kamura/20091123/1258948977

NicoPITA Blog.
http://nicopita.info/NicoPITA/

今回は、VB.NET で作成していきます。

Imports System.Net.Sockets
Imports System.Text

Module Module1

    Sub Main()

        'http://watch.live.nicovideo.jp/api/getplayerstatus?v=lv何とか
        'msの値
        '取ってくるのはまた別に書くよ!
        Dim thread As Integer = 1062986843
        Dim addr As String = "msg102.live.nicovideo.jp"
        Dim port As Integer = 2813

        Dim more As String = ""
        'res_from で過去ログ取得 -10にすると、-10コメント前を取ってくる
        Dim req = String.Format("<thread thread=""{0}"" version=""20061206"" res_from=""-10"" /> ", thread)
        Dim tcp As New TcpClient(addr, Integer.Parse(port.ToString))
        Dim ns As NetworkStream = tcp.GetStream()
        Dim sendBytes As Byte() = Encoding.UTF8.GetBytes(req)
        sendBytes(sendBytes.Length - 1) = 0

        ns.Write(sendBytes, 0, sendBytes.Length)


        Dim resSize As Integer

        Do
            Dim resBytes As Byte() = New Byte(2048) {}

            resSize = ns.Read(resBytes, 0, resBytes.Length)
            If resSize = 0 Then
                Exit Do
            End If

            Dim message As String = Encoding.UTF8.GetString(resBytes)
            'Console.WriteLine(message)

            message = more & message
            more = ""
            Dim elements As String() = message.Split(New String() {vbNullChar}, StringSplitOptions.RemoveEmptyEntries)

            '<chat thread="1062986843" no="1" vpos="6300" date="1293718792" mail="184" user_id="mwR5e8FptFf6-O3gZtQ3ceHAgPU" premium="3" anonymity="1">テスト!</chat>

            For Each receiveData As String In elements

                '帰ってきたXMLに"<chat"から"</chat>"まで全部あったらで分ける
                '文字が多いいと、分割して帰ってくるから、
                If receiveData.StartsWith("<chat") AndAlso receiveData.EndsWith("</chat>") Then
                    OnReceiveChat(receiveData)
                Else
                    'チャットが分割で来たときの処理。
                    If receiveData.StartsWith("<thread resultcode=") = False Then
                        If receiveData.StartsWith("<view_counter") = True Then
                            'ここは、ニコニコ実況ようだから、スルーでおk
                        ElseIf receiveData.Contains("</chat>") = False Then
                            more = receiveData
                        End If
                    End If

                End If

            Next

        Loop While ns.CanRead
    End Sub

    Public Sub OnReceiveChat(ByVal receiveData As String)
        Dim commentNo As String
        Dim commentVpos As String
        Dim commentDate As String
        Dim commentMaill As String
        Dim commentUserID As String
        Dim commentPremium As String
        Dim commentAnonymity As String
        Dim commentText As String
        Dim commentThread As Integer
        Dim commentLoom As String = ""

        Dim userName As String = Nothing




        Dim comment = XElement.Parse(receiveData)
        commentNo = comment.@no
        commentDate = comment.@date
        commentVpos = comment.@vpos
        commentMaill = comment.@mail
        commentUserID = comment.@user_id
        commentPremium = comment.@premium

        '時々帰って来ない時がある。
        If commentPremium = Nothing Then
            commentPremium = "0"
        End If

        commentAnonymity = comment.@anonymity
        commentThread = CInt(comment.@thread)
        commentText = comment.Value



        'ユーザーレベル種分け
        If commentPremium = "0" Then
            commentPremium = "一般"
        ElseIf commentPremium = "1" Then
            commentPremium = "プレミアム"
        ElseIf commentPremium = "3" Then
            commentPremium = "放送主"
        ElseIf commentPremium = "7" Then
            commentPremium = "BSP"
        End If

        '0=一般
        '1=プレミアム
        '2=放送終了後に送られてくる、/disconnect のレベル
        '3=放送主
        '7=BSP

        '公式生見ると25とかある時がある。何故かはわからん

        Console.WriteLine("{0} : {1}", commentNo, commentText)
        'Console.Write(vbCrLf & CommentNo & " " & CommentVpos & " " & CommentDate & " " & CommentMaill & " " & CommentUserID & " " & CommentPremium & " " & CommentAnonymity & " " & CommentText)
 
    End Sub

End Module

お疲れ様でした 一応取得部分は完成です。
次は、getplayerstatusから値を取るコードを書きたいと思います。