Geçerli Gravatar için kontrol edin (PHP)

8 Cevap php

Ben PHP için oldukça yeni, bu yüzden doğru yönde bana gelin herhangi bir düşünce ya da önerileriniz varsa, ben minnettar olurdum.

Bir kullanıcının e-posta adresinin geçerli bir Gravatar Görüntüsüne çevirir eğer basit bir fonksiyon kontrol etmek için yapmaya çalışıyorum, ama gravatar.com onların başlıkları değişti görünüyor.

get_headers('urlencoded_bad_email@example.com') yerine 302 bir 200 döndürür kullanma.

Burada geçerli bir gravatar imajına özdeş çünkü yardım edebilmek görünüyor bunların hiçbiri kötü bir gravatar görüntü başlıkları şunlardır:

array(13) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(13) "Server: nginx"
  [2]=>
  string(35) "Date: Sun, 26 Jul 2009 20:22:07 GMT"
  [3]=>
  string(24) "Content-Type: image/jpeg"
  [4]=>
  string(17) "Connection: close"
  [5]=>
  string(44) "Last-Modified: Sun, 26 Jul 2009 19:47:12 GMT"
  [6]=>
  string(76) "Content-Disposition: inline; filename="5ed352b75af7175464e354f6651c6e9e.jpg""
  [7]=>
  string(20) "Content-Length: 3875"
  [8]=>
  string(32) "X-Varnish: 3883194649 3880834433"
  [9]=>
  string(16) "Via: 1.1 varnish"
  [10]=>
  string(38) "Expires: Sun, 26 Jul 2009 20:27:07 GMT"
  [11]=>
  string(26) "Cache-Control: max-age=300"
  [12]=>
  string(16) "Source-Age: 1322"
}

P.S. Ben '&d' parametresinin farkında değilim, ama bu benim amaca hizmet etmeyecektir. :)

EDIT:

'?d' yerine '&d' arasında kullanın. Bir gravatar.com 'numaranı olmalı.

8 Cevap

NOTE: yazma zamanda, bu tek seçenek oldu. Bununla birlikte, bazı daha sonraki zaman ?d=404 Andrew's answer, daha temiz hale ilave edildi.


Eğer avatar yok çünkü Bulunan d parametresi , do you know it actually returns a redirect header when applicable? So, the following yields 302 hakkında bilmek dedi olsa:

http://www.gravatar.com/avatar/3b3be63a4c2a439b013787725dfce802?d=http%3A%2F%2Fwww.google.com%2Fimages%2Flogo.gif

HTTP/1.1 302 Found  
...  
Last-Modified: Wed, 11 Jan 1984 08:00:00 GMT  
Location: http://www.google.com/images/logo.gif  
Content-Length: 0  
...  
Expires: Sun, 26 Jul 2009 23:18:33 GMT  
Cache-Control: max-age=300

Yapmanız gereken tüm d parametresini ekleyin ve sonra HTTP sonuç kodu kontrol edilir gibi geliyor bana.

Gravatar resim varsa if you pass in d=404 , you get a 404 page (instead of some 302 yerine sezgisel kullanım zorunda göre,) bir varsayılan resim yönlendirmek anlamına, 'd' parametresi için bir seçenek ekledik.

Ben Lucas Araújo php gravatar class denemenizi öneririz.

/**
*  Class Gravatar
*
* From Gravatar Help:
*        "A gravatar is a dynamic image resource that is requested from our server. The request
*        URL is presented here, broken into its segments."
* Source:
*    http://site.gravatar.com/site/implement
*
* Usage:
* <code>
*        $email = "youremail@yourhost.com";
*        $default = "http://www.yourhost.com/default_image.jpg";    // Optional
*        $gravatar = new Gravatar($email, $default);
*        $gravatar->size = 80;
*        $gravatar->rating = "G";
*        $gravatar->border = "FF0000";
*
*        echo $gravatar; // Or echo $gravatar->toHTML();
* </code>
*
*    Class Page: http://www.phpclasses.org/browse/package/4227.html
*
* @author Lucas Araújo <araujo.lucas@gmail.com>
* @version 1.0
* @package Gravatar
*/
class Gravatar
{
    /**
     *    Gravatar's url
     */
    const GRAVATAR_URL = "http://www.gravatar.com/avatar.php";

    /**
     *    Ratings available
     */
    private $GRAVATAR_RATING = array("G", "PG", "R", "X");

    /**
     *    Query string. key/value
     */
    protected $properties = array(
        "gravatar_id"    => NULL,
        "default"        => NULL,
        "size"            => 80,        // The default value
        "rating"        => NULL,
        "border"        => NULL,
    );

    /**
     *    E-mail. This will be converted to md5($email)
     */
    protected $email = "";

    /**
     *    Extra attributes to the IMG tag like ALT, CLASS, STYLE...
     */
    protected $extra = "";

    /**
     *    
     */
    public function __construct($email=NULL, $default=NULL) {
        $this->setEmail($email);
        $this->setDefault($default);
    }

    /**
     *    
     */
    public function setEmail($email) {
        if ($this->isValidEmail($email)) {
            $this->email = $email;
            $this->properties['gravatar_id'] = md5(strtolower($this->email));
            return true;
        }
        return false;
    }

