PHPでタイトル取得してみた

参考サイト:PHPでWEBページのタイトルを抜き出すサンプル
      http://creazy.net/2008/05/php_get_page_title_sample.html

こんな感じで書いて動かしてみる

echo "PageTitle:". getPageTitle("http://www.google.co.jp/");

function getPageTitle($url) {
    $html = file_get_contents($url);
    $html = mb_convert_encoding($html, "UTF-8", "auto" );
    if (preg_match( "/<title>(.*?)</title>/i", $html, $matches)) {
        return $matches[1];
    } else {
        return "タイトル取れなかった";
    }
}

実行すると、一応結果は表示される…が!
Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding
って出る、解決するには、

$html = mb_convert_encoding($html, mb_internal_encoding());

と、”auto”を消すだけだった。

これで、”一応取”得はできた
次に今のコードで、
http://headlines.yahoo.co.jp/hl?a=20110321-00000046-jij-soci
ここの名前を取ろうとすると…

見事に文字化けする!
(ちなみに、”auto” 付けてもダメでした)
勝手にエンコードの種類を特定して勝手にしてくれるのかと思ってた…

もしかして:このページが EUC-JP で出来てるから?

取りあえず、ゴニョゴニョしてみる

結論こんなコードになった。

echo "PageTitle:". getPageTitle("http://headlines.yahoo.co.jp/hl?a=20110321-00000046-jij-soci");

function getPageTitle( $url ) {
    $html = file_get_contents($url);
    $enc_format =  "JIS, eucjp-win, sjis-win, UTF-8";
    $html = mb_convert_encoding($html, "UTF-8", $enc_format);
    if ( preg_match( "/<title>(.*?)</title>/i", $html, $matches) ) {
        return $matches[1];
    } else {
        return "タイトル取れなかった";
    }
}

“auto”じゃなく、形式を指定してあげればいいみたい

ちなみに、なぜ、eucjp-win とか付けるのか?
参考サイト:SJISじゃなくてSJIS-win、EUC-JPじゃなくてeucJP-winを使おう
      http://pentan.info/php/sjiswin_eucjpwin.html

以上終わりです。

っと思ったけど、まだ続きがある!
世の中にはこんなサイトもある、

( ゚д゚)…

?!

改行が…

まぁ、正規表現変えればいいだけなんだけどねw

preg_match( "/<title>(.*?)</title>/is", $html, $matches)

/なんとか/i が文字列の大文字・小文字を区別しない
/なんとか/is が大文字・小文字を区別せず、1行とみなして調べる

こんな感じ

結論!

$br = "<br />n";
$url = "http://headlines.yahoo.co.jp/hl?a=20110321-00000046-jij-soci";

    echo "PageTitle:". getPageTitle($url). $br;

    function getPageTitle($url){
        $html = file_get_contents($url);

        $enc_format =  "JIS, eucjp-win, sjis-win, UTF-8";
        $enc_html = mb_convert_encoding($html, "UTF-8", $enc_format);
        if(preg_match( "/<title>(.*?)</title>/is", $enc_html, $matches)){
            //echo mb_detect_encoding($html, $enc_format). "<br />n";
            return $matches[1];
        } else {
            return false;
        }
    }

以上です、お疲れ様でした。

追伸:改行が入るかも…

生主討論会2の俺的意見

※すっげー見づらいです

http://live.nicovideo.jp/watch/lv40747757
でやってた生主討論会の俺的意見

①相変わらず出会い厨多いいよね
 多いいっすね。オワリ

 え?意見少ないだって?
 だってどうでもいいしw
 (それに、勉強会目的とかあるし)

 いや、別に出会い厨が居るのは問題ないんですよ
 そこからが問題だと自分は思うんですよ

 出会う→犯罪行為→ニュースになる→ニコ生は悪の巣窟
 ニコ生は悪の巣窟だと思われる
 
 これが困るんですよね。

 結論:別に出会う分には問題ないです、はい
    ただ犯罪行為などニュースになるような事はしないでほしい

②エロ配信で釣るのはどうよ?
 別にいいんじゃないっスか?はい
 自分はエロ配信とか見ないんで分からないっすね、

 釣ってコミュ伸ばそうがそれは人それぞれ有って良いんじゃないですかね?
 釣られてたらザマーミロって事でw

 つまり、何が言いたいかというと、エロ配信がすべてじゃないって事ですよ
 面白ければ評価される。それだけです。
 (面白い の評価の仕方は人それぞれです。 暗黒が面白い・面白くない って人もいるし)

 結論:①の結論と似てるけど、犯罪行為にならない程度ならいいと思いますよ
    釣られて怒るのは小学生までです。

 ちなみに、運営曰くR-18タグって形だけなんですって、だからR-18付けようが実況タグ付けようが関係ないらしいですよ

