PHP : CodeIgniter + Twitter API Library での oauth 投稿の具体的なポイント


  PHP フレームワーク : CodeIgniter




CodeIgniter とは、アメリカの EllisLab によって開発されたPHPのフレームワークです。
フレームワークは、PHP の学習には適しませんが、システム開発には無くてはならない
もので、特に特殊な処理に関してはそれぞれのフレームワークで容易に実現可能になっ
ているのが通常です。ただ、フレームワークであるが故に自由の利かない場面もあります。

また、フレームワークは万能では無く、アプリケーション開発にはそのフレームワークの
能力を十分に発揮できる「骨組み」と中身を良く知る技術者が必要になります


日本CodeIgniterユーザ会 のがどのようなものかは知りませんが、一般的にこのような会
「日本語」に関する情報や手助けを行う事を主旨としていますので、開発そのものは自分
の環境に適したものを自ら構築する必要があります。

その導入として、ドキュメントが日本語化された日本語言語パック ci-ja-all-in-one
(1.7.2用)
は、技術者にとって良い手助けになるものと思います。


  Twitter API CodeIgniter Library




Twitter API に限らず、セキュアな認証処理は面倒なもので、自分であまり作りたいものでは無く、
できれば「動作するコード」を手に入れるのが早道には違いないのですが、思った目的をそのコード
で達成できない場合には、他人が作ったコードを読まなくてはいけないというデメリットもあります。

そういう意味で、Twitter API CodeIgniter Library — Elliot Haughin は、実用には
少し問題があるようですが、Twitter に対する処理の面倒な部分である認証そのものには何も問題
は無いので、その部分を利用するには比較的良いコードであると思います。

以下は、サンプルコードのコメント部分を省いた、最小限の投稿サンプルです。

  

<?php

class Home extends Controller {

	function Home()
	{
		parent::Controller();	
	}
	
	public function index()
	{
		$consumer_key = '';
		$consumer_key_secret = '';

		$this->load->library('session');
		
		$tokens['access_token'] = NULL;
		$tokens['access_token_secret'] = NULL;

		$oauth_tokens = $this->session->userdata('twitter_oauth_tokens');

		if ( $oauth_tokens !== FALSE ) $tokens = $oauth_tokens;

		$this->load->library('twitter');

		$auth = $this->twitter->oauth(
			$consumer_key, 
			$consumer_key_secret, 
			$tokens['access_token'], 
			$tokens['access_token_secret']
		);

		if ( isset($auth['access_token']) && isset($auth['access_token_secret']) )
		{
			$this->session->set_userdata('twitter_oauth_tokens', $auth);

			if ( isset($_GET['oauth_token']) )
			{
				$uri = $_SERVER['REQUEST_URI'];
				$parts = explode('?', $uri);

				header('Location: '.$parts[0]);
				return;
			}
		}

		$this->twitter->call(
			'statuses/update', 
			array('status' => '本文')
		);

	}
}
  

CodeIgniter としては、ごく一般的なコードで、インストールURL/index.php/home でアクセスされます。
Twitter で登録して取得したトークンを以下のコード部分に埋め込むだけで動作します。

  

$consumer_key = '';
$consumer_key_secret = '';
  

そして、コードの内容からも推測できますが、以下のトークンが認証後に得られるもので、
これを保存しておく事によってユーザにログインを求める事無く処理を継続する事ができます。

  

$tokens['access_token'] = NULL;
$tokens['access_token_secret'] = NULL;
  

初回、このトークンは NULL であり、ログイン画面にリダイレクトされ、ログイン後に Twitter 側ではアプリ
が登録されてかつ、ユーザ側の URL が再度呼び出されます。( ここでは同じこの場所を想定しています )
その結果クッキーにトークンが登録され、その情報を使って以降は API をログイン無しで呼び出す事ができ
るようになります。( セッションへの書き込みがされている最後の if 構文の中で最初の登録が行われます )

よって、クッキーが削除されると、そのブラウザでは新たなユーザでのログインが求められる事になるのです
が、このコードでは一つ問題があって、Twitter 側でアプリケーションが削除されても再度ログインが必要
なのですが、トークンが削除されていないので継続して処理が行われ、エラーになっいるのですが、それを
チェックする機構が twitter->oauth にありません。ですから、自分で account/verify_credentials
を実行して結果からエラーであった場合はトークンを空にして呼び出す必要があります。

また、もう一つ問題があって、Twitter.php 内の定数であるログイン用の URL が https でなく http に
なっているので、折角のセキュアな認証の意味が無くなっていますので、以下のように変更する必要があり
ます

  

protected $authorizeUrl = 'https://twitter.com/oauth/authorize';
  

  ファイルにトークンを保存した永続的な接続

以下は簡単な画面を追加し、認証の有効チェックを行ったサンプルです。
トークンがサーバーのファイルに保存されているので、Twitter でアプリ
ケーションを削除しない限り、ユーザがログイン画面を見る事はありません。

  

<?php

class Home extends Controller {

	function Home()
	{
		parent::Controller();	
	}
	
	public function index()
	{
		// 画面の表示
		$this->load->view('view_twitter.php');

		if ( $this->input->post('send', TRUE) == '' ) {
			return;
		}

		$consumer_key = '';
		$consumer_key_secret = '';

		// デフォルトのトークン
		$tokens['access_token'] = NULL;
		$tokens['access_token_secret'] = NULL;

		// 保存されたトークンがある場合はそれを使う
		$ret = file_get_contents( "./token.txt" );
		if ( $ret != "" && $ret != "\t" ) {
			$oauth_tokens = explode("\t",$ret);
			$tokens['access_token'] = $oauth_tokens[0];
			$tokens['access_token_secret'] = $oauth_tokens[1];
		}

		// ライブラリロード
		$this->load->library('twitter');

		// 認証( トークンが空の場合はブラウザで認証 )
		$auth = $this->twitter->oauth(
			$consumer_key,
			$consumer_key_secret,
			$tokens['access_token'],
			$tokens['access_token_secret']
		);

		// 認証が有効かチェック
		$check = $this->twitter->call('account/verify_credentials');
		if ( property_exists( $check, "error" ) ) {
			// 認証できていない場合は、新規認証
			$tokens['access_token'] = NULL;
			$tokens['access_token_secret'] = NULL;
			$auth = $this->twitter->oauth(
				$consumer_key,
				$consumer_key_secret,
				$tokens['access_token'],
				$tokens['access_token_secret']
			);
		}

		// 初回認証の処理
		if ( isset($auth['access_token']) && isset($auth['access_token_secret']) )
		{

			// トークンを保存
			file_put_contents(
				 "./token.txt", 
				$auth['access_token'] . "\t" . $auth['access_token_secret'] 
			);

			// 元々あった処理
			if ( isset($_GET['oauth_token']) )
			{
				$uri = $_SERVER['REQUEST_URI'];
				$parts = explode('?', $uri);
				header('Location: '.$parts[0]);
				return;
			}
		}

		$this->twitter->call(
			'statuses/update',
			array('status' => $this->input->post('text', TRUE) )
		);

	}
}
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[phpVarious]
CCBot/2.0 (https://commoncrawl.org/faq/)
24/12/06 23:13:01
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube