2009-08-23 [長年日記]
_ [ruby] TwitMusic でみんながどんな曲を聴いてるのか集計するコードを書いてみた
先日みつけた楽しいiPhoneアプリ"TwitMusic"。
iPhoneで再生してる曲のタイトルなどをtwitterに投稿するだけなんだけど、
みんながどんな曲を聴いてるのか、
みんながどんな曲をオススメしたいのかが分かっておもしろい。
集計したらおもしろいなと思ってtwitter api を使った集計コードを書いてみました。(説明は後半で)
考えてみれば、ウォークマンが発売されてから30年、
みんながどんな曲を聴いているのかここまで大規模に大人数に調査したデータはないのでは。
それが手軽にできるようになったわけで、すごいことだなぁと。
マーケティングをしたい人はユーザーが面白いと感じる利点をつけて
iPhoneなど音楽再生デバイス用のアプリをつくり、
(TwitMusicは曲を通じて他の人と会話するという楽しさを提供している)
それを集計するコードを書いて情報収集ができる。
もしくは、集計表示してアフィリエイトを載せるサイトをつくれば、
iPhone - twitter - web と連携したサービスを提供できるかもしれません。
(私は今のとこやるつもりはないのでやりたい人いたらどぞ。(^^ゞ)
データを集計してみてわかったのは、同じ曲をオススメする人が全然いない!
みなさんこだわりがあるんだなぁと妙に納得。
アーティストでまとめれば人気の人がいそうですね。
オリコンとは一味違うデータが見れて楽しかったです。(^^)
(収集したデータは後ろに)
_ twitterから情報収集するコードの説明
Ruby twitter gem というライブラリを使います。(ruby1.8.7で動作確認。)
$ sudo gem install twitter
でインストールして、
#! ruby -Ku
require "rubygems"
require "twitter"
Twitter::Search.new.hashed('TwitMusic').per_page(100).each do |t|
p t
end
これで情報取得できちゃいます。簡単!
あとはsleepいれて定期的に実行する(1分に1回にしました)のですが、
前回取得した続きから取りたい場合は
つぶやきにidがついているのでそれを見て、
次回取得時にはsince()に前回のmax idを渡してそれ以降を取得します。
Twitter::Search.new.hashed('TwitMusic').since(twit_status_id_max).per_page(100).each do |t|
あとは取得できた本文から正規表現マッチで曲タイトルとアーティストを抜き出して配列にしまいます。
既に同じ曲が配列にあったらcount++と。
# 正規表現のコードは1行で済むよね・・・うまく書けない・・・
結果はアクセスごとにlog.txtに追記してます。
_ TwitMusicから集計するコード
#! ruby -Ku require "rubygems" require "twitter" musics = Array.new TwitMusic = Struct.new(:title, :artist, :count) def get_twit_music_info(musics, twit_status_id_max) twit_music = TwitMusic.new Twitter::Search.new.hashed('TwitMusic').since(twit_status_id_max).per_page(200).each do |t| # status id twit_status_id_max = t.id if twit_status_id_max < t.id # t → twit_music へ情報をつめる twit_music.count = 0 # title title = t.text.match( /\n.*?\(/ ).to_s # .*? = 強欲なmatch title.slice!(/^\n/) title.slice!(/\(.*$/) twit_music.title = title # artist artist = t.text.match( /\):.*?:/ ).to_s artist.slice!(/^\): /) artist.slice!(/:$/) twit_music.artist = artist # 過去のデータ(musics)にtwit_musicを追加する unless twit_music.title == '' or twit_music.artist == '' result = false musics.each do |music| if music.title == twit_music.title and music.artist == twit_music.artist result = true music.count +=1 puts "increment!" break end end musics << twit_music.dup unless result puts '<<' end end return twit_status_id_max end File.open("log.txt","w") do |file| twit_status_id_max = 0 while true file.puts Time.new twit_status_id_max = get_twit_music_info(musics, twit_status_id_max) musics.each do |music| file.puts "#{music.title} : #{music.artist} : #{music.count}" end puts twit_status_id_max sleep(60) end end
_ TwitMusicから集計したデータ
8/23日曜日の午前11時頃から1時間くらい収集しました。
「De Do Do Do, De Da Da Da : The Police」は私も好き!
Sun Aug 23 11:56:47 +0900 2009
スコールクロール : 堀江由衣 : 0
Random Number Generation : Miriam Shor : 0
洗濯機の中から : 堀江由衣 : 0
ポーランド : ZABADAK : 0
着心地の悪い恋なんて : 堀江由衣 : 0
Sweet Thing-Zoe's Guitar Mix- : HAL FROM APOLLO '69 : 0
バンクーバー : Superfly : 0
Ben : Michael Jackson : 0
Insistence : 堀江由衣 : 0
Stripped [7" Version] : Depeche Mode : 0
Mama : My Chemical Romance : 0
Cherry Kiss : 田村ゆかり : 0
桜 : 堀江由衣 : 0
Spiritual Garden : 田村ゆかり : 0
Secret Garden : 堀江由衣 : 0
Bastards : Hardcore Superstar : 0
Summer of Love : Hi-STANDARD : 0
It's All Over Now : The Rolling Stones : 0
どんだけ the ジャイアント : 電気グルーヴ : 0
She's So Cold : The Rolling Stones : 0
Banquet : Bloc Party : 0
Rescue Me : Zebrahead : 0
Oh My Precious Time : Superfly : 0
Samambaia : Yo-Yo Ma : 0
Dance the Night Away : Van Halen : 0
Hippy Hippy Shake : The Georgia Satellites : 0
08 - INFINITY : STRATOVARIUS : 0
MR. LONELY : Bank Band : 0
Little Wish 〜lyrical step〜 : 田村ゆかり : 0
夢 : 鴉 : 0
Gimme More : Britney Spears Feat. Amanda Blank : 0
etjude : xin xci : 0
チェルシーガール : 田村ゆかり : 0
coffeetime : xin xci : 0
HAPPY AGAIN : 酒井法子 : 0
安里屋ユンタ : 坂本龍一 : 0
sn070801 : 水口幸広&桜井俊宏 : 0
MARIA & JOKER : 水樹奈々 : 0
Banana Pancakes : Jack Johnson : 0
Saints Of Los Angeles : Mötley Crüe : 0
Hold Me : Fleetwood Mac : 0
Understand; : Q;indivi : 0
Shangri-La : Acid=Stone Valley feat.YURiE : 0
Electric Red : Meshuggah : 0
Centerfold : J. Geils Band : 0
Sexy B***h : David Guetta : 0
深愛 : 水樹奈々 : 0
Emotionally Yours : Bob Dylan : 0
熱烈歓迎わんだーらんど : 宮永咲(植田佳奈),原村和(小清水亜美),片岡優希(釘宮理恵),染谷まこ(白石涼子),竹井久(伊藤静) : 0
Beautiful Girls : Sean Kingston : 0
I Thought I Heard New Orleans Say : Dr. John : 0
Hankachi : SPECIAL OTHERS : 0
19:00の街 : 野口五郎 : 0
素直になりたい : Hi-Fi Set : 0
元祖 高木ブー伝説 : 筋肉少女帯 : 0
Satin Doll : McCoy Tyner : 0
Tender : Marcy : 0
Forgiveness : Anna Faris : 0
chronicle of sky : 水樹奈々 : 0
海の見える街 : DAISHI DANCE : 0
アンチェインド・メロディ : The Righteous Brothers : 0
Plastic Super Star : Southern All Stars : 0
Poker Face : Lady Gaga : 0
Nostalgia : 水樹奈々 : 0
This Woman I Met : Steven Wright : 0
かもめが翔んだ日 : 渡辺真知子 : 0
シュラバ★ラ★バンバ SHULABA-LA-BAMBA : Southern All Stars : 0
夜をぶっとばせ! : Marcy : 0
01 - HUNTING HIGH AND LOW : STRATOVARIUS : 0
日経・朝のたまご 8月12日放送 : KBCラジオ : 0
翼をください : 林原めぐみ : 0
Far Away Eyes : Keith Richards : 0
Livin' On A Prayer : Bon Jovi : 0
魔法の鏡 : 荒井由実 : 0
_E5 : 鷺巣詩郎 : 0
即ち…光をも逃がさぬ暗黒の超重力 : Sound Horizon : 0
はるまついぶき : Bank Band : 0
Happy happy*rice shower(type yui) : 堀江由衣 : 0
片翼のイカロス : 榊原ゆい : 0
Dragonfly pie : Stephen Malkmus & The jicks : 0
Angry Inch : John Cameron Mitchell : 0
1234 : Feist : 0
ニート釣り : 大槻ケンヂと絶望少女達 : 0
SAKURA-ハルヲウタワネバダ- : 矢島美容室 : 0
GROOVIN' : 山下達郎 : 0
声 : 中島美嘉 : 0
All Hands On Deck, Pt. 1: Raise The Sail : Funeral For A Friend : 0
The Unsung War : Keiki Kobayashi, ACE COMBAT 5 Chorus Team : 0
人として軸がぶれている : 大槻ケンヂと絶望少女達 : 0
アオイアサガオ : Jazztronik : 0
Winter Love : BoA : 0
99 blues : 佐野元春 : 0
カメリア : 天野月子 : 0
夢で逢えたら : Dragon Ash : 0
空想ルンバ : 大槻ケンヂと絶望少女達 : 0
When God Created The Coffeebreak : Esbjörn Svensson Trio : 0
Almost Here : Delta Goodrem & Brian McFadden : 0
Dont Stop Me Now : Queen : 0
【けいおん!】Cagayake!GIRLS [Eurockbeat Mix]【Remix】 : (null) : 0
Ghostbusters : The Rasmus : 0
I'm Not Jesus : Apocalyptica : 0
March Of Time : Helloween : 0
De Do Do Do, De Da Da Da : The Police : 0