ビットコイン目次/もくじToggleシステムの開発の大まかな流れ実装方法リアルタイムで更新させる音声読み上げAPIに読み上げさせる音声読み上げに特化する取引所でデイトレードしているとチャットが目につくことがあります。今回はそれを作ってみようと思います。返ってきた音声ファイルを再帰的に読み上げる感じです。目標はシンプルですが、実装するとなると複合的な感じがします。必要な知識は、API処理、PHP、Javascript(AJAX)あたりです。非同期処理とAPIができればだいたいOKです。はじめはコインチェックでやろうとしたのですが、どうやらチャットのAPIメソッドはないようです。(あったような気がしたんだけどな)なので、今回はbitFlyerのチャットを引っ張ってきます。将来的にはチャット内容に応じたトレードなんかもできると思います。実装方法bitFlyerのチャットメソッドはhttps://lightning.bitflyer.jp/docs?lang=ja#チャットにドキュメントがあります。メソッドはPublicなので、認証とかハッシュとかは必要ありません。POLONIEXのヒストリーデータ取得メソッドのようにパラメータに時刻を指定することで、それ以降のチャットを返します。リクエストhttps://api.bitflyer.jp/v1/getchats?from_date=2017-12-10T08:02:15.2531https://api.bitflyer.jp/v1/getchats?from_date=2017-12-10T08:02:15.253レスポンス[{"nickname":"横浜海月姫","message":"いま、いるのはみな勝ち組。ナンバーだしw","date":"2017-12-10T08:02:28.323"},{"nickname":"勃起マン","message":"ちんこ","date":"2017-12-10T08:02:32.547"},{"nickname":"大正の煽り王(92)【ノーポジ】","message":"草コインにばらまくのがいいで。笑えるでwww","date":"2017-12-10T08:02:33.973"},{"nickname":"UserEC68D68","message":"もな2000円に戻ると思う?","date":"2017-12-10T08:02:35.563"},{"nickname":"さい","message":"15万乖離で絶望に変わったら織だな","date":"2017-12-10T08:02:35.777"}]1[{"nickname":"横浜海月姫","message":"いま、いるのはみな勝ち組。ナンバーだしw","date":"2017-12-10T08:02:28.323"},{"nickname":"勃起マン","message":"ちんこ","date":"2017-12-10T08:02:32.547"},{"nickname":"大正の煽り王(92)【ノーポジ】","message":"草コインにばらまくのがいいで。笑えるでwww","date":"2017-12-10T08:02:33.973"},{"nickname":"UserEC68D68","message":"もな2000円に戻ると思う?","date":"2017-12-10T08:02:35.563"},{"nickname":"さい","message":"15万乖離で絶望に変わったら織だな","date":"2017-12-10T08:02:35.777"}](publicでだれでも閲覧できる状態なのでプライバシーとかはもともとありません。)いろいろ試してみて分かったのですが、このパラメータ指定には癖があります。指定された日付以降の発言を取得します。日前からの発言を返します。指定された日付以降の発言を取得します。日前からの発言を返します。実は、この指定する時間に一致する発言がないと、うまくレスポンスが返ってこないことがあります。(というかほぼ返ってきません。)そのため、現在時刻をこのフォーマットに成形してパラメータで渡しても上手く表示されない結果になります。(日付だけだと上手くいく)一回目のリクエストは仕方がないとして、2回目以降でも同じように大量にレスポンスが返ってくると処理が重くなるので、2回目以降はセッションに保存した時刻を使います。例によってCURLを使ってください。curl_exec($curl);curl_close($curl);あとはこれをjsonデコードして連想配列に入れれば、チャットの内容だけを取得できます。2chよりはるかに簡単ですね。最新のチャット内容を取得するには配列のサイズを取得する必要があります。$r_json[$i]["message"]."<br>";}}あとは、任意で10件程度ループして出力すれば出来上がりです。bitFlyerのチャットには建玉情報を流す機能がありますが、他人の建玉情報はいらないので、オーダーの自動発言の場合には非表示にしています。(買いオーダーだけ)また、半角文字しか入っていない場合も非表示にしています。ここら辺は適宜追加してみてください。次はそれをリアルタイムで更新させるところまでやります。基本的にWEBページというものは静的なもので、動かしたりするには別途記述が必要です。動かすにはJavasciprtによる記述が必要ですが、今回はその中でもAJAXというものを使います。AJAXというのはリアルタイムで非同期処理をするための処理です。jqueryを読み込む必要があります。src="https://code.jquery.com/jquery-3.0.0.min.js"></script>あとはシンプルに処理を書きます。{$('#text').html(data);}});}});});</script>これはボタンを押すとajax_call.phpを非同期処理で呼び出します。このphpファイルの中に前回のbitFlyerのチャット呼び出しの記述をすればいいわけです。ボタンを押すとページが更新されることなくチャットが表示されます。最新の情報を取得するにはボタンを連打する必要があります。今回は自動的に更新&表示してほしいので、javascriptの関数にループ処理を付け加えます。javascriptにはスリープ関数がないので、今回はただのループです。javascriptでむりやりスリープしても良いのですが、次回以降にphpと組み合わせるときにphp側でスリープを入れます。{//alert('error');}});}});});</script>これで自動的に更新されるようになりました。value="START"/></body></html>音声読み上げAPIに読み上げさせる最近は便利なものでWEB上でAPIを使って音声読み上げができるんですよね。”ゆっくり”)が有名で、もし読み上げを自動化するのであれば、WEBとオフラインのソフトークをマクロでつないでやる必要がありました。APIがあるので、それを有難く使います。https://cloud.voicetext.jp/webapi配布、商用利用する場合は金を払えということなので、それぞれ各自APIを取得してみてください。メールアドレスを登録するとAPIキーが送られてくるので、それを使います。"2");今回はとりあえずAPIの実行がメインなので、送るテキストは固定にします。話者を選択できるので、楽しいですね。bear(凶暴なクマ)とりあえず今回はtakeruにしました。凶暴なクマが気になったのですが、こんな感じでした。https://fxantenna.com/kumavoice.wav(意外とまとも?)このAPIを叩くと指定した音声ファイルが保存できるので、とりあえず自サーバーに保存します。$output);fclose($fp);?>ちなみにtakeruの場合、こんな感じです。https://fxantenna.com/chattext.wavもっと残念な感じだと想像していましたが、最近の読み上げAIはすごいですね。これなら長い間聞いていても疲れなさそうです。APIも特に癖はないので、すんなりいけます。以下の形式でエラーメッセージを返します。長い文章にするとエラーになるので、体感としては10から20までのコメントにしておいた方が安定します。これ、デバッグのときに何度も何度も同じ文章を聞く羽目になるため、軽く洗脳されます。・AJAXでリアルタイム更新ができたわけですが、ここから悪戦苦闘がありました。ストレートにリアルタイムで取得した音声ファイルをAJAXで再生しようとしたのですが、どうしてもブラウザがキャッシュを優先してしまい、更新された音声ファイルではなく古い音声ファイルを繰り返し読み上げてしまいました。htmlのメタタグでキャッシュを不可にする記述もあるのですが、他のブログさんで紹介しているように、まったく効果を発揮しません。JavascriptでAudioオブジェクトのload()メソッドとかもあるのですが、これらも上手くいきませんでした。オブジェクトを一度削除して新しくインスタンスを生成してもダメでした。音声ファイルの再生ってブラウザとそのバージョンによって、再生できたりできなかったりするので、もし製品化とかだったらプログラマさん大変ですね。当初の仕様から方針をかなり変えました。すべてWEBアプリで完結できればよかったのですが、上記もろもろの理由で現在の仕様では困難なため、クライアント側から強制的にページそのものを更新する仕様にします。ページそのものが更新されればブラウザはキャッシュがあっても読み込んでくれるため、新しい音声ファイルを呼び出してくれます。この場合、ページそのものを更新してしまうので、リアルタイムなチャットテキストの更新は失われてしまいますが、AJAXを使う必要もありません。(何のためのAJAXだったのか...)そもそもリアルタイムなテキストの更新が目的なら、取引所のページを開けば良いので、今回に限っては音声の読み上げに特化したいと思います。言っても、これまでにやった内容から難易度が一気に下がるので、今までの内容をつなぎ合わせるだけでできちゃいます。volume="0"></body></html>あとはこいつを適当なPHPサーバーに上げて何度も呼び出してあげればOKです。(ゴリ押しー)呼び出しは何でもいいですが、下記はUWSCのコードです。TrueIE.refreshSLEEP(10)Wend今まで再帰的にページ内容を更新するときには、IE.Navigateを使っていたのですが、ループの中でこれを使っても音声ファイルが更新されなかったので、refreshメソッドにすれば更新されました。navigateで同じページに推移した場合とrefreshで更新した場合は、読み込みが微妙に違うんですねたまにIEオブジェクトの取得に失敗することがあるので、try文でフェイルセイフをかけると安定すると思います。読み上げのスピードよりもテキストが更新されるスピードの方が早いので、読み上げが途中でも次のテキストに移行する仕様にしました。以下は稼働している様子を録画したものです。https://fxantenna.com/chatvoice.html音量にムラがありますが、これは録画ソフトのせいなので、実際に使う際にはムラはありません。実ソフトはここに上げてしまうと二次配布になってしまい、音声読み上げAPIの運営に怒られるので、各自キーを入れ替えて実装してください。これで画面上は他の作業をしながら、もしレートに何かあった場合にはチャット民の悲鳴や歓喜を察知することができます。(ていうか作業が進まない)bitFlyerのチャットはビットコインに関するコメントが多いですが、アルトコインに関する情報は比較的あんまり流れません。アルトコインガチホ勢の身としてはコインチェックのチャットの方が聞きたいのですが、コインチェックはチャットAPIがないので、ページからむりやり抽出してみたいですね。APIで行っているはずですが、それをドキュメントで公開していないということは、何かしらの意図があってAPIを公開していないのかもしれません。役に立ったと言っています。Messageメールアドレスが公開されることはありません。上に表示された文字を入力してください。以前、bitFlyerのチャットの自動読み上げシステムを作りましたが、個人的にはコインチェックのチャ記事を読む↑仮想通貨MT5システムトレードに↑プロフィール横瀬兼元(ペンネーム)。株式、その他金商品の取引を勧誘することを意図したものではありません。金融商品取引は元本保証ではなくリスクを伴います。レバレッジ取引は大きなリスクと損失の可能性があります。取引をする前に、投資目的、経験の程度およびリスクの許容範囲を慎重に考慮してください。投資資金の一部または全部を失うことがあります。損失に耐えられない資金投資をしてはなりません。