    /**
     *    
     */
    public function setDefault($default) {
        $this->properties['default'] = $default;
    }

    /**
     *    
     */
    public function setRating($rating) {
        if (in_array($rating, $this->GRAVATAR_RATING)) {
            $this->properties['rating'] = $rating;
            return true;
        }
        return false;
    }

    /**
     *    
     */
    public function setSize($size) {
        $size = (int) $size;
        if ($size <= 0)
            $size = NULL;        // Use the default size
        $this->properties['size'] = $size;
    }

    /**
     *    
     */
    public function setExtra($extra) {
        $this->extra = $extra;
    }

    /**
     *    
     */
    public function isValidEmail($email) {
        // Source: http://www.zend.com/zend/spotlight/ev12apr.php
        return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
    }

    /**
     *    Object property overloading
     */
    public function __get($var) { return @$this->properties[$var]; }

    /**
     *    Object property overloading
     */
    public function __set($var, $value) {
        switch($var) {
            case "email":    return $this->setEmail($value);
            case "rating":    return $this->setRating($value);
            case "default":    return $this->setDefault($value);
            case "size":    return $this->setSize($value);
            // Cannot set gravatar_id
            case "gravatar_id": return;
        }
        return @$this->properties[$var] = $value;
    }

    /**
     *    Object property overloading
     */
    public function __isset($var) { return isset($this->properties[$var]); }

    /**
     *    Object property overloading
     */
    public function __unset($var) { return @$this->properties[$var] == NULL; }

    /**
     *    Get source
     */
    public function getSrc() {
        $url = self::GRAVATAR_URL ."?";
        $first = true;
        foreach($this->properties as $key => $value) {
            if (isset($value)) {
                if (!$first)
                    $url .= "&";
                $url .= $key."=".urlencode($value);
                $first = false;
            }
        }
        return $url;    
    }

    /**
     *    toHTML
     */
    public function toHTML() {
        return     '<img src="'. $this->getSrc() .'"'
                .(!isset($this->size) ? "" : ' width="'.$this->size.'" height="'.$this->size.'"')
                .$this->extra
                .' />';    
    }

    /**
     *    toString
     */
    public function __toString() { return $this->toHTML(); }
}

ve bu onu kullanmak istiyorum nasıl:

include 'gravatar.php';
$eMail = 'name@email.net';
$defImg = 'http://www.example.com/images/myphoto.jpg';
$avatar = new Gravatar($eMail, $defImg);
$avatar->setSize(90);
$avatar->setRating('G');
$avatar->setExtra('alt="my gravatar"');

<p>
<?php echo $avatar->toHTML(); ?>
</p>

Gravatar için kontrol ederken görüntü url "default" parametresi eklemek, bu görüntü bulunamadı değilse bir 302 yönlendirme sağlayacaktır.

$grav_url = 'http://www.gravatar.com/avatar/'.md5(mb_strtolower($email)).'?default=http://www.mysite.com/null.jpg&size=310';

Bunu :) isterseniz boş görüntü daha sonra bir 404 dönebilirdi

"Bulunamadı / geçersiz" Gravatar görüntüler için tutarlıdır;: (filename = "5ed352b75af7175464e354f6651c6e9e.jpg" inline İçerik Eğilimi) dosya mı? Eğer öyleyse, geçersiz görüntüleri tanımlamak için kullanın ki?

Aslında d=404 ile bir Gravatar sorgu oluşturmak mümkün, d = 404 yaklaşık Andrew Aylett tarafından cevap genişletme (veya default=404), sonra başlıklarına bakarsanız tuşu {[(2)] } değeri 404 ya da 200 içerir.

$email = md5(strtolower("myemailaddress@example.com"));
$gravatar = "http://www.gravatar.com/avatar/$email?d=404";
$headers = get_headers($gravatar,1);
if (strpos($headers[0],'200')) echo "<img src='$gravatar'>"; // OK
else if (strpos($headers[0],'404')) echo "No Gravatar"; // Not Found

Orijinal soru üç yıl öncesine uzanır. Belki o zaman Gravatar sitesini başlıkları şeyler biraz farklı oldu.

Eğer onu bir kez olsun bu bilgiyi kullanmak istediğiniz tam olarak nasıl emin ... ama yapamadım:

Onerror var (ya da yükleme sorunları vardır) yok ya onu kovarsa onload yangınlar, sen, bir maç varsa ... bir onload veya ekli onerror işleyicisi ile, bir web sayfasında görüntüyü yükleyin

örneğin

<img
  src="http://www.gravatar.com/avatar/282eed17fcb9682bb2816697482b64ec?s=128&d=identicon&r=PG"
  onload="itWorked();"
  onerror="itFailed();"/>

Gerçekten unperformant çözüm email nakletmek http://en.gravatar.com/accounts/signup ve Sorry, that email address is already used! kontrol etmek için olabilir ...

edit

Tamam, bir hata oluştu olup olmadığını göstermek için biraz çerez kullanın ... ;-)

function isUsed($email)
{
    $url   = 'http://en.gravatar.com/accounts/signup';
    $email = strtolower($email);

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'commit=Signup&email=' . urlencode($email));
    curl_setopt($ch, CURLOPT_HEADER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    return (false !== strpos($response, 'Set-Cookie: gravatar-notices'));
}

var_dump(isUsed('test@example.org'));