BASIC認証など以外、たとえばNTLMがかかっているときにcurlを実行する方法。
rss-php
PHPでRSSを取得できるパッケージです。
dg/rss-php: Small and easy-to-use library for consuming RSS and Atom feeds
実装
ひとつのファイルにまとめられていますし、長くも無いので読めると思います。
rss-php/Feed.php at b33661748d89d8c0c288e8d86feada6018d05031 · dg/rss-php
PHPのcurl関数を使用しています。
cURL関数の認証
Linuxのcurlと同等だとすると、デフォルトではuserとpassを入力してもBASIC認証しか対応できない。
curl コマンド | コマンドの使い方(Linux) | hydroculのメモ
オプションの設定
CURLOPT_HTTPAUTH | 使用する HTTP 認証方法。 以下の中から選びます。 CURLAUTH_BASIC、 CURLAUTH_DIGEST、 CURLAUTH_GSSNEGOTIATE、 CURLAUTH_NTLM、 CURLAUTH_ANY および CURLAUTH_ANYSAFE。 2 つ以上の方法を組み合わせるには、ビット演算子 |(or) を使用します。このような場合、cURL はサーバーがサポートしている方法を 問い合わせたうえで最適な方法を選択します。 CURLAUTH_ANY は CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM のエイリアスです。 CURLAUTH_ANYSAFE は CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM のエイリアスです。 |
コードを書き換える
(composerで入れて)
vendor/dg/rss-php/src/Feed.php
に
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
を追加してやる。
と、メソッドはこうなる。
/**
* Process HTTP request.
* @param string
* @param string
* @param string
* @return string|FALSE
* @throws FeedException
*/
private static function httpRequest($url, $user, $pass)
{
if (extension_loaded('curl')) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
if ($user !== NULL || $pass !== NULL) {
curl_setopt($curl, CURLOPT_USERPWD, "$user:$pass");
}
// ↓追加
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_TIMEOUT, 20);
curl_setopt($curl, CURLOPT_ENCODING , '');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // no echo, just return result
if (!ini_get('open_basedir')) {
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // sometime is useful :)
}
$result = curl_exec($curl);
return curl_errno($curl) === 0 && curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200
? $result
: FALSE;
} elseif ($user === NULL && $pass === NULL) {
return file_get_contents($url);
} else {
throw new FeedException('PHP extension CURL is not loaded.');
}
}