【個人開発】Twitterで「会いたい人に会える」確率が上がるアプリ作った（rails）


「あ、同じイベント行ってたのか。声かければよかった！」

Twitterでフォローしてる人が「〇〇なう」のような投稿をしてるのを後から知って、せっかく来ているなら声かければ良かった的な体験ってありませんか。ニッチだとは思いますが（笑）これは、そんな自分ではやりたくないけど、誰かが作ってくれたら使う！という通知アプリを作ってローンチしましたので、それに至るまでのお話をしていきたいと思います。

![qiita0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116375/bf7621b1-58ef-fe96-9685-52782048388a.png)

▼ Product Hunt参戦中なので投票してくれると嬉しいです！！
<a href="https://www.producthunt.com/posts/highprofile-alert?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-highprofile-alert" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=170643&theme=light" alt="Highprofile alert - Notify you when people you want to meet come to your city | Product Hunt Embed" style="width: 250px; height: 54px;" width="250px" height="54px" /></a>

## 問題

今はアメリカに住んでいるけど、1年前までは東京で普通に過ごしていました。その頃からサンフランシスコに行きたい、現地の人たちと絡みたいと願っていたため、積極的にそういう人たちをフォローしたり、Slackコミュニティに参加するようにしていました。

フォローしてるだけでなく、彼らの意見に対して何かアイデアを出せそうな場合にはリプライを飛ばしたりと、とにかく東京に居ながらもできる形でネットワーキングに励んでいました。それでも、オンラインでの活動に限界もあり、やっぱり、アメリカに行きたいなと想いを募らせながら過ごしている時にあるツイートが目に止まりました。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Hi I&#39;m Shun. And we built an app let twitter users introduce their followers before. That was listed on Twitter Trend😎✨ Looking for seeing ya tmr!</p>&mdash; Shun Yamada 👺 (@shyamady) <a href="https://twitter.com/shyamady/status/1062945632426483712?ref_src=twsrc%5Etfw">November 15, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まじか！Kavon（Periscope創業者）が東京にくるのか！！めっちゃ会ってみたい！

東京、とりわけ日本を好んでいる人たちは多くて、実際にフォローしている多くの人たちが定期的に旅行できていることが分かりました。Kavon以外にも、Twitterや、Bufferの創業者が訪れてきたり、一昨年の末にはY Combinatorのチームが滞在していて、Twitter経由でリプを飛ばすと会ってもらい、未だにサンフランシスコでもたまにコーヒーブレイクをする仲にまで発展した友だちもいるほどです。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/ramonrecuero?ref_src=twsrc%5Etfw">@ramonrecuero</a> I heard you coming to Tokyo this end of the month! Can you join 21th or 28th Bitcoin meetup in Japan? We can introduce to you some Blockchain guys there :)</p>&mdash; Shun Yamada 👺 (@shyamady) <a href="https://twitter.com/shyamady/status/942742787295809536?ref_src=twsrc%5Etfw">December 18, 2017</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Twitterで本当にすごい！チャンスで溢れている！むしろ、サンフランシスコにいると、自分みたいなアグレッシブな輩が沢山居て埋もれてしまうけど、東京だとそんなリプライ飛ばしてるの自分だけしかないから、逆に目立って会える確率が現地より高い気がする。

この「東京行く」ツイートに対するリプ飛ばしで何人ものスタートアップ関係者と出会うことができたのですが、問題がありました。それは、「東京行く」ツイートを見過ごしてしまう場合が多いことです。

Twitterに一日中張り付いているわけにもいかないし、何百人何千人とフォローしていればそんなツイート見逃してしまうのはしょうがないことです。

まず、最初に思いついたのはZapierや、IFTTTです。いかにも彼らが用意してそうなレシピだったので、Twitterトリガーのものをくまなく探してみました。しかし、全Twitterタイムラインからキーワード検索はできても、個人タイムラインに限定して行なうことはできませんでした。正直、スタートアップにも関係ない、旅行者の「東京行く」ツイートなんて全く興味ない。てか、そんなツイート一日に相当数ありそうで通知数が半端なさそう。

それから、My Tweet Alertやら、その他Twitter連携系のサービスを探してみたのですが、自分がやりたいことをシンプルに実現してくれそうなサービスはありませんでした。

## 解決策

