Twitter APIの仕様変更対応

ブログの説明では「プログラミングの話題など」と書いておきながら、プログラミング関係のエントリをまったく書いていませんでしたが、ようやく初めてのプログラミングの話題のエントリになります(笑)。

さて、私が管理しているMMJ plus Schedule(MpS)というPHPのシステムがあります。このシステムの管理画面で予定情報を入力して登録すると、自動的に内容の要約をTwitterでツイートするという機能を実装しています。
これが最近になって、以前はツイートされていたのに最近ツイートされなくなった(がエラーにもならない)という現象が発生していたので、いろいろ調査してみました。
すると、2014年1月14日にTwitter APIの仕様変更があり、これまでhttpで使えた投稿用のAPIが、SSLによるhttps必須になったそうで、接続先をhttp://~からhttps://~に変更すれば動く、という情報を得ました。
ということで、接続先URIの設定をhttp://~からhttps://~に変更してみました。
と、ここまではこの問題の関連情報を検索してここにたどり着かれた方はご存知ではないかと思います。重要なのはここから先ですね。

変更してみましたが、やはりうまくいきません。
処理ごとにトレースログを吐くように変更しようと思ってソースを追っていると、まず接続を行っているのがfsockopen()であることを思い出しました。
ここでピンときたので、ひとまずPHPのリファレンスを見てみました。するとやはり、SSL接続の場合はホスト名の前に'ssl://'をつけなければならない、とありました。
ホスト名はparse_url()で接続先URI文字列を解析して、その要素hostを取得して指定しているので、URIをhttps://~に変更してもホスト名そのものには反映されていなかったわけですね。
そこでホスト名の前に'ssl://'を追加して実行してみました。

すると今度は明白な接続エラーが返ってきました。そこでハッと気づいたのは、fsockopen()でポート番号を80に指定していたけれど、SSLのポートは別だった、ということ。
ということで最終的に以下のようにすることで無事、ツイートが送信されるようになりました。


(変更前)
$fp = fsockopen($URL['host'], 80, $ecode, $emsg);

(変更後)
$fp = fsockopen('ssl://' . $URL['host'], 443, $ecode, $emsg);

この記事へのコメント