2009-07-26 13 views
5

Sono abbastanza nuovo in PHP, quindi se avete qualche idea o suggerimento per indicarmi la giusta direzione, sarei grato.Verifica valido gravatar (PHP)

Cercando di fare una semplice funzione per verificare se l'indirizzo e-mail di un utente si traduce in un'immagine Gravatar valida, ma sembra che gravatar.com abbia cambiato le intestazioni.

Utilizzando get_headers('[email protected]') restituisce 200 invece di 302.

Ecco le intestazioni da un'immagine gravatar male, nessuno dei quali sembrano essere in grado di aiutare, perché sono identici a un'immagine gravatar valida:

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" 
} 

ps Sono a conoscenza del parametro '&d', ma non è funzionale al mio scopo. :)

EDIT:

Uso '?d' invece di '&d'. Deve essere un thang di gravatar.com.

+5

(Solo una nota a margine: come da RFC2607, nella documentazione si prega di utilizzare sempre @ example.com, @ example.org o @ example.net - non è necessario che le persone su address.com ricevano spam.) – Arjan

+0

Aaah! LO SAPEVO anche quello. LOL, risolto. – Jeff

risposta

4

NOTA: al momento della scrittura, questa era l'unica opzione. Tuttavia, è stato aggiunto un po 'di tempo dopo il ?d=404, rendendo così più pulito il Andrew's answer.


Anche se lei ha detto che conosci il d parameter, fai a sapere che in realtà restituisce un colpo di testa di reindirizzamento se del caso?Così, il seguente yields 302 Trovato in quanto l'avatar non esiste:

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 

mi sembra che tutto quello che dovete fare è aggiungere il parametro d e controllare il codice risultato HTTP poi.

+1

Questo funziona. Sembra che il fattore determinante sia l'uso del '? D =' rispetto all'utilizzo del '& d =' per il gravatar predefinito. – Jeff

+2

Il * primo * parametro GET deve sempre essere preceduto da un punto interrogativo; tutti i parametri successivi sono separati usando la e commerciale. – Arjan

+0

L'interpretazione di un codice di stato 302 come errore è molto interessante. Usa il default 404 e sei pronto. – cweiske

2

Ti suggerisco di provare lo php gravatar class di Lucas Araújo.

/** 
* 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 = "[email protected]"; 
*  $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 <[email protected]> 
* @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(); } 
} 

e questo è il modo che ci si utilizza:

include 'gravatar.php'; 
$eMail = '[email protected]'; 
$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> 
+1

Si consiglia di modificare la classe per sostituire la chiamata deprecata (dalla versione 5.3) a eregi e utilizzare preg_match con/i – hobodave

+0

La risposta è molto apprezzata, ma ho solo bisogno di una funzione per verificare un'immagine gravatar valida. Se non viene trovata un'immagine valida, la funzione deve restituire FALSE. A meno che non l'abbia trascurato, non ho visto il codice nella classe sopra per quello. – Jeff

0

è il nome (Content-Disposition: inline; filename = "5ed352b75af7175464e354f6651c6e9e.jpg") coerente per "non trovato/non valido" Immagini di Gravatar? In tal caso, potresti usarlo per identificare le immagini non valide?

+0

Vorrei che fosse coerente, ma è diverso per ogni indirizzo e-mail, sia che si tratti di un gravatar valido o meno. :( – Jeff

+0

Il contenuto è lo stesso per gli indirizzi e-mail non validi anche se il nome del file non lo è? Forse potresti prendere l'hash MD5 di una risposta "non valida" conosciuta e usarlo per confrontare ... –

+0

Sì, il contenuto è lo stesso per gli indirizzi e-mail non validi anche se il nome del file non è.Il problema è che le risposte valide sono identiche alle risposte non valide – Jeff

-1

Una soluzione davvero unperformant potrebbe essere quella di inviare email-http://en.gravatar.com/accounts/signup e verificare la presenza di Sorry, that email address is already used! ...

modificare

Va bene, usano alcuni cookie per indicare in caso di errore o no ... ;-)

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('[email protected]')); 
+2

Non penso che la gente di Gravatar sarebbe eccessivamente entusiasta di questo approccio. ;-) – scunliffe

+0

Poi loro dovrebbe fornire un API ... ;-) –

+1

re: l'API; Sono d'accordo con tutto il cuore. Recentemente hanno cambiato i 302 di un gravatar non valido a 200 ... probabilmente per questo scopo. Perché non consentirebbero ai webmaster di verificare la presenza di un'immagine non valida? Non ha senso. – Jeff

-1
Non

sicuro esattamente come si desidera utilizzare queste informazioni una volta arrivati ​​... ma si potrebbe:

Carica l'immagine su una pagina web, con un gestore on-on o on-on collegato ... se l'onload si attiva, hai una corrispondenza, se l'onerror lo spara o non esiste (o ci sono problemi che lo carica)

es.

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

Non penso che funzionerà perché l'immagine non fallisce mai ... Sempre una risposta 200. – Jeff

+0

Ah, peggio. Suppongo che valga la pena di leggere attentamente la domanda. – scunliffe

1

aggiungere il parametro "predefinito" all'URL immagine quando si verifica un gravatar, questo fornirà un reindirizzamento 302 se l'immagine non viene trovata.

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

l'immagine nulla potrebbe quindi restituire un 404 se si vuole che :)

+0

non sono sicuro del motivo per cui è stato modificato, ho funzionato perfettamente in un ambiente di produzione. – Jason

+0

Non ne sono nemmeno sicuro, probabilmente perché la domanda originale menziona già il parametro predefinito. Per il karma e l'aiuto, votati. – Jeff

+0

ah, perso quello .... – Jason

6

Gravatar hanno aggiunto un'opzione per il parametro 'd', il che significa che if you pass in d=404, si ottiene una pagina 404 (invece di alcuni 302 reindirizzano a un'immagine predefinita) se non ci sono immagini, piuttosto che dover utilizzare l'euristica.

1

Estendere la risposta da Andrew Aylett circa d = 404, in realtà è possibile comporre una query Gravatar con d=404 (o default=404), quindi esaminare le intestazioni se chiave [0] contiene un valore o .

$email = md5(strtolower("[email protected]")); 
$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 

La domanda originale risale a tre anni fa. Forse in quel momento le notizie sugli intestazioni di Gravatar erano leggermente diverse.