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行目 ここコメントのローテーション

2019年2月12日火曜日

Fighting Fantasy Legends Portalの感想と不具合と疑問

難易度についての感想
1章
マッピングすればノーミスクリアできるものの
運試しが必ず成功する「お守り」がないと失敗=スタート地点にもどる
ことになり何周もすることになってきつい。
しかし、即死ポイントがほとんどないのでイージー。
最低1度はスタート地点戻ることがあるので難所は後回しにして
ダイスを強化してからチャレンジすると楽。

2章
即死ポイントが多すぎる。
たぶんいくつかのクエストと後日談を無視すればノーミスでいけるかも?
ただし、混沌のチャンピオンがランダムエンカウントっぽいので運も必要。
最初の島の戦いの連戦も難しいし一番難しい。


3章
(たぶん未達だが)ノーミスは狙いは楽。
お金を稼いでお店でトームを買い続ければダイス強化できるのでイージー。
賭博場でルーンルーンは主人公が圧倒的な有利なのでそれで稼いでもいい。
最終決戦は長いもののお店で回復剤を二つあればいけると思うし、これもお店で揃えられる。
金の鍵入手がランダムなのでクエストをできるだけクリアを狙う場合はメンドクサイ。


//////////////////////////////////////////////////////////
不具合

全般
exe終了でハングする。タイトルまで戻ってからだとハングしづらい気がする
名前の入力ができない。たぶんEsc→半角だとすんなりできるような気がする
全体的に日本語のフォントが入っていないので白騎士が白士になっていたりする。
だいたい予想できるが、気になるなら英語に直して読むという手もある。

1章
途中、トンネル?を通ってスタート地点を戻るとそれからずっと雑踏の音がずっとする
スロムのあたりのイベントがなんかおかしい
黒い本(罠感知の薬)のフラグがおかしい 赤い本のフラグになっている
ドワーフと何度でも戦える状態になることがある
罠のダーツが失敗すると繰り返しダーツをやらされる

2章
殺人事件関係の人物のフラグが逆転している?
エルフの回復がUターンすると何度でも取れる(いけるのは外れルートなのでメリットは無いかな)
野良犬にも木の笛が効くのはいいが文章が双頭の犬
リッチクイーンがライチクイーンとか間抜けな誤訳

3章
ナンディベアの報酬が何度でも取れて大金持ちになれる
星石の洞窟で3分岐のところで不正解ルート後に運試し失敗で体力があっても20ダメくらうと死ぬ
星石の洞窟で3分岐のところで不正解ルート後に運試し成功でもハング?
ガイドに預言者に会わない⇒去るの選択でハング

//////////////////////////////////////////////////////////
情報求む
疑問
1章
にんにく(なぞなぞで入手できる)とブラックパールと短剣、エルフの短剣は使い道が不明
ルビー(穴で技術試し失敗)とトパーズは金貨の替わりだけ?

2章
骸骨王から出てくる鏡の使い道
銅の指輪はのろわれるだけ?
盾の部屋のルーン文字クエストはわざわざクエストになっている意味ある?
蜘蛛に捕まっているビリーボブがする「泉の水を飲んではいけない」というアドバイスは3章の泉のことOK?飲まないと死ぬのですが。

3章
甲虫の首飾り 野営の回復量が減る&ラスボスで使うと即死するだけ?

Fighting Fantasy Legends Portalの後日談集

ネタばれですね。
各章で条件によりエンディング時に出会った人物の後日談があります。
まったく無かったりちょっと文章が変わったりします。
攻略記事というわけではないですが、1周90分はかかってしまうので手助けになるかと。
後日談はゲームブックでは無く、今回ゲーム化に伴い追加したみたいです。
大層な話ではないもののこれはうれしいです。

わかっているところだけ下の方に書いときます。これでたぶん全部?
違うパターンがあれば情報求む!





















1章
・囚人:無しor有り
・ポイズン・アイヴィー:無しor有り
・トライアルマスターのドワーフ:固定
・スロム:2通り(死因による)




2章
・殺人事件:無しor指名した人の3通り。有罪の人以外の二人は指名と後日談条件が入れ替わっているかも?
・島の話:固定
・ドワーフの貴族:無しor有り(蜘蛛から助けると。死体が後日談前にもある)
・トライアルマスターのノイ:固定
・トライアルマスターのレクサス:固定
・サカムビット男爵:固定




3章
・マックス:無しor2通り(生死で変わる)
・主人公の友人ドレク:固定
・ガイドのゾッグ:無しor有り
・酒場の3人組:無しor有り
・宿屋の主人オビジー:無しor有り
・大食いの人:無しor有り

Fighting Fantasy Legends Portalの実績解除できない問題

情報求む!

Steamにある、ファイティングファンタジーレジェンドポータルの実績が
☆5全部とるくらいやり込んでも現在4つ解除されない状態です。













[追記2019/5/21:タイトルアンロック100%より①踏破の実績は解除できました。
実績はあと3つ]
①「踏破」はタイトルのアンロック100%だと思うのが、
あと一つがわかりません。技術試しで失敗が必要とか?普通選択しない何かか?






残り一つの名称でもわかれば、

だいたいこんな感じでマッピングしているので場所がわかるかなぁ?


[追記2019/12/12:アップデートにより②の実績は解除できました。
実績はあと残り2つ]
②「チャンピオンのトライアル」わからん。
2章をクリアで達成できそうな名前だけどバグなのかできない。


③「知れ渡る名声」
アイコンに10って書いてあるから
全部で10回クリアかと思ったけどダメでした。
それぞれの章で10回クリアか?それだとメンドクサイ。

④「最後の一人」(英語だとLast One Standingらしい)
3章で仲間をできるだけ入れずに、強制で入る仲間は死なせても無理。
できるだけ仲間増やした(つもり)でも無理。
ずっと酒場にいる主人公の友達はなんもないんか