ラベル YouTube の投稿を表示しています。 すべての投稿を表示
ラベル YouTube の投稿を表示しています。 すべての投稿を表示

2025年6月1日日曜日

4-7-8呼吸法タイマー っぽい汎用タイマー

柔らかい音タイマー

タイミング設定(秒)<10分間、以下の順で音を出すよ





待機中(スタートボタンを押すとピッで始まるよ)


睡眠のために4-7-8呼吸法は、鼻から4秒で息を吸い、7秒で息を止め、8秒かけて口から息を吐き出すっていう呼吸法がありますけど、

これ吸っている割合が少なくて苦しくないですかね?時間調整してもいいらしいので調整できる音のでるタイマーを作りました。

 

YouTubeの動画だとBGMが流れたり、4-7-8と時間が固定と自分自身にとってベストでなかったりしませんか。

タイミングをこれで音を鳴らして、BGMは別に用意できるのではと考えました。

 

・全体の長さは10分で経過後強制停止します。

・呼吸法はいろいろあるので、4-6呼吸法に対応するために時間をゼロにしたら、ゼロの音を飛ばせるようにしました。

Beep音だと音が鋭い感じなので、音は柔らかめにしましたがちょっと睡眠に使うにはうるさいかも。音量調整でカバーしてください

・もしかしたら、筋トレとかのタイミングにも使えるかと各最大20秒まで設定できるようにしています。

・設定はブラウザに保存されるので再度時間を設定する必要はないはず。

 

個人的には雑念無しで何秒とか時間を気にせず呼吸に集中がいいのかもしれない。

 

2021年5月5日水曜日

Youtube Data APIが使えない&日本語のコメントのみの抽出に挑戦

 バズッた外国の動画見た時に日本人のコメントあるかなと思っても、
コメントが数100以上とか多いと探す前にあきらめるじゃないですか?
ということでYoutube  Data APIを使って解決できるかに挑戦しました。


久しぶりにAPI使おうと思ったら403エラーが出てAPIが使用できなかったです。
調べた感じだとGoogle Cloud Platformで新しいプロジェクトを作成するのが正解なようです。
(古いプロジェクトで新しいAPIキーを作ってもダメでした。
他のエラーが出力されるケースもあっても新しいプロジェクトで試すのが近道っぽいです。)

なんかAPIを使用量がQueries 10000/日しかないけどなんか今はずいぶんと少なくなっているようですね。
大量のコメントを処理すると簡単に超えてしまいそう。


で、本題の日本語のコメントだけを抽出する方法は

① コメント情報→チャンネル情報から国を判断する
各コメントには書き込んだ人のチャンネルID情報があります。
そこからチャンネル情報をAPIで読み込めば国の情報があるので
JPの人のみのコメントを出力するという案です。
これは出来たにはできたのですけど、国情報を登録してないのか見えない人の方が多かったのでやりたいことができませんでした。
あとAPIの使用量的にはいけていません。

② コメントを「Google Cloud Translation API」に投げて言語を判断する。
有料なのでやめときました。たぶんやろうと思えばできます。

③ 正規表現で判断する。
preg_matchを使用して「ひらがな・カタカナ・漢字が一部でも含まれている」(完全一致ではなく部分一致です。)に該当するコメントだけ出力する。
これがAPI使用しないしコスト的にもいいようです。
例:
    $str = str_replace("\n","\n\t",$data["snippet"]["topLevelComment"]["snippet"]["textDisplay"]);//コメント文字列
    mb_regex_encoding("UTF-8");
    if(preg_match( "/[ぁ-ん]+|[ァ-ヴー]+|[一-龠]/u", $str) ){
            print_r($str);//日本語なので出力する
    }else{
            //出力しない
    }
上記を参考に過去のコメント出力コードの親コメント子コメントの出力部をうまく修正すればよいです。
コメント3000件で一分ちょいぐらい時間がかかりました。
(全コメントをtxt出力した後から正規表現できるエディタかなんかで探した方が早いかも。

検索窓に

[ぁ-ん]+|[ァ-ヴー]+|[一-龠]

これだと親コメントなど前後も残るし。今回はかなり回り道をした。)

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分ぐらいで更新とか工夫してください。。。






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

2018年9月27日木曜日

プレミア動画と生放送の違い

プレミア動画というものを、ぽんぽこちゃんの動画で知ったのでAPIの挙動をどたばたしながらチェック
(収益化以上の状態必要っぽいけど、初めて見たのでここぞとばかりに確認)

全部確認できんかったけど、結果。


・検索のAPIの生放送でないので「&eventType=upcoming」や「&eventType=live」でヒットしない。
なので、最新の動画「&order=date」あたりで1番目に来るはずなのでみつけることもできる。
ゲリラとして使うことはないでしょから、放送前を見つけて動画IDをURLから直接とることもできる。
・プレミア動画は通常の動画違い[snippet] [liveBroadcastContent] => upcoming となっています。これを引っかけると自動検出できるかも。
※upcoming(放送前の状態)、放送中ならliveになる
・チャットは生放送と同じようにactiveLiveChatIdを取得できるのでいつものノリでチャットの取得可能
・視聴者数["liveStreamingDetails"]["concurrentViewers"]は、はっきり確認してないけどログを見ると無いかも。視聴者数はブラウザ上に表示できていたので他の方法で取得できるかも。

