2009-07-26 3 views
5

저는 PHP에 매우 익숙합니다. 올바른 방향으로 나를 가르키려는 생각이나 제안이 있으면 감사하게 생각합니다.유효한 gravatar (PHP)를 확인하십시오

사용자의 이메일 주소가 유효한 Gravatar Image로 변환되는지 확인하는 간단한 기능을 시도했지만 gravatar.com이 헤더를 변경 한 것처럼 보입니다. get_headers('[email protected]') 수익률을 사용

200 대신

다음

가 유효한 Gravatar에 이미지와 동일하기 때문에 도와 줄 수있을 것, 어느 것도 나쁜 Gravatar에 이미지 헤더입니다 (302) :

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 '&d' 매개 변수를 알고 있지만 내 용도로 사용되지 않습니다. :)

편집 :

사용 '?d' 대신 '&d'. gravatar.com 'thang이어야합니다.

+5

(단점 참고 : RFC2607에 따라 문서에서 항상 @ example.com, @ example.org 또는 @ example.net을 사용하십시오. 주소록의 사람들이 스팸을받을 필요가 없습니다.) – Arjan

+0

아아! 나도 그걸 알아. LOL, 고정됨. – Jeff

답변

4

참고 : 글을 쓰는 시점에서,이 유일한 옵션이었다. 그러나 얼마 후 ?d=404이 추가되어 Andrew's answer이 훨씬 깨끗 해졌습니다.


당신은 당신이 실제로 적용 할 때 리디렉션 헤더를 반환 알고, 당신은 d parameter에 대해 알고 말했다 비록?그래서, 아바타가 존재하지 않기 때문에 다음 yields (302)는 찾았

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 

당신이 할 필요가 d 매개 변수를 추가 한 다음 HTTP 결과 코드를 확인할 것을 나에게 보인다.

+1

이것은 작동합니다. 결정 요인은 '? d ='대 기본 gravatar에 '& d ='를 사용하는 것입니다. – Jeff

+2

* first * GET 매개 변수에는 항상 물음표가 붙어야합니다. 모든 후속 매개 변수는 Z 퍼 w 드를 사용하여 구분됩니다. – Arjan

+0

302 상태 코드를 실패로 해석하는 것은 매우 비참합니다. 그냥 404 기본값을 사용하면 설정됩니다. – cweiske

2

Lucas Araújo가 php gravatar class으로 시도해 보시기 바랍니다.

/** 
* 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(); } 
} 

이 당신이 그것을 사용하는 거라고하는 방법입니다

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

eregi에 대한 deprecated (5.3 이후) 호출을 대체하고 preg_match와/i를 사용하여 클래스를 수정하는 것이 좋습니다. – hobodave

+0

답장을 많이 보내 주지만 유효한 gravatar 이미지를 확인하는 함수 만 필요합니다. 유효한 이미지가 없으면 함수는 FALSE를 반환해야합니다. 내가 간과하지 않는 한, 나는 위의 클래스에서 코드를 보지 못했다. – Jeff

0

파일 이름입니다 (내용 - 처리 : 인라인, 파일 이름 = "5ed352b75af7175464e354f6651c6e9e.jpg") "/ 무효를 찾을 수 없습니다"에 대한 일관된 그라바 타 이미지? 그렇다면 잘못된 이미지를 식별하는 데 사용할 수 있습니까? 오류가 발생하거나하지 않을 경우

+0

나는 그것이 일관 되길 바란다. 그러나 그것은 유효한 gravatar인지 여부에 관계없이 모든 이메일 주소마다 다르다. :( – Jeff

+0

파일 이름이 같지 않더라도 유효하지 않은 이메일 주소에 대해 내용이 동일합니까? 알려진 "잘못된"응답의 MD5 해시를 받아서 비교할 수 있습니다 ... –

+0

예, 내용이 같습니다. 문제는 유효한 응답이 유효하지 않은 응답과 동일하다는 것입니다. – Jeff

-1

정말 unperformant 솔루션은

편집

좋아, 그들이 나타 내기 위해 몇 가지 쿠키를 사용하여 ... http://en.gravatar.com/accounts/signupemail을 게시하고 Sorry, that email address is already used!를 확인하기 위해 수 ... ;-)

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

Gravatar의 사람들이이 접근법에 지나치게 열중하고 있다고 생각하지 않습니다 .-) – scunliffe

+0

그런 다음 API를 제공해야합니다 ... ;-) –

+1

re : API; 나는 전심으로 동의합니다. 그들은 최근에 무효 gravatar에 대한 302를이 정확한 목적을 위해 200 개로 변경했습니다. 웹 마스터가 잘못된 이미지를 확인하도록 허용하지 않는 이유는 무엇입니까? 말도 안돼. – Jeff

-1

회원님이 당신이 그것을 일단이 정보를 사용하려면 정확히 어떻게 확인 ...하지만 당신이 수 :

onload 또는 onerror 핸들러가 첨부 된 웹 페이지에 이미지로드 ... oner가 실행되면 onerror가 발생하거나 일치하지 않는 경우 (또는로드하는 데 문제가있는 경우)

예 :

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

이미지가 결코 실패하지 않기 때문에 작동하지 않을 것이라고 생각합니다 ... 항상 200 응답. – Jeff

+0

아, 허풍. 질문을 철저하게 읽는 것이 좋습니다. – scunliffe

1

gravatar를 확인할 때 이미지 URL에 "default"매개 변수를 추가하면 이미지를 찾을 수없는 경우 302 리디렉션이 제공됩니다. 당신이 :)하려는 경우

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

널 이미지는 404을 반환 할 수

+0

이것이 왜 수정되었는지는 잘 모르겠습니다. 프로덕션 환경에서 완벽하게 작동합니다. – Jason

+0

원래 질문에 이미 기본 매개 변수가 언급되어 있기 때문에 어느 쪽인지 확실하지 않습니다. 카르마와 도움을 위해서 투표했습니다. – Jeff

+0

아, 그리워 .... – Jason

6

Gravatar에가 (대신 if you pass in d=404, 당신은 404 페이지를 얻을 의미하는 'D'매개 변수에 옵션을 추가 한 휴리스틱 스를 사용하는 대신 그림이없는 경우 일부 그림이 302으로 리디렉션됩니다.

1

[0] 키 값 404 또는 200를 포함하는 경우, 다음의 헤더를 조사 실제로 d=404 (또는 default=404)와 Gravatar에 조회를 구성 할 수있어, D = 404에 대해 앤드류 Aylett 의한 응답을 확장.

$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 

원래의 질문은 3 년 전으로 거슬러 올라갑니다. 아마도 그 당시 Gravatar의 헤더 정보는 약간 다릅니다.