2019年2月24日日曜日

YouTubeの生放送のチャットをPHPから書き込む

今回はYouTuve Liveのチャットの書き込みに挑戦します。
例えば、「チャンネル登録よろしくね」を100コメントごとに1回流すとか、
注意事項を10分ごと流すとか、特定のワードに対して自動で返すとか。
botってやつです。

今回は10分ごとにA⇒B⇒C⇒A…のコメントをローテーションするものを作ります。


APIの使い方は公式のここ
と検索してできた外国の動画でやり方を察しました。情報が少なくて苦労しました。
荒らしとかの関係なのか全然でてこない。謎です。

公式の「Try it now.」の以下のフォーマットが投げられればいいらしいです。



スパチャもたぶんtypeを変えればできそう。試さないけど。



今までのread操作とはやることが多いです。
①OAuth2.0での認証が必要なので、以前の記事を参照してトークンを作成。
ただし、書き込みなので
「https://www.googleapis.com/auth/youtube.readonly」
ではなく
「https://www.googleapis.com/auth/youtube」
でトークンを作る必要があります。
「get_token.php」の12行目を変更し、実行すればOK。
これは URLを送信するときにヘッダーに含まれるようにします。

 ②チャットのテキストのために配列を作ってそれをjson_encode関数で
変換して付与しています。
これを URLを送信するときにRequest bodyに含まれるようにします。

 コードは以下のようになります。
コードの前半は、以前の記事「登録チャンネルリストの出力」 の前半と同じです。

①にはAPIキー、②には今回は生放送中の動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。
③ここにコメントを入力です。絵文字はちょっとわかんないです。
読み出ししたのをコピペすればいけるか?

なお、トークンは読み出して作成するので今回はコード上に記述しません。
また、一度作成したトークンの更新処理を行っていないので1時間で無効になります。
50分ぐらいで更新とか工夫してください。。。


chat_write.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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
////////////////////////////////////////////////////////////////////////////////////////////////
define('TOKEN_URL', 'https://accounts.google.com/o/oauth2/token');
 
//ファイルからclient_idとclient_secretを読み込む
$fp = @fopen("client_data.txt","r") or die("File Open Error!\n");
$client_id = rtrim(fgets($fp));
$client_secret = rtrim(fgets($fp));
fclose($fp);
 
//ファイルから更新トークンを呼び出す
$fp = @fopen("ReToken.txt","r") or die("File Open Error!\n");
$refresh_token =rtrim( fgets($fp));
fclose($fp);
 
//リフレッシュトークンからアクセストークンを取得する
$params2 = array(
 
    'client_id' => $client_id,
    'client_secret' => $client_secret,
    'refresh_token' => $refresh_token,
    'grant_type' => 'refresh_token',
);
$headers = array(
    'Content-Type: application/x-www-form-urlencoded',
);
// POST送信
$options2 = array('http' => array(
    'method' => 'POST',
    'content' => http_build_query($params2),
    'header' => implode("\r\n", $headers),
));
 
// アクセストークンの取得
$res = file_get_contents(TOKEN_URL, false, stream_context_create($options2));
 
// レスポンス取得
$token = json_decode($res, true);
if(isset($token['error'])){
    echo 'エラー発生';
    exit;
}
$access_token = $token['access_token'];
 
//////////////////////////////////////////////////////////////////////////////////////////////////ここからチャットへの書き込み
$key = "①";
$videoId = "②";
$comentList = array(
"A",//③
"B",
"C",
);
$cnt = 0;
 
 
 
//ChatIdの取得
$search_api="https://www.googleapis.com/youtube/v3/videos?part=liveStreamingDetails&id=" . $videoId ."&key=" . $key;
$search_contents = file_get_contents($search_api);
$search_json = json_decode($search_contents,true);
$ChatId = $search_json["items"][0]["liveStreamingDetails"]["activeLiveChatId"];
 
 
 
while(1)
{
    $post_api="https://www.googleapis.com/youtube/v3/liveChat/messages?part=snippet";
 
    $params = array(
      'snippet' => array(
        'type' =>  'textMessageEvent',
        'liveChatId'=> $ChatId,
        'textMessageDetails'=>array(
           'messageText'=>$comentList[$cnt],
        )
      )
    );
    $json_param = json_encode($params);
 
 
    $options = array('http' => array(
        'method' => 'POST',
        'header' =>implode("\r\n", array(
                    'Authorization: Bearer '.$access_token,
                    'Accept: application/json',
                    'Content-type: application/json;',
                    )),
        'content' => $json_param,
    ));
 
 
    $res = file_get_contents($post_api, null, stream_context_create($options));//書き込み
//    $token = json_decode($res, true);
//    print_r($token);
    usleep(600*1000*1000);//10min待ち
    $cnt = ($cnt+1) % (count($comentList));//次のコメントへ
 
}
 
 
?>




注釈として
69行目から78行目がRequest body部分です。ここにチャットIDやコメント文が入ります。
84行目 たぶんBearerの後にスペースが必要です。
92行目 ここでチャットの書き込みを行います。投げた結果が返ってきます。たぶん書き込みをすぐ消すときに使ったりするのかもしれない。
エラー401が返った場合は認証されてない⇒アクセストークンをうまく設定できていません。
エラー400の場合は認証ができているがRequest bodyのフォーマットが正しくなかったり、
チャットの連続投稿ではじかれたりしているのだと思われます。
95行目 ここで10分という時間を作ってます。
96行目 ここコメントのローテーション

サンプルコードないし、検索しても全然でてこないし、
そもそもPHPでfile_get_contentsが何をしているかよくわかっていないし、
検索するとfile_get_contentsは古くて推奨されてないようなこと書かれているし
よくわからないっすねぇ。
PHPもAPI関係で遊ぶだけで基礎できませんもん。

0 件のコメント:

コメントを投稿