Skip to content

Instantly share code, notes, and snippets.

@pn11
Last active November 17, 2022 03:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pn11/f5ae3627fd024aed083182411f4c08d7 to your computer and use it in GitHub Desktop.
Save pn11/f5ae3627fd024aed083182411f4c08d7 to your computer and use it in GitHub Desktop.
Ruby で Twitter API をいじる

5年ぶりくらいに Twitter API で遊んでみる。B4のときに遊んでた思い出。リアルタイムで Twitter 見てしまう依存症を治すためにログに保存しといてオフラインで見よう。 (ついでにリンクなども保存したい)

アクセストークンを取得

ググればやり方が出てくる。

Gem install

gem install twitter

List member を保存

fav という list に入っているアカウントの ID などをファイルに保存しておく。

#!/usr/bin/ruby
# coding: utf-8

require 'twitter'

client = Twitter::REST::Client.new do |config|
  config.consumer_key = "hoge"
  config.consumer_secret = "hoge"
  config.access_token = "hoge"
  config.access_token_secret = "hoge"
end

## fav という名前の list のメンバーをファイルに保存
client.owned_lists.each do |list|
	if list.name == "fav"
		members = client.list_members(list.id, count: 1000)
		fout = File.open("member.list.txt", "w")
		members.each do |user|
			fout.puts "#{user.id} #{user.screen_name} #{user.name}"
		end
		fout.close
	end
end

Time line を取得

を参考にさせて頂く。

Time line から Tweet を取得してきて、上で作ったリストに入っているかどうか判定して、tweets/fav160616.md, tweets/other160616.md に保存していく。MacDown で読めるような Markdown にしてる。保存順は古い順。

#!/usr/bin/ruby
# coding: utf-8

require 'twitter'
client = Twitter::REST::Client.new do |config|
  config.consumer_key = "hoge"
  config.consumer_secret = "hoge"
  config.access_token = "hoge"
  config.access_token_secret = "hoge"
end

member = Hash.new  ## member かどうか判定するための hash
File.open("member.list.txt").each_line do |line|
	id = line.split[0].to_i
	member[id] = true
end


last_tweet_id = 0
flastname = "last_tweet_id.txt"
if File.exists?(flastname)
	File.open(flastname).each_line do |line|
		last_tweet_id = line.to_i
	end
end


tweet_new = [] ## array of Twitter::Tweet class. new tweets will be saved

itweet = 0
count = 200 ## 200
max_id = client.home_timeline.first.id
client.home_timeline(maxid: max_id, count: count).each do |tweet|
	tweet_id = tweet.id.to_i
	if tweet_id <= last_tweet_id
		break
	end
	tweet_new[itweet] = tweet
	itweet += 1
end

ntweet = itweet

datadir = "./tweets"

for itweet in 0..ntweet-1
	tweet = tweet_new[ntweet-1 - itweet] ## start from oldest
	time = tweet.created_at.getlocal 
	date = time.strftime("%y%m%d")
	userurl = "https://twitter.com/#{tweet.user.screen_name}"
	tweeturl = "https://twitter.com/#{tweet.user.id}/status/#{tweet.id}"
	filename = ""
	if member[tweet.user.id.to_i] == true
		filename = "#{datadir}/fav#{date}.md"
	else
		filename = "#{datadir}/other#{date}.md"
	end
	fout = File.open(filename, "a")
	fout.puts "--"
	fout.puts ""
	fout.puts "![](#{tweet.user.profile_image_url})  #{tweet.user.name} [@#{tweet.user.screen_name}](#{userurl})  "
	fout.puts "#{tweet.full_text}  "
	fout.puts "at [#{time}](#{tweeturl})  "
	fout.puts ""
	tweet.urls.each do |url|
		fout.puts "- [#{url.display_url}](#{url.expanded_url})"
	end
	fout.puts ""
	fout.close
end

## save newest tweet id
flast = open(flastname, "w")
flast.puts max_id
flast.close
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment