WPのプラグインなしで自動でWebサイトのキャプチャ画像を作成する

  • 2014年10月28日
WPのプラグインなしで自動でWebサイトのキャプチャ画像を作成する

Wardpressのプラグインを使用せず、簡単なコードを記述するだけで、Webサイトのキャプチャ画像を取得する方法の紹介です。コピペができるように最後にコピペ用のソースコードも記述してあります。

全体の構造

Webサイトのキャプチャを取得するための、クラスを作成し、大まかな関数を入力していきます。
「wpCaptcha」というclassをまずは作成します。その中に初期化用の「__construct」、キャプチャ画像を保存するディレクトリが存在するか確認し、存在しなかった場合に新しく保存用のディレクトリを作成するようの「isUploadsDir」、同じサイトのキャプチャがないか確認し、サイトのキャプチャの取得、保存する「getHtmlCaptcha」。
上にあげた3つの関数をベースに作成していきます。

class wpCaptcha {
  function __construct(){
    //コンストラクタ:クラスが生成されたときに読み込まれる関数
  }

  private function isUploadsDir(){
    //キャプチャを作成し、その画像をアップロードするためのディレクトリ確認
  }

  public function getHtmlCaptcha($url = null){
    //キャプチャを取得・保存するための関数
  }
}

コンストラクタの作成

クラスが生成されて一番最初に読み込まれるコンストラクタから作成していきます。
コンストラクタに引数を指定すると、その引数が「new wpCaptcha();」と呼び出されたときの引数となります。「new wpCaptcha(‘WP_CONTENT_DIR’);」といった感じに指定できます。
初期値が入っている引数に関しては、通常の関数と同様記述しなくても、初期値が採用されるので問題ありません。今回は下記の場所にキャプチャを保存します。

wp-content/captcha

wp-contentの絶対パスを取得し、その中に指定したディレクトリを作成。そのディレクトリのパスをクラス内の変数「$upload_dir」で保持させます。

class wpCaptcha {
  private   $upload_dir = '';          //アップロード用ディレクトリ名

  function __construct( $dir, $upload_dir = 'captcha'){
    $this->upload_dir = $dir.'/'.$upload_dir;
  }

アップロード先のディレクトリの作成と確認

アップロードする前に、アップロードディレクトリの確認をします。もし、アップロード先に指定されているディレクトリがない場合は自動的にそのディレクトリを作成します。変数「$chmod」はその場合にアップロードディレクトリのパーミッションを指定するためのものです。「mkdir」の第二引数を使用してパーミッションを設定することが可能ですが、あまり優秀ではなく、設定できない場合があるので、chmod関数を使用して再度パーミッションを設定します。
今回のパーミッションは「0777」で一番ゆるい設定になっているので、気になる方は「0755」などにするのもいいかもしれません。

private   $chmod      = '0777';      // パーミッション
  private function isUploadsDir(){
    // ディレクトリが存在していた場合
    if (file_exists($this->upload_dir)){ return true; }
    // ディレクトリが存在していなかった場合
    else {
      echo $this->upload_dir;
      
      if( mkdir( $this->upload_dir, $this->chmod)){
        //mkdirで設定できない場合があるので、再度パーミッションを設定する
        chmod( $this->upload_dir, $this->chmod); return true;
      } else {
        echo 'ディレクトリの作成に失敗:'.$this->upload_dir;
      }
    }
    return false;
  }

Webサイトのキャプチャの取得・保存

getHtmlCaptcha関数はこの機能のメインになるサイトのキャプチャを取得し、保存するための機能です。はじめに、幾つかの変数を宣言します。「$vowels」ドメインをファイル名として記載する際にファイル名として指定してはいけない文字を除外するためのリスト、「$width」「$height」は保存するキャプチャの画像サイズの宣言です。
この機能は、「capture.heartrails」の機能を利用し作成します。以下はそのサービスを利用するためのアドレスを作成しています。

$capture_heartrails = 'http://capture.heartrails.com/'.$this->width.'x'.$this->height.'/delay=1'.'?'.$url;

引数に「$url」を取得することで任意のURLを記述できるようにし、先ほど作成したisUploadsDir関数を使用し、作成する前にディレクトリの存在、引数の入力を確認してから実行します。

//ファイル名、除外文字リスト
  private   $vowels     = 
    array("http://","https://","/","\\","¥",">","<","?",":",";","|","\"","*");
  
  // 取得画像のサイズ
  private   $width      = 400;
  private   $height     = 300;