というわけで、API的にはちょっと違うのは検索ぐらいっぽいです。


ちなみにプレミア動画の流れ
 生放送のように、放送前からチャット可能
 時間になるとカウントダウンが2分程度始まる(必ずある?)
 その後、プレミア動画が始まる
 終了後も生放送のように終了する
 更新すると普通の動画に放送中のチャットが追加されたようになる

あっ、生放送通知については未確認です。

youtubeは、生放送でチャットのリプレイ追加などしているけどAPIは更新されてないみたい。
プレミア動画フラグとかありそうなんだけどなぁ。
※リプレイはソースからがんばって取得できるらしいけど。APIからじゃないのでちょっとアレ




2018年5月26日土曜日

YouTubeの生放送のチャットを使ってアンケートを行う


追記
youtubeライブに2021年ごろ?に便利なアンケート機能が追加されました。
追記終わり

さてタンバリンさんのツールが動いているのを見ました。
あれは過去のコメントも保存しているようですね。それどうだろうなぁ?
アンケート機能があるようですね。便利そうですね。
じゃあYouTubeの生放送のチャットを使ってアンケートを作ってみましょ


ニコニコのようなアンケート機能が視聴者には匿名ですしやりやすい思うのですが、
YouTubeにはそのような機能はないのでお試しに作ってみました。

検索すると、YouTubeでアンケートカードというものもあるらしいですが、
生放送には対応していないのかな?誰か作ってそうですけどねぇ




仕様は、
・投票項目を入力できる
・投票開始ボタンが押されてからのチャットのみを投票の対象とする
・アンケート中に投票数が確認できる
・IDで同じ人からの投票を弾く(途中で投票先の変更はダメ)
・投票終了時の結果を円グラフで表示する。
※スーパーチャットには今回未対応

苦労した所は、
ほんとはしちゃいけないだろうけど、PHPのコード部分に無限ループする部分があります。
ブラウザがChrome
かつ
sessionを使用した場合
スクリプトが終了していないのと次のページ遷移できない
という問題があるようで解決に時間がすごくかかりました。
(IE,FireFoxは停止しなくても遷移しました。)
解決策として正しいかわからないですが、
window.stop();
によってブラウザの中止ボタンの機能によりスクリプトを停止して解決してます。
そしたら今度は、IEがwindow.stop()関数に対応していないので使用ブラウザの判断をして
回避しています。
これでIE,Chrome,FireFoxで動いているのを確認しました。

3ページ分のコードをいつものフォルダ(C:\xampp\htdocs)に配置して
ブラウザ上で
http://localhost/vote1.php
とすれば使用できます。
いままでのやってきたことを組み合わせたようなもんです。


外見はこんな感じです。
見れば動きはなんとかくわかるでしょう。
1ページ目
例は雑に1文字ずつになっていましが、ちゃんと指定できます。
これは投票先を「あ」「い」「う」にしています。
本来は好きなお菓子の名前などちゃんとしたものを入れましょう。
2ページ目
投票項目が見えるようにしています。
この画像の動作では「あ」「い」「う」のワードを含むチャットを「投票した」
としていますが、
一致でもいいし、
投票項目のワードが長いと入力が大変だと思い「#1」~「#3」でもコードをいじればできます。(数字だけでもいいでしょう)
何も表示されないと寂しいのでチャットと現在の投票数を表示しています。
アンケートを打ち切る場合は投票終了ボタンを押します。

3ページ目
HighChartsを使いアンケート結果が円グラフで表示されます。
それぞれの結果を%と票数も全部載せです。
再びアンケートをやる場合は1ページに目から開始してください。




コードです。
1ページ目


form部分だけなので注釈はありません。
php部分が1行もないのにファイル名がphpですね。。。


2ページ目
①にはAPIキー、②には今回は生放送中の動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。






注釈として
7行目から22行目あたりがスクリプトを停止して3ページ目へ遷移させる部分です。
48行目から59行目あたりが1ページ目の入力を分解して投票項目を作成しています。
空の行を無視します。
94行から下は基本的にはチャット表示のコードの改造です。
130行目あたりは、APIが初回の入力はボタンを押したものの過去のチャットとなりますのでスキップする処理です。
142行から145行あたりは、一致するか、含むにするか、#nの一致にするかです。
好きなコードを選んでください。
148行目から156行目はまだ投票していないIDでの投票一致の場合、票として数えているところです。

3ページ目



注釈として
Highchartsの円グラフの例 を改造し、2ページ目の結果を入力としています。
33行目でPHPから_SESSIONのデータを受け取り、
それを68行目から78行目で使用しています。