で、あれば自分で作れば良い！こういう時には、本当にエンジニアで良かったと思う！（笑）作ったサービスの名前は「[Highprofile Alert](https://highprofilealert.com)」。Twitterで会員登録を行ない、あなたが住んでいる街や、区画の名前（Tokyo、Japan、Shibuyaなど）を入力するだけ。これだけで、あなたのタイムライン、すなわちフォローしてる人がこれらのキーワードを含むツイートをすれば設定済みのメールアドレス宛てにメールが届く仕組みです。めっちゃ簡単。

![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116375/8e2e82e9-783b-515e-9c09-397b6ff37488.png)


冒頭で説明したみたいに、イベントなんかでも使えるんじゃないかなと思っています。何百人何千人と集まるような普通に行っても会えるようなイベントじゃない場合は特に。イベント中はTwitterをじっくり見てる暇はなさそうだし、そんな時に通知が飛んできてくれたら便利だとは思いませんか。

仕組みとしては、TwitterのAPIを使って、定期的に個人タイムラインを取得してキーワードの検索をかけているだけです。もし、こんなキーワード入れるのもありかも的なアイデアがあれば教えていただきたいです！

ちなみに、一キーワードかつ、一日一回のアラートを受けるのは無料ですが、それ以上に利用する場合は要課金となります。チャンスをあげるために、ぜひ有料プランへの更新もおすすめします！（笑）

## Highprofile Alertの開発に使った技術

* Ruby on Rails
* Heroku
* AWS S3
* AWS SES
* CloudFlare

## 作り方

### タイムラインを収集して、キーワード検索する

まずは、生のRubyで定期的にTwitterを収集してくれるスクリプトを書いて実験してみました。

REST APIを使って、制限にかかる限界のリアルタイム性と、取得数で実装していきます。

```ruby:search.rb
require 'twitter'

# Setup client
@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "XXXXXXXXXX"
  config.consumer_secret     = "XXXXXXXXXX"
  config.access_token        = "XXXXXXXXXX"
  config.access_token_secret = "XXXXXXXXXX"
end

# Setup keywords
keywords = ["Test"]

max_id = @client.home_timeline.first.id

loop do
  @client.home_timeline(max_id: max_id,count: 100).each do |subject|
    if subject.is_a?(Twitter::Tweet)
      keywords.each do |object|
        if subject.text.include? object
          printf "%s / %s\n  %s\n\n",
          subject.user.screen_name,
          subject.user.name,
          subject.text.gsub("\n", "\n  ")
        end
      end
    end
  end
  sleep 60
end
```

これで実行すると、Testが含まれるツイートが直近タイムラインの100にある場合はツイートが表示されるようになる。Clientは、`consumer_key`、`consumer_secret`はアプリで予め設定しておく必要があり、`access_token`と`access_toke_secret`は認証時にユーザーから取得しなければならないです。

テストスクリプトなので、loop構文を使って1分おきに実行しているのですが、アプリではcronを使って実行します。

## Wheneverを使ってみる

Railsでcronを実行する場合には `whenever` を使うのが一般的らしいです。

```ruby:Gemfile
gem 'whenever', require: false
```

`bundle install`します。

```Terminal
$ bundle exec wheneverize .
```
上記のコマンドを実行すると、config配下に`schedule.rb`のファイルが生成されます。

```ruby:schedule.rb
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :environment, Rails.env.to_sym
set :output, "#{Rails.root.to_s}/log/cron.log"

every 3.minutes do
  begin
    rake "search:twitter"
  rescue => e
    raise e
  end
end
```

3分おきに、`search:twitter`を実行しなさいという命令を書きます。実際に、1分、2分おきも試してみたんですけど、Twitter APIの制限なのか、途中でエラーが起きてしまいました。実験の末、3分おきならエラーが出ないと確信できました。

```ruby:lib/tasks/search.rake
namespace :search do
  task :twitter => :environment do
    search_twitter = SearchTwitter.new
    search_twitter.search
  end
end
```

lib/tasks配下に、実行するスクリプトを書きます。更に、その下で読んでいる`search_twitter.rb`は、先ほど書いたTwitterスクリプトを用意しておきます。

```Terminal
$ bundle exec whenever --update-crontab
$ bundle exec whenever --clear-crontab
```

上記のコマンドで、前のを実行するとcronがデータに反映され、後のを実行すればそれを止めることができます。

## Heroku Schedulerで設定する

結局、`whenever`はHerokuには対応していなかったんですね。
その代わり、Heokuには、`Heroku Scheduler`というrakeコマンドを入れておけば実行してくれる、簡単設定できるプラグインがあるので、これで解決です。

## さいごに

TwitterのAPIは変更点が多いので、前触れもなく変わるはないにしても、常に情報をキャッチアップしながら開発を進めていかなければなと思います。本当は、Streaming APIとか使えばもっと負担をかけずに実現できることもあるんだろうですが、残念ながら2018年の8月に廃止となってしまったそうです。

ともかくも、本日（10/10）もお決まりにてProduct Huntレースに参加しているので、この記事を読んで応援したいと思ってくれた方は、ぜひぜひ下記のリンクから応援投票のほどお待ちしております！

<a href="https://www.producthunt.com/posts/highprofile-alert?utm_source=badge-featured&utm_medium=badge&utm_souce=badge-highprofile-alert" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=170643&theme=light" alt="Highprofile alert - Notify you when people you want to meet come to your city | Product Hunt Embed" style="width: 250px; height: 54px;" width="250px" height="54px" /></a>