RubyでProductHuntのランキングをSlackに流す

タイトル通りですが、SlackのSlashコマンドを使って写真のようなProductHuntのToday'sランキングを流してくれるBotを作成します。

f:id:mikamimikami60:20200125182440p:plain
Slack通知

使用技術

ProductHuntのランキングスクレイパーを作成する

まず、欲しい情報を扱うためのモデルクラスを作成します。 とりあえず、Productモデルを作成しましました。 ProductHuntからプロダクトの単位ごとにスクレイピングをし、作成したインスタンスに格納します。

詳しくは、以下のリポジトリを見てください。

github.com

def scrape(doc)
    name = doc.css('h3').text
    description = doc.css('p').text
    category = doc.css('span.font_9d927.grey_bbe43').text
    detail_url = 'https://www.producthunt.com' + doc.css('a.link_523b9').attribute('href').value
    product = Product.new(name, description,category, detail_url)
    product
  end

Slack Slash Commandの準備

api.slack.com

ここから、Slack Appを作成しIncoming Webhooksでwebhook urlとSlash Commandを作成します。

f:id:mikamimikami60:20200125183448p:plainf:id:mikamimikami60:20200125183452p:plain
Slack Incoming WebhooksとSlash Command

ローカルで開発する場合

Slash CommandはRequest Urlを指定しないといけませんが、localhost:3000などのように外部から見えないURLは選択することができません。よって、ローカルではSlash Commandを使って開発するためにngrokを使用します。ngrokを使用することでローカルで立てたサーバーを外部からアクセスできるようにします。

ngrok.com

f:id:mikamimikami60:20200125183759p:plain
Slash Command Edit

Slack通知

Slack通知には、Slack Notifierを使用しました。

github.com