Services_TwitterでHTTPプロキシを使いたい
ソースを読んでるだけでも楽しいCodeRepos
PHPからTwitterのAPIを使うためのライブラリを見つけました。
会社にいるときにちょっと触ってみたのですが、うちの会社はプロキシサーバーを経由しないとWebに繋げないので、TwitterのAPIが使えませんでした。社内LANの内側で使うためにプロキシを設定できるようにしたい。ちょっとやってみよう。
PEAR/HttpRequest.php のソースコードを見ながら、Services_Twitterのソースコードに手を加えてみた。(ほとんどPEAR/HttpRequest.phpからのコピペ。いいのかなこんなんで。)
Index: src/Services/Twitter/Connector.php
===================================================================
--- src/Services/Twitter/Connector.php (revision 3381)
+++ src/Services/Twitter/Connector.php (working copy)
@@ -42,6 +42,30 @@
var $_body;
/**
+ * Proxy server
+ * @var string
+ */
+ var $_proxy_host;
+
+ /**
+ * Proxy port
+ * @var integer
+ */
+ var $_proxy_port;
+
+ /**
+ * Proxy username
+ * @var string
+ */
+ var $_proxy_user;
+
+ /**
+ * Proxy password
+ * @var string
+ */
+ var $_proxy_pass;
+
+ /**
* Class constructor
*
* @access public
@@ -99,6 +123,19 @@
}
}
+ // Proxy authentication
+ if (!empty($this->_proxy_user)) {
+ $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass));
+ }
+
+ // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
+ // connection token to a proxy server...
+ if (isset($this->_proxy_host) && !empty($this->_headers['connection']) &&
+ 'Keep-Alive' == $this->_headers['connection'])
+ {
+ $this->removeHeader('connection');
+ }
+
if (count($this->_body) > 0) {
foreach ($this->_body as $line) {
$body .= $line . "\r\n";
@@ -111,6 +148,9 @@
if (isset($url['query'])) {
$path .= '?' . $url['query'];
}
+ $proxy_host = isset($this->_proxy_host) ? $url['scheme'] . '://' . $url['host'] : '';
+ $proxy_port = (isset($this->_proxy_host) AND $url['port'] != 80) ? ':' . $url['port'] : '';
+ $path = $proxy_host . $proxy_port . $path;
// definity send target
$request .= $method . ' ' . $path . ' HTTP/1.1'."\r\n";
@@ -130,7 +170,11 @@
$request .= $body;
// send request
- $fp = fsockopen($url['host'], $url['port']);
+ if( $this->_proxy_host ) {
+ $fp = fsockopen( $this->_proxy_host, $this->_proxy_port );
+ } else {
+ $fp = fsockopen($url['host'], $url['port']);
+ }
if (!$fp) return false;
fputs($fp, $request);
$response = '';
@@ -234,4 +278,22 @@
return $this->_basic_auth;
}
+
+ /**
+ * Sets a proxy to be used
+ *
+ * @param string Proxy host
+ * @param int Proxy port
+ * @param string Proxy username
+ * @param string Proxy password
+ * @access public
+ */
+ function setProxy($host, $port = 8080, $user = null, $pass = null)
+ {
+ $this->_proxy_host = $host;
+ $this->_proxy_port = $port;
+ $this->_proxy_user = $user;
+ $this->_proxy_pass = $pass;
+ }
+
}
\ No newline at end of file
Index: src/Services/Twitter.php
===================================================================
--- src/Services/Twitter.php (revision 3381)
+++ src/Services/Twitter.php (working copy)
@@ -330,6 +330,30 @@
var $_cache_dir;
/**
+ * Proxy server
+ * @var string
+ */
+ var $_proxy_host;
+
+ /**
+ * Proxy port
+ * @var integer
+ */
+ var $_proxy_port;
+
+ /**
+ * Proxy username
+ * @var string
+ */
+ var $_proxy_user;
+
+ /**
+ * Proxy password
+ * @var string
+ */
+ var $_proxy_pass;
+
+ /**
* class constructor
*
* @access public
@@ -491,6 +515,23 @@
}
/**
+ * Sets a proxy to be used
+ *
+ * @param string Proxy host
+ * @param int Proxy port
+ * @param string Proxy username
+ * @param string Proxy password
+ * @access public
+ */
+ function setProxy($host, $port = 8080, $user = null, $pass = null)
+ {
+ $this->_proxy_host = $host;
+ $this->_proxy_port = $port;
+ $this->_proxy_user = $user;
+ $this->_proxy_pass = $pass;
+ }
+
+ /**
* send update request
*
* @access private
@@ -503,6 +544,13 @@
{
$req =& new Services_Twitter_Connector();
+ if( isset($this->_proxy_host) ) {
+ $req->setProxy( $this->_proxy_host
+ , $this->_proxy_port
+ , $this->_proxy_user
+ , $this->_proxy_pass );
+ }
+
if (!$this->checkAuth()) {
$req->enableBasicAuth($this->_user, $this->_pass);
}
@@ -605,6 +653,13 @@
$req =& new Services_Twitter_Connector();
+ if( isset($this->_proxy_host) ) {
+ $req->setProxy( $this->_proxy_host
+ , $this->_proxy_port
+ , $this->_proxy_user
+ , $this->_proxy_pass );
+ }
+
if (!$this->checkAuth()) {
$req->enableBasicAuth($this->_user, $this->_pass);
}
@@ -712,6 +767,13 @@
}
$req =& new Services_Twitter_Connector();
+ if( isset($this->_proxy_host) ) {
+ $req->setProxy( $this->_proxy_host
+ , $this->_proxy_port
+ , $this->_proxy_user
+ , $this->_proxy_pass );
+ }
+
$req->addHeader('User-Agent', 'PHP/' . phpversion());
$response = $req->sendRequest($url, $method);
$response = explode("\r\n", $response);
@@ -1078,4 +1140,4 @@
return false;
}
}
-}
\ No newline at end of file
+}BlackJumboDogでプロキシサーバーを立ててテスト。無事にFriendsTimelineが取得できました。やったね!
<?php // ソースのある場所にパスを通す。 set_include_path('.;C:\Program Files\xampp\php\PEAR;C:\work\coderepos\lang\php\Services_Twitter\src'); require_once( 'Services/Twitter.php' ); // Services_Twitterを生成して、JSONをデコードしてもらうように設定する。 $twitter = new Services_Twitter( 'drgqst', '********'); $twitter->enableJsonConvert(); // 今回追加したメソッド。プロキシサーバーをセットする。 $twitter->setProxy('localhost', 8080 ); // お友達のタイムラインを取得 $friendsTimeline = $twitter->getFriendsTimeline(); var_dump( $friendsTimeline ); ?>
ところで、これってコミットしていいものなのかな・・・?
この辺の空気がまだよくわかってない。やっぱり勝手にコミットしたりしちゃマズいよね。。。作った人に連絡してみよう。そうだそうだそれがいいそうしよう。