Twitterの仕様変更で正常にツイートできなくなるのを修正した
2020/11/29 更新
1/14より、TwitterではAPIの利用はすべてHTTPS接続としなければならなくなりました。サイトに組み込んでいるプログラムでは特別な対応は必要ないはずが、(一部ミスで)ツイートができなくなっていたので、今後の確認のためにメモ。
Twitterの仕様変更
2014年1月14日より、APIの利用はHTTPS接続が必須となりました。これにより、HTTP接続となっているプログラム(アプリケーション)は、APIが利用できなくなるため、正常に投稿や表示ができなくなります。
サイトを運営していて、サイトの更新情報を流したりTwitterの投稿を表示したりするために作成したプログラムなどでは、(少なくとも当サイトでは)Twitterへ文章を送信(投稿)することとタイムラインを読み込んで表示することがメインなので、その2つができなくなった場合の対応についてのメモです。
なお、ここではTwitterOAuthを利用した場合についてメモしています。
API仕様変更への対応
TwitterOAuthをAPI 1.1に対応させていない場合
以前からAPI 1.1への対応が必須となっていますが、TwitterOAuthで対応を済ませていない場合は、次の部分を直してみてください。
<?php
/*
* Abraham Williams (abraham@abrah.am) http://abrah.am
*
* The first PHP Library to support OAuth for Twitter's REST API.
*/
/* Load OAuth lib. You can find it at http://oauth.net */
require_once('OAuth.php');
/**
* Twitter OAuth class
*/
class TwitterOAuth {
/* Contains the last HTTP status code returned. */
public $http_code;
/* Contains the last API call. */
public $url;
/* Set up the API root URL. */
public $host = "https://api.twitter.com/1.1/";
/* Set timeout default. */
public $timeout = 30;
/* Set connect timeout. */
public $connecttimeout = 30;
/* Verify SSL Cert. */
public $ssl_verifypeer = FALSE;
/* Respons format. */
public $format = 'json';
/* Decode returned json data. */
public $decode_json = TRUE;
/* Contains the last HTTP headers returned. */
public $http_info;
/* Set the useragnet. */
public $useragent = 'TwitterOAuth v0.2.0-beta2 (compatible with API 1.1)'; //対応してるアピール(変更しなくて問題ない)
/* Immediately retry the API call if the response was not successful. */
//public $retry = TRUE;
# (以下省略)
?>
今のところ仕様変更以来これで動いているので問題ないかと…
投稿・タイムライン読み込み
一言で言えば、HTTP接続ではなくHTTPS接続に変更すれば問題ないです。
投稿の場合はこんな感じ。
<?php
# (前略)
// OAuthオブジェクト作成
$obj = new TwitterOauth( $consumer_key, $consumer_secret, $access_token, $access_token_secret );
// POST
$res = $obj->OauthRequest( "https://api.twitter.com/1.1/statuses/update.json", "POST", array( "status" => $text ) );
#以下は誤った例(API 1.1非対応・HTTP接続)
#$res = $obj->OauthRequest( "http://api.twitter.com/1/statuses/update.xml", "POST", array( "status" => $text ) );
# (後略)
?>
タイムライン読み込みの場合はこんな感じ。
<?php
# (前略)
// OAuthオブジェクト生成
$obj = new TwitterOAuth( $consumer_key, $consumer_secret, $access_token, $access_token_secret );
// GET
$res = $obj->OAuthRequest( "https://api.twitter.com/1.1/statuses/user_timeline.json", "GET", array( "count"=>"100" ) ); //default:count=20
#以下は誤った例(API 1.1非対応・HTTP接続)
#$res = $obj->OAuthRequest( "http://api.twitter.com/1/statuses/user_timeline.xml", "GET", array( "count"=>"100" ) );
# (後略)
?>
当サイトでも何か理由がなければ初期のプログラミング段階でHTTPS接続を利用しているはずなのですが、なぜかHTTP接続になっていた部分があったためにツイートできなくなっていたようです。