カレンダー

11 | 2016/12 | 01
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

広告



最近の記事

カテゴリー

DATE: CATEGORY:TECH


以前の記事で、

TwitterのつぶやきをFC2ブログに勝手に投稿するようにしてみた。

Basic認証を使って、こんな事をやってたんですが、
8月16日にBasic認証は停止になっちゃって、OAuth認証しか
使えなくなっちゃったんですねぇ(^^;

twitterのBasic認証停止延期

というわけで、今回は以前のスクリプトをOAuth認証に
対応させてしまうって話。


大きな流れとしては、こんな感じ。

1、まずは、OAuth認証が出来るようにサイトをTwitterに登録
2、Twitterのデータ取得方法をBasicからOAuthに修正。

 ※まずは、ここのサイトでOAuth認証のフローを理解しておく。
  第1回 OAuthとは?―OAuthの概念とOAuthでできること

1、まずは、OAuth認証が出来るようにサイトをTwitterに登録



まずは、「https://twitter.com/apps/new」で必要な情報を入力してサイトを登録。
登録すると「Cunsumer Key」と「Consumer secret」が取得出来るので、保存しておく。

その「Cunsumer Key」と「Consumer secret」を使って、自分のIDに
紐づく「Access Token」と「Access Token Secret」を取得するページを作る。

PHPで作る時は、まずは以下の3つの必要なパッケージを導入。

$ pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
HTTP_OAuth 0.1.18 alpha
HTTP_Request2 0.5.2 alpha
Net_URL2 0.3.1 beta

で、ページはこんな感じ。説明はコメントのみで。。。
(1回目で使うだけなので、SSL対応まではしてないです;;)
このページにアクセスして、Twitterにアクセスして
「Access Token」と「Access Token Secret」を取得。

「Access Token」取得ページ

<?php
include 'HTTP/OAuth/Consumer.php';

// 指定のIDのアクセストークンの保存先
$idfiledir = '';

// カスタマーキー情報等の保存
$consumer_key = '';
$consumer_secret = '';
$callback = '';
$content = '';


session_start();

print "REQ TOKEN : ".$_SESSION['oauth_request_token'].".<br>";
print "ACCESS TOKEN : ".$_SESSION['oauth_access_token'].".<br>";
print "REQ TOKEN SEC : ".$_SESSION['oauth_request_token_secret'].".<br>";
print "ACCESS TOKEN SEC : ".$_SESSION['oauth_access_token_secret'].".<br>";
print "OAuth Verifier : ".$_GET['oauth_verifier'].".<br>";

try{
// init HTTP_OAuth_Consumer
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);

if(!empty($_REQUEST['oauth_token']) && $_SESSION['oauth_status'] === 'start'){
// Twitter 認証後のcall back処理
print "[DEBUG] CALLBACK URL<br>";
$_SESSION['oauth_status'] = 'returned';

if(empty($_SESSION['oauth_access_token']) || empty($_SESSION['oauth_access_token_secret'])) {
// access_tokenが未取得の場合
/* request tokenをセット */
$consumer->setToken($_SESSION['oauth_request_token']);
$consumer->setTokenSecret($_SESSION['oauth_request_token_secret']);

/* twitterから戻ってきた oauth_verifierをセット */
$verifier = $_GET['oauth_verifier'];

/* Access token をリクエスト */
$consumer->getAccessToken('http://twitter.com/oauth/access_token', $verifier);

$_SESSION['oauth_access_token'] = $consumer->getToken();
$_SESSION['oauth_access_token_secret'] = $consumer->getTokenSecret();

}
}

if(!empty($_SESSION['oauth_access_token']) && !empty($_SESSION['oauth_access_token_secret'])) {
// -- 認証済みの場合
/* Random copy */
$content = 'your account should now be registered with twitter. Check here:<br />';
$content .= '<a href="http://twitter.com/account/connections">http://twitter.com/account/connections</a>';

/* access_tokenをセット */
$consumer->setToken($_SESSION['oauth_access_token']);
$consumer->setTokenSecret($_SESSION['oauth_access_token_secret']);

/* ユーザ情報を取得するリクエストを発行. */
// $result = $consumer->sendRequest('http://twitter.com/account/verify_credentials.xml', array(), 'GET');
$result = $consumer->sendRequest('http://twitter.com/statuses/user_timeline.xml', array(), 'GET');

/* データを取得 */
$content = simplexml_load_string(mb_convert_encoding($result->getBody(), 'EUC-JP', 'UTF-8'));
$uid = $content->screen_name[0];
// $content = $result->getBody();

/* UID と Access tokenを保存 */
$access_token_set = $_SESSION['oauth_access_token'].",".$_SESSION['oauth_access_token_secret'];
system("echo $access_token_set > $idfiledir/$uid");

} else {
// 初回呼び出し時
print "[DEBUG] INITIAL CALL URL<br>";
// twitterからrequest_tokenの取得
$consumer->getRequestToken('http://twitter.com/oauth/request_token', $callback);

// TOKEN をセッションに保存
$_SESSION['oauth_request_token'] = $consumer->getToken();
$_SESSION['oauth_request_token_secret'] = $consumer->getTokenSecret();
// status を start にセット
$_SESSION['oauth_status'] = "start";

// authorization URL の取得
$auth_url = $consumer->getAuthorizeUrl('http://twitter.com/oauth/authorize');

// link の作成
$content = "Click on the link to go to twitter to authorize your account.<br />";
$content .= "<a href=".$auth_url.">twitterと連携する</a>";
}
} catch (Exception $e) {
$content = $e->getMessage();
}

?>
<html>
<head><title>twitter fc2</title>
</head>
<body>
<h2>Welcome to a Twitter coop FC2 blog.</h2>
ID : <?php print $uid ?>
<p><pre><?php print_r($content); ?><pre></p>
</body>
</html>

で、ここまで出来たらあとはBasic認証で取得していたスクリプトを修正。

2、Twitterのデータ取得方法をBasicからOAuthに修正。



先に取得した「Cunsumer Key」と「Consumer secret」、「Access Token」と「Access Token Secret」
を引数にもらうようにしながら、こんな感じで修正。

Twitter からのデータ取得 function

// ----------------Basic認証用---------------- //
function get_usertimeline($username, $password, $latest_id){
// ----------------Basic認証用---------------- //


// ----------------OAuth認証用---------------- //
function get_usertimeline($consumer_key, $consumer_secret, $oauth_access_token, $oauth_access_token_secret, $latest_id){
// ----------------OAuth認証用---------------- //

// xmlデータ取得用ベースURL
$requesturl = "http://twitter.com/statuses/user_timeline.xml";
// since_id(このID以降の記事を取得出来る)
$since_id = $latest_id;
// リクエストURL
$requesturl = $requesturl."?since_id=".$since_id;
print "Request URL[".$requesturl."]\n";

// ----------------Basic認証用---------------- //
//接続オプション
$option = array(
"http"=>array(
"method"=>"GET",
"header"=>"Authorization: Basic ". base64_encode($username. ":". $password)
)
);

// コンテキストの生成
$context = stream_context_create($option);
// 結果データの取得
$result = file_get_contents($requesturl, false, $context);
// ----------------Basic認証用---------------- //

// ----------------OAuth認証用---------------- //
// init HTTP_OAuth_Consumer
$consumer = new HTTP_OAuth_Consumer($consumer_key, $consumer_secret);
/* access_tokenをセット */
$consumer->setToken($oauth_access_token);
$consumer->setTokenSecret(oauth_access_token_secret);
/* ユーザ情報を取得するリクエストを発行. */
$result = $consumer->sendRequest($requesturl, array(), 'GET');
// ----------------OAuth認証用---------------- //


// 結果のxmlファイルをパースし、オブジェクト取得
$res_xml = simplexml_load_string($result) or die("XMLパースエラー");

$twitter[result]=count($res_xml->status);
$twitter[latest_id]=$latest_id;
$twitter[data]="";
$twitter[reply]="";

if($twitter[result]){
foreach($res_xml->status as $value){
// リプライ投稿は除く
if(!mb_convert_encoding($value->in_reply_to_screen_name,'EUC-JP','UTF-8')){

$twitter[data] = $twitter[data]."--------------------<br />\n";
$twitter[data] = $twitter[data]."投稿日時[".mb_convert_encoding(date("Y/m/d",strtotime($value->created_at)), 'EUC-JP', 'UTF-8')."]<br />";

// 最新記事のidを取得
$latest_id = mb_convert_encoding($value->id, 'EUC-JP', 'UTF-8');
if($latest_id > $twitter[latest_id]){
$twitter[latest_id] = $latest_id;
}

$twitter[data] = $twitter[data]."<br />\n".mb_convert_encoding($value->text, 'EUC-JP', 'UTF-8')."<br />\n<br />\n";
}else{
// リプライ投稿はreplyとして返す
$twitter[reply] = $twitter[reply]."--------------------\n";
$twitter[reply] = $twitter[reply]."投稿日時[".mb_convert_encoding(date("Y/m/d H:i",strtotime($value->created_at)), 'EUC-JP', 'UTF-8')."]";
$twitter[reply] = $twitter[reply]."(id:".mb_convert_encoding($value->id, 'EUC-JP', 'UTF-8').")\n";
$twitter[reply] = $twitter[reply]."\n".mb_convert_encoding($value->text, 'EUC-JP', 'UTF-8')."\n\n";
}
}
}
return $twitter;
}



実際にはスクリプトの通り、「Access Token」取得ページで取得した
AccessTokenをテキストファイルに落としておいて、mainスクリプトで
読み込んで、Twitter からのデータ取得 functionに引数で渡すような
処理にしています。

こんな感じの説明で。
・・・3ヶ月くらい前にやったので実はよく憶えてないですがw

以上。

関連記事


TwitterのつぶやきをFC2ブログに勝手に投稿するようにしてみた
【続】TwitterのつぶやきをFC2ブログに勝手に投稿するようにしてみた。
TwitterのつぶやきをFC2ブログに勝手に投稿するようにしてみた(OAuth編)

タグ : TECH Twitter FC2

Comment

コメントの投稿

管理者にだけ表示を許可する


トラックバック


この記事にトラックバックする



copyright © なんとなしの日記 all rights reserved.
内職☆在宅ワークの最強は?アフィリエイト!. 初心者だってカッコ良いホームページ作るぅ!
Powered by FC2ブログ
Related Posts Plugin for WordPress, Blogger...