③ニコニコ大会議をどう思いますか?
 一応要る

 そもそも、元々の大会議は新バージョンや新機能の発表の場で有ったわけですよ

=================================================================
  当初は運営報告や新バージョンの発表会を大規模に行う方向性であり、ユーザーゲストも極小であった。
  が、ニコニコ動画(9)発表と同時に敢行したニコニコ大会議2009-2010 ニコニコ動画(9)全国ツアー(というかそのファイナル)
  以降、『「大会議」と言う名のライブイベント』大きく様変わりすることとなる。

ニコニコ大百科-ニコニコ大会議から抜粋
=================================================================

 そう、元々は新機能など発表用のイベントだった訳ですよ、
 それに何故か歌い手さんなどが来てかつ有料に成った訳ですよ、

 一緒にしたのが間違いなんですよ。

 昔:新機能発表(メイン)→ 歌い手(サブ)
 今:新機能発表(メインに近いサブ)→ 歌い手(メイン)

 こんな気がしますねw

 結論:昔みたいに新機能発表などなら必要だと思います。
 結論②:歌い手と新機能発表を別枠で放送して!

 こんな感じですw
 
 ちなみに、新機能発表だけなら100P位払ってもいいですよ。
 歌い手はあまり興味無いので払いたくないですけどねw

④3年後、ユーザー生放送は残っているか?
 残っている
 しかし、今よりも過疎ってると思う

 3年後は、有名配信者OR過疎配信の2極化しちゃうと思うんですよね。
  ・ちくわランキング上位配信者だけ見る
  ・今過疎ってる放送は、たぶん1年持たないと思うんですよ、
  ・放送枠がありすぎて昔入ってたコミュしか見ない←今の俺
  ・新しい放送を見つけるのがめんどくさい。
  ・ニコ生クルーズとか見のめんどくさい。

 今ニコ生が盛んな理由(俺的感!)
  1、ニコニコ動画の為にプレミアムになった。しかし、プレミアムだけが利用できるニコ生を実際に放送してみたらはまった、からやってる
  2、暗黒放送など、常に満員放送などでも追い出されないようにプレミアムになった。 後↑と同じ理由
  3、出会いやエロ目的でニコ生を始めて見た
  4、友達がやってって面白そうだからやってみた
  5、gacktや福山雅治がやってるから!

 なぜ放送が過疎るのか?
  ①昔見たい(枠取がクリックの頃)にワザワザクリックせずに待ってるだけで枠が取れるようになった
   ちゃんと、企画せずに枠取りができるようになっちゃった。
   昔は枠取るのが一番の苦労で、しかも、放送時間が30分と限られていました、なので放送内容がぎっしり詰まってた気がします。

  ②枠数が多すぎる
   ↑でも書いたんですが、枠数が多いいと2極化になっちゃうと思うんですよ。

  ③ランギングがあるから
   ランキング上位に上がる→何となく見る→さらに上がる→過疎放送はもっと過疎る

 こんな感じに俺は考えてます。

 結論:残ってる。しかし今よりも過疎ってる
    (何となく思ったこと: 有名配信者を潰す。& 枠数を減らす。 AND クリックを復活させる これすれば、いいんでね?)

⑤運営に物申す
 1、取りあえず、バグ減らしてください…

【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』にします。

終わりです。

以上使い方でした。

【某人理論の解説】PHPで ‘ と . を大量に繋げるのと “” で一括でやるのどっちがいいの?

以下某人の説明
まず、PHPの言語仕様ではシングルクォートのが早いで、
ダブルクォートは書き方がたくさんあって
シングルクォートと同じ書き方にすればシングルクォートのがはやい
例えばシングルクォートだったら
'a' . $a . 'a'
これしかないんだけど
ダブルクォートだったら
"a" . $a . "a"
"a{$a}a"
"a $a a"
これだけあるだから、
セッキーとみゆっきのやり方はフェアじゃない
だそうです

PHPで ‘ と . を大量に繋げるのと “” で一括でやるのどっちがいいの?

PHPで ‘ と . を大量に繋げるのと “” で一括でやるのどっちがいいの?

実験に使用したコードは下記の通り

$value = 'ミートボール';
$start = microtime(true);

for($i = 1;$i <1000;$i++){
//下記の2つで実験
//echo '私の大好きな'. $value. ' ヴぁー';
//echo '私の大好きな${valu}eヴぁー';
}
$end = microtime(true);
echo "<br />n";
echo $end - $start. '秒処理にかかった';

結果

echo ‘私の大好きな’. $value. ‘ ヴぁー’;の場合
10000回
① 6.7555861473083秒処理にかかった
② 3.3046059608459秒処理にかかった
③ 3.1271910667419秒処理にかかった

echo ‘私の大好きな${valu}eヴぁー’;の場合
1000回
① 0.42566299438477秒処理にかかった
② 0.84215688705444秒処理にかかった
③ 0.38536906242371秒処理にかかった

このような結果になりました。

※鯖によって結果は異なりますのでご注意ください。
※この結果は、m264鯖で実験した結果です。

ニコニコ生放送のコメント取得の方法まとめ

実際にコメントビューアーを作ってみて分かったこと(飛ばしてもいいよ)
http://sekki.org/wordpress/?p=13

実際にコメント取得してみよう!(VB.NETのコードです)
http://sekki.org/wordpress/?p=25

Cookieを渡してgetplayerstatus を取る方法です。
http://sekki.org/wordpress/?p=47

コメントサーバーの仕組み?を解説します。
これを読めば、アリーナ、立ち見ABCどこにでも接続が出来ちゃう!
http://sekki.org/wordpress/?p=54

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

ニコ生コメント鯖について分かったかも知れない事

※間違ってたらごめんなさい
※ユーザー生の場合です。

知ったら得すること
ポート番号は
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
これしかない。

アドレスは
msg101.live.nicovideo.jp
msg102.live.nicovideo.jp
msg103.live.nicovideo.jp
msg104.live.nicovideo.jp
これだけ

スレッドは
アリーナから席ごとに+1した数
例)1062986843 : アリーナ
1062986844 : 立ち見A列
1062986845 : 立ち見B列
1062986846 : 立ち見C列
こんな感じ

そして!!
ポート番号が 2814 で、アドレスが msg101.live.nicovideo.jp でアリーナの時
立ち見にアクセスするときは、ポートが 2805 で、アドレスが msg102.live.nicovideo.jp になる!

例)スレッド,アドレス,ポートの順番
1039973590,msg101.live.nicovideo.jp,2813 : アリーナ
1039973591,msg101.live.nicovideo.jp,2814 : 立ち見A列
1039973592,msg102.live.nicovideo.jp,2805 : 立ち見B列
1039973593,msg102.live.nicovideo.jp,2806 : 立ち見C列

繰り上がる?感じ。
さらに、アドレスが msg104.live.nicovideo.jp だと次が、 msg101.live.nicovideo.jp に戻る

例)1062194798,msg104.live.nicovideo.jp,2814 : アリーナ
1062194799,msg101.live.nicovideo.jp,2805 : 立ち見A列
1062194800,msg101.live.nicovideo.jp,2806 : 立ち見B列
1062194801,msg101.live.nicovideo.jp,2807 : 立ち見C列

スレッドは、関係なしに+1

自分は、一回アリーナに戻して(今立ち見Cだったら、アドレスをアリーナにしなおす)全席を出してます。

以上だいたい説明しました。
これが今まで書いた内容が全部出来れば無敵です!w

コメビューを開発する方は頑張ってください!

== 追伸 ==
経過時間、残り時間の出し方は、暇だったら書きます。

ニコニコ生放送のコメント取ってみようぜ!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から値を取るコードを書きたいと思います。

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

実際にコメント取得して分かった事一覧

1, ログインしなくてもコメントは取れる。
2, なので、コミュに入ってない、かつコミュニティ限定のコメントも取れなくはない。
3, 匿名IDからユーザーの名前を取得するのは不可能
4, 帰ってくるチャットのXMLの順番が適当
5, コメントの長さが多いいと分割されて帰ってくる。
6, アリーナ・立ち見ABCのコメント鯖は推測できる。
7, 経過時間を出すのは結構難しい。
8, なんの文字がNGワードなのか特定不可能になった。
しかし、コメント番号から、NGコメントはわかる。

以上自分がコメント取得して分かったことです。

次は本題