【PHP】 PEAR::Services_TwitterでTwitter API 1.1の検索APIに対応

前回の続き。 PEAR::Services_Twitterを使ってAPI1.1にリクエストを送る方法はこちらを読んでください。 【PHP】 PEAR::Services_TwitterでTwitter API 1.1対応 | mutter 「タイムラインから「google」という単語で検索してマッチしたツイートを取得したい」というような要求があった場合に、API1であればこんなリクエストを送れば取得出来ました。 GET search | Twitter Developers

http://search.twitter.com/search.json?q=google
API1.1では、要Authentication付きでこんなリクエストになります。 GET search/tweets | Twitter Developers
https://api.twitter.com/1.1/search/tweets.json?q=google
このリクエストをServices_Twitterで組み立てるとこんな感じになるのですが、
$obj = new Services_Twitter();
/* oAuth省略 */
$data = $obj->search->tweets(array('q' => 'google'));
実際に動かすと、
Unsupported endpoint search/tweets
と言われて動きません。問題は2つあります。
  1. Services_Twitterが「search/tweets」をサポートしていない
  2. searchの場合のリクエストURLが「http://search.twitter.com」になっている
この2つを解決してやれば、無事に動くようになります。

続きを読む

【PHP】 PEAR::Services_TwitterでTwitter API 1.1対応

息抜きにちょっとした自分向けアプリケーションを作りました。仕様はこんな感じ。

  • 「1日1ニコ」ブログのアカウント @__1nico__ に投稿しているブログの更新情報を拾って
  • メインアカウント @nobodyplace でリツイートする
ただそれだけ。 いちいち確認してリツイートするの面倒くさいってことなんだけども、Twitter API 1.1向けの課題としては軽くて面白いかなってことでさくっとこしらえました。使用言語は例によってPHPです。 大体の流れはこんな感じ。
  1. PEAR::Services_Twitterを読み込み
  2. OAuthアクセス
  3. GET statuses/user_timeline」を使ってユーザー「@__1nico__」のツイートを取得する
  4. リツイートしてなければ「POST statuses/retweet/:id」でユーザー「@nobodyplace」としてリツイート
最初の構想では、3と4の間に、
  • GET statuses/retweets/:id」を使ってリツイート一覧を取得して自分がリツイート済みかどうかチェックする
という工程も入っていたのですけど、実際に使ってみると、「GET statuses/user_timeline」「POST statuses/retweet/:id」のリクエスト制限が15分当たり180であるのに対して、「GET statuses/retweets/:id」の制限が15分当たり15でボトルネックになってしまうことが解ったので、除外しました。 Twitterへのリツイートのリクエストは、重複している場合は無視される(ただしエラーは返ってきて今回なら、Services_Twitter_Exceptionが投げられる)そうなので、まあそれでいいかなという。

追記

こんなことをしなくても自分がリツイートしているかどうかは、「retweeted」という要素を確認することでチェックできるのですね。「retweeted」は、そのツイートがリツイートされているかどうかを示していると勘違いしていたのですが、実際にはそのリクエストを送ったユーザー(この場合なら@nobodyplace)がリツイートしているかどうかをあらわしていました。trueならリツイート済み、falseなら未リツイートと。そもそもツイートがリツイートされたかどうかは、「retweet_count」で判断できますもんね。そうかー

続きを読む

【メモ】 CUIに実行ログを書き出す(1行を上書きしていく) 【PHP】

やりたいこと

フレームワークのタスクなどを実行する際に、きちんと進行しているかインジケータを表示させたい。ただし、処理数分だけ行数を重ねるのではなくて1行に上書きしていきたい。上手く説明できなくて歯がゆいんですけど、つまりこうではなくて、
doSomething ...  1/5
doSomething ...  2/5
doSomething ...  3/5
doSomething ...  4/5
doSomething ...  5/5 finished
こう。
doSomething ...  5/5 finished ← この行だけで更新されていく
わかりますかね…

続きを読む

KyotoCabinet + KyotoTycoonをインストールしてPECL::Memcachedで接続

調べてみたらPEAR::Cache_Liteが思った以上に頼りないことが解ったのでキャッシュ機構の入れ替えを検討。 【メモ】PEAR::Cache_Liteの生存期間について誤解してたこと(追記あり) | mutter いろいろ考えたのだけど、個人プロジェクトなんだし好奇心優先って事でKyotoCabinetとそれを扱うKyotoTycoonを入れて、PECL::Memcachedを利用して接続してみることにしました。PHP側については、OpenPEARの方に「Net_KyotoTycoon」と言うライブラリもアップされているのですが、まぁ今は良いかなと言うことで。 Net_KyotoTycoon \ パッケージ \ Openpear KyotoTycoon の PHP 版を作った – Heavens hell と言うわけで、以下インストール。

続きを読む

【メモ】FuelPHPをインストールしてgitでプロジェクトを管理するまで

なんだか凄く嵌まってしまったのでメモだけでも残しておこうと。

手順

  1. gitをインストール
  2. FuelPHPをインストール
  3. FuelPHPの新しいプロジェクトを作成する
  4. 新しいプロジェクトを含むディレクトリ全体をgit管理下に置く
  5. eclipseにインポート

前提

  • サーバ側:CentOS 5.6
  • クライアント側:Windows 7 64bit / Eclipse 3.7.1
  • SSH等の設定は終了しているものとする

続きを読む

【PHP】 セッションファイルを階層分けして格納する

とあるシステムのセッションディレクトリを覗いてみたらミリオン単位のファイルが詰まっていることが解って、I/O重いの当たり前じゃねーか…!(普通は1ディレクトリ1000ファイルまでに抑えるべき)となったので改善を試みました。 具体的にはディレクトリを階層化します。

改善前

/path/to/session/sess_hogehogehoge

改善後

/path/to/session/0/1/2/sess_hogehogehoge
以下、手順。
  1. 階層化されたセッションディレクトリを作成する
  2. 作成したセッションディレクトリのパーミッションを変更する
  3. PHPの設定を変更する
  4. httpd再起動
  5. 古いセッションを削除するように設定する

続きを読む

【PHP】【Symfony】 ピリオド(ドット)を含む文字列でroutingを行いたい

環境はSymfony 1.4.11。 やりたいことは、次のようなルールが設定されているときに、

sample:
url:   /:query
param:
module: module
action: action
次のようなURLで引数を渡したいと言うことなのだけど、これが上手く行かない。
http://hogehoge.com/Part.3
結果は、404 Not Foundになってしまう。 なぜ404 Not Foundになってしまうかというと、渡した文字列「Part.3」に含まれるピリオドがセパレータとなって機能し(Symfony 1.4のroutingにおけるデフォルトのセパレータは「/」と「.」)、「Part」部分がモジュール名、「3」部分がアクションとして解釈されてしまうため。単純にSymfonyに文字列が渡らないと言うことであれば、次の解決策が参考になるのだけど、どうやらそういうことではないみたい。 ルートにピリオドを含める – Do You PHP はてな

続きを読む

PHP Simple HTML DOM Parserがとっても便利

PHP logo

HTMLをパースしてきてDB化したり、RSSのテンプレに落とし込む…と言ったことを少し前からしているのですけど、1つ2つならいざ知らず対象サイトが増えてくると正規表現で何かし続けるのはたいそう無理があります。そういうわけでDOMを使ったりXPathを使ったりもしていたのですが、どちらもHTMLの構造にぴったりとは言えなくて、高度なことが出来るが故に記述が複雑になってしまうのでした。うーん。慣れるまでにハードルがあるな…

続きを読む