ちゃんと勉強せず、行き当たりばったりで作っているから苦労する。
いままでのコードもformやhead、bodyの対応がよくなかったようだ。
WEB系の基本勉強してないものなぁ。

2018年5月16日水曜日

片鱗が見えたかなぁ

昨日のタンバリンさんのyoutubeコメント拾いマシーン(名前前回と違うじゃん)の部分を見て思ったこと。

更新がうまくっている部分を見ていると
2秒で4コメントぐらい追加されているように見える。
 ・一度API投げて保存したコメントを吐き出しているとしたら、人気バーチャルユーチューバーさんの場合ピークでは170コメント/9.5秒(実測)なので処理量としては追いつかない。
 ・停止したときにアイコンは違うけど名前とコメントが同じ人が表示されているからなんかバグっている。
ということがわかりますね。

 2秒毎にAPIを投げているということはなさそう。なぜならpollingIntervalMillisを無視することになるのでwarningを出てコメントを取得できない。保存したコメントを少しずつ出しているのでしょう。

 発言から動作テスト時は動いていたみたいですが限定公開でリスナーなしでやっていたのかもしれませんね。その場合はコメントが多い生放送してるときと差があります。
 pollingIntervalMillisは5秒以下で短いですし、最初のAPIでだいたい過去のコメント75ぐらいが一気に取得してしまいます。
 放送を見る限りpollingIntervalMillisが動作テスト時と違い長すぎて止まったと勘違いしたってことはなさそうです。
  適切なpollingIntervalMillisをwaitしてAPIを使用しているのか、それとコメントを保存している部分に不具合があるような気がしますねぇ。


Unityは見栄えがいいなぁ。アイコンも丸くなっているし。フィルタしてキーワードのだけ表示じゃなくて全部保存してから検索って形なのかしら 。

テスト時と実際の時の差異によるバグってなんかわくわくしますね。

2018年5月11日金曜日

YouTubeチャットで視聴者参加のためのツールを考える

5/8の某生放送でバーチャルユーチューバーのマネージャーのタンバリンさんが言っていたYouTubeのコメント欄で視聴者参加できるWPP1システム?というやつを想像で作ってみる。
PHPじゃなくてもっと立派なものだろうと思うけどね。
PHPほんと動的につかいづらい
っていうか、上位のバーチャルユーチューバーってチャット欄が人数に対して、速すぎて読めなくない


参加者を募る(キーワードを決めてそれをコメントした人のみを抽出)

参加者のコメントのみを表示する
っていう機能があればよさそう。

初期画面


モード1:決めたキーワードをコメントした人だけが表示される(今回のコードではキーワードを含むにしている。本来は一致だろう)
例はキーワードの所に「あ」を入力しkeyボタンを押した場合。
「あ」を含むコメントした人だけが表示されている。


 アイコン、ID(青字)、名前(赤字)、コメント(黒字)の順に表示されるので、青字のIDをコピーしてIDに入力しIDボタンを押す。


モード2:対象IDの方のみチャット が表示される
対象ボタンを押した先に遷移します。(入力欄が空白の場合は初期画面に遷移)

 コードは以下の通り。①にはAPIキー、②には生放送中の動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。
今回はアイコンも表示したいのでブラウザで無理やり表示してます。
ブラウザで「http://localhost/modoki.php」と入力。





注釈としては、
7行目から16行目で文字の装飾と画像のサイズを指定しています。
サイズを指定してそれっぽく表示 。うまくできなくてえらい時間がかかった。
24行目。PHPの処理は無限ループでまわしているため処理が終了しません。
ブラウザ上の場合は30秒でタイムアウトの処理により停止するようなので60分に延長しています。
26行目から43行目(組込み系のコードだと空のelse書くものだけど忘れた)がボタンを押した場合の処理です。
ボタンが押された場合、どのボタンが押されたかと二つのテキスト入力の値が$_POSTに格納された状態で再度同じPHPが呼び出されます。
( 18行目で自身を呼び出すように設定しています。)
62行目 file_get_contenstsでwarninngが返った時の対策に@をつけてみましたが、
これで対策うまくいってるのかなぁ
73行目 キーワードを含む場合のチェック。キーワードと一致に変更するなら両者を==で比較する
85行目 対象IDかをチェック
106,107行目 ブラウザ上の場合、通常PHPの処理すべてが終了しないと表示されないが、無限ループ(55行目)なので途中の状態を表示するための関数呼び出しです。
92行目から101行目がコメントとアイコンの表示部分。IDはモード2で出力しなくていいかも。
追記:2018/5/12
スーパーチャットには$data["snippet"]["textMessageDetails"]["messageText"]は存在しない。本当は対応が必要。共通としては$data["snippet"]["displayMessage"]とすると楽だと思うがスーパーチャットの場合「¥1,000 from 名前 : ”コメント”」のような構造なのでキーワードの一致で判定しにくいので場合わけが必要だろう。
[snippet][type] でsuperChatEventならば[snippet] [superChatDetails][userComment]を$text。textMessageEventならば["snippet"]["textMessageDetails"]["messageText"]で一致判定がOK。あと、98行目は重複しているのでいらない。
思えば取り込み後に削除されたコメントも保持してしまう。既に削除されているならば上記の判定で無視できるはずだ。その辺は運用で対応。

