LoginSignup
8
1

More than 3 years have passed since last update.

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

Posted at

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

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

qiita0.png

▼ Product Hunt参戦中なので投票してくれると嬉しいです!!
Highprofile alert - Notify you when people you want to meet come to your city | Product Hunt Embed

問題

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

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

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

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

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

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

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

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

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

解決策

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

qiita1.png

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

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

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

Highprofile Alertの開発に使った技術

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

作り方

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

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

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

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_keyconsumer_secretはアプリで予め設定しておく必要があり、access_tokenaccess_toke_secretは認証時にユーザーから取得しなければならないです。

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

Wheneverを使ってみる

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

Gemfile
gem 'whenever', require: false

bundle installします。

$ bundle exec wheneverize .

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

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分おきならエラーが出ないと確信できました。

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スクリプトを用意しておきます。

$ 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レースに参加しているので、この記事を読んで応援したいと思ってくれた方は、ぜひぜひ下記のリンクから応援投票のほどお待ちしております!

Highprofile alert - Notify you when people you want to meet come to your city | Product Hunt Embed

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1