PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する(API v1)

この記事はTwitter API v1のものです。
2013年6月11日でTwitter APIのv1は使用できなくなり、使用できるのはv1.1となっています。
[参考記事] PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する v1.1

2012/09/16 記事を修正しました(http関数でエラーが出る)

TwitterのAPIを使用するには、以前はベーシック認証による認証方式が使えていましたが、今では使えなくなっています。
そこでOAuthによる認証方式を使用します。

PHPでTwitterのツイートをする
PHPでTwitterのツイート一覧を取得する
CURL関数が使用できない場合

Twitter APIに接続するライブラリは、abraham氏のtwitteroauthにあるコードを使用すると実装が楽です。

abraham/twitteroauth GitHub
The first PHP Library to support OAuth for Twitter's REST API

ここからtwitteroauthをダウンロードします。(バージョンは0.2.0などでかまいません)
このファイルを解凍し、twitteroauthフォルダ内のファイルを使用します。
OAuth.php
twitteroauth.php

[参考記事] Twitter APIを使用する (Twitterアプリケーション登録)

Twitterの開発用サイトでアプリケーションを登録して、
Consumer key、Consumer secret、Access Token、Access Token Secret
を取得します。

PHPでTwitterのツイートをする

APIに送る値はUTF-8で送信します。

// ツイート内容
$status = 'つぶやき';

require_once("twitteroauth.php");

// Consumer keyの値
$consumer_key = "consumer_key";
// Consumer secretの値
$consumer_secret = "consumer_secret";
// Access Tokenの値
$access_token = "access_token";
// Access Token Secretの値
$access_token_secret = "access_token_secret";
 
// OAuthオブジェクト生成
$twitterOauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
$ret = $twitterOauth->OAuthRequest("http://api.twitter.com/1/statuses/update.xml","POST",array("status"=>$status));

PHPでTwitterのツイート一覧を取得する

//twitterID
$screen_name = 'pentan_info';

require_once("twitteroauth.php");

// Consumer keyの値
$consumer_key = "consumer_key";
// Consumer secretの値
$consumer_secret = "consumer_secret";
// Access Tokenの値
$access_token = "access_token";
// Access Token Secretの値
$access_token_secret = "access_token_secret";
 
// OAuthオブジェクト生成
$twitterOauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
$ret = $ret = $twitterOauth->OAuthRequest("http://api.twitter.com/1/statuses/user_timeline.xml","GET",array("screen_name"=>$screen_name));

$xml = simplexml_load_string($ret);

foreach($xml->status as $value){
  //発言内容
  $text = $value->text;

  //発言者のtwitterID
  $screen_name = $value->user->screen_name;

  //発言者の名前
  $name = $value->user->name;
}

CURL関数が使用できない場合

twitteroauth.phpではcurl_init()やcurl_setopt()などCURL関数を使用しています。
しかしCURL関数を使用するためには、libcurlパッケージをインストールしておく必要があります。
このためCURL関数が使用できない場合にはhttp()メソッドは使用できない。

そこでCURL関数を使用していない代替となるhttp()メソッドは次のようになります。
これに置き換えると使用することができます。

function http($url, $method="GET", $post=NULL, $ver="1.0") {
  $URL = parse_url($url);
  if(empty($URL["query"])){
    $URL["query"] = "";
  }else{
    $URL["query"]="?".$URL["query"];
  }
  if(empty($URL["port"])){
    if (preg_match('/^https/i',$url)) {
      $URL["port"]=443;
    }else{
      $URL["port"]=80;
    }
  }
  if(empty($URL["path"])){
    $URL["path"] = "/";
  }

  //リクエストライン
  $request  = $method . " " . $URL["path"] . $URL["query"] . " HTTP/".$ver."\r\n";
  //リクエストヘッダ
  $request .= "Host: " . $URL["host"] . "\r\n";
    
  //POSTの時
  if(strtoupper($method) == "POST") {
    $postdata = $post;
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Content-Length: " . strlen($postdata) . "\r\n";
  }
  $request .= "\r\n";
  //接続
  if($URL["port"]==443){
    $fp = @fsockopen('ssl://'.$URL["host"], $URL["port"], $errno, $errstr, 5);
  }else{
    $fp = @fsockopen($URL["host"], $URL["port"], $errno, $errstr, 5);
  }
  //エラー処理
  if(!$fp){
    return false;
  }

  //リクエスト送信
  fputs($fp, $request);

  //応答データ受信
  $response = "";
  while (!feof($fp)){
    $data= fgets($fp);
    $response.=$data;
  }
  fclose($fp);

  list($dummy,$response) = explode("\r\n\r\n",$response,2);
  return $response;
}

CURL関数が使用できるときには、twitteroauth.php既存のhttp()メソッドを使用して、CURL関数が使用できないときには別のメソッドを使うようにするのが正しいかもしれません。

function http($url, $method, $postfields = NULL) {
  if (!func_exists('curl_init')) {
    return $this->httpNoCurl($url, $method, $postfields);
  }

  ……
}
function httpNoCurl($url, $method="GET", $post=NULL,$ver="1.0") {
  $URL = parse_url($url);
  if(empty($URL["query"])){
    $URL["query"] = "";
  }else{
    $URL["query"]="?".$URL["query"];
  }
  if(empty($URL["port"])){
    if (preg_match('/^https/i',$url)) {
      $URL["port"]=443;
    }else{
      $URL["port"]=80;
    }
  }
  if(empty($URL["path"])){
    $URL["path"] = "/";
  }

  //リクエストライン
  $request  = $method . " " . $URL["path"] . $URL["query"] . " HTTP/".$ver."\r\n";
  //リクエストヘッダ
  $request .= "Host: " . $URL["host"] . "\r\n";
    
  //POSTの時
  if(strtoupper($method) == "POST") {
    $postdata = $post;
    $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $request .= "Content-Length: " . strlen($postdata) . "\r\n";
  }
  $request .= "\r\n";
  //接続
  if($URL["port"]==443){
    $fp = @fsockopen('ssl://'.$URL["host"], $URL["port"], $errno, $errstr, 5);
  }else{
    $fp = @fsockopen($URL["host"], $URL["port"], $errno, $errstr, 5);
  }
  //エラー処理
  if(!$fp){
    return false;
  }

  //リクエスト送信
  fputs($fp, $request);

  //応答データ受信
  $response = "";
  while (!feof($fp)){
    $data= fgets($fp);
    $response.=$data;
  }
  fclose($fp);

  list($dummy,$response) = explode("\r\n\r\n",$response,2);
  return $response;
}

関連記事

スポンサーリンク

lpr プリンタで印刷する

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る