セッピーナの趣味の天文計算セッピーナの趣味の天文計算Excelでできる天文計算とデジカメと小型望遠鏡による天体観測のブログです。ありますのでExcelファイルを使われる方は必ずごらんください。このブログにあるコンテンツは文章、画像、グラフ、Excelファイル、プログラムソース等すべて自由に引用あるいは再利用していただいてかまいません。お互いのオリジナリティーはたいせつにしていただきますようお願いします。プロフィールにある画像は駒田京伽さん(https://pychanxx.wixsite.com/mysitexx1234)が提供されているものです。「ライブ情報」の取得(GO言語のソースつき)」にSHOWROOMのAPIから返されるJSONからデータを取得する方法があります。これは複雑な(大きな)JSONからひとつ、ぶたつのデータを取り出すやり方としてはいいのですが、JSONから取り出すデータが多いとき(特にほとんどのデータがほしいとき)には面倒になるので、JSONに対応する構造体を作ってそこに代入させる方が手間がかかりません。前記事とほとんど同じ機能をもつサンプルプログラムを作成しましたので紹介しておきます。この程度だったらどっちでも同じようなものですが....(参考にしたサイトなども前記事にあります)---------------------恥ずかしくて書きたくないのですが、このプログラムはちょっとはまりました。「パッケージ外から参照できるのは最初の文字が大文字の変数だけ」というのを忘れてました。w(逆に言うと大文字だと外部から参照できるわけで、変数名の付け方はちゃんと考えるようにします。テストプログラムです。Room_ID配信ルームのID、アカウントっぽい方じゃなくて(ふつう)数字6桁くらいのやつです。{//一時的にデータが取得できない。//JSONをデコードする。//パラメータの数をチェックします。イベントでの配信者の獲得ポイント数を取得する(改良版)」という記事を書き、使っているAPIのURLは某巨大掲示板にころがってたやつです、って書いたのですが、SHOWROOMのAPIをきちんとまとめられている方がいらっしゃいました。SHOWROOMのAPIについて(現在26個公開。main()」に書いたように今"自動三周ツール"の改良版を作成しています。その中で応援しているルーム(星投げ・種投げの対象ルーム)が配信中か否かのチェックを視聴者数が0でないかということでやっていたのですが、ちょっとタイムラグがあるようです。しようか考えていたのですが、上の記事を見ると、ちゃんと配信状況を知るAPIがあるみたいです。最初の実行結果は配信中のもので、Live_statusは2となっています。次の実行結果は配信終了後のものでLive_statusは1になっています。これ以外の値をとるのかとらないのか?は今後の課題です。Go言語でJSONに泣かないためのコーディングパターン」の記事を参考にさせていただきました。環境やポリシーに依存するパラメータを設定します。星集め/種集めの対象としないルームのリストを作ります。公式枠/アマチュア枠に該当するジャンル(の位置)をオンライブ画面から検出します。タスクリストにしたがって星集め/種集め、星投げ/種投げ、カウントを行います。タスクリストから現在時(時分)に実行すべきタスクの集まり(タスクグループ)を抜き出します。星集め/種集めの対象とするルームのリストを作ります。星集め/種集めを行います。星投げ/種投げを行います。ブラウザ画面を開きます。ブラウザ画面を閉じます。(三周のやり方を例に)例えば「15時00分からの公式枠・○○さんの配信で3周する」という目標を立てます。いろんな"作業"が必要になります。(1)~(15)が必要な"作業"です。このブログの記事(とソース中のコメント)では、次のような"用語"を使うことにします。・スケジュール配信予定とそれに対する対応の計画をいいます。「公式枠・○○さんの15時00分から90分の配信で最初3周+50カウントし、次の解除で1周+50カウントする。解除は15時15分」みたいなやつです。スケジュールはスケジュールファイルとしてプログラムの入力となります。スケジュールファイルには複数のスケジュールを書くことができます。・タスクスケジュールを実現するために必要な作業の一つ一つを言います。星・種を集める、星・種を投げる、カウントするがそれに相当します。上の図で(1)から(15)で示したものがそれです。・タスクリスト一日のすべてのタスクの集まりです。タスクリストファイルに書き込まれています。・タスクグループ指定した時刻に始めるべきタスクとそれに継続して実行する一連のタスクを言います。星投げ」の三つのタスクの集合がそれです。-------------------------------------このプログラムではプログラム実行開始時(と任意の時刻に)スケジュールをファイルから読み込み、タスクリストを作成してファイルに書き込みます。その後、毎分0秒にタスクリストファイルを読み込み、もしタスク実行時間が現在時に一致するものが見つかれば、実行時間が一致するタスクから開始されるタスクグループを抽出します。抽出したタスクグループにしたがって個々のタスクを実行していきます。BreakDownSchedule()のソースを紹介します。このソースはShowroomLibパッケージから該当部分を抜粋したものであり、このままではコンパイルできませんので念の為。ShowroomLibパッケージのソース全体は後日公開します。main()」の記事にあります。1時間配信+カウント枠のケースは(たとえば)90とします。配信開始が15時、解除が15時15分であれば900とします。直前のタスクに引き続き実行する。すべての色で10個(あるいは9個)投げるのを1回とします。false:配信ルームリストを作り直す。namexxxx開始時刻が99時99分99秒となっているのは、直前のタスクに継続して順次実行することを意味しています。したがってこのタスクファイルには4つのタスクグループがあります。解除は開始900秒後ですから、3周目分の星集め開始時刻は15時45分となるわけですが、その前に配信ルームリストを作らなければならないので星集めのタスクの開始時刻は15時44分20秒となっています。実際に星を集め始めるのは15時45分00秒となります。環境やポリシーに依存するパラメータを設定します。星集め/種集めの対象としないルームのリストを作ります。公式枠/アマチュア枠に該当するジャンル(の位置)をオンライブ画面から検出します。タスクリストにしたがって星集め/種集め、星投げ/種投げ、カウントを行います。タスクリストから現在時(時分)に実行すべきタスクの集まり(タスクグループ)を抜き出します。星集め/種集めの対象とするルームのリストを作ります。星集め/種集めを行います。星投げ/種投げを行います。ブラウザ画面を開きます。ブラウザ画面を閉じます。main()これまで、なんでもいいから三周できればいいや、みたいな気持ちでプログラムを書いていたのですが、心をいれかえて少しは役にたつようなプログラムになればという気持ちで作りました。特徴(というか目標)・全体の構造や処理の内容がわかりやすく、再利用・改修が容易なプログラム。あるソースを改修したのものではなく、その反省をもとに新たに作成したものです。・GO言語らしいプログラム、GO言語のプログラミングの参考になるようなプログラム(そういう気持ちで作っているという意味で、じっさいそうなってるかどうかはわかりません。他の言語に移植しにくいようなものにはしません)・環境に依存しないように作る(要するにハードコーディングはしない。言ってもSHOWROOMのシステムを相手にしてるわけで...)・特に公式枠・アマチュア枠のジャンルの変更にはできるだけ影響を受けないようにする(これまでさんざん泣かされたところです)・Goroutineは使わない。Goroutineを使えば処理の時間を短縮できるのですが、プログラムの可読性がおちるので今回はやめました。誤解を招きそうなので補足しておきます。Goroutineを使ったからプログラムがわかりにくくなるということはないのですが、Goroutineを完全に非同期で動かすことはできず、ある程度お互いの動作を意識する必要があり、その部分があるためにわかりにくくなる、という意味です。--------・配信者さんに合わせたスケジュール(タスクリスト)が作れる(要するに時間にルーズな配信者さんにもある程度対応できる)・可能な限り星集めの"解除"の時刻を正確にコントロールする(PCのRTCが正確という条件で不確かさを1秒以下に抑える)これによって3時間おき一日7配信みたいなのにも対応できるかと思います(まだ実際にやってみていないですけど)・PCの過負荷やムリな設定条件などで三周できそうにないときも最大の星数種数が投げられるように最適化する。--------今回はmain()のソースを紹介します。これから順次各関数の紹介・説明をしていきます。環境やポリシーに依存するパラメータを設定します。星集め/種集めの対象としないルームのリストを作ります。公式枠/アマチュア枠に該当するジャンル(の位置)をオンライブ画面から検出します。タスクリストにしたがって星集め/種集め、星投げ/種投げ、カウントを行います。タスクリストから現在時(時分)に実行すべきタスクの集まり(タスクグループ)を抜き出します。星集め/種集めの対象とするルームのリストを作ります。星集め/種集めを行います。星投げ/種投げを行います。ブラウザ画面を開きます。ブラウザ画面を閉じます。自動三周ツール(もう一つの自動星集め・星投げ・カウントツール」にあるツールは星集め(種集め)がいわゆる「ツイボ」で行われていました。7月からツイボによる星集めはできず、「視聴ボーナス」だけが星集めの手段となりました。あしかっぴ(@pf_ashika)さんから「視聴ボーナス」対応のGO/agouti版ソースをいただきましたので、公開することにします。じつはこのソースはツイボで星集めができなくなる前にいただいたのですが、いろいろやりとりをしてるうちに一ヶ月以上経ってしまいました。