やりたいことはこんな感じだろうけど、右クリックで対象者選択とかもっと使いやすいのだろうなぁ。配布したりするのだろうか。
PHPって不向きだと思う。
本当はモード1にID表示なくして何番の人か指定でIDを保存していた配列から出力したかったけどPHPの処理が無限ループで完了しないからPOSTに渡せなそうなのであきらめたり、レイアウト関係がむずかしくてあきらめたりと妥協しまくって。このコード量でそれでも1日かかった。まぁ自分C言語の人なので。

2018年4月22日日曜日

YouTube 生放送自動録画方法を考える

※この記事だけでは録画はできません。また、うまくいかないことがあると思います。

以前の記事でYouTuve Liveの検出もできたので録画もできるんじゃないかなぁと思い、
その手順を考えてみました。

生放送を検出する

ブラウザを立ち上げてその動画を表示

何かツールを使い録画する

終了を検出して録画を終了する、ブラウザの閉じる

最初に戻る。

という手順が考えられると思います。
ここでは、ブラウザを立ち上げて動画を表示するだけですが
コマンドプロンプトからキャプチャーソフトで録画・終了できるものは世の中には存在するので、そのキャプチャーソフトの使い方を参考にしてコードに反映させれば録画できるかもしれません。
今回はfirefoxを起動させていますが、他のブラウザだとウィンドウの最大化など制御項目が多いかも?


以下がコードとなります。以前の生放送の検出コードの改造です。
①は自分のAPIキー。②は生放送を監視したいチャンネルID
③にはキャプチャーソフトの録画開始処理。④はキャプチャーソフトの録画終了です。



注釈として
12行目と53行目がペアとなっています。処理が終了したら最初に戻るgoto処理。
26行目はファイルポインタを閉じているだけでブラウザを閉じるわけではありません。
PHPではアプリケーションを起動する関数はいろいろあるようですが、これが最適かはわかりません。とりあえず起動はできます。
24行目 引数に開きたいURLを付けるとfirefoxはそのURLを開く
42行目は生放送の終了条件のチェックです。60秒周期で監視しているので生放送1→生放送2も続けて同じ放送と判定されるから同じvideoIdであるか判定したほうがいいかも。

改善点・注意点として
firefoxの新しいウィンドウとして表示されますが、前回のブラウザの大きさに左右されてたりブックマークのサイドバーの状態が維持されています。
生放送でも広告が表示されることがありますが手動スキップはできません。
広告が1時間とか長かったから手も足も出ないです。
広告後に再生が手動の場合もある?
生放送後砂嵐画面で止まるなら音がでていないのでブラウザを終了する必要ないかも。
そもそもYouTubeが最近止まるってリロード必要の場合があるし。。。
60秒周期で処理していますがもっと短くしないと動作確認も大変かも
自分が家にいないときに動画が流れてうるさい場合もあるかも。
前回同様、限定公開も無理。

など考える点がたくさん。アプリの組み合わせで実現するだけだから仕方ないよね・・・
録画しっぱなし、生放送は一回だけの想定ならこれで使えないことはないと思う。
もう出先で通知を受け取ってリモートデスクトップの操作のが楽か?
あまり自分には生放送を録画するという必要に迫られていないのでこのぐらいでクローズ

2018年4月16日月曜日

目次:YouTube Data APIで遊ぶ

このブログ内のYouTube Data API関係の記事についての目次です。

1:PHPの開発環境
APIを使うために開発環境についての説明

2:YouTube Data APIの使い方 
APIキーについてとAPIの簡単な動作確認
API使用量制限について説明

3:YouTube生放送の検出 
コマンドプロンプトで生放送の開始を監視してビープ音を鳴らすというプログラムについての説明

4:YouTube コメントの全取得
動画のコメント欄を一括で取得するプログラムについての説明

5:OAuth2.0での認証と登録チャンネルリストの出力 
認証の方法
アクセストークンについての説明
自分自身の登録チャンネルをリスト出力

6:YouTube チャットの取得
生放送でのチャットメッセージ情報を取得

7:YouTube 生放送中の評価芸
API使って評価数や視聴者数を取得

8: YouTube生放送で評価数をリアルタイムでグラフ表示する 
PHPで難しそうなのでJavaScriptを使ってリアルタイムで変化するグラフ表示

9: YouTube 生放送自動録画方法を考える 
とりあえず考えてみる。対象の動画の表示だけはできたが・・・

10:YouTubeチャットで視聴者参加のためのツールを考える 
上位のバーチャルユーチューバーのチャット欄は早くて読みにくいので、
たぶんこんな感じで対象者を募って決めて。対象者だけ表示すると予想。

11:YouTubeの生放送のチャットを使ってアンケートを行う 
チャットのコメントでアンケートを実装してみる。

