因為工作需求的關係,需要使用到 phpFlickr 這一個類別來使用 Flickr API。但是,這一個類別有一個問題,就是 SESSION 的檢查,萬一在使用這個類別之前,有先拉出 session 的話,會造成重覆傳遞 auth()
的認證而掛點。在 Firefox 裡面就會告訴你,此網頁重新導向 (Redirect) 方式不正確,的錯誤訊息。
所以,我利用了 php 5 在類別上的一些方法,利用 _get
與 _set
的方式將 session 資料──基於使用習慣,我在開發的時候幾乎都會這麼做──儲存在資料庫中,再接著改寫 phpFlickr 的 Class 將他擴展出來,利用 Class extends 的方式,將原有的類別擴展出一個新的函式,這個函式用來檢查資料庫是否有關於 flickr 的 session 資料,若是有,就將這個 flickr 的 session 丟給 $this->token
就可以了。
這樣就可以在 SESSION 發生問題時,完美解決傳遞錯誤造成的導向不正確的問題囉!
方法很簡單,至於是不是要利用 session 的自訂類別將它儲存在資料庫中,這就見仁見智。基本上,只要把在 auth 做完之後的東西儲存到資料庫就好了。
<?php
DEFINE('ROOT', '../');
require_once (ROOT.'lib/MySQL.class.php');
require_once (ROOT.'lib/UserSession.class.php');
require_once (ROOT.'lib/phpFlickr.php');
/* API KEY */
$api_key = "你的 API KEY";
$api_secret = "你的密鑰";
class flickrAPI extends phpFlickr
{
/* modify by Hina. */
function flickrAPI($api_key, $api_secret) {
global $objSession;
$this->phpFlickr($api_key, $api_secret);
$token = (!empty($_SESSION['phpFlickr_auth_token'])) ? $_SESSION['phpFlickr_auth_token'] : $objSession->phpFlickr_auth_token;
$this->token = (!empty($token)) ? $token : "";
}
function auth_getToken ($frob)
{
/* http://www.flickr.com/services/api/flickr.auth.getToken.html */
$this->request('flickr.auth.getToken', array('frob'=>$frob));
session_register('phpFlickr_auth_token');
$_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token'];
/* modify by Hina. */
global $objSession;
$objSession->phpFlickr_auth_token = $this->parsed_response['auth']['token'];
return $this->parsed_response ? $this->parsed_response['auth'] : false;
}
}
$__flickr = new flickrAPI($api_key, $api_secret);
上述文中的 $objSession 是我自己所撰寫的 UserSession 類別。你可以在這一篇文章中找到這一個類別來使用。而那個 MySQL.class.php 這個類別可以在這一篇文章中找到。這只是個範例,你可以依照你的需求或是習慣去做修改。
上面那個內文就是一個檔案,我是命名為 api.flickr.php.ini 然後丟到 includes 裡面用 require_once
的方式引入,所以它會自動去呼叫一個 $__flickr
來用,這個就端看個人習慣了。
然後 auth.php 這一支 Call Back 的檔案,也是要修改,但是改的不多。我的 Call back 是放在 /flickrapi/
目錄底下,所以他的 ROOT 相對位置是 ../
,這一點可能跟其他人不同。
<?
define ('ROOT', '../');
require_once (ROOT.'lib/MySQL.class.php');
require_once (ROOT.'lib/UserSession.class.php');
require_once (ROOT.'lib/phpFlickr.php');
$permissions = "read";
ob_start();
require_once (ROOT.'includes/api.flickr.php.inc');
if (!empty($_GET['extra'])) {
$redirect = $_GET['extra'];
}
if (empty($_GET['frob'])) {
$__flickr->auth($permissions, false);
} else {
$__flickr->auth_getToken($_GET['frob']);
}
if (empty($redirect)) {
header("Location: " . $default_redirect);
} else {
header("Location: " . $redirect);
}
注意一下,我的 permissions 是只設定 read 而已。而原來的設定是儲存在 SESSION 裡面的,當然,這也是可以做修改的啦!但是由於我不需要 read 以外的權限,所以我就把這個設定固定在 read 了。
就降,可以完美的繞過 SESSION 的檢查的問題,這樣就可以隨時呼叫 flickr API 來使用,而不會因為 SESSION 問題而卡住了。