LoginSignup
5
2

More than 5 years have passed since last update.

GravatarをWebページのfaviconに自動適用するやつ

Last updated at Posted at 2018-02-08

Gravatarとは

いろんなWebサービス(Qiitaもその1つ)で共通のアイコンを使えるようにするもので、
画像をアップロードすると簡単に取得できるようになっています。

これを作った経緯

  1. Apacheとかでfaviconをアイコンにしたい。手動で設定したらGravatarじゃなくていいじゃん?
  2. いちいちlinkタグを書きたくない。多分メンテナンス性が下がっちゃう
  3. gravatarに.htaccessとかで転送したらうまくいかない。(pngですし外部ですし)
  4. よし、PHPで頑張って作ろう!

やってること

  • faviconはPHPに転送しちゃう。
  • PHPはGravatarを見に行って、更新されてたら持ってきてicoに変換。
  • アクセスにIf-Modified-Sinceがついてて、まだ変更がなかったら304返しておわり。
  • 新しいアイコン/クライアントならアイコンのデータを送ってあげる

用意するもの

  • Webサーバー(Apacheがおすすめ。というか他は動作確認してないだけ)
  • PHPの実行環境(7.1でテスト済)
  • Gravatarのアイコン
  • ある程度の知識(コピペで終わるけどね)

手順

アイコン画像生成ライブラリを入れる

PHP ICO - The PHP ICO Generator
ドキュメントルート/lib/にphpファイルだけ入れる、でOK.

ドキュメントルートにfavicon.phpを置いてコードを書く。

場所を変えたいなら以降は適宜書き換える必要あり。

favicon.php
<?php 

$force=false;
$force=isset($_GET['force']);

if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/favicon.ico")){//faviconあるかな?
    $found=true;
    $last_modified_num = filemtime($_SERVER['DOCUMENT_ROOT'] . "/favicon.ico");
    $last_modified=gmdate( "D, d M Y H:i:s T", $last_modified_num);
}else{
    $found=false;//無いのかよ
    $last_modified=gmdate( "D, d M Y H:i:s T", time());//とりあえず今の時間渡しとけばいいかな
}


// Gravatarを見に行って
$url = "https://secure.gravatar.com/avatar/[自分のid(メールアドレスのmd5)]?size=256";
$ch = curl_init ();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); //これをしないと結果をブラウザへ送ってしまう

if($found && !$force){
    curl_setopt($ch, CURLOPT_HTTPHEADER,['If-Modified-Since: '.$last_modified]);
}
$r = curl_exec ($ch);
$info = curl_getinfo ($ch);
$status_code = $info['http_code'];

if(!$found||$force||$status_code==200){ //データが新しければ取得して保存!
    file_put_contents ("favicon.png", $r);
    require_once $_SERVER['DOCUMENT_ROOT'] . '/lib/class-php-ico.php';
    $ico_lib = new PHP_ICO();
    // 画像指定
    $ico_lib->add_image('favicon.png');
    // ファビコン生成/保存
    $ico_lib->save_ico('favicon.ico');
}

// さてブラウザへデータを返そうか

header("Last-Modified: {$last_modified}");

$if_modified_since = filter_input( INPUT_SERVER, 'HTTP_IF_MODIFIED_SINCE' );
if(!$found || $force || strtotime($if_modified_since)<$last_modified_num){ // ブラウザからの要求より新しいデータか?
    // header( "Content-Type: image/x-icon;" );
    header( "Content-Type: image/vnd.microsoft.icon;" );
    echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/favicon.ico");
}else{
    header( 'HTTP', true, 304 );
    exit;
}
?>

.htaccessの編集

あるなら追記、無いなら新規作成しましょう

.htaccess
RewriteEngine On
RewriteRule favicon\.ico$ favicon.php

権限の確認

ファイルを操作するときに権限がないと怒られるのでサーバーがいじれるようにする

以上。簡単でしょ?

追加説明

新しめのfaviconがもう置いてあるから更新されない!って言う人はfavicon.ico?forceにアクセスすると更新します。
セキュリティ的にマズそうな気がしたらコメントアウトしてください。

ライセンス(?)

放棄します。こんなソースくれてやる!
自由に使って下さい。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2