2009-07-26 18 views
5

Jestem całkiem nowym użytkownikiem PHP, więc jeśli masz jakieś przemyślenia lub sugestie, które wskażą mi właściwy kierunek, będę wdzięczny.Sprawdź poprawność gravatar (PHP)

Próbujesz wykonać prostą funkcję, aby sprawdzić, czy adres e-mail użytkownika przekłada się na prawidłowy obraz Gravatar, ale wygląda na to, że gravatar.com zmieniła nagłówki.

Korzystanie get_headers('[email protected]') zwraca 200 zamiast 302.

Oto nagłówki ze złego gravatar obrazu, z których żadna nie wydają się być w stanie pomóc, ponieważ są one identyczne do ważnego obrazu gravatar:

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 Znam parametr '&d', ale nie spełni on mojego zadania. :)

EDIT:

Zastosowanie '?d' zamiast '&d'. Musi to być thang gravatar.com.

+5

(Uwaga: zgodnie z RFC2607, w dokumentacji zawsze używaj @ example.com, @ example.org lub @ example.net - nie ma potrzeby, aby ludzie pod adresem address.com otrzymywali spam). – Arjan

+0

Aaah! WIEDZIAŁEM TO również. LOL, naprawiony. – Jeff

Odpowiedz

4

UWAGA: w momencie pisania tego tekstu, to była jedyna opcja. Jednak po pewnym czasie dodano ?d=404, dzięki czemu Andrew's answer jest znacznie czystszy.


Choć powiedział pan wie o d parameter, wiesz, że to faktycznie zwraca nagłówek przekierowania jeśli dotyczy?Tak więc, po yields 302 Znaleziony ponieważ awatar nie istnieje:

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 

Wydaje mi się, że wszystko, co musisz zrobić, to dodać, że parametr d i sprawdź kod wynikowy następnie HTTP.

+1

To działa. Wydaje się, że czynnikiem decydującym jest użycie "? D =" zamiast "& d =" dla domyślnego gravatar. – Jeff

+2

Parametr * first * GET zawsze musi być poprzedzony znakiem zapytania; wszystkie kolejne parametry są rozdzielane za pomocą ampersand. – Arjan

+0

Interpretowanie kodu statusu 302 jako niepowodzenia jest bardzo podejrzane. Wystarczy użyć domyślnego ustawienia 404 i gotowe. – cweiske

2

Proponuję wypróbować php gravatar class autorstwa 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(); } 
} 

i to jak chcesz go używać:

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

Polecam modyfikowanie klasy, aby zastąpić przestarzałe (od 5.3) wywołanie eregi i przy użyciu preg_match z/i – hobodave

+0

Odpowiedź jest bardzo doceniane, ale potrzebuję tylko funkcji do sprawdzenia poprawnego obrazu gravatar. Jeśli nie znaleziono prawidłowego obrazu, funkcja musi zwrócić FALSE. O ile nie przeoczyłem tego, nie widziałem kodu w powyższej klasie. – Jeff

0

Czy nazwa pliku (Content-Disposition: inline; filename = "5ed352b75af7175464e354f6651c6e9e.jpg") zgodne z "nie znaleziono/nieważny" Obrazy Gravatar? Jeśli tak, to możesz go użyć do identyfikacji nieprawidłowych obrazów?

+0

Chciałbym, żeby było spójne, ale jest inne w przypadku każdego adresu e-mail, czy jest to ważny gravatar, czy nie. :( – Jeff

+0

Czy treść jest taka sama dla niepoprawnych adresów e-mail, nawet jeśli nazwa pliku nie jest? Być może mógłbyś użyć skrótu MD5 o znanej "nieprawidłowej" odpowiedzi i użyć go do porównania ... –

+0

Tak, treść jest taka sama w przypadku nieprawidłowych adresów e-mail, nawet jeśli nazwa pliku nie jest.) Problem polega na tym, że prawidłowe odpowiedzi są identyczne z nieważnymi odpowiedziami – Jeff

-1

Naprawdę unperformant rozwiązaniem byłoby zakładać email do http://en.gravatar.com/accounts/signup i sprawdzić Sorry, that email address is already used! ...

edit

Ok, używają jakiś plik cookie, aby wskazać, czy wystąpił błąd, czy nie ... ;-)

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

Nie sądzę, aby ludzie w Gravatar byli nadmiernie entuzjastycznie nastawieni do tego podejścia. ;-) – scunliffe

+0

powinien dostarczyć API ... ;-) –

+1

re: the API; Zgadzam się z całego serca. Niedawno zmienili 302 na nieważnym gravatar na 200 ... prawdopodobnie w tym celu. Dlaczego nie pozwoliłby webmasterom sprawdzić nieprawidłowego obrazu? Nie ma sensu. – Jeff

-1

Nie wiem dokładnie w jaki sposób chcesz wykorzystać te informacje, gdy pojawi się to ... ale można:

Załaduj obraz na stronie internetowej, z załączoną obsługą onload lub onerror ... jeśli uruchamiany jest onload, masz dopasowanie, jeśli onerror wystrzeliwuje albo nie istnieje (lub występują problemy z ładowaniem)

np.

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

Nie sądzę, że to zadziała, ponieważ obraz nigdy nie zawodzi ... Zawsze odpowiedź 200. – Jeff

+0

Ah, bummer. Domyślam się, że opłaca się dokładnie przeczytać to pytanie. – scunliffe

1

dodaj parametr "domyślny" do adresu URL obrazu podczas sprawdzania, czy gravatar, zapewni przekierowanie 302, jeśli obraz nie zostanie znaleziony.

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

null obraz może następnie powrócić do 404 jeśli chcesz go :)

+0

nie wiem, dlaczego jest to modded down, mam to działa doskonale w środowisku produkcyjnym. – Jason

+0

Nie jestem również pewien, być może dlatego, że pierwotne pytanie już wspomniało o domyślnym parametrze. Za karmę i pomoc głosowali. – Jeff

+0

ah, brakowało tego ... – Jason

6

Gravatar dodano opcję do parametru „D”, co oznacza, że ​​if you pass in d=404, masz stronę 404 (zamiast niektóre przekierowania 302 do domyślnego obrazu), jeśli nie ma obrazu, zamiast konieczności korzystania z heurystyki.

1

Rozszerzanie odpowiedź przez Andrew Aylett o d = 404, w rzeczywistości jest to możliwe, aby skomponować Gravatar frazę d=404 (lub default=404), a następnie zajrzeć do nagłówków jeśli klucz [0] zawiera wartość lub .

$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 

Oryginalne pytanie pochodzi sprzed trzech lat. Być może w tym czasie nagłówki Gravatar były nieco inne.

Powiązane problemy