見出し画像

初心者がseleniumを使ってInstagramをエゴサするBotを作るお話(cloud9編)

・はじめに

前回までの作業で実行部分は完成しましたので、AWS Lambdaにデプロイして定期実行するまでの作業をcloud9で行いました。cloud9を選んだ理由はruby on rails tutorialを通して使用したことがあるため、Lambdaと相性良さそうなため、手元にwindowsマシンしかないためです。

・作業内容

初めにrbenvをインストールしてruby2.5.0をインストールします。こちらを参考にそのまま行いました。githubのread meに当然方法は書いてありますが英語なのでしんどい。

その後bundlerをインストールしてgemを揃えます。

gem install bundler
bundle init

でGemfileが生成されるので、Gemfileを以下のようにしてbundle install

source "https://rubygems.org"

gem 'google-api-client'
gem 'selenium-webdriver'
gem 'nokogiri' ,"1.10.1"
gem 'websocket-driver' , "0.7.0"
gem 'nio4r' , "2.3.1"
gem 'gem-wrappers' , "1.4.0"

nokogiriに関してはバージョンを指定しなかったときエラーが出たのでメッセージ通りに1.10.1を、websockt-driver以下3つに関してもエラーが出たのでメッセージ通りにバージョンを指定したらいい感じに動くようになりました。

よくわからなくても物ができるって最高ですね。わかるようになりてえ……

Lambdaにデプロイする際はgemも含めてzipにする必要があります。

bundle install --deployment

を実行するとvendor/bundleにgemを保存してくれます。

次に、以下の記事を参考にしつつserverless-chromeとchromedriverを/binに準備します。

最新版はPythonで動かない(2018年4月27日現在 [参照])ため、v1.0.0-37を入れます。

とあります。rubyだし最新版で大丈夫かな?と思い最新版のv1.0.0-55とchromedriver2.44を準備したところ、Lamdbaデプロイ後にしっかりエラーが出たので、記事の通りのバージョンにしておくといいと思います。最終的にディレクトリは以下のような構造になりました。

.
├── bin
│   ├── chrome_debug.log
│   ├── chromedriver
│   ├── headless-chromium
│   └── locales
├── Gemfile
├── Gemfile.lock
├── Google_spreadsheet.rb
├── Instabot.rb
├── selenium.rb
└── vendor
    └── bundle

seleniumクラスのinitializeメソッド内を以下のようにしてheadless-chromiumとchromedriverのPATHを指定します、ついでにオプションも記事のとおりにします。

Selenium::WebDriver::Chrome.driver_path="./bin/chromedriver"
options = Selenium::WebDriver::Chrome::Options.new(binary:"./bin/headless-chromium")
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1280x1696")
options.add_argument("--disable-application-cache")
options.add_argument("--disable-infobars")
options.add_argument("--no-sandbox")
options.add_argument("--hide-scrollbars")
options.add_argument("--enable-logging")
options.add_argument("--log-level=0")
options.add_argument("--single-process")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--homedir=/tmp")

ここまでの作業で、無事に実行できると思います。たぶん……

・感想

rubyやgemなどのバージョンの違いが以下に問題になるか身に沁みてわかりました……ローカルにrubyの環境を導入するときにはrbenv?bundler?それは必要になるんだろうか……?なんて思っていたのですが、普通に必要になり嬉しいやら悲しいやらといった気持ちです。

次回でLambdaにデプロイしておしまいです。

この記事が気に入ったらサポートをしてみませんか?