Skip to content

Instantly share code, notes, and snippets.

@rummelonp
Created December 20, 2012 17:10
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rummelonp/4346814 to your computer and use it in GitHub Desktop.
Save rummelonp/4346814 to your computer and use it in GitHub Desktop.
Twitter Lists から YoruFukurou の抽出タブを同期するスクリプト書いた

Twitter Lists から YoruFukurou の抽出タブを同期するスクリプト書いた

なんでわざわざ抽出タブ作ってるか理由を説明するのは面倒くさいから省く
ただリストから抽出タブを作ってる人は他にもいるみたいでどうにか自動化出来ないかなと書いてみた

前提条件

  • Mac 使ってる
  • YoruFukurou 使ってる
  • Ruby が入ってる
  • Thor, Twitter, Plist gem が入ってる
  • plutil コマンドが使える

OS X Mountain Lion + App Store 版 YoruFukurou + Ruby 1.9.3 という組み合わせでしか試してない

ダウンロード

curl -O https://gist.github.com/raw/4346814/yoru_fukurou_list_sync.rb

使い方

使い方

ruby yorufukurou_list_sync.rb <screen_name>

YoruFukurou の <screen_name> のアカウントのタブ設定がリストから最新の状態が反映される

ヘルプ表示

ruby yorufukurou_list_sync.rb --help
Usage:
  yorufukurou_list_sync.rb screen_name

Options:
  -t, [--twitter-config-path=TWITTER_CONFIG_PATH]  # Twitter Configuration ".yml" File Path.
                                                   # Default: /Users/ktakeshima/.tw.yml
  -y, [--yf-config-path=YF_CONFIG_PATH]            # YoruFukurou Configuration ".plist" File Path.
                                                   # Default: /Users/ktakeshima/Library/Containers/com.YoruFukurouProject.YoruFukurou/Data/Library/Preferences/com.YoruFukurouProject.YoruFukurou.plist

Sync YoruFukurou Tab Configuration from Twitter Lists.

Twitter の設定

--twitter-config-path=<path> で指定出来る

自分は tw gem を自分のアプリケーションで使ってるのでその設定をそのまま流用している
そのためデフォルトは ~/.tw.yml になってる

---
consumer_key: <key>
consumer_secret: <secret>
users:
  <screen_name>:
    access_token: <token>
    access_secret: <secret>

設定はこんな感じで YAML 形式で書く必要がある

YoruFukurou の設定

yf-config-path=<path> で指定出来る

デフォルトは $HOME/Library/Containers/com.YoruFukurouProject.YoruFukurou/Data/Library/Preferences/com.YoruFukurouProject.YoruFukurou.plist
おそらくどの Mac もここに設定があると思うけど他の人の Mac を見たことがないので確証はない

技術的なこと

YoruFukurou の設定は .plist として保存されてるが中身がバイナリになってる
これを plutil コマンドで xml 形式に変換したのち plist gem で hash として読み込み書き換え再度 xml 形式で保存してる

因みに .plist の設定ファイルが xml 形式のままでも YoruFukurou は正常に読んでくれる

制限事項など

  • YoruFukurou 側で予め(設定内容は空で良いので)リスト名と同名かリスト名を含む名前の抽出タブを作っておく必要がある(大文字小文字の区別はしない)
    これはタブ表示設定のところにタブ設定の UUID が入ってるからだけど自分で入れる処理を書くのが面倒くさかったから

  • 別のリストの名前を含むリストがある場合(例えば list というリストと list2 というリストがある場合)は変な挙動をするはずなのでリスト名を変えるか適宜スクリプトを書き換えて欲しい

  • このスクリプトは元の設定ファイルをバックアップしてないので、心配な人は適宜スクリプトを書き換えるか事前にバックアップをしよう

  • スクリプトを動かす前に YoruFukurou を終了しておかないといけない

その他

このスクリプトに興味を示すような人は適当に書き換えて使うと思うのでひとまずはこんなやり方で出来るよと主張したかった

# -*- coding: utf-8 -*-
require 'thor/group'
require 'twitter'
require 'plist'
require 'yaml'
class YoruFukurouListSync < Thor::Group
TWITTER_CONFIG_PATH = File.expand_path('~/.tw.yml')
YF_IDENTIFIER = 'com.YoruFukurouProject.YoruFukurou'
YF_CONFIG_PATH = File.expand_path("~/Library/Containers/#{YF_IDENTIFIER}/Data/Library/Preferences/#{YF_IDENTIFIER}.plist")
desc 'Sync YoruFukurou Tab Configuration from Twitter Lists.'
def self.banner
"#{basename} screen_name"
end
class_option :twitter_config_path, :aliases => '-t', :type => :string, :default => TWITTER_CONFIG_PATH,
:desc => 'Twitter Configuration ".yml" File Path.'
class_option :yf_config_path, :aliases => '-y', :type => :string, :default => YF_CONFIG_PATH,
:desc => 'YoruFukurou Configuration ".plist" File Path.'
argument :screen_name
def setup
@twitter_config = YAML.load_file(options.twitter_config_path)
Twitter.configure do |config|
config.consumer_key = @twitter_config['consumer_key']
config.consumer_secret = @twitter_config['consumer_secret']
config.oauth_token = @twitter_config['users'][screen_name]['access_token']
config.oauth_token_secret = @twitter_config['users'][screen_name]['access_secret']
end
system "plutil -convert xml1 #{options.yf_config_path}"
@yf_config = Plist.parse_xml(File.read(options.yf_config_path))
@client = Twitter.client
end
def check
filter_sets = @yf_config['FilterSets']
unless filter_sets
say 'Don\'t Have FilterSets.', :red
raise SystemExit
end
@filter_set = filter_sets[screen_name]
unless @filter_set
say 'Don\'t Have FilterSet.', :red
raise SystemExit
end
end
def sync
@client.lists.each do |list|
list_name = list.slug
filter = @filter_set.find { |f| f['TitleName'] =~ %r{#{list_name}}i }
if filter
say "Collect Users Names of @#{screen_name}/#{list_name}"
screen_names = collect_screen_name(list_name)
say "Rewrite #{filter['TitleName']} tab Configuration."
filter['UserIDs'] = screen_names.sort
current_keywords = filter['Keywords'] || []
screen_name_keywords = screen_names.map { |n| '@' + n }
filter['Keywords'] = (current_keywords + screen_name_keywords).sort.uniq
else
say "Can't Create Tab of @#{screen_name}/#{list_name}", :red
say "Please Create Tab \"#{list_name}\"", :red
end
end
end
def save
say "Save YoruFukurou Configuration to #{options.yf_config_path}"
File.open(options.yf_config_path, 'w') { |f| f.print @yf_config.to_plist }
end
private
def collect_screen_name(list_name)
screen_names = []
next_cursor = -1
while next_cursor != 0
result = @client.list_members(list_name, :cursor => next_cursor)
screen_names.concat(result.users.map(&:screen_name))
next_cursor = result.next_cursor
end
screen_names
end
end
YoruFukurouListSync.start(ARGV)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment