This is a sitelog of Easun.org.
一直在用 多说 的 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 'http://static.easunlee.cn/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 ;
}
1 Comments