« Showroomでの自動星集めの試み (1) | トップページ | Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間 »

2017年12月29日 (金)

Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る

今回は自動星集めの前段階として配信されているルームの情報を集めることをやってみたいと思います。

ところでこの「自動星集め」というのはやっていいことなのかいけないことなのかがよくわかりません。やっていることは(将棋のオンライン対局のアプリ指しなんかとは違って)単に人間のやることと同じことをプログラムで実行しているだけですから問題ないように思うのですが、Showroomがこのようなことを禁じている可能性もあります(まだ確認していません)

その後調べたところ.....
SHOWROOM 会員規約」の第10条に「禁止事項」というのがあって今回の件に関連するのは以下のものになるかと思います。
「当社が提供するアプリケーション、当社が保有するサーバー及びこれらが生成する情報、通信内容等の解読、解析、逆コンパイル、逆アセンブルまたはリバースエンジニアリング」、「ボットなどの自動化された手段を用いて本サービスを利用すること」、「本サービスを変更または妨げることを目的に利用すること」、「その他当社が不適当と判断するもの」
これらがとういう行為に対してどう適用されるかはけっきょく「中の人」の判断ということになるのでしょうから、私にはこれ以上何も書くことはありませんが、参考にしていただければと思います。

以下の例はミュージック枠に表示されている各ルームのリスナー数、配信開始時刻、ルーム名を取得して表示するものです。

このような内容が表示されます。
このとき「まいにちミュージック」で17件、「ONLIVE」で4件の配信が行われていました。

-------------------------

参考
 

  「Showroom - 自動星集め・星投げ・カウントツール)」 (使用法とソースつき)
  「Showroom - 自動三周ツール(もう一つの自動星集め・星投げ・カウントツール)」 
  「Showroom - イベントの獲得ポイント数を取得して記録するツール
  「Showroom - 福引するプログラムとその結果 (1)

  「Showroom - イベント結果データ

  「Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間
  「Showroom ラスカルイベの最後の5分間

  「Showroomの複数アカウント(複アカ、複垢)について考えてみた(1)
  Showroom - 複数アカウント(複垢)問題の真実 - 実験計画
  「Showroomの重複アカウント(複垢)減算はこうして起きる

  「Showroomでの自動星集めの試み (1)
  「Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る
  「Showroomでの自動星集めの試み (4) 星集めツール
  「Showroomでひたすらリスナーレベルを上げるための星集めツール(Go/Agouti)

  「超初心者のGo言語/agouti - ブラウザ操作の基本の基本
  「超初心者のGo言語 - 複数の戻り値をもつ関数
  「超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)

 

  ---------------------

  「GoDoc - package agouti

  「Qiita @0829 - Goではじめてみたブラウザの自動操作

 

  「Qiita @tenten0213 - agoutiというWebDriverクライアントを使って面倒な作業を自動化する
  「Qiita @masaru_b_cl - Windows上でGo言語初心者向け学習環境を作る

  「はじめてのGo言語
  「天才まくまくノート - まくまく Hugo/Go ノート - 関数を定義する (func)

 

  「Qiita @TakaakiFuruse - Golang Goの並列処理を学ぶ(goroutine, channel)
  「Qiita @To_BB - Rubyエンジニアがゴルーチン(Go言語)を学んでみた【初心者向け】
  「Qiita @fukumone - goroutine 使い方まとめ


C:/Appl/Go/bin/go.exe build -i [C:/Users/Seppina/Go/src/main]
成功: プロセスがコード 0 で終了しました
C:/Users/Seppina/Go/src/main/main.exe  [C:/Users/Seppina/Go/src/main]
2017-12-29 12:21:33.5591426 +0900 JST m=+0.019488001
   1   1    789 12:00〜 【絶対1位】最終日大ピンチ 新生☆眞野咲耶
   1   2    384 12:10〜 最終日【 絶対1位】MVイベ☆ゆきこhr☆やっちょんな!?
   1   3    489 12:00〜 【1位狙いMVイベ再挑戦】岡井つばさ THEカラオケ★バトル
   1   4    369 12:00〜 咲耶さん、SHOWROOM始めるってよ。
   1   5    386 12:01〜 シンガーソングライター美桜(みおう)
   1   6    329 12:00〜 ♡みきぽんルーム♡MV獲得イベント決勝!!
   1   7    157 12:09〜 イベ中_美羽希(みゆき)と今夜もリラックス
   1   8    350 12:00〜 詩愛組の部屋@1/31CLUBCITTA川崎トリ21:05〜
   1   9    498 11:18〜 【誕生日イベ中!】クロネコの音楽室☆彡弾き語り
   1  10    218 12:00〜 NANA.の「金髪救急救命士!だって私はベーシスト!」
   1  11    224 11:45〜 ムーラー師匠のギルガメッシュROOM〜♪
   1  12    359 11:29〜 芽亜利・Jの部屋(イベント参加中♪)
   1  13    197 11:59〜 かやROOM【2/11 東京の祖師ヶ谷大蔵で初ライブ】
   1  14    141 12:05〜 I’m your SSW!久保木寛人ルーム!!
   1  15     98 12:09〜 dan hiryu宅録部屋
   1  16     70 12:12〜 Arrowの粗塩対応おつまるTV
   1  17     11 12:20〜 グラッチェ!!送りバント歌手HIROTO
   2   1    239 12:00〜 まゆみん。のお部屋
   2   2    194 12:01〜 TWINKLE KISS
   2   3    114 12:04〜 ✻流架のまったり部屋✻
   2   4      1 12:20〜 ZaBii(ざびー)のショールームへようこそ!!新アバ配布中
成功: プロセスがコード 0 で終了しました

上の結果を得たときのソースを示します。


package main

import "github.com/sclevine/agouti"
import "fmt"
import "time"

func main() {

	FmtNumberOfListner := "#js-onlive-collection > div > section:nth-child(%d) > ul > li:nth-child(%d) > div > div > div.listcard-image > div.listcard-label > div.label-room.is-onlive"
	FmtStartTime := "#js-onlive-collection > div > section:nth-child(%d) > ul > li:nth-child(%d) > div > div > div.listcard-image > div.listcard-label > div.label-room.is-start-time"
	FmtName := "#js-onlive-collection > div > section:nth-child(%d) > ul > li:nth-child(%d) > div > div > div.listcard-info > h4"
	// FmtURL := "#js-onlive-collection > div > section:nth-child(%d) > ul > li:nth-child(%d) > div > div > div.listcard-image > div.listcard-overview > div > a.js-room-link.listcard-join-btn"
	FmtNoRoom := "#js-onlive-collection > div > section:nth-child(%d)"

	fmt.Println(time.Now())

	// Chromeを利用することを宣言
	agoutiDriver := agouti.ChromeDriver()
	agoutiDriver.Start()
	defer agoutiDriver.Stop()
	page, _ := agoutiDriver.NewPage()

	// オンライブ画面を開く
	page.Navigate("https://www.showroom-live.com/onlive")
	page.Screenshot("Screenshot01.png")

	// ミュージック枠を選択する
	page.Find("#js-categorymenu-list > li:nth-child(4)").Click()
	page.Screenshot("Screenshot02.png")

 // 「まいにちミュージック」と「ONLIVE」を巡回
	for j := 1; j < 3; j++ {

 // 配信者数を取得する
		SelectorNoRoom := fmt.Sprintf(FmtNoRoom, j)
		NoRoom, _ := page.First(SelectorNoRoom).AllByClass("js-room-link").Count()
 // 配信者数の分繰り返す
		for i := 1; i < NoRoom; i++ {
			SelectorNumberOfListner := fmt.Sprintf(FmtNumberOfListner, j, i)
			NumberOfListner, _ := page.Find(SelectorNumberOfListner).Text()
			SelectorRoomName := fmt.Sprintf(FmtName, j, i)
			SelectorStartTime := fmt.Sprintf(FmtStartTime, j, i)
			StartTime, _ := page.Find(SelectorStartTime).Text()
			RoomName, _ := page.Find(SelectorRoomName).Text()
			fmt.Printf("%4d%4d %6s %s %s\n", j, i, NumberOfListner, StartTime, RoomName)
		}
	}

}

前回の内容と合わせて考えれば、現在の配信画面を次々に開いて行くだけでしたらすぐにできそうです。ただこれまでのサンプルではログイン操作は行っていませんので、画面を開いても星はたまりませんので念のため。

Goは(そしてagoutiも)はじめてなので簡単なプログラムの割には手間取りました。
いちばん悩んだのは

			StartTime, _ := page.Find(SelectorStartTime).Text()
というようなところです。

右辺は複数の値を返しており、

			StartTime := page.Find(SelectorStartTime).Text()

などとしてしまうと

  multiple-value page.selectable.Find(SelectorStartTime).Text() in single-value

というようなエラーが発生します。どうやって一つの値(先頭の値)だけ取り出すのかがさっぱりわからず、配列かな?とか回り道しましたが、「天才まくまくノート 」にある記事を拝見してやっとやり方がわかりました。

はじめての言語というのは何かとたいへんです。

« Showroomでの自動星集めの試み (1) | トップページ | Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間 »

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

コメント

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

トラックバック


この記事へのトラックバック一覧です: Showroomでの自動星集めの試み (2) 配信ルームの一覧を作る:

« Showroomでの自動星集めの試み (1) | トップページ | Showroomでの自動星集めの試み (3) ガチイベ、最後の5分間 »

フォト

サイト内検索

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

新着記事

リンク元別アクセス数

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

人気記事ランキング

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