[Perl]緩存 Gravatar 頭像到本地服務器

This is a sitelog of .

Logo_Gravatar.png

一直在用 多說Gravatar 頭像鏡像服務器, 最近不知道怎麼的。 這個服務器經常返回 503 ,于是乎,本地評論的朋友頭像又不顯示了。

雖然最近貌似檢測到 cn.gravatar.com 顯示正常。 但是為了安全,還是選擇最後一招吧: 緩存頭像到本地服務器。。。。。

Perl 代碼貌似很簡單, 機制: 緩存7天,7天後删除重新下載。。 當然,因為CDN 的存在,也許你換了頭像,14天後本站才會更新:(7天本地緩存。7天CDN緩存)。

記錄下修改的 Perl 代碼片段:

code## CommenterUserpicURL
sub _hdlr_gravatar_url {
    my ($url, $param, $ctx) = @_;  
    return $url if ($url ne '') ;   

    my $c = $ctx->stash('comment')
        or return $ctx->_no_comment_error();  

   #Easun 's QQ plugin    ($cmntr->auth_type =~ m/^QQ/ )  
   my $cmntr = $ctx->stash('commenter');
   if ($cmntr && $cmntr->hint && ($cmntr->hint=~ m!^https?://!) )  { return $cmntr->hint; }

   # gravatar_url         
   my $email = $c->email;
   return  '../../images/ds-avatar.png' if ($email eq '');       

  require Digest::MD5;
  my $md5_mail = Digest::MD5::md5_hex(lc($email)) ;

  my $local_path = File::Spec->catdir( MT->instance->support_directory_path, 'avatar' );
  $local_path =~ s|/$||  unless $local_path eq  '/';  ## OS X doesn't like / at the end in mkdir().
  my $cache_file_main =  File::Spec->catfile( $local_path, $md5_mail);
  my $cache_dir_url = MT->instance->support_directory_url .'avatar/' ;

  my $ext ='.png'; #先設置後綴為 png,因為檢查機制不知道圖像類型。

  require MT::FileMgr;
  my $fmgr     = MT::FileMgr->new('Local'); 

  unless ( $fmgr->exists($cache_file_main. $ext) )  #沒有 .png
  { 
      $ext = '.gif' ;  #檢查 .gif 
      unless ( $fmgr->exists($cache_file_main. $ext) ) { $ext = '.jpg' ;}    #設定為 .jpg  
  }

  my $cache_file = $cache_file_main . $ext ;      
  my $cache_file_url= $cache_dir_url . $md5_mail . $ext ; 

  if ( $fmgr->exists($cache_file) ) {                
    my $mtime    = $fmgr->file_mod_time( $cache_file );
    my $INTERVAL = 60 * 60 * 24 * 7;
    if ( $mtime > time - $INTERVAL ) {
        # newer than 7 days ago, don't download the userpic
        return $cache_file_url;
    }
    $fmgr->delete($cache_file);  #超過7天啦。删除。
  }
return &_get_from_gravatar_noassetset( $md5_mail, $local_path,$cache_dir_url);
}

sub _get_from_gravatar_noassetset { 
  my ($md5,$local_path,$cache_dir_url) = @_;
  my $image_url = "http://cn.gravatar.com/avatar/" . $md5 . '?s=50&d=identicon' ;
  my $ua = MT->new_ua( { paranoid => 1 } )  or return;
  my $resp = $ua->get($image_url);
  return $image_url unless $resp->is_success;
  return $image_url if $resp->code eq '404';
  my $image = $resp->content;
  return $image_url unless $image;
  my $mimetype = $resp->header('Content-Type');
  return $image_url unless $mimetype;
  my $ext = {
    'image/jpeg' => '.jpg',
    'image/png'  => '.png',
    'image/gif'  => '.gif'
  }->{$mimetype};

  unless ($ext) { $ext ='.png'; } #如果沒有獲取到 mimetype 強行設置為 png 

  require MT::FileMgr;
  my $fmgr = MT::FileMgr->new('Local');

  unless ( $fmgr->exists($local_path) ) { $fmgr->mkpath($local_path); }
  my $local_img   = File::Spec->catfile( $local_path, $md5 . $ext );
  $fmgr->put_data( $image, $local_img, 'upload' );
  return $cache_dir_url . $md5 . $ext  ;
}