Archives by date

You are browsing the site archives by date.

PHPのmail()関数とmb_send_mail()関数の違い。

メモ。

■mb_send_mail()

自動でヘッダーに以下を追加してくれる。

MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

また、mb_language()の設定に基づき、第1引数から第3引数までを自動でエンコードしてくれる。
mb_languag(‘ja’)ならiso-2022-jp、mb_languag(‘uni’)ならutf-8へ変換。
ヘッダーに関してはmb_encode_mimeheader()してくれるという至れり尽くせりっぷり。

■mail()

全部自分でやれや。

 

 

 

 

 

 

( ゚д゚ )

 

 

こっちみn(ry

 

 

 

まぁ添付ファイルを送りたい際はヘッダーがplainだと問題あるのでmail()使うしかないんですけどね。

PHP、file_exists()のおさらい。

file_exists ? ファイルまたはディレクトリが存在するかどうか調べる。

 

ファイルまたはディレクトリが存在するかどうか調べる。

 

ファイルまたはディレクトリが存在するかどうか調べる。

 

ファイルまたはディレクトリが存在するかどうか調べる。

 

関数名に騙されないこと!!!
十分注意されたし!!!

 

PHPで行うスマートな文字列置換方法の考察。

テンプレートファイルなんかの文字列をスマートに置換する案のメモ。

1, 配列のキーに置換対象の文字列を、バリューに置換する文字列をセットする。

2, テンプレート読み込み

3, array_keys()、array_values()、str_replace()を使い一気に置換。

例えば以下のような感じ。

■テンプレート側

1個目:{%foo%}
2個目:{%bar%}
3個目:{%baz%}

■PHP側

$template = file_get_contents('/path/to/template.ext');

$vars = array(
	'foo' => 'hoge',
	'bar' => 'fuga',
	'baz' => 'piyo'
);

foreach($vars as $varName => $value) $varArray['{%'.$varName.'%}'] = $value;

$str = str_replace(array_keys($varArray) ,array_values($varArray) , $template);

var_dump($str);

いかがなものか。

PHPにて配列を変数に変換する方法。

extract()関数を用いると配列のKeyを変数名に、値をValueとして変換してくれる。
フレームワークなどでよく用いられる。

以下使用例。

$array = array(
	'foo' => 'hoge',
	'bar' => 'fuga',
	'baz' => 'piyo'
);

extract($array);

var_dump($foo);
var_dump($bar);
var_dump($baz);
↓
string(4) "hoge" string(4) "fuga" string(4) "piyo"

変換した変数がすでに定義されていた場合も、変換後の値で上書きされるので注意。

$foo = 'GEKIOKO_PUNPUN_MARU';

$array = array(
	'foo' => 'hoge',
	'bar' => 'fuga',
	'baz' => 'piyo'
);

// 第2引数の「EXTR_OVERWRITE」は明示的に上書きモードで固定するためのもの。
// 指定しなければ通常このモードで動作する(模様)。
extract($array, EXTR_OVERWRITE);

var_dump($foo);
var_dump($bar);
var_dump($baz);
↓
string(4) "hoge" string(4) "fuga" string(4) "piyo"

変数の上書きを許可したくない場合は、第2引数へ「EXTR_SKIP」を渡せばよい。

$foo = 'GEKIOKO_PUNPUN_MARU';
$bar = '';

$array = array(
	'foo' => 'hoge',
	'bar' => 'fuga'
);

extract($array, EXTR_SKIP);

var_dump($foo);
var_dump($bar);
↓
string(19) "GEKIOKO_PUNPUN_MARU" string(0) ""

「EXTR_PREFIX_SAME」を渡すと、変数の衝突が起きた際、第3引数に指定した値をプレフィックスとして先頭に追加してくれる。

$foo = 'GEKIOKO_PUNPUN_MARU';
$bar = '';

$array = array(
	'foo' => 'hoge',
	'bar' => 'fuga'
);

extract($array, EXTR_PREFIX_SAME, 'pre');

var_dump($foo);
var_dump($bar);
// [prefix] + [_] + [key]、というように連結される
var_dump($pre_foo);
var_dump($pre_bar);
↓
string(19) "GEKIOKO_PUNPUN_MARU" string(0) "" string(4) "hoge" string(4) "fuga"

「EXTR_PREFIX_ALL」を渡すと、衝突の有無に関わらず全てがプレフィックス付きの変数となる。

$array = array(
	'foo' => 'hoge',
	'bar' => 'fuga'
);

extract($array, EXTR_PREFIX_ALL , 'pre');

var_dump($pre_foo);
var_dump($pre_bar);
↓
string(4) "hoge" string(4) "fuga"

 

PHPにて文字列の末端1文字を取り除く。

超絶基礎だけどめも。

$str = 'aaaa,bbbb,cccc,';
$res = substr($str, 0, -1);
// 文字列がマルチバイトの場合はmb_substr()を使用
var_dump($res);

文字列のループ連結後、末端を丸め込む際に使用。

自分用メール送信クラスを作った。

Reply-Toとか細かい設定はないけど、よく使う(と思われる)部分をシンプルに実装。

<?php
/**
 * sendmailを用いたシンプルなメール送信用クラス
 * 単純に送信したい場合は以下の通り
 * ※to, cc, bcc, のいずれか一つの指定は必須
 * 
 * $mail = new simpleMailTransmission();
 * 		
 * $res = $mail
 * ->to('to@local.host') // 必要に応じて
 * ->cc('cc@local.host') // 必要に応じて
 * ->Bcc('bcc@local.host') // 必要に応じて
 * ->from('from@local.host') // 必須
 * ->subject('タイトルを指定')
 * ->send('本文を指定');
 * 
 */
class simpleMailTransmission {
	
	// 送信先
	protected $to = array();
	
	// メールタイトル
	protected $subject = '';
	
	// メール本文
	protected $message = '';
	
	// ヘッダー情報
	protected $header = '';
	
	// 送信先一時格納変数(複数可)
	protected $_to = array();
	
	// 送信元設定
	protected $_from = array();
	
	// Cc格納変数
	protected $_cc = array();

	// Bcc格納変数
	protected $_bcc = array();

	// ヘッダー情報一時格納変数
	protected $_header = '';
	
	// テンプレートファイルパス
	protected $_template = '';
	
	// テンプレートに渡す変数
	protected $_viewVars = array();
	
	/**
	 * 送信先のセット
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return multitype:|mailTerminal
	 */
	public function to($email = null, $name = null) {
		if($email === null) {
			return $this->_to;
		}
		return $this->_setEmail('_to', $email, $name);
	}
	
	/**
	 * 送信先の追加
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	public function addTo($email, $name = null) {
		return $this->_addEmail('_to', $email, $name);
	}

	/**
	 * Ccのセット
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return multitype:|mailTerminal
	 */
	public function cc($email = null, $name = null) {
		if($email === null) {
			return $this->_cc;
		}
		return $this->_setEmail('_cc', $email, $name);
	}
	
	/**
	 * Ccの追加
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	public function addCc($email, $name = null) {
		return $this->_addEmail('_cc', $email, $name);
	}
	
	/**
	 * Bccのセット
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return multitype:|mailTerminal
	 */
	public function bcc($email = null, $name = null) {
		if($email === null) {
			return $this->_bcc;
		}
		return $this->_setEmail('_bcc', $email, $name);
	}
	
	/**
	 * Bccの追加
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	public function addBcc($email, $name = null) {
		return $this->_addEmail('_bcc', $email, $name);
	}
	
	/**
	 * セット用メソッド
	 * @param unknown_type $varName
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	protected function _setEmail($varName, $email, $name) {
		if(self::email($email)) {
			if($name === null) {
				$name = $email;
			}
			$this->{$varName} = array($email => $name);
		}
		return $this;
	}
	
	/**
	 * 追加用メソッド
	 * @param unknown_type $varName
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	protected function _addEmail($varName, $email, $name) {
		if(self::email($email)) {
			if($name === null) {
				$name = $email;
			}
			$this->{$varName}[$email] = $name;
		}
		return $this;
	}
	
	/**
	 * 送信元の設定
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return multitype:|mailTerminal
	 */
	public function from($email = null, $name = null) {
		if($email === null) {
			return $this->_from;
		}
		return $this->_setEmailSingle('_from', $email, $name);
	}
	
	/**
	 * 単一の値であることを保障するためのセット関数
	 * @param unknown_type $varName
	 * @param unknown_type $email
	 * @param unknown_type $name
	 * @return mailTerminal
	 */
	protected function _setEmailSingle($varName, $email, $name) {
		$current = $this->{$varName};
		$this->_setEmail($varName, $email, $name);
		if(count($this->{$varName}) !== 1) {
			$this->{$varName} = $current;
		}
		return $this;
	}
	
	/**
	 * メールタイトルのセット
	 * @param unknown_type $subject
	 * @return string|mailTerminal
	 */
	public function subject($subject = null) {
		if($subject === null) {
			return $this->subject;
		}
		$this->subject = (string)$subject;
		return $this;
	}
	
	/**
	 * テンプレートファイルパスの指定
	 * @param unknown_type $template
	 * @return string|mailTerminal
	 */
	public function template($template = false) {
		if($template === false) {
			return $this->_template;
		}
		$this->_template = $template;
		return $this;
	}
	
	/**
	 * テンプレートファイルに渡す変数を設定
	 * @param unknown_type $viewVars
	 * @return multitype:|mailTerminal
	 */
	public function viewVars($viewVars = null) {
		if($viewVars === null) {
			return $this->_viewVars;
		}
		$this->_viewVars = array_merge($this->_viewVars, (array)$viewVars);
		return $this;
	}
	
	/**
	 * メールアドレスのバリデーション設定
	 * @param unknown_type $check
	 * @return boolean
	 */
	protected function email($check) {
		$hostName = '(?:[_a-z0-9][-_a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})';
		$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@'.$hostName.'$/i';
		return self::_check($check, $regex);
	}
	
	/**
	 * メールの送信開始トリガー
	 * @param unknown_type $plainMessage
	 * @return string|Ambigous <boolean, multitype:boolean >
	 */
	public function send($plainMessage = null) {
		if(empty($this->_from)) {
			return 'From is not specified.';
		}
		if(empty($this->_to) && empty($this->_cc) && empty($this->_bcc)) {
			return 'You need to specify at least one destination for to, cc or bcc.';
		}
		$this->header = $this->createHeader();
		$this->to = $this->createTo();
		if(!file_exists($this->_template)) {
			$this->message = self::mce($plainMessage);
		} else {
			$this->message = self::mce($this->createMessage());
		}
		return self::_send();
	}
	
	/**
	 * 送信処理
	 * @return boolean|multitype:boolean
	 */
	protected function _send() {
		mb_language('ja');
		mb_internal_encoding('UTF-8');
		if(empty($this->to)) {
			return mb_send_mail(null, $this->subject, $this->message, $this->header);
		} else {
			$_errors = array();
			foreach($this->to as $to) {
				if(!mb_send_mail($to, $this->subject, $this->message, $this->header)) $_errors[$to] = false;
			}
			if(empty($_errors)) return true;
			return $_errors;
		}
	}
	
	/**
	 * 追加ヘッダーの生成
	 * @return string
	 */
	protected function createHeader() {
		foreach($this->_from as $email => $name) $this->_header .= 'From: '.self::mem($name).' <'.$email.'>'."\n";
		if(!empty($this->_cc)) {
			$this->_header .= 'Cc: ';
			foreach($this->_cc as $email => $name) {
				$this->_header .= self::mem($name).' <'.$email.'>'."\n,";
			}
			$this->_header = self::trimLastChar($this->_header);
		}
		if(!empty($this->_bcc)) {
			$this->_header .= 'Bcc: ';
			foreach($this->_bcc as $email => $name) {
				$this->_header .= self::mem($name).' <'.$email.'>'."\n,";
			}
			$this->_header = self::trimLastChar($this->_header);
		}
		return $this->_header;
	}
	
	/**
	 * 送信先ヘッダーの生成
	 * @return multitype:string
	 */
	protected function createTo() {
		$t = array();
		if(!empty($this->_to)) {
			foreach($this->_to as $email => $name) {
				$t[] = self::mem($name).' <'.$email.'>';
			}
		}
		return $t;
	}
	
	/**
	 * テンプレートより本文の生成
	 * @return Ambigous <string, mixed>
	 */
	protected function createMessage() {
		$b = '';
		$tmp = file_get_contents($this->_template);
		if($tmp) {
			$varArray = array();
			if(!empty($this->_viewVars)) {
				foreach($this->_viewVars as $varName => $value) {
					$varArray['{%'.$varName.'%}'] = $value;
				}
			}
			$b = str_replace(array_keys($varArray) , array_values($varArray) , $tmp);
		}
		return $b;
	}
	
	/**
	 * バリデーションの実行
	 * @param unknown_type $check
	 * @param unknown_type $regex
	 * @return boolean
	 */
	protected function _check($check, $regex) {
		if(preg_match($regex, $check)) return true;
		return false;
	}
	
	protected function mem($var) {
		return mb_encode_mimeheader($var);
	}
	
	protected function mce($var) {
		return mb_convert_encoding($var, 'ISO-2022-JP');
	}
	
	protected function trimLastChar($var) {
		return substr($var, 0, -1);
	}
}

基本的な使い方はクラス上部のコメントアウトを参照。
テンプレートファイルを用いる場合の使用例は以下の通り。

■テンプレートファイル
文字列で置換したい部分を「{%…%}」で囲い定義する。
※.txtファイルだろうが無拡張子だろうが読み込めれば何でもOK

{%name%} 様

テストメッセージテストメッセージテストメッセージ
テストメッセージテストメッセージテストメッセージ
テストメッセージテストメッセージテストメッセージ

担当 {%charge%}

{%url%}

{%footer%}

PHP側から以下のように変数とテンプレートをセットし、メールを送信する。

$params = array(
	'name' => 'テスト太郎',
	'charge' => 'テスト花子',
	'url' => 'http://localhost.com',
	'footer' => '株式会社テストテスト'
);

$mail = new simpleMailTransmission();
$res = $mail
->to('to@local.host')
->from('from@local.host')
->subject('テストメールなう。')
->viewVars($params)
->template('/path/to/template.txt')
->send();

イイ感じ。

ニコニコ動画ダウンロード用のクラスを作った。

今更ながら必要だったので作成。

以下のページを参考にさせて頂きました。
http://istb16.wordpress.com/2011/09/11/niconico_download_for_php/

goto構文使ってるのでphp5.3以上じゃないと動作しません。

<?php 
/**
 * ニコニコ動画保存用クラス
 * 
 * $nico = new niconicoMovieDownloader();
 * $nico->email = 'ログインメールアドレス';
 * $nico->password = 'ログインパスワード';
 * $nico->saveDir = '動画保存用ディレクトリ'; // 末端DS無し
 * $nico->tmpDir = '作業用ディレクトリ'; // 末端DS無し
 * $res = $nico->download('sm*******');
 * 
 * @author Owner
 *
 */
class niconicoMovieDownloader {
	
	// ログイン用メールアドレス
	public $email = '';
	
	// ログインパスワード
	public $password = '';
	
	// 動画保存ディレクトリ(末端スラッシュ無し)
	public $saveDir = '';
	
	// 一時作業ディレクトリ(末端スラッシュ無し)
	public $tmpDir = '';
	
	// 動画ID(sm****)
	protected $mid = '';
	
	// 送信ヘッダーの入れ物
	protected $headers = array();
	
	// エラーメッセージの入れ物
	protected $errors = array();
	 
	// input要素の名前設定(メールアドレス欄)
	protected $formNameEmail = 'mail_tel';
	
	// input要素の名前設定(パスワード欄)
	protected $formNamePassword = 'password';
	
	// input要素の名前設定(移動先URL欄)
	protected $formNameNextUrl = 'next_url';
	
	// ニコニコ動画ログインポストURL。間違えると動画ページを取得できないので注意。
	protected $loginUrl = 'https://secure.nicovideo.jp/secure/login?site=niconico';
	
	// 動画ページのURL設定
	protected $watchUrl = 'http://www.nicovideo.jp/watch';
	
	// ダウンロードURLを割り出すAPIの設定
	protected $apiUrl = 'http://flapi.nicovideo.jp/api/getflv';
	
	/**
	 * インスタンス生成時、送信ヘッダーを設定
	 */
	public function __construct() {
		$this->headers[] = 'Connection: keep-alive';
		$this->headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
		$this->headers[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36';
		$this->headers[] = 'Referer: http://www.nicovideo.jp/';
		$this->headers[] = 'Accept-Language: ja,en-US;q=0.8,en;q=0.6';
	}
	
	/**
	 * ダウンロードの実行
	 * @param string $mid
	 * @return multitype:|boolean
	 */
	public function download($mid = null) {
		$this->mid = $mid;
		$this->checkParams();
		if(!empty($this->errors)) return $this->errors;
		// cookieを持ちまわすためのファイルパスを指定
		$tmpCookiePath = $this->tmpDir . DIRECTORY_SEPARATOR . '_cookie';
		$tmpWorkPath = $this->tmpDir . DIRECTORY_SEPARATOR . md5(microtime());
		$headerFilePath = $this->tmpDir . DIRECTORY_SEPARATOR . 'h_' . $this->mid;
		self::tp($tmpCookiePath);
		self::tp($tmpWorkPath);
		self::tp($headerFilePath);
		
		$params = array(
				$this->formNameEmail => $this->email,
				$this->formNamePassword => $this->password,
				$this->formNameNextUrl => $this->watchUrl . DIRECTORY_SEPARATOR . $this->mid
		);
		$ch = curl_init();
		//curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpCookiePath);
		//curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpCookiePath);
		curl_setopt($ch, CURLOPT_URL, $this->loginUrl);
		curl_setopt($ch, CURLOPT_POST, true);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
		
		$output = curl_exec($ch);
		
		$params = array('v' => $this->mid);
		curl_setopt($ch, CURLOPT_URL, $this->apiUrl);
		curl_setopt($ch, CURLOPT_HTTPGET, true);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
		
		$output = curl_exec($ch);
		
		// DLリンクの解析
		preg_match("'url=(.*?)&link'", urldecode($output), $m);
		if(empty($m)) goto exception;
		
		curl_setopt($ch, CURLOPT_POSTFIELDS, array());
		curl_setopt($ch, CURLOPT_URL, $m[1]);
				
		// 動画DLセクション
		$execResult = false;
		$hdFp = fopen($headerFilePath, 'w');
		if($hdFp) {
			//プロセス実行中でも書き込んでくれるWRITEHEADERを利用
			curl_setopt($ch, CURLOPT_WRITEHEADER, $hdFp);
			$twFp = fopen($tmpWorkPath, 'wb');
			if($twFp) {
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
				curl_setopt($ch, CURLOPT_FILE, $twFp);
				$execResult = curl_exec($ch);
				curl_close($ch);
				fclose($twFp);
			}
			fclose($hdFp);
		}
		if(!$execResult) goto exception;
		
		// headerFileの解析(ファイルタイプ、拡張子を取得)
		$contentType = self::parseHeaderFile($headerFilePath);
		$ext = self::getFileExtension($contentType);
		
		// 実ファイルのパスを指定(お名前指定)
		$filePath = $this->saveDir . DIRECTORY_SEPARATOR . $this->mid . $ext;
		// ファイル移動
		rename($tmpWorkPath, $filePath);
		
		// 作業ファイル削除
		self::u($tmpCookiePath);
		self::u($tmpWorkPath);
		self::u($headerFilePath);
		return true;
		
		if(false) {
			exception:
			self::u($tmpCookiePath);
			self::u($tmpWorkPath);
			self::u($headerFilePath);
			curl_close($ch);
			return false;
		}	
	}
	
	/**
	 * ファイルの存在確認と作成、及び権限の付与
	 * @param unknown $path
	 */
	protected function tp($path) {
		if(!file_exists($path)) touch($path);
		chmod($path, 0777);
	}
	
	/**
	 * ファイルの存在確認と削除
	 * @param unknown $path
	 */
	protected function u($path) {
		if(file_exists($path)) unlink($path);
	}

	/**
	 * パラメーターチェック
	 */
	protected function checkParams() {
		if(!self::validateEmail($this->email)) array_push($this->errors, 'please check your email address.');
		if(empty($this->password)) array_push($this->errors, 'password is required but not set.');
		if(!is_dir($this->saveDir)) array_push($this->errors, 'saveDir must be a directory.');
		if(fileperms($this->saveDir) != '16895') array_push($this->errors, 'saveDir required to be permission 777.');
		if(!is_dir($this->tmpDir)) array_push($this->errors, 'tmpDir must be a directory.');
		if(fileperms($this->tmpDir) != '16895') array_push($this->errors, 'tmpDir required to be permission 777.');
		if(empty($this->mid)) array_push($this->errors, 'mid is required but not set.');
		if(!self::validateMid($this->mid)) array_push($this->errors, 'ID starting from nm is not allowed (sm****** only).');
	}
	
	/**
	 * メールアドレスのバリデーション
	 * @param unknown $check
	 * @return boolean
	 */
	protected function validateEmail($check) {
		$hostname = '(?:[_a-z0-9][-_a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})';
		$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . $hostname . '$/i';
		if (preg_match($regex, $check)) return true;
		return false;
	}
	
	/**
	 * 動画IDの正規バリデーション
	 * @param unknown $check
	 * @return boolean
	 */
	protected function validateMid($check) {
		$regex = '/^(sm)[0-9]+$/';
		if (preg_match($regex, $check)) return true;
		return false;
	}
	
	/**
	 * ヘッダーファイルの情報を解析
	 * @param unknown $path
	 * @return Ambigous <NULL, string>
	 */
	protected function parseHeaderFile($path) {
		$hd = file_get_contents($path);
		$ct = null;
		$k = 'Content-Type:';
		$st = stripos($hd, $k);
		if($st !== false) {
			$st += strlen($k);
			$ed = strpos($hd, "\n", $st);
			if($ed === false) $ed = strlen($hd);
			$l = $ed - $st;
			$ct = strtolower(trim(substr($hd, $st, $l)));
		}
		return $ct;	
	}
	
	/**
	 * コンテントタイプより動画ファイルの拡張子を分析し返却
	 * @param unknown $ct
	 * @return string
	 */
	protected function getFileExtension($ct) {
		$e = '';
		switch($ct) {
			case 'video/3gpp':
				$e = '.3gp';
				return $e;
			case 'video/mp4':
				$e = '.mp4';
				return $e;
			case 'video/x-flv':
			default:
				$e = '.flv';
				return $e;
		}
	}
}

コメントアウトにもあるけど、使い方は以下の通り。

$nico = new niconicoMovieDownloader();
$nico->email = 'ログインメールアドレス';
$nico->password = 'ログインパスワード';
$nico->saveDir = '動画保存用ディレクトリ'; // 末端DS無し
$nico->tmpDir = '作業用ディレクトリ'; // 末端DS無し
$res = $nico->download('sm*******');

気が向いたら動画再生ページのパーサー実装しようかな。

ChromeでHTTPヘッダを確認する。

メモ。

1, Chromeのアドレスバーに以下を入力
「chrome://net-internals/」

2, 出てきた画面上部のプルダウンメニューから「Events」を選択

3, 該当のリクエストをクリックし、右側の詳細ログからHTTPヘッダ情報を探し出す。

他にも色々と情報が除ける模様。