2018年4月15日日曜日

YouTube 生放送中の評価芸

生放送中をみるようになって思ったのですけど、
例えばチャンネル登録数がもう少しで5000人になるって時にわざと解除したり、
一発芸すると低評価が入ってすぐ戻ったりなど
評価の上下で視聴者とコミュニケーションするのだなと思いました。

ということで、生放送中の評価を取得するプログラムを書いてみました。
仕様は
・最初にタイトル等を表示する
・時間,視聴者数,再生数,高評価,低評価,チャンネル登録数を記録する
・10秒間隔で取得する
・終了条件はなし
です。
特に今回は追加のテクニックはありません。  ①にはAPIキー、②には今回は生放送中の動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。



livedata.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
$key = "①";
$videoId = "②";//今回はvideoIdを入力
 
// 処理開始日時
//タイムゾーンを東京に設定
date_default_timezone_set('Asia/Tokyo');
echo  "処理開始日時". date('Y-m-d H:i:s') . PHP_EOL;
 
//生放送の情報の取得して表示
$video_url_base = "https://www.googleapis.com/youtube/v3/videos?part=snippet,liveStreamingDetails";
$video_url = $video_url_base . "&id=" . $videoId . "&key=" . $key;
$video_contents = file_get_contents($video_url);
$video_json = json_decode($video_contents,true);
 
//配信タイトル(トピック)取得
$title = $video_json["items"][0]["snippet"]["title"];
//配信開始時刻取得
$StartTime = $video_json["items"][0]["liveStreamingDetails"]["actualStartTime"];
//チャンネル名取得
$channel_name = $video_json["items"][0]["snippet"]["channelTitle"];
//説明文取得
$description = $video_json["items"][0]["snippet"]["description"];
 
echo "タイトル:" . $title . PHP_EOL ;
echo "放送開始時間:" . date("Y-m-d H:i:s",strtotime($StartTime)) . PHP_EOL ;//タイムゾーンを東京に変更している
echo "チャンネル名:" . $channel_name . PHP_EOL ;
echo "概要欄:" . $description . PHP_EOL . PHP_EOL;
 
//チャンネルIDを取得
$channelId = $video_json["items"][0]["snippet"]["channelId"];
 
 
 
echo "10秒ごとにサンプリングする" . PHP_EOL;
echo "時間,視聴者数,再生数,高評価,低評価,チャンネル登録数" . PHP_EOL;
 
$video_url_base = "https://www.googleapis.com/youtube/v3/videos?part=statistics,liveStreamingDetails";
$video_url = $video_url_base . "&id=" . $videoId . "&key=" . $key;
 
$channel_url_base = "https://www.googleapis.com/youtube/v3/channels?part=statistics";
$channel_url = $channel_url_base . "&id=" . $channelId . "&key=" . $key;
 
while(true)
{
 //視聴者数 再生数 高評価 低評価
 $video_contents = file_get_contents($video_url);//動画側へのAPIを叩く
 $video_json = json_decode($video_contents,true);
 
 $viewCount = $video_json["items"][0]["statistics"]["viewCount"];
 $likeCount = $video_json["items"][0]["statistics"]["likeCount"];
 $dislikeCount = $video_json["items"][0]["statistics"]["dislikeCount"];
 $viewers = $video_json["items"][0]["liveStreamingDetails"]["concurrentViewers"];
 
 //チャンネル登録数
 $channel_contents = file_get_contents($channel_url);//チャンネル側へのAPIを叩く
 $channel_json = json_decode($channel_contents,true);
 $subscriberCount = $channel_json["items"][0]["statistics"]["subscriberCount"];
 
 //表示
 echo date('Y-m-d H:i:s')  . ",";
 echo $viewers . ",";
 echo $viewCount . ",";
 echo $likeCount ",";
 echo $dislikeCount . ",";
 echo $subscriberCount . PHP_EOL;
 
 //10 秒待つ
 usleep(10*1000000);
}
?>


注釈としては
YouTubeからのレスポンスのタイムゾーンが違うので 7行目と26行目で日本時間に変換しています。
61行目から66行目は取得した情報をカンマ区切りで出力しています。



備考として
・生放送中にリアルタイムでグラフがだせたらもっといいかも。PHPだけでは無理っぽいけど。あとチャットの勢いとかだせたらいいかなぁ。
・生放送中のアーカイブをそのままアップするとどうも生放送中の再生数が引き継がれる感じでした。
・低評価と高評価や再生数が約12分毎で更新することもあるし、もっと短いこともあってよくわからない。YouTubeのアルゴリズムの問題?
・取得の間隔は評価の変化が激しい時に3秒とか短めにできたら評価芸がわかっていいかもしれない。今回は10秒としましたがもっと短い周期でも制限的に大丈夫かも。
・長時間取得しっぱなしだと1日の使用量の制限を超える可能性があるので注意する。
・配信者は生放送中の上下が後からみることができるのだろうか?
・コードでは現在時刻で表示しているがliveStreamingDetailsのactualStartTimeでアーカイブの再生時刻と合わせられるかもしれない

0 件のコメント:

コメントを投稿