CHANGE エンジニア BLOG

株式会社チェンジ エンジニア ユニットによる情報発信BLOG

Hubotで爆速!Web情報共有

こんにちは、株式会社チェンジの中川です!

株式会社チェンジとは皆さんがより良く仕事を楽にするか!作業効率が高くなるかを推奨、提案している企業です!

そこで今回はチェンジが社内で利用しているチャットツール【direct】を使用して、情報の共有を楽にするためにWebサイトからスクレイピングをおこなった話をしたいと思います!

Webスクレイピングとは

Webスクレイピングとは、ざっくりいうとWebサイトから情報を抽出する技術のこと!

Webサイトにはメタ情報として、そのサイトのタイトルと説明文と、画像のURLが記載しております!

このようなものです!

f:id:Taku_Nakagawa:20170807100415p:plain

これらの情報を参照するソフトウェア技術のことをウェブスクレイピングといいます!

Webスクレイピングを利用してボットと連携

今回はこれを利用してチャット形式でコマンドを投げたらサイトの情報を取得して表示する!っていうものを作成しました!

作ったのはこれです!!

①コマンド【url】をつけてサイトのURLを投げたら、

f:id:Taku_Nakagawa:20170807100710p:plain

②URLからサイトのメタ情報を参照して、レスポンスとして返してくれる

f:id:Taku_Nakagawa:20170807101118p:plain

これにより、 urlだけを貼り付けたら、他の人に知って貰いたいことをなんの言葉も発せずに勝手にdirectにwebサイトの情報を拾い上げてくれる!作業効率があがること間違いないです!

チャットツール【direct】の開発言語とツール

チャットツール【direct】の開発言語はCoffeeScript

このWebスクレイピングボットを作成するためのツールは【daab (direct agent assist bot)】を使用しました。

スクレイピング方法

ウェブスクレイピング方法はnode.jsのライブラリ である【cheerio-httpcli】を使用しました。

取得対象のメタ情報はサムネイル画像とタイトルと説明文

取得方法は
cheerio.fetch(pickupUrl[0], {}, (err, $, msg) ->
   thumbnailCheck = ->
     if $("meta[property='og:image']").attr("content")
       console.log($("meta[property='og:image']").attr("content"))
       return $("meta[property='og:image']").attr("content")
     else
       return

   titleCheck = ->
      if $("meta[property='og:title']").attr("content")
        return $("meta[property='og:title']").attr("content")
      else if $("title")
        return $("title").text()
      else
        return "題名"

  descriptionCheck = ->
     if $("meta[name=description]").attr("content")
       return $("meta[name=description]").attr("content")
     else
       return

サイトごとでogタグにタイトルの記載や画像の記載がないものもあるので、そこは条件分岐にしました。

スクレイピングするならJS

今回、サイトからWebスクレイピングするために必要だったコードは一行のみ!
それはNode.jsのライブラリとして用意されていることはもちろんですが、JSの強みでの一つでDOM解析が優れている点があるかと思います!

社内の反応

社内ではいくつかのボットが使用されているのですが、一番評判いいような気がします!
やはりURLだけコピペするだけで、対象となるサイトの画像とタイトル、説明文を爆速に共有することはインパクトがあるような気がします!

苦労したところ

サイトから画像を取得→ダウンロード→保存→ボットに画像を吐かせる
という一連の流れのところで苦労しました。
どうしても画像を保存する前に画像を読み込んでしまったり、と結構色々な方法を試してみたような気がします!