Help us understand the problem. What is going on with this article?

Google Apps ScriptでスクレイピングしてSlackに定期ポストするbotを瞬殺で作った

More than 3 years have passed since last update.

お金とかソース管理とか何も考えなくていいスクレイピングbotを作りたい

「SlackにStackShare.ioからトレンドランキング拾って投稿するbot作って」「ほいきた」
Slackのbotってhubotとかいう奴の事でしょ?皆作ってるし余裕だろ、と何も考えずに引き受けたら何やらサーバが必要だわyo hubotしたらファイルが2000個自動生成されるわ、で速攻ぶん投げたくなりました。目的が単純ならその実装も運用も管理も可能な限りシンプルにしたいものです。探してみたところ、Google Apps Scriptが一番手軽そうだったので早速やってみました。

Google Apps Script

PaaSやIaaS系のサービスとかでは全然無いです。ざっくり言えばGoogleドライブにスクリプトをアップしておくだけ。
image新規⇢アプリを追加⇢Apps Scriptを検索、追加しておきます。

プログラミング

  • 新規⇢その他⇢Google Apps Script でGASのプロジェクトが作られます。
  • GASプロジェクト画面のメニューのリソース⇢ライブラリで以下のキーを入力して追加します。
ライブラリ key 出典
SlackApp M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO Slack BotをGASでいい感じで書くためのライブラリを作った
Parser M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV Easy data scraping with Google Apps Script in 5 minutes
  • コーディングします。以下が全文。ちなみにHTMLパーサなるリッチな物はありません。探してみると正規表現で実装している例が殆どでしたが、Parserライブラリを使って極力手抜きを目論見ます。
function postMessage() {
  var prop = PropertiesService.getScriptProperties().getProperties();

  var html = UrlFetchApp.fetch('http://stackshare.io/trending/tools').getContentText();
  var doc = Parser.data(html)
                    .from("<div class='trending-load-more div-center' style='margin-top: 0;'>")
                    .to("<div class='div-center'>")
                    .build()

  var as = Parser.data(doc)
                    .from("<a href='")
                    .to("' style='cursor:pointer'>")
                    .iterate()
  var names = Parser.data(doc)
                    .from("<span id='service-name-trending'>")
                    .to("</span>")
                    .iterate()
  var descs = Parser.data(doc)
                    .from("<div class='trending-description'>")
                    .to("</div>")
                    .iterate()

  var slackApp = SlackApp.create(prop.token);

  for(i=0;i<as.length;++i){
    slackApp.postMessage("チャンネルのID", "[" + (i+1) + "] http://stackshare.io" + as[i] + " : " + names[i] + " : " + descs[i].replace(/¥n/ig,""), {username : "stackshare.io"});
  }
}

from().to()はfromとtoに挟まれた部分を抜き出します。build()で文字列、iterate()で文字列の配列が得られます。楽ちん。prop.tokenやチャンネルIDといったSlack側の細かい部分は"Slack BotをGASでいい感じで書くためのライブラリを作った"にお任せします。

定期実行

ツールバーのimageをクリックしてタイマートリガーを仕込みます。これだけ。

結果

動作するとこんな感じになります。
image

fireowl11
ニュアンスはアグリーです
future
ITを武器とした課題解決型のコンサルティングサービスを提供します
http://future-architect.github.io/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away