ひらやすみ

意識の高いブログ

食べたいものをツイートするとおすすめの店を紹介してくれる何か

ブログ力爆age Advent Calendar 2017 21日目の記事です。
adventar.org

アドベントカレンダーも終盤という所まで来ました。
僕自身も3回目の記事担当になりますが、皆さん2回3回と複数回担当されており、絶対繋いでやるという固い意志を感じますね。
前日の記事(2017年YouTubeで何度も繰り返し見た・おすすめしたい動画5本 - ytm_n’s diary)も読み、挙がってた動画を見てみましたが楽しめました。正直HIKAKINさんは結構好きです。


本題

さて、今回何を作ったかというと、タイトルの通りです。
「◯◯食べたい」というような日常の何気ない欲求がツイートされた時に、脈絡なくおすすめのお店をリプライで送りつけるというものです。
TLをリアルタイムで監視して、自分のアカウントから「○○食べたい」というツイートがされると、○○の部分をキーワードとしておすすめのお店を検索します。
その後、検索結果のおすすめ順で10位までのお店の中からランダムに選び、自分に向けてリプライで教えてくれます。


こんな感じです。


あとはhrys__さんあてにリプライを送った時のみ他のユーザーにも情報を返すようにもしてます。


変なことを言うと検索にヒットしなかった旨が返信されます。




ここには載せてませんが、地味に「◯◯飲みたい」というツイートにも反応するのでお酒が飲みたいときにも情報をくれます。
お酒食べたいとかカレー飲みたいとツイートしても反応します。


中身

twittterのAPIぐるなびAPIを叩いてます。
↓これ
ぐるなび Web Service - トップページ

エリアはとりあえず八王子で固定。位置情報をツイートからとって周辺の店を検索みたいなこともできますが、それだけのためにツイートに位置情報を付与するのもアホらしいのでやめました。

汚いですがコード載せておきます。
大したことしてないので特に解説することもないですね。

require 'json'
require 'twitter'
require 'open-uri'

CONSUMER = "YOUR_CONSUMER_KEY"
CONSUMER_SECRET = "YOUR_CONSUMER_SECRET"
TOKEN = "YOUR_ACCESS_TOKEN"
TOKEN_SECRET = "YOUR_ACCESS_TOKEN_SECRET"

rest = Twitter::REST::Client.new do |config|
  config.consumer_key        = CONSUMER
  config.consumer_secret     = CONSUMER_SECRET
  config.access_token        = TOKEN
  config.access_token_secret = TOKEN_SECRET
end

stream = Twitter::Streaming::Client.new do |config|
  config.consumer_key        = CONSUMER
  config.consumer_secret     = CONSUMER_SECRET
  config.access_token        = TOKEN
  config.access_token_secret = TOKEN_SECRET
end

my_name = rest.user.screen_name
stream.user do |object|
  regex = /食べたい$|飲みたい$/
  if (object.is_a?(Twitter::Tweet) && object.text.match(regex)) \
    && (object.user.screen_name == my_name || object.in_reply_to_screen_name == my_name)
    id = object.id
    to_name = object.user.screen_name
    food = object.text.gsub(regex, "")
    food = food.gsub(/@.+\s/, "") if object.in_reply_to_screen_name == my_name
    url = "https://api.gnavi.co.jp/RestSearchAPI/20150630/?keyid=<keyid>&format=json&areacode_s=AREAS2288&freeword=#{food}&hit_per_page=1"
    hash =  JSON.parse(open(URI.escape url).read)
    if hash['error']
      rest.update("@#{to_name} \"#{food}\"に関するお店が見つかりません", in_reply_to_status_id: id)
    else
      name =  hash['rest']['name']
      link = hash['rest']['url']
      rest.update("@#{to_name} このお店がおすすめです\n#{name}\n#{link}", in_reply_to_status_id: id)
    end
  end
end


諸々のgemをインストールしたり、自分でkey登録して該当箇所を書き換えればすぐ動くと思います。
試したい方はどうぞ。

最後に

なんでこんなものを作ったのかというと、お腹が減ってるときに思いついた以上の理由はありません。
グルメ検索ってだけならもっと便利な実装ができると思いますが、何気ない「~食べたい」というツイートにスッと店のURL飛んできたら面白いんじゃねという一発ネタなので細かいことは気にしないでください。


明日の担当はあのkrkrkgrさんです。