Blog

【PHPでfacebookとTwitterと連携する】けっ・・・・貴様と融合するくらいなら・・・・俺は死を選ぶ!

social

こんにちは、制作から開発にコンバートした奥田です。
これからは、よりDeveloperらしいことを発信していこうと思います。
よろしくお願いします。

さて、早速タイトルでツンデレ発言が飛び出しましたね。
詳しくは以下でベジータさんのツンデレ発言をご覧ください。

ベジータのツンデレ発言集

今回は、PHPでfacebookやTwitterと連携する方法をご紹介します。

Twitterで自分のフィードを取得する。

まずはTwiiterのフィードを取得してみましょう。
Twitterにフィードを取得したいアカウントでログインし、以下のページへ行きます。

Twitter Apps

Create an applicationをクリックし、アプリケーション名、説明、フィードを取得するサイトURLを入力します。

「Callback URL」はユーザーに認証させる場合は必要ですが、今回は自分のツイートを表示するだけなので必要ありません。

01

「Yes, I agree」にチェックして「Create your Twitter application」ボタンをクリックします。

02

画面下部にある「Create my access token」をクリックします。
「OAuth tool」というタブをクリックし、下記4つのKeyをメモ帳などにメモします。

03

次にgitHubからzipをダウンロードし(Downloadボタンはサイドバーの1番下にあります)、twitteroauthというフォルダーを丸ごとサーバーにアップします。(wordpressの場合はwp-contentフォルダー内)

https://github.com/abraham/twitteroauth

 require_once("twitteroauth/twitteroauth.php"); 
//Wordpressの場合 //require_once(WP_CONTENT_DIR"twitteroauth/twitteroauth.php");
 $cnt = 10;//表示件数 

//先ほどメモしたKey
$consumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$accessToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
$accessTokenSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxx";
 $twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);

 $req = $twObj->OAuthRequest("https://api.twitter.com/1.1/statuses/user_timeline.json","GET",array("count"=>$cnt));
 $tw_arr = json_decode($req);

 if (isset($tw_arr)) {
         foreach ($tw_arr as $key => $val) { echo $tw_arr[$key]->text;
   echo date('Y-m-d H:i:s', strtotime($tw_arr[$key]->created_at));
 echo '<br />'; 
     }
 } else {

 echo 'つぶやきはありません。'; 
}

 

これで最新Tweetを10件表示できます。
wordpressの場合はfunctionsに$tw_arrをreturnするように記述すればいいと思います。

facebookのフィードに投稿する

wordpressにはwordbookerという便利なプラグインが存在しますが、フレームワークなどで開発している際には自前でコードを書く必要があります。

まず、facebookのアカウントでログインし、以下のページからアプリを作成します。

facebook Apps

04

「Apps→新しいアプリを作成」をクリックします。

05

・アプリの名前
・アプリの名前空間(任意)
・アプリのカテゴリを入力し、「続行」を押します。

06

App IDとApp Secretをメモ帳にメモします。
「Facebookでログインが可能なウェブサイト」にチェックを入れ、サイトURLを入力します。

アプリの詳細から認証時の画像やキャプションなどいろいろ設定できますが今は割愛します。
facebook SDK for PHPをダウンロードします。

FB SDK for PHP

次に解凍したfacebookフォルダー内の/src/base_facebook.phpファイルのリダイレクトする urlを変更します。
594行目(現在の行番号です。)のredirect_urlを認証後のURLに変更します。(cakephpの場合http://exmaple.com/users/fb_callback/などとする)

07

facebookフォルダーをサーバーにアップロードします。(CakephpならVendorフォルダー)

以下はCakephp2.xのサンプルです。

Users tableを作成

CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) NOT NULL AUTO_INCREMENT,
 `username` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `passwd` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `facebook_id` bigint(64) NOT NULL,
 `facebook_access_token` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `created` datetime NOT NULL,
 `updated` datetime NOT NULL, PRIMARY KEY (`id`),
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=60 ;

//appControllerUsersController.php
 App::import('Vendor', 'facebook/src/facebook');
 class UsersController extends AppController {
	
	 public $uses = array('User');
	 public $facebook; 


	 public function beforefilter(){ 
		$this->Auth->allow('index','facebook','callback');
		
			 parent::beforeFilter();
		 }

		 /*** * * facebook 連携 * ****/ 
	
	public function facebook() { 
		//facebook インスタンス生成 
		$this->facebook = $this->createFacebook();
	
		 //権限を指定
		 $par = array('scope' => 'publish_stream,manage_pages');

		//ログインURLを取得
		 $url = $this->facebook->getLoginUrl($par);
		 //ログインURLへジャンプ $this->redirect($url);
		 }
	
	 public function fb_callback() {
		//facebookの認証処理部分 $this->autoRender = false;
	
		 $this->facebook = $this->createFacebook(); 
		 $me = null;
		 $user = $this->facebook->getUser();
		
		 if ($user) $me = $this->facebook->api('/me');
		 //access_token入手
		
		 $access_token = $this->facebook->getAccessToken();
		 $this->request->data['User']['username'] = $me['first_name'].'.'.$me['last_name'];
		 $this->request->data['User']['passwd'] = $access_token; $this->request->data['User']['facebook_id'] = $me['id'];
	  	 $this->request->data['User']['facebook_access_token'] = $access_token;
		 if ($this->Auth->login($this->data)){//Authの処理 $this->redirect($this->Auth->redirect());
			//ログイン成功したら、リダイレクト 
		} else {
			 }

		 }
		 /*** * * facebook App * ****/

		 private function createFacebook() {
			 return new Facebook(array( 'appId' => "先ほどメモしたAppId", 'secret' => "先ほどメモしたAppSecret", ));

			 }

 

投稿の追加ロジックで以下を記述すればwallに投稿できます。

 

	//行を作成
	 $this->Post->create();
	 //記事追加 
		
		if ($this->Post->saveAll($this->request->data)) {
			 $siteUrl = env('HTTP_HOST'); 
			$facebookApp = $this->FacebookApp->find("first");
			 	// ラストインサートIDを取得 
				$last_id = $this->Post->getLastInsertID();
				 // 投稿情報を取得 
				$fb_title = $this->request->data["Post"]["title"]; 
				$fb_body = strip_tags(mb_strimwidth($this->request->data["Post"]["body"],0,150,"..."));
				 // facebook Appをインスタンス化 
				$this->facebook = $this->createFacebook();
				 // facebook情報を取得 $user = $this->Auth->user();
				 // アクセストークン $access_token = $user['User']["access_token"];
				 // ユーザー名 $me = $user['User']['username']; 
				 // facebook_id $fb_id = $user['User']['facebook_id'];
				 //投稿ボディー内に画像があれば使用。
				
				 if(preg_match_all('/<img.*?src=(["'])(.+?)1.*?>/i',$this->request->data["Post"]["body"], $res)) 
					{
					 $fb_image = rtrim($siteUrl,"/").$res[2][0]; 
						} 
						try 
					 { $attachment = array( 
						 "message" => $fb_body,
						 "link" => rtrim($siteUrl,"/")."/posts/view/".$last_id."/",
						 "name" => $fb_title,
						 'picture' => $fb_image,
						 "description" => $post_body,
						 "access_token" => $access_token,
						 "actions" => json_encode(array( "name" => "投稿を見る",
						 "link" => rtrim($siteUrl,"/")."/posts/view/".$last_id."/")) );
					
					 $fb_result = $this->facebook->api("/".$fb_id."/feed","post",$attachment); 	
					} 
						catch (FacebookApiException $e) 
						{ 
						$this->Session->setFlash($e->__toString(), 'default', array('class'=>'alert-danger'),"message");
						 //リダイレクト	
							 return $this->redirect("/admin/posts/");
						 } 
						//セッションメッセージ
							 $this->Session->setFlash('記事を作成しました。', 'default', array('class'=>'alert-success'),"message");
								 //リダイレクト 
						return $this->redirect("/admin/posts/");

※根幹を大幅に端折り、修正しつつ記事にしたのでタイプミスなどあるかもしれません。
(実際は複数ドメインでやり取りしたり、facebook App_IDとAppSecretをDBに保存し、取り出せるようにしました。)
UsersController.phpでは通常ログインとfacebookログインどちらにも対応できるよう、passwordとaccesstokenどちらでも認証できるように記述してください。

今回参考にさせていただいたサイト

PHPでOAuth認証して自分のつぶやきを表示する [Twitter API 1.1 対応版]

CakePHPでFacebookにConnect、wallに投稿する機能つくってみました。

cakePHPでFacebookログイン

  • Knowledge DEPOT
  • サポートサイト