12:YouTubeの生放送のチャットをPHPから書き込む
チャットのコメントにPHPから周期的に書き込むサンプル。

以上。

YouTube生放送で評価数をリアルタイムでグラフ表示する

いままでPHPでがんばってたんですが。。。
おかしいよな、PHPでやり方を発信するはずがJavaScriptを使用なんて。


グラフ表示には 調べた結果Highchartsというのがよさそう

でもJavaScriptで書く必要がある

PHPのデータで保存したファイルをJavaScriptで逐次読もうと考えたけど難しそう

PHPあきらめて JavaScriptでやり始める

Firefoxにできたhtmlファイルを突っ込んで確かめていたけど、途中でChromeを右クリックの「検証」でブレークとかエラー表示が見えることに気付く

グラフの見栄え・気になる所をいろいろいじったらすごい時間をかかるのである程度妥協する

そして、出来上がったのがこれ

 HighchartsとJavaScriptを無勉から、で作り上げました。
Highchartsのこちらをベースにしています。

仕様は
 ・20点のデータ
 ・2秒間隔で取得
 ・高評価と低評価。チャンネル登録者数を表示
 ・最新値が見えるようにする



右が最新のデータで、左が過去データで流れていきます。

これがコードです。このhtmlをChromeやFirefoxに放り込んでみてください。古いIEでは動きません。


<!DOCTYPE html>
<html lang = "ja">
  <head>
    <meta charset = "utf-8">
    <title>Live data</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
 
<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
  </head>
  <body>
  
<script>
var input_y0=0,input_y1=0,input_y2=0;
var key = "①";
var videoId = "②";//今回はvideoIdを入力
var channelId="";//こっちは空欄でOK

    function requestvideo() {
      return $.ajax({
                type: 'GET',
                url: 'https://www.googleapis.com/youtube/v3/videos?part=statistics,snippet,liveStreamingDetails&id=' + videoId + '&key=' + key,
                dataType: 'json',
                async: false,//同期処理にする
                error: function() {
                    //error func
                    $('#yt-list').append('<li>Youtubeのデータが取得できませんでした。<\/li>');
                }
      }).done(function (jsondataYt) {
   channelId = jsondataYt.items[0].snippet.channelId;
         input_y0 = parseFloat(jsondataYt.items[0].statistics.likeCount);
         input_y1 = parseFloat(jsondataYt.items[0].statistics.dislikeCount);
      });
    }


    function requestchannel() {
      return $.ajax({
                type: 'GET',
                url: 'https://www.googleapis.com/youtube/v3/channels?part=statistics&id=' + channelId + '&key=' + key,
                dataType: 'json',
                async: false,//同期処理にする
                error: function() {
                    //error func
                    $('#yt-list').append('<li>Youtubeのデータが取得できませんでした。<\/li>');
                }
      }).done(function (jsondataYt) {
         input_y2 = parseInt(jsondataYt.items[0].statistics.subscriberCount);
      });
    }

  



Highcharts.setOptions({
  global: {
    useUTC: false
  },
    lang: {
        numericSymbols: null//軸のkキロ表示をやめる
    }
});

Highcharts.chart('container', {
  chart: {
   type: 'spline',

    animation: Highcharts.svg, // don't animate in old IE
    marginRight: 100,//右の軸が隠れるので適切な値にする
    events: {
      load: function () {

        // set up the updating of the chart each second
        var series0 = this.series[0];
        var series1 = this.series[1];
        var series2 = this.series[2];

        setInterval(function () {
          var x = (new Date()).getTime(); // current time
          requestvideo();//YouTubeAPI ビデオ側
          requestchannel();///YouTubeAPI チャンネル側

          series0.addPoint([x, input_y0], true, true);
          series1.addPoint([x, input_y1], true, true);
          series2.addPoint([x, input_y2], true, true);
          series0.update({name: '高評価:'+input_y0});
          series1.update({name: '低評価:'+input_y1});
          series2.update({name: '登録者数:'+input_y2});
       }, 2000);//2秒のインターバルタイマ
      }
    }
  },
  title: {
    text: 'Live data'
  },
  xAxis: {
    type: 'datetime',
    tickPixelInterval: 150
  },
  yAxis: [
      { // 1つ目のy軸設定
          title: {
              text: '評価'
          },
          plotLines: [{
              value: 0,
              width: 1,
              color: '#FF8080'
       }],
       allowDecimals: false //軸を整数表示
      },
      { // 2つ目のy軸設定
          title: {
              text: '登録者数'
          },
       allowDecimals: false, //軸を整数表示
          opposite: true // trueの場合グラフの右側にy軸を配置する
      }
  ],
  tooltip: {
    formatter: function () {
      return '<b>' + this.series.name + '</b><br/>' +
        Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' + this.y;
    }
  },
  legend: {
    enabled: true //凡例表示
  },
  exporting: {
    enabled: false
  },
  series: [{
    name: '高評価',
    yAxis: 0,
    data: (function () {
      var data = [],
        time = (new Date()).getTime(),
        i;

      for (i = -19; i <= 0; i += 1) {
        data.push({
          x: time + i * 1000,
          y: null
        });
      }
      return data;
    }())
  },
  {
    name: '低評価',
    yAxis: 0,
    data: (function () {
      var data = [],
        time = (new Date()).getTime(),
        i;

      for (i = -19; i <= 0; i += 1) {
        data.push({
          x: time + i * 1000,
          y: null
        });
      }
      return data;
    }())
   },
  {
    name: '登録者数',
    yAxis: 1,
    data: (function () {
      var data = [],
        time = (new Date()).getTime(),
        i;

      for (i = -19; i <= 0; i += 1) {
        data.push({
          x: time + i * 1000,
          y: null
        });
      }
      return data;
    }())
   }
   
   ]
});</script>


  </body>
</html>

注釈として
なんか上のコードの色が変ですがあきらめました。
Highchartsは、ダウンロードしても使えるみたいですがしなくてもできるらしいです。今回はダウンロードなしで使用しています。
16と17行目はPHPと使い方は同様です。APIキーと動画IDいれてください。
APIの使いかたはPHPと同じようなものです。URL作って投げて、レスポンスを使用する形は変わりません。
25行目と43行目については、PHPと違いJavascriptだとレスポンスが返るまでまたず処理が進んでしまう、雑な対策としてこの行追加でレスポンスが返るまで待ち状態となります。これでPHPと同じ感じに動作します。
62行目 Y軸が1000を1kとかの表示するのを禁止します。
71行目 第2のY軸を右に置こうとしたら表示されないので苦労しました。原因は画面の外に表示されていました。この値を増加したら解決。これで1時間は無駄にしました。
80行目は2秒周期インターバル動作させています。
85行目あたりaddPointのtrueとかすることによってシフト動作してくれます
88行目 汎用に最新値表示しています。最新の値をプロット上に出したかったのですがdataの要素の最後だけlabel表示をenableにしてもシフト動作すると前の要素に移動していってしまうのでaddPointを使わずfor文なりで更新するのがよさそう?メンドクサイのであきらめました。
112行目と118行目でY軸が整数表示
119行目で二つ目のY軸を右側に置きます
136行目でどちらのY軸に表示するか決まります
142行目等のi=-19でデータの点数を20点してます。-199にすれば200点になります。


なんとかやりきった。疲れた。

2018年4月15日日曜日

YouTube 生放送中の評価芸

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

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





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



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

2018年4月13日金曜日

YouTube チャットの取得

今回はYouTuve Liveのチャットの取得に挑戦します。

ということで、チャットが取得できるようになれば
特定の人を見えなくしたいとか、
特定の人だけピックアップするとか、
特定のキーワードで何かが加速したり、
スーパーチャットで何かしたり、
他のアプリケーションとの連携したり
チャットを保存したい
読み上げソフトで読み上げたり
翻訳したり
など、いろいろな目的がかなうようになると思います。

今回の仕様はこんな感じです。
・名前とテキストのみを表示
・コマンドプロンプトで表示する
・”www”(半角)を含むテキストを”NGNGNGNG”に置き換える
です。

使用しているAPIについてはvideoLiveChatMessagesを参照。
①にはAPIキー、②には今回は生放送中の動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。


以下がコードになります。 ※少ししか動作確認していません。
 追記2018/4/29 下の方に処理タイミングを変更したコードを載せました。





注釈として
6行目はpart=liveStreamingDetailsとして、”ChatId”を取得しています。
12行目でわかるように今回も続きを読み出すために&pageToken=を使用しています。
ただし、46行目にあるように"pollingIntervalMillis"より早くAPIを投げるとエラーとなるのでそれより500ms多めに遅延させています。
29行目から411行目を変更すればいろいろな機能を持たせられると思います。
コマンドプロンプトで>chatlog.txtやファイル書き込みで保存もできます。

結果はこんな感じです。
コマンドプロンプトなのでいまいちな見た目ですが・・・残像でるし

改善点として
・絵文字も使えないのでやっぱりhtmlなどでやるべきかなぁと。でも更新処理どうしていいかわからない。。。
・チャットが激しすぎるとどうなるのだろうという疑問。1回で取得する数のデフォルトは500ですがそれ以上の激しさでも追いつくか。
・pollingIntervalMillisは勢いで変化します。激しいほど長い感じです。
自分が見たのは4秒から9秒とかでした。
取得したメッセージを一気に表示しているのでpollingIntervalMillis/pageInfo.resultsPerPage
との間隔で少しずつ出力した方が自然な感じがします。
・生放送の終了判定がありませんので自分で強制終了するか確認処理が必要かと思います。放送自体が終了してもチャットが生きてたりで動作確認が必要かも。upcoming中はとりあえず取得ができる。

 -------------------------------------------------------------------------------------
追記2018/4/28
 配列でバーチャルYoutuber300人程度の発言のみを抽出コードを作って生放送見てたんだけど少し抜けがある。抽出処理の時間分待ち時間削ってないし、500ms分固定でプラスしてるのもイケてないのかも。
