2009/11/28

twitterの検索APIは発言内の読点を無視して検索結果を返してくる

twitterの検索APIは発言内の読点を無視して検索結果を返してくる

現象

「うんこ」で検索した結果に「うん、この中に(以下略)」が入っていた
「うんこ」だけをまぬけに置換していると「うん、この中に」がすり抜ける
「うんこ」で検索した結果の中で「うんこ」を別の文字に置き換えて改変tweetする迷惑botを動かしてて気づいた

対策

「うんこ」にほかの文字が入っていても置き換えてしまうのも悪くはない
でも置き換えが出来なかったらその発言無視して次の発言の改変に行く方がシンプルで楽そう
頻度が低ければorどうでもよければ 気にしないのがいい

句点がどうなのかとかほかの記号がどうなのかとかは知らない
ゲンミツにやりたいときは気をつける
そういうのが入りやすい検索キーワードで何かしたいときは頭の片隅に入れておく

全文検索ってこういうものなのを知らなかっただけかもしれない

2009/09/16

twitter4rでtwitter検索するのに思ったより苦戦 そしてtwitterの仕様

twitter4rでtwitter検索するのに思ったより苦戦したのでメモを残す
twitter4rはruby用のtwitterライブラリ

2009-09-16時点
$ gem list --local | grep twitter
twitter4r (0.3.1)
Twitter API 仕様書はtsupoさん訳のもの。第31版。

twitter検索の大まかな使い方

twitter = Twitter::Client.new
iterator = twitter.search(:q => "四時 OR 4時 OR 4時", :lang => 'ja')
iterator.each do |tweet|
  p tweet.text
end

これで検索対象発言が取り出せる。無指定だと15件。
:lang => jaが日本語限定。「 OR 」でOR検索ができる。
試してないけど「 AND 」でAND検索できるんじゃね。このへんはAPI仕様書参照。

発言者名の取得

「show_user=true の場合」に発言ユーザ名でprefixが入るのはsearch.atomの場合のみ。
search.jsonの場合入らない。 twitter4rはjsonをパースするので、結局発言ユーザ名は入らない。

ググった結果から
tweet.user.screen_name
tweet.user.name
勘で探すけどいない

tweetは :source と :text と :created_ at しか持っていないように見える。 jsonのレスポンスには他にも居るのに!
仕方がないので↓こんな感じでライブラリを書き換えて

*** /usr/local/lib/ruby/gems/1.8/gems/twitter4r-0.3.1/lib/twitter/model.rb
     2009-09-14 00:55:27.000000000 +0900
--- /path/to/model.rb  2009-09-14 00:54:59.000000000 +0900
***************
*** 227,233 ****
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name]
      attr_accessor *@@ATTRIBUTES

      class << self
--- 227,233 ----
      include ModelMixin
      @@ATTRIBUTES = [:id, :text, :source, :truncated, :created_at, :user,
                      :favorited, :in_reply_to_status_id, :in_reply_to_user_id,
!                     :in_reply_to_screen_name, :from_user]
      attr_accessor *@@ATTRIBUTES

      class << self
***************
eachのなかでユーザ名を取得した。
tweet.from_user

まず間違いなくもっとbetterな方法があると思うけど、web検索にもでてこないし、用は足りたので一応よかったことにする。
見つけたら加筆修正する。おしまい。

以下参考資料

UT blog: Twitter crawler with ruby 2
http://yyuto.blogspot.com/2009/06/twitter-crawler-with-ruby-2.html
RC3の無職しょ日記:Twitter4Rの歩き方
http://blog.livedoor.jp/r_c_3/archives/50648653.html
rdocは古いので参考意見にしかならない
http://twitter4r.rubyforge.org/rdoc/


2009-10-03 15:00追記

twitter4r 0.3.2以降でsearchでもfrom_user, to_userが取れるようになった
そのため、本エントリの修正は以後不要

2009/09/06

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました

時間に関するつぶやきをするtwitterbot「tokisaka」をつくりました。
http://twitter.com/toki_b

cronでまわしてランダムで登録済みの発言をPOSTします。 話しかけられても特に返事はしません。フォロー周りも実装していません。 あらかじめ登録済みの発言をたんたんとPOSTするのみです。

開発・本番環境とコード管理は↓にまとめました。
實松アウトプット: gitとProjectLockerでtwitterbotをリリースするまで

構成はruby1.8.7 + Twitter4r0.3.1 + MySQL5.1.32 + ActiveRecord2.3.3 (+Rake 0.8.3)です。
まずは登録発言をふやさな。

gitとProjectLockerでtwitterbotをリリースするまで

gitとProjectLockerを利用してtwitterbotを管理してリリースしました。bot自体はlinode.comで動かしています。

ProjectLocker説明

ProjectLockerはワンストップのバグトラッキングシステムのホスティングサービスです。いわゆるBTS一式+ソース管理。プロジェクトごとにgitかsubversionのリポジトリを選択して使います。githubではなくこちらを選んだ理由はプライベートのリポジトリが無料で持てるから。tracやwikiはあるらしいけど利用してないので知りません。複数ユーザの管理や権限分けも可能。ただそもそも運営がDQNぽいのであんまり使わない方がいいと思います。

すぐやり方を忘れるので手順。gitはローカルリポジトリとconfig周りを設定済み。project locker, twitterはアカウント取得済み。

プロジェクト名を決める

決めるとやる気が出るので。今回は「時逆(tokisaka)」。

ローカルのディレクトリ構成を決める

$ mkdir $HOME/app/tokisaka
$ cd app/tokisaka
$ mkdir lib
$ mkdir spec
$ touch lib/foo.txt
$ touch spec/bar.txt

ローカルのディレクトリ構成の雛形は以上。gitはデフォルトだと(?)空ディレクトリを無視するのでファイルを作った。

ローカルリポジトリの準備

$ git init
$ git add .
$ git commit -m "initial commit"

ローカルリポジトリの準備ができた。

ProjectLocker側の準備

アカウントをとったあとどこからログインするのかいつも分からないので書いておく。ここからログインする。
ProjectLocker User Portal: Login
https://portal.projectlocker.com/

ログインしたら、左ペインの「Account Links」の中の「Add Project」からプロジェクトを追加する。入力するのはプロジェクト名とプロジェクト概要とgit/svn。
gitを選んでプロジェクトを作成完了。

プロジェクト一覧が出てくる。これは左ペインの「Account Links」の中の「List Project」と同じ。作ったプロジェクトの「Name」をクリックする。ここは直感的に。

「Users in Project」に誰もいなくて、「Account Users not Assigned to this Project」に自分がいるのでメールアドレスの隣の「Add To Project」をクリックする。「Users in Project」に自分が入る。

gitのリポジトリの場所が分からなくなったので後で追記する。左ペインの「User Links」から「User Home」を選択すると、プロジェクトごとのリポジトリURLとアカウントが表示される。tokisakaは「git-foobar@free2.projectlocker.com:tokisaka.git」

公開鍵を登録

「User Links」の中の「Manage Public Keys」に自分の公開鍵を登録する。「id_dsa.pub」の中身。

リモートリポジトリを登録

ローカルに戻る。
$ git remote add origin git-foobar@free2.projectlocker.com:tokisaka.git
$ git push
pushするとエラーが出る

To git-foobar@free2.projectlocker.com:tokisaka.git
! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to 'git-foobar@free2.projectlocker.com:tokisaka.git'
なので先にpullしてやる

$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
してから
$ git push
するとpushができる。ProjectLocker側でリポジトリを作ったときに「README」ってファイルが自動で生成されるが、それとぶつかるかららしい。
push, pullの時には鍵のパスフレーズを要求されるので入力する。

本番サーバ側(linode.com)からpull

秘密鍵を本番サーバに転送する。ProjectLockerに登録した公開鍵とペアのもの。その鍵を使って認証する。git initとgit pullでファイルを取得。pullするものを選べば反映したいブランチを適応できるんじゃないかな。HEADをガツンと反映するので知らない。

$ git init
$ git pull git-foobar@free2.projectlocker.com:tokisaka.git
パスフレーズを入力するとProjectLockerのリポジトリからpullしてくる。

リリース完了。
http://twitter.com/toki_b

最近のトラックバック

information

  • author : sanemat
    表記はsanemat あるいは SANE もしくはsanematsu, sane
    sanemat's portfolio
    (murahashi kenichi)
  • サイト内検索
ブログ powered by TypePad