在 Twitter / CodeIgniter 项目中安装 cURL
Posted
技术标签:
【中文标题】在 Twitter / CodeIgniter 项目中安装 cURL【英文标题】:Installing cURL in a Twitter / CodeIgniter project 【发布时间】:2013-04-30 12:16:05 【问题描述】:我是 Twitter API 1.1 版的新手,在运行 http://localhost/twitter_test.php
时遇到此错误时正在关注 Jimbo's excellent answer to this question:
需要安装cURL,见:http://curl.haxx.se/docs/install.html
虽然我的 XP 机器上已经安装了 cURL,但如何在这个测试 codeigniter 项目中“安装 cURL”?
twitter_test.php
// Set access tokens here
$settings = array(
'oauth_access_token' => "My Access Token",
'oauth_access_token_secret' => "My Access Secret",
'consumer_key' => "My Consumer Key",
'consumer_secret' => "My Consumer Secret"
);
$url = 'https://api.twitter.com/1.1/followers/ids.json';
$getfield = '?username=somename';
$requestMethod = 'GET';
$twitter = new TwitterAPIExchange($settings);
echo $twitter->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
?>
TwitterAPIExchange.php(来源:j7mbo / twitter-api-php)
<?php
/**
* Twitter-API-PHP : Simple PHP wrapper for the v1.1 API
*
* PHP version 5.3.10
*
* @category Awesomeness
* @package Twitter-API-PHP
* @author James Mallison <me@j7mbo.co.uk>
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @link http://github.com/j7mbo/twitter-api-php
*/
class TwitterAPIExchange
private $oauth_access_token;
private $oauth_access_token_secret;
private $consumer_key;
private $consumer_secret;
private $postfields;
private $getfield;
protected $oauth;
public $url;
/**
* Create the API access object. Requires an array of settings::
* oauth access token, oauth access token secret, consumer key, consumer secret
* These are all available by creating your own application on dev.twitter.com
* Requires the cURL library
*
* @param array $settings
*/
public function __construct(array $settings)
if (!in_array('curl', get_loaded_extensions()))
exit('You need to install cURL, see: http://curl.haxx.se/docs/install.html');
if (!isset($settings['oauth_access_token'])
|| !isset($settings['oauth_access_token_secret'])
|| !isset($settings['consumer_key'])
|| !isset($settings['consumer_secret']))
exit('Make sure you are passing in the correct parameters');
$this->oauth_access_token = $settings['oauth_access_token'];
$this->oauth_access_token_secret = $settings['oauth_access_token_secret'];
$this->consumer_key = $settings['consumer_key'];
$this->consumer_secret = $settings['consumer_secret'];
/**
* Set postfields array, example: array('screen_name' => 'J7mbo')
*
* @param array $array Array of parameters to send to API
* @return \TwitterAPIExchange Instance of self for method chaining
*/
public function setPostfields(array $array)
if (!is_null($this->getGetfield()))
exit('You can only choose get OR post fields.');
$this->postfields = $array;
return $this;
/**
* Set getfield string, example: '?screen_name=J7mbo'
*
* @param string $string Get key and value pairs as string
* @return \TwitterAPIExchange Instance of self for method chaining
*/
public function setGetfield($string)
if (!is_null($this->getPostfields()))
exit('You can only choose get OR post fields.');
$this->getfield = $string;
return $this;
/**
* Get getfield string (simple getter)
*
* @return string $this->getfields
*/
public function getGetfield()
return $this->getfield;
/**
* Get postfields array (simple getter)
*
* @return array $this->postfields
*/
public function getPostfields()
return $this->postfields;
/**
* Build the Oauth object using params set in construct and additionals
* passed to this method. For v1.1, see: https://dev.twitter.com/docs/api/1.1
*
* @param string $url The API url to use. Example: https://api.twitter.com/1.1/search/tweets.json
* @param string $requestMethod Either POST or GET
* @return \TwitterAPIExchange Instance of self for method chaining
*/
public function buildOauth($url, $requestMethod)
if (strtolower($requestMethod) !== 'post' && strtolower($requestMethod) !== 'get')
exit('Request method must be either POST or GET');
$consumer_key = $this->consumer_key;
$consumer_secret = $this->consumer_secret;
$oauth_access_token = $this->oauth_access_token;
$oauth_access_token_secret = $this->oauth_access_token_secret;
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
$getfield = $this->getGetfield();
if (!is_null($getfield))
$getfields = str_replace('?', '', explode('&', $getfield));
foreach ($getfields as $g)
$split = explode('=', $g);
$oauth[$split[0]] = $split[1];
$base_info = $this->buildBaseString($url, $requestMethod, $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
$this->url = $url;
$this->oauth = $oauth;
return $this;
/**
* Perform the acual data retrieval from the API
*
* @param boolean optional $return If true, returns data.
* @return json If $return param is true, returns json data.
*/
public function performRequest($return = true)
if (!is_bool($return))
exit('performRequest parameter must be true or false');
$header = array($this->buildAuthorizationHeader($this->oauth), 'Expect:');
$getfield = $this->getGetfield();
$postfields = $this->getPostfields();
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
);
if (!is_null($postfields))
$options[CURLOPT_POSTFIELDS] = $postfields;
else
if ($getfield !== '')
$options[CURLOPT_URL] .= $getfield;
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
if ($return) return $json;
/**
* Private method to generate the base string used by cURL
*
* @param string $baseURI
* @param string $method
* @param string $params
* @return string Built base string
*/
private function buildBaseString($baseURI, $method, $params)
$return = array();
ksort($params);
foreach($params as $key=>$value)
$return[] = "$key=" . $value;
return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $return));
/**
* Private method to generate authorization header used by cURL
*
* @param array $oauth Array of oauth data generated by buildOauth()
* @return string $return Header used by cURL for request
*/
private function buildAuthorizationHeader($oauth)
$return = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key => $value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$return .= implode(', ', $values);
return $return;
【问题讨论】:
当你用 你在 cURL 的块中看到了什么? +1 cURL 没有块 因此,它已“安装”,但对 PHP 不可用(PHP 未配置为使用它...可能未使用 curl 扩展名编译)。见这里:php.net/manual/en/curl.installation.php 很高兴我把代码放在那里检查人们现在有 cURL! ;) +1 @Jimbo 非常感谢 TwitterAPIExchange.php 太棒了! 【参考方案1】:How to enable curl in xampp?
假设您使用的是 XAMPP。
无论如何,您可能只需要找到php.ini
,打开它,取消注释;extension=php_curl.dll
(删除分号)并重新启动apache。
【讨论】:
以上是关于在 Twitter / CodeIgniter 项目中安装 cURL的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 一项具有多个访问点、子域、htaccess 的服务
CodeIgniter 身份验证系统允许 3rd 方身份验证?