猫の手も借したい

暇を極めた時に更新します

「あいつまだ寝てるのか...」ができるプログラムを作ってる話

ラズパイの環境構築がいい感じにできてきて、日常も暇ができてきたので前々から構想していたプログラムを形にし始めています。

具体的にどういうのなの

  • ユーザーIDを指定して問い合わせると指定ユーザーの最終Tweetを取得。
  • 最終Tweetの時間も取得。
  • それを問い合わせ元ユーザーへ返信で返す。

というTwitterBotを製作中。要は「あいつ最後に呟いてからもうn分経ってんじゃん、寝てんな」ができるということ。
普段から必要としてる相手が暇なのかを確認するのにいちいちユーザーページまで見に行くことが多かったので、結構需要がある機能だと思ってる。無くてもいいんです、私が使うから。

進捗


*1


現在実装済みの機能

  • 指定したユーザーの最終Tweetを取得
  • 取得した瞬間のタイムスタンプを付加(連投規制回避のためのUUID)
  • サーバー側へのログの保存
  • ピリオドによる連投回避で問い合わせが可能。ピリオドは全て消去して処理される。

今後実装が必要な機能

  • 取得したTweetの投稿された時間と現在時間との相対時間。要はn分前か。
  • 鍵垢、存在しないIDを弾く。エラメ返信。(現時点では鍵垢、存在しないアカウントを指定されると無条件で落ちる。)
  • 最終Tweetがこのbotへの問い合わせだった場合の処理をどうするか。(現時点では最終Tweetがこのbotへの問い合わせだった場合返信後無条件で落ちる。)
  • 最終Tweetが誰かへのリプライだった場合の処理をどうするか。(現時点では最終Tweetにリプライが含まれるとそのまま引用してしまうためその相手にも返信が行ってしまう。迷惑。)

その他思いついたものを実装予定。


元々はメインのアカウントで動かす予定だったが、このbotがフォローしている相手なら取得できてしまうという仕様上、鍵垢晒しが可能になってしまうため専用のアカウントを用意した。このアカウントでは鍵垢をフォローしない事によりプライバシーを守ることができる。つよい。



一応現時点でのコード状態。整理もしてないし、中途半端に実装して悩んでる途中のコメントアウトも外していないのでメモ程度に。

# coding: utf-8


require "./consumer"
require "twitter"

rest_client = Twitter::REST::Client.new do |config|
	config.consumer_key        = CONSUMER_KEY
	config.consumer_secret     = CONSUMER_SECRET
	config.access_token        = ACCESS_TOKEN
	config.access_token_secret = ACCESS_SECRET
end

stream_client = Twitter::Streaming::Client.new do |config|
	config.consumer_key        = CONSUMER_KEY
	config.consumer_secret     = CONSUMER_SECRET
	config.access_token        = ACCESS_TOKEN
	config.access_token_secret = ACCESS_SECRET
end

stream_client.user do |status|
	if status.is_a?(Twitter::Tweet)
		if status.text.match("@got_up_bot last_post")
			user = status.text.gsub(/(@got_up_bot|last_post|\s|\.)/, "")
			time = Time.now
			puts "(@#{status.user.screen_name}) take #{user}'s Post."
				rest_client.user_timeline(user, { count: 1 } ).each do |timeline|
					tweet = rest_client.status(timeline.id)
					#if user.protected != true { ... }
					#	rest_client.update("@#{status.user.screen_name} IDが存在しないか鍵垢のユーザーです。鍵垢はプライバシー保護のためPostを取得しません。 #{time}")
					#else
						#post_time = tweet.created_at
						post = tweet.text
						rest_client.update("@#{status.user.screen_name} #{user}'s last post is 「#{post}#{time}")
					#end
				end
		end
	end
end


さて、起動したまま寝るけど起きた時まで動いてるか。多分ハゲが見つけておもちゃにして速攻落とされる。

*1:このbotに「@got_up_bot last_post ユーザーID」とリプライで動作。現在かなり不安定で基本例外処理もレスキューもしてないのでイレギュラーがあるとそのままクラッシュします。あしからず。