  public function getHtmlCaptcha($url = null){
    $captcha_path = '';
  
    //作成先のディレクトリがあるか確認する
    if (!($this->isUploadsDir())){
      return false;
    }
    //引数が指定されなかった場合
     if (!(isset($url))){
      return false;
    }
    
    //特定文字列を取り除く
    $captcha_path = str_replace($this->vowels, "", $url);
    $captcha_path = $this->upload_dir.'/'.$url.'.jpg';
    
    // ファイルが存在していなければ作成する
    if (!(file_exists($captcha_path))){
      // Webサービスを使用して取得する
      // capture.heartrails.com
      $capture_heartrails = 'http://capture.heartrails.com/'.$this->width.'x'.$this->height.'/delay=1'.'?'.$url;
      $imgdata = file_get_contents( $capture_heartrails );
      
      //特定文字列を取り除く
      $url = str_replace($this->vowels, "", $url);
      $captcha_path = $this->upload_dir.'/'.$url.'.jpg';
  
      //書き出し
      file_put_contents( $captcha_path , $imgdata);
      
      return true;
    }
    return false;
  }

関数の呼び出しと実行

「WP_CONTENT_DIR」はWordPressの定数で独自クラスでは読み込めません。なので引数で渡すことで環境の違いがあっても同様の機能に保てるようにしています。

「setWidth」「setHeight」のセッターを記述しました。これは上では記述していませんが、使いまわす際に取得する画像のサイズをその都度変更することができます。
サイズはこのサービスの使用で400×300以上の画像は作成できないので、下記のように600×400としてもその大きさでは取得できません。

$wp_content_dir = WP_CONTENT_DIR;
if(isset($wp_content_dir)){
  $captcha = new wpCaptcha( $wp_content_dir ) ;
  //$captcha->setWidth('600');
  //$captcha->setHeight('400');
  $captcha->getHtmlCaptcha('/');
}

最後にまとめ。コピペ用

/*
  Webサイトのキャプチャを取得する
*/
class wpCaptcha {
  
  //保存先フォルダ
  private   $upload_dir = '';          //アップロード用ディレクトリ名
  private   $chmod      = '0777';      // パーミッション
  
  //ファイル名、除外文字リスト
  private   $vowels     = 
    array("http://","https://","/","\\","¥",">","<","?",":",";","|","\"","*");
  
  // 取得画像のサイズ
  private   $width      = 400;
  private   $height     = 300;
  
  /*
    constructor
  ----------------------------------------------------------------------------*/
  function __construct( $dir, $upload_dir = 'captcha'){
    $this->upload_dir = $dir.'/'.$upload_dir;
  }
  
  /*
    Getter & Setter
  ----------------------------------------------------------------------------*/
  function getPermission() {
    return $this->chmod;
  }
  function setPermission($chmod) {
    $this->chmod = $chmod;
  }
  function getWidth(){
    return $this->getWidth();
  }
  function setWidth($width){
    if($width > 400) $width = 400;  //maxサイズ
    $this->width = $width;
  }
  function getHeight(){
    return $this->getWidth();
  }
  function setHeight($height){
    if($height > 300) $height = 300;  //maxサイズ
    $this->height = $height;
  }
  function getVowels(){
    return $this->getWidth();
  }
  function setVowels($vowels = null){
    if(!(isset($vowels)))
      $this->height = $vowels;
  }
  
  /*
    (bool)isUploadsDir()
    -> アップロード用のディレクトリを確認し、無ければ作成する。
    @return ディレクトリが存在または作成に成功した場合 ture. それ以外 false
  ----------------------------------------------------------------------------*/
  private function isUploadsDir(){
    // ディレクトリが存在していた場合
    if (file_exists($this->upload_dir)){ return true; }
    // ディレクトリが存在していなかった場合
    else {
      echo $this->upload_dir;
      
      if( mkdir( $this->upload_dir, $this->chmod)){
        //mkdirで設定できない場合があるので、再度パーミッションを設定する
        chmod( $this->upload_dir, $this->chmod); return true;
      } else {
        echo 'ディレクトリの作成に失敗:'.$this->upload_dir;
      }
    }
    return false;
  }
  
  /*
    (bool)getHtmlCaptcha()
    ->
    @prame $url : キャプチャ画像を作成したいサイトのURLを指定する
    @return キャプチャ画像の作成に成功 true 失敗or入力不足 false
  ----------------------------------------------------------------------------*/
  public function getHtmlCaptcha($url = null){
    $captcha_path = '';
  
    //作成先のディレクトリがあるか確認する
    if (!($this->isUploadsDir())){
      return false;
    }
    //引数が指定されなかった場合
     if (!(isset($url))){
      return false;
    }
    
    //特定文字列を取り除く
    $captcha_path = str_replace($this->vowels, "", $url);
    $captcha_path = $this->upload_dir.'/'.$url.'.jpg';
    
    // ファイルが存在していなければ作成する
    if (!(file_exists($captcha_path))){
      // Webサービスを使用して取得する
      // capture.heartrails.com
      $capture_heartrails = 'http://capture.heartrails.com/'.$this->width.'x'.$this->height.'/delay=1'.'?'.$url;
      $imgdata = file_get_contents( $capture_heartrails );
      
      //特定文字列を取り除く
      $url = str_replace($this->vowels, "", $url);
      $captcha_path = $this->upload_dir.'/'.$url.'.jpg';
  
      //書き出し
      file_put_contents( $captcha_path , $imgdata);
      
      return true;
    }
    return false;
  }
}
/* /end class wpCaptcha */