某所のコメントログでは比べるとどちらも抜けがあるしチャットは結構きついのかなぁ
公式のサンプルをもっと見た方がよかったか。
追記2018/4/29
 pollingIntervalMillisに対してフィルタ処理はそんな重くないことがわかったんで、とりあえず500ms固定を削除して待ち方を変更。
コードは以下




注釈として
 51行目の待ちがないとCPU負荷が高いので挿入しています。

これで抜けがいくらか減ると思います。

2018年4月12日木曜日

OAuth2.0での認証と登録チャンネルリストの出力

YouTubeのAPIにはOAuth2.0での認証が必要なものがあります。
ここでは認証を行った後、自分のチャンネル登録のリストの出力を目標とします。

認証の仕方についてはこちらに書かれています。ざっと目を通せばよいです。

①認証情報の作成
APIキーを作成した時のようにconsole.developers.google.comへ行き
認証情報>認証情報を作成>OAuthクライアントID の作成>その他
で作成します。(たぶんこれでいいと思う。。。)



クライアントIDとクライアントシークレットをコピーしてファイルに保存してください。
※ここではclient_data.txtにクライアントIDとクライアントシークレットの順に文字列だけを保存します。

② トークンの取得
2つのphpファイルが必要です。
一つ目のphpをブラウザ上で実行する

googleの認証画面に行き許可ボタンを押す(goolgeアカウントのパスワードが必要かも)

認証情報をもらった2つ目のphpが更新トークンをファイルに保存する
という流れとなります。

2つ目のphpでは アクセストークンと更新トークンの両方が得られますが更新トークンだけを保存します。
トークンにはアクセストークンと更新トークンがあります。
アクセストークンをAPIキーのように&access_token=に渡して使用しますが1時間ぐらいで期限切れになってしまいます。アクセストークンを得るために認証画面にたびたいび行くのはメンドクサイです。
しかし更新トークンはもっと期限はもっと長いです。
なので更新トークンを使いアクセストークンを認証画面に無しでゲットしてphpで使用しようって流れとなります。

 ブラウザのURLに
「http://localhost/get_token.php」と入力してみてください。(C:\xampp\htdocs直下にファイルがある場合)
これで認証画面に遷移した後に許可をすると、 ReToken.txtに更新トークンが保存されます。
「更新トークンを保存しました。」と表示されれば成功です。

コードは以下のようになります。


1つ目のphp


注釈としては
コードの①にクライアントIDを入れる。(折角ファイルに保存したのでそのように改造しても可)
4行目のコールバックした時実行するphpについては、2つ目のファイル名にあわせる。
12行目のスコープはとりあえず「https://www.googleapis.com/auth/youtube.readonly」にしています。たとえば動画のアップロードをする、グーグルマップを使いたいなどの場合はそれぞれ違うURLになります。

2つ目のphp


注釈としては
コードの①にクライアントIDを入れる。②にはクライアントシークレットを入れる。
(折角ファイルに保存したのでそのように改造しても可)
11行目で認証した結果をgetしています。



③自分の登録しているチャンネルのリストの出力をする。
コード前半は、ファイルに保存されたクライアントID、クライアントシークレットと更新トークンを読み出し使用してアクセストークンを得てます。
後半は、アクセストークンを使い自分の登録チャンネルを出力しています。
出力のフォーマットして、チャンネルIDを””でくくり、タイトルをコメントアウトで出力して 以前の生放送の検出のコードで使用しやすいフォーマットとしました。
コマンドプロンプトで実行し>や>>で保存するなどすれば登録したチャンネルの整理やさらにコードを変更して登録者数でグループ分けするなどに活用できると思います。
使用しているAPIについてはこちらからを参照。



注釈として
48行目&mine=trueとして自分のアカウントの情報を対象としています。(そのため自分のアカウントで承認されたアクセストークンが必要)。
またAPIキーではなく&access_token=としてアクセストークンを使用しています。
アクセストークンの使用期限は$resの情報に含まれています。
長時間の使用する場合は使用期限が切れる少し前に更新トークンを使用してアクセストークンを再取得する必要があります。連続使用するケースは思いつきませんが。。。

YouTube コメントの全取得

YouTubeの動画の下の方にコメントがありますね。
長いコメントは詳細を押さないと表示できなかったり、件数が多いと下へのスクロールを繰り返しさないといけなくて煩わしいと思ったことはありませんか?ということでコメントの全取得に挑戦します。
コマンドプロンプトで確認した後はhtmlで取得という二段階にわけて説明します。
使用するAPIは2つ。
APIの情報は親コメントがこちらで子のコメントはこちらです。

今回のAPI使用方法のポイントとしては、コメントの件数が多く一回の読み出しで終わらない場合は、["nextPageToken"]を使い&pageToken=にその値を入れてURLに付与することにより続きを読み出すことができます。
また、コメントは返信による子コメントがあります。
["totalReplyCount"]が1以上であれば子コメントが存在するので、commentThreadsのAPIで読み出します。件数が多い場合もあるのでpageTokenを使い終わるまで読みだしています。 子コメントに関わる変数名は$○○2としています。
またAPIの使用回数を減らすため 親コメントはmaxResults=100、子コメントはmaxResults=50をURLに付与しています。

