« SHOWROOM - 自動三周ツール(視聴ボーナス版)(もう一つの自動星集め・星投げ・カウントツール | トップページ | SHOWROOM 星集め・星投げツール スケジュールの詳細化 BreakDownSchedule() (三周のやり方を例に) »

2019年9月17日 (火)

SHOWROOM 新・自動三周ツール -- GO言語によるブラウザ制御 (1) main()

これまで、なんでもいいから三周できればいいや、みたいな気持ちでプログラムを書いていたのですが、心をいれかえて少しは役にたつようなプログラムになればという気持ちで作りました。

特徴(というか目標)

・全体の構造や処理の内容がわかりやすく、再利用・改修が容易なプログラム。

今回のプログラムはShowroom - 自動星集め・星投げ・カウントツール)にあるソースを改修したのものではなく、その反省をもとに新たに作成したものです。

・GO言語らしいプログラム、GO言語のプログラミングの参考になるようなプログラム
 (そういう気持ちで作っているという意味で、じっさいそうなってるかどうかはわかりません。
  もちろん他の言語に移植しにくいようなものにはしません)

・環境に依存しないように作る(要するにハードコーディングはしない。と言ってもSHOWROOMのシステムを相手にしてるわけで...)

・特に公式枠・アマチュア枠のジャンルの変更にはできるだけ影響を受けないようにする(これまでさんざん泣かされたところです)

・Goroutineは使わない。
  Goroutineを使えば処理の時間を短縮できるのですが、プログラムの可読性がおちるので今回はやめました。
  (今後Goroutineを使うバージョンも作る予定はあります)

※ 誤解を招きそうなので補足しておきます。Goroutineを使ったからプログラムがわかりにくくなるということはないのですが、Goroutineを完全に非同期で動かすことはできず、ある程度お互いの動作を意識する必要があり、その部分があるためにわかりにくくなる、という意味です。

--------

・配信者さんに合わせたスケジュール(タスクリスト)が作れる(要するに時間にルーズな配信者さんにもある程度対応できる)

・可能な限り星集めの"解除"の時刻を正確にコントロールする(PCのRTCが正確という条件で不確かさを1秒以下に抑える)
 これによって3時間おき一日7配信みたいなのにも対応できるかと思います(まだ実際にやってみていないですけど)

・PCの過負荷やムリな設定条件などで三周できそうにないときも最大の星数種数が投げられるように最適化する。

--------

今回はmain()のソースを紹介します。これから順次各関数の紹介・説明をしていきます。

main()
  SHOWROOM 新・自動三周ツール -- GO言語によるブラウザ制御 (1) main()

  SetEnvironment() 環境やポリシーに依存するパラメータを設定します。

  SetBlackList() 星集め/種集めの対象としないルームのリストを作ります。

  GetCategoryList() 公式枠/アマチュア枠に該当するジャンル(の位置)をオンライブ画面から検出します。

  BreakDownSchedule() 配信スケジュールから星集め/種集め、星投げ/種投げ、カウントの
   SHOWROOM 星集め・星投げツール スケジュールの詳細化 BreakDownSchedule() (三周のやり方を例に)

  Scheduler() タスクリストにしたがって星集め/種集め、星投げ/種投げ、カウントを行います。

    MakeTaskList() タスクリストから現在時(時分)に実行すべきタスクの集まり(タスクグループ)を抜き出します。

    GetRoomList() 星集め/種集めの対象とするルームのリストを作ります。

    CollectStarts() 星集め/種集めを行います。

    ThrowStars() 星投げ/種投げを行います。

    Count50() カウントを行います。

共通して使用する主な関数

  MakeNewPage() ブラウザ画面を開きます。
  ClosePage() ブラウザ画面を閉じます。

package main
 
import (
	"io"
	"log"
	"os"
 
	"ShowroomLib" //	このプログラムの実行に必要な関数をおさめたパッケージです。
)
 
/*
 
SHOWROOMでの星集め/種集め、星投げ/種投げ、カウントを配信開始時刻を指定することによって自動的に行うツールです。
 
起動方法
	Scheduler.exe EnvironmentFileName [Option]
 
		1.	EnvironmentFileName		環境設定ファイルのファイル名
		2.	Option					星投げ・星集めのツールとして使う場合は "GO" を指定します。
									指定しない場合、あるいは"GO"以外を指定した場合は配信開始時刻から
									タスクリストを作る処理のみを行います。
									これはプログラムを起動したまま、スケジュールを変更するために使います。
 
 
プログラムのだいたいの構造
 
main()
 
	SetEnvironment()		環境やポリシーに依存するパラメータを設定します。
 
	SetBlackList()			星集め/種集めの対象としないルームのリストを作ります。
 
	GetCategoryList()		公式枠/アマチュア枠に該当するジャンル(の位置)をオンライブ画面から検出します。
 
	BreakDownSchedule()		配信スケジュールから星集め/種集め、星投げ/種投げ、カウントの
							詳細スケジュール(タスクリスト)を作成します。
 
	Scheduler()				タスクリストにしたがって星集め/種集め、星投げ/種投げ、カウントを行います。
		MakeTaskList()		タスクリストから現在時(時分)に実行すべきタスクの集まり(タスクグループ)を抜き出します。
		GetRoomList()		星集め/種集めの対象とするルームのリストを作ります。
		CollectStarts()		星集め/種集めを行います。
		ThrowStars()		星投げ/種投げを行います。
		Count50()			カウントを行います。
 
共通して使用する主な関数
 
	MakeNewPage()			ブラウザ画面を開きます。
	ClosePage()				ブラウザ画面を閉じます。
 
実行に必要なファイル
	詳細はそれぞれのファイルを扱う関数にあります。
 
	"Environment.txt"
		実行環境の設定を記したファイル プログラムの引数として渡します。
		詳細は ShowroomLib.SetEnvironment() を御覧ください。
 
	environment.FileNameOfCatName (例 "CategoryName.txt")
		"CategoryName.txt" の内容はGetCategoryList()の説明にあります。
 
	environment.FileNameOfBlackList (例 "BlackList.txt")
		星集め/種集めの対象としないルームの一覧です。
		一行にルームURLとルーム名や対象としない理由をタブ区切りで記述したもので構成されます。行数の制限はありません。
		ルーム名や理由は処理には無関係です。
 
	environment.FileNameOfSchedule (例 "Schedule.txt")
		応援している配信者さんの配信スケジュールとそれに付随するデータ
 
	environment.FileNameOfTaskList (例 "TasList.txt")
		配信スケジュールから星集め/種集め、星投げ/種投げのスケジュールに詳細化したもの
		このプログラムではこれをタスク、一連の処理に対応するタスクの集まりをタスクグループ、
		すべてのタスクグループを集めたものをタスクリストと称しています。
 
	environment.FileNameOfLog (例 "log.txt")
		ログの出力先
 
*/
func main() {
 
	log.Printf("\n\n\n******************** test of Scheduler ********************\n")
	defer log.Println("******************** end of test ********************")
 
	if len(os.Args) == 1 || len(os.Args) > 3 {
		//	実行時パラメータが正しくセットされていないとき
		log.Println("usage:", os.Args[0], "FileNameOfEnvironmentFile [GO]")
		return
	}
 
	//	環境設定ファイル
	FileNameOfEnvironmentFile := os.Args[1]
 
	//	環境設定ファイルを読み込んで実行環境を設定します。
	environment, status := ShowroomLib.SetEnvironment(FileNameOfEnvironmentFile)
	if status != 0 {
		log.Println("Error in SetEnvironment()")
		return
	}
 
	//	ログファイル出力先の指定があれば変更します。
	if environment.FileNameOfLog != "" {
		logfile, err := os.OpenFile(environment.FileNameOfLog, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
		if err != nil {
			panic("cannnot open logfile: " + environment.FileNameOfLog + err.Error())
		}
		defer logfile.Close()
		//	log.SetOutput(logfile)
		log.SetOutput(io.MultiWriter(logfile, os.Stdout))
	}
 
	//	後続の処理(星集め、星投げ)を実行するためには実行時パラメータの2番めが"GO"である必要があります。
	//	うっかりプログラムを二重に起動しないようにこうしてあります。
	//	GOがなければスケジュールの再作成のみ行います。
	if len(os.Args) == 2 || len(os.Args) == 3 && os.Args[2] != "GO" {
		return
	}
 
	//	ブラウザを起動します。
	status = ShowroomLib.MakeNewPage(&environment, 0)
	if status != 0 {
		return
	}
	defer ShowroomLib.ClosePage(&environment, 0)
 
	//	オンライブ画面上の各カテゴリーの位置(ジャンルリスト)を調べます。
	//	起動時に一回のみ調べていますが、1時間に一回くらいにした方がいいかも。
	IdxCategory, status := ShowroomLib.GetCategoryList(
		&environment, //	実行環境
	)
 
	log.Println("status of GetCategoryList =", status)
	//	ブラウザを閉じます。
	ShowroomLib.ClosePage(&environment, 0)
 
	//	星集め・種集めの対象としないルームのリストを作ります。
	BlackList, status := ShowroomLib.SetBlackList(&environment)
	if status != 0 {
		log.Println("Error in SetBlackList()")
		return
	}
 
	/*
		スケジュールをブレイク・ダウンします。
		つまり
			15時00分から始まる○○さんのルームで3周する
		という指示から例えば
			13時10分に星を10回集める
			14時10分に1回だけ星を集める(いわゆる捨て星)
			...
		というような具体的な操作を作ります(詳細は関数のコメントにあります)
		Scheduler()との間のスケジュール(タスクリスト)の受け渡しはファイルを介して行います。
		これはタスクリストを可視化し、かつプログラム実行中の修正を可能にするためです。
	*/
	status = ShowroomLib.BreakDownSchedule(&environment)
	if status == 0 {
		log.Println("List of Task created!")
	} else {
		log.Println("Error in BreakDownSchedule()")
		return
	}
 
	//	できあがったスケジュール(タスクリスト)にしたがって、星・種集め、星・種投げを行います。
	status = ShowroomLib.Scheduler(&environment, IdxCategory, BlackList)
	if status != 0 {
		log.Println("Error in Scheduler()")
		return
	}
 
}
 

« SHOWROOM - 自動三周ツール(視聴ボーナス版)(もう一つの自動星集め・星投げ・カウントツール | トップページ | SHOWROOM 星集め・星投げツール スケジュールの詳細化 BreakDownSchedule() (三周のやり方を例に) »

パソコン・インターネット」カテゴリの記事

コメント

この記事へのコメントは終了しました。

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