【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つを解決してやれば、無事に動くようになります。

続きを読む

Tumblr BinderにTwitterアカウントでログイン出来ない不具合を修正しました

TumblrのRSSをまとめる「Tumblr Binder」というサービスを作っています。 umbls | Tumblrを便利に使うサービス そこではTwitterの認証機能を使ってログイン機能を作っているのですけれども、どの認証が上手く出来なくなっていました。まめに設定を変更するようなサービスでもない(使ってる人も大体1回設定したら終わりだと思います)ので、全く気付いていませんでした…申し訳ありません。 現在は再びTwitterアカウントでログイン出来るようになっています。 今も使われている方がどれくらいいらっしゃるかわかりませんが、ご迷惑おかけいたしました。

続きを読む

【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 ← この行だけで更新されていく
わかりますかね…

続きを読む

昨日、一時的にサービスが落ちていました。

15時くらいにサーバの1つが突然繋がらなくなり、何かやっちまったのか(例えばデータベースへの過剰なアクセスとか)と思ってサーバを再起動してみたのだけど全然ダメでおろおろしていたら、しれっとこんな告知が出てました。

メンテナンス・障害情報・機能追加|さくらインターネット公式サポートサイト

平素よりさくらインターネットをご利用いただき、誠にありがとうござ います。 本日、ご提供サービスにおきまして、以下の通り障害が発生いたしました。 ご利用中のお客様には大変ご迷惑をおかけしておりますことを深くお詫び 申し上げます。

影響範囲 : さくらのVPS 1Gプランの一部 IPアドレスが下記の範囲のお客様 219.94.245.15 ~ 219.94.245.134 障害内容 : サーバに接続できなくなる障害が発生しました。 障害によりVPSの意図しない再起動が発生しました。
ああうん、ドンピシャだよさくらさん。 いままでここまでビシッとターゲットになったことが無かったのでちょっと驚きました。発生したのが15時20分で復旧したのが18時05分。何が原因か解らないけど(機材の故障かなぁ)さすがに3時間とめられるのはきついなー。まぁ、障害発生は仕方ないか。ただせめてメールでお知らせくらいして欲しいなーと思いました。障害情報をRSSで読むといっても、それを読むRSSリーダーが今障害が起きているサーバに載っていたので。 とりあえず、データに何の問題も無くて良かったです。やれやれ。

続きを読む

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 と言うわけで、以下インストール。

続きを読む

【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の構造にぴったりとは言えなくて、高度なことが出来るが故に記述が複雑になってしまうのでした。うーん。慣れるまでにハードルがあるな…

続きを読む