コマンドプロンプトで行う場合の仕様
・textデータとして表示する
・タブでインデントぽくする
・絵文字はあきらめる
・アイコン画像はあきらめる
・コメントの並びは新しい順
・日時情報は省略
です。コードが以下になります。
①のはAPIキー、②には今回は動画のidを入れます。
https://www.youtube.com/watch?v=xxxxxxxxxxx
のxxxxxxxxxxxの文字列のことです。



注釈として
子コメントも親コメントと同様に新しい順で読み出されるため、一度全部配列に保存しから 65行目でひっくり返して古い順にして読みやすくしています。
28と72行目では改行文字を改行文字と水平タブに置換することによって無理やりインデントを作っています。


動作確認がしたらコマンドプロンプトで以下のように[>>test.txt]や[>test.txt]とすればファイルに保存されます。
>は、新規ファイルを作成して実行結果を出力する
>>は、既存ファイルを作成して実行結果を出力する。ファイルなければ>と同じ動作
です。
結果の例はこんな感じです。一応ぼかしてあります。

2018年4月10日火曜日

YouTube生放送の検出

前回の記事でのコードを修正してYouTuve Live(生放送)の検出を行います。

生放送検出コードのバージョン1の仕様は
・指定したチャンネルが放送中の場合は1秒毎にブザー音を鳴らす。
・確認間隔を60秒として検出を行う。
・起動開始した時間と生放送を検出した時間を表示する。
以下がそのコードになります。
①にはAPIキー②には対象のチャンネルのID(UCで始まる文字列)が入ります。
適当な生放送中のチャンネルや開始時間がわかっているチャンネルなどで動作を確認してみてください。
使用するAPIの情報はこちらです。


注釈として
10行目と19行目はdate関数で時間を取得しています。タイムゾーンを変更しないと日本時間で表示されないので9行目で変更しています。
17行目は、APIで「&eventType=live」を条件として検索をしているので生放送をしていない場合["items"]の配列は存在しません。逆にFALSEの場合は生放送中です。
このコードを終了する場合はキーボードで「Ctrl+c」と入力して強制停止してください。
以降の記事でも無限ループがあるものの停止方法は同様です。(そういうところが雑なので。。。)




次にバージョン1の仕様を拡張し複数のチャンネルの生放送の検出を行えるようにします。
生放送検出コードのバージョン2の仕様は
・起動時に生放送を検出したら検出したチャンネル名を表示する。この時はブザー音を鳴らさない。
・起動時に生放送をしていなかった残りのチャンネルについて確認間隔を60秒として検出を行う。
・検出した場合は1秒毎にブザーを鳴らす。
・ その後も残りのチャンネルについての検出を継続する。
(ブザーは鳴り続けているため運用として強制停止後に再度起動を想定)

・検出した場合そのチャンネル名を表示する。
・起動開始した時間と生放送を検出した時間を表示する。
です。

以下がそのコードになります。行数が増えましたが前半と後半にわけて考えればそれほど難しくないと思います。




出力例としてはこんな感じになると思います。


注釈として
 ・$channelId_Listに検出したいチャンネルを登録してできるようにしています。今回は手作業でおこなってください。自分のアカウントから登録チャンネルの情報から作成したいところですがその場合「OAuth 2.0のトークン」が必要になってくるため別途説明します。
・放送中のチャンネルを何回もチェックしないようにunset関数を使いchannelId_List配列からの削除を行っています。
・ブザーが鳴った条件を満たしたあと再度検出処理中はブザーが鳴らないため
ポッ*60回・無音区間・ポッ*60回・無音区間の繰り返しになります。
登録しているチャンネル数をが多くなればなるほど無音区間が増えてしまいます。(例:40個で約20秒無音区間)

2018年4月8日日曜日

YouTube Data APIの使い方

プログラムからYouTubeから情報を取得・アップロードする等場合はYouTube Data APIを使用します。
 YouTube Data APIについてはこのあたりをみればおおよそわかりますので軽く目を通してもらえればいいと思います。
このYouTube Data APIを使用するために2つの方法があります。
 APIの呼び出しについてはこのリンクを参照
「APIキー」もしくは「OAuth 2.0のトークン」が必要です。

このサイトでは基本はAPIキーを使用します。
アップロードなどの更新や自身のアカウントの情報の取得などはAPIキーではできません。

PHP開発環境

最初にPHPの開発環境を整えます。


私の環境は
XAMPP: Version 7.2.2(PHP:7.2.2)
OS:Windows7 Professional 64bit
エディタ:秀丸
です。
ここでは初心者の自分には難しかったのでPHPクライアントライブラリは使用しません。
ほんとはライブラリ使った方が楽だと思いますが英語だし・・・