カテゴリー「Go言語/agouti」の3件の記事

2018年1月20日 (土)

超初心者のGo言語/agouti - ブラウザ操作の基本の基本

これはやく記事にしなければならなかったのですが、面倒で後回しにしていました。ただ実際にGo言語/agoutiを使おうとするといちばん最初に必要なことなので簡略化した形で記事にします。画像や詳細な説明はこれから少しずつ追記していくつもりです。

操作したい場所を探す

ChromeでF12キーを押すとデベロッパーツールが開きますのでこれを使います。デベロッパーツール上でhtmlの上にマウスカーソルを置くとブラウザ画面の対応箇所がグレー表示されます。これで場所を追い込んで行ってもいいんですが、Ctrl+Shift+Cを押すと逆にブラウザ画面上にマウスカーソルを置くとそれに対応するhtmlがわかるようになっていますので、この機能を使った方が早いでしょう。

情報を得る

上の手順でブラウザに表示されている内容を取得する場所がわかり、例えば

  <span id="event-next-point">24,693</span>

の“24,693”という数字がほしいとき(これはShowroomでイベントをやっているときに表示される「次の順位まであと 24,693 pt」の数字のところです)

  evnet_next_point, _ := page.FindByID("event-next-point").Text()

FindByID() で場所を特定し、Text() で文字列を取り出します。ただいつでもおあつらえ向きにID があるわけじゃありません。確実なのはセレクターを使う方法です。セレクターもデベロッパーツールで知ることができます。該当するhtmlにマウスカーソルをおき右クリックして表示されるコンテクストメニューからCopy => Selector と進みます。ここでは“#event-next-point”でした。次の方法でデータを取得できます。

  evnet_next_point, _ := page.Find("#event-next-point").Text
()

Showroomで言えば/onlive/follow のページのように配信者のルームが表になっているときはそれぞれの項目(配信者)の項目へのセレクターは

  #list-ranking > li:nth-child(1) > div > div > div.listcardinfo-image > a

のような形をしています。ここで赤字の数字のところを1から順に2、3、...と変化させればそれぞれの項目を取得できます。

  FmtURLSelector := "#list-ranking > li:nth-child(%d) > div > div > div.listcardinfo-image > a"
  Selector := fmt.Sprintf(FmtURLSelector, i)
  URL
, _ := page.Find(Selector).Attribute("href")


ここでは上の例だとText() となっているところがAttribute() になっていますがこれは

  <a href="/xxxxxxxx" class="room-url">.........<a>

というhtmlからhrefの値を取得しているためです。画像のファイル名を知りたいときもこの方法です。

それからこういう一覧表みたいなのにアクセスする場合はまず表の大きさ(配信者数)を知っておいた方が楽です。これにはCount()を使います。例えば

  NoOfRoom, _ := page.AllByClass("js-follow-li").Count
()

というようにします。

リンクをクリックする

これは上と同じように場所を特定できればClick()を使うだけです。

  page.FindByClass("starButton").Click
()

これはShowroom Toolbox の“一気投げ”のボタンを押しているところです。なおjavascript:void(0) が使われているところは当然のことながらクリックしてもムダですので念のため(これって何か対応方法あるんでしょうか?)



文字列を入力する

これはFill()を使うのですが、大問題があってGoogle Chrome Ver.65ではFill()が正常に機能しないようです。Ver.64では問題なく使えており、今はVer.64のChromeをインストールして使っています。(chromedriverを最新版(現時点でVer.2.40)にすることでChromeの最新バージョン(現時点で Ver.67)でもFill()が正しく機能するようになりました)

例1 Showroomのコメント欄の入力

 page.Find("#js-chat-input-comment").Fill(message)
 time.Sleep(1 * time.Second)  // ウェイトは必要ないかも
 page.Find("#js-chat-input-comment").Submit()

例2  SHOWROOMコメント&ギフトビューアのURL欄の入力

 page.Find("#room_url").Fill(os.Args[2])
 time.Sleep(2 * time.Second)  // ウェイトは必要ないかも
 page.Find("#connectButton").Click()

上の例2は例1でうまくいかなかったからClick()を使う方法にしたのだったと思います。
はっきりしなくてすみません。

----------

今のところ、ここに書いた範囲の知識でどうにかなっています (^^;;


続きを読む "超初心者のGo言語/agouti - ブラウザ操作の基本の基本" »

2018年1月13日 (土)

超初心者のGo言語 - 複数の戻り値をもつ関数

見よう見まねでagoutiを使ってブラウザの自動操作ツール(Showroomの星集め)を作っていたらヘンなコンパイルエラーが出ます。

MyPoint := page.Find("#room-gift-item-list > li:nth-child(12) > div").Text()

というソースに対し

multiple-value page.selectable.Find("#room-gift-item-list > li:nth-child(12) > div").Text() in single-value context

と怒られました。単一の値が現れるべきところに複数の値Text()が現れている、ということのようです。

ここではじめてGo言語っていうのは関数が複数の値を戻すことができるということを知るのですが、どうやったら関数の戻り値を取得できるのかなかなかわかりませんでした(まあ、単に調べ方が悪かっただけでしょうか)

この複数の値を戻すというのはかなり違和感があるのですが、よくよく考えてみると引数を使って値を戻すのよりわかりやすくトラブルが起きなさそうですから合理的なのでしょう。

関数の側を含めてこんな感じで使うものらしいです。

package main

func sub(f1, f2 int) (int, int, int, int) {
	return f1 + f2, f1 - f2, f1 * f2, f1 / f2
}
func main() {
	a, b, c, d := sub(10, 3)
	println(a, b, c, d)

	a = sub(10, 3)
	println(a)

	_, a, _, _ = sub(10, 3)
	println(a)

	_, _, a, _ = sub(10, 3)
	println(a)

	_, _, _, a = sub(10, 3)
	println(a)

}

13 7 30 3
13
7
30
3

funcを定義するときは戻り値の型を定義するところで複数の戻り値それぞれの型をカンマで区切り括弧でくくる。戻り値を受けるときは戻り値の分だけ変数をカンマで区切って並べるということになります。戻り値の一部を使わないときは変数の代わりにアンダースコアを置きます(ダミーの変数を置くと使われていない変数があるというエラーが出てコンパイルが通らなくなります)

続きを読む "超初心者のGo言語 - 複数の戻り値をもつ関数" »

2018年1月 9日 (火)

超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)

Showroomの星集めツールを作ろうとGo言語/agoutiを扱いはじめて2週間ほど経ちました。経験のある方には信じられないようなところでつまずきまくっています。いろんなサイトの記事も参考にさせていただいているのですが、レベルが高すぎて読むのに苦労したりしています。

私ももう一ヶ月も経つと超初心者から次第に初心者になりさらに一年も経つと経験者となって今の苦労はきれいに忘れてしまいそうです。そこで今のうちにつまずいたあれこれを記事にしてこれからGo言語を始める方の参考にしていただこうと思い立ちました。

最初はもっともGo言語らしいと思われるGoroutine(並列処理)の話です。以下もっとも簡単なGoroutineの例ですが、これでも非同期で並列に処理が進んでいることがわかります。次にどうやって動作を同期させるのかというようなことでチャンネルの話なんかが出てきます。

続きを読む "超初心者のGo言語 - もっとも簡単なGoroutine(並列処理)" »

フォト

サイト内検索

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

新着記事

リンク元別アクセス数

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

人気記事ランキング

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