2009-07-26 49 views
5

Tôi khá mới đối với PHP, vì vậy nếu bạn có bất kỳ suy nghĩ hoặc gợi ý nào để chỉ cho tôi đúng hướng, tôi sẽ biết ơn.Kiểm tra gravatar hợp lệ (PHP)

Cố gắng tạo một chức năng đơn giản để kiểm tra xem địa chỉ email của người dùng có chuyển thành hình ảnh Gravatar hợp lệ hay không, nhưng có vẻ như gravatar.com đã thay đổi tiêu đề của họ.

Sử dụng get_headers('[email protected]') lợi nhuận 200 thay vì 302.

Dưới đây là các tiêu đề từ một hình ảnh gravatar xấu, không ai trong số đó dường như để có thể giúp đỡ, vì họ là giống với một hình ảnh gravatar hợp lệ:

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 Tôi biết về thông số '&d', nhưng nó sẽ không phục vụ mục đích của tôi. :)

EDIT:

Sử dụng '?d' thay vì '&d'. Phải là một gravatar.com 'thang.

+5

(Chỉ một lưu ý phụ: theo RFC2607, trong tài liệu, vui lòng luôn sử dụng @ example.com, @ example.org hoặc @ example.net - không cần phải để mọi người tại address.com nhận được spam của bạn.) – Arjan

+0

Aaah! Tôi cũng biết điều đó. LOL, cố định. – Jeff

Trả lời

4

LƯU Ý: tại thời điểm viết bài, đây là lựa chọn duy nhất. Tuy nhiên, một số thời gian sau đó ?d=404 đã được thêm vào, làm cho Andrew's answer sạch hơn nhiều.


Mặc dù bạn đã biết nó thực sự trả về tiêu đề chuyển hướng khi áp dụng?Vì vậy, sau đây yields 302 Tìm thấy vì avatar không tồn tại:

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ường như với tôi rằng tất cả các bạn cần làm là thêm rằng d tham số và kiểm tra mã kết quả HTTP sau đó.

+1

Tính năng này hoạt động. Có vẻ như yếu tố quyết định là sử dụng '? D =' so với sử dụng '& d =' cho gravatar mặc định. – Jeff

+2

Tham số * đầu tiên * GET phải luôn được đặt trước bằng dấu chấm hỏi; tất cả các tham số tiếp theo được phân tách bằng dấu và. – Arjan

+0

Giải thích mã trạng thái 302 là thất bại rất nhiều. Chỉ cần sử dụng mặc định 404 và bạn đã đặt. – cweiske

2

Tôi đề nghị bạn thử dùng php gravatar class bởi 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(); } 
} 

và đây là cách bạn muốn sử dụng nó:

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

Tôi khuyên bạn nên sửa đổi lớp để thay thế cuộc gọi không được chấp nhận (từ 5.3) sang eregi và sử dụng preg_match với/i – hobodave

+0

Câu trả lời được đánh giá cao nhưng tôi chỉ cần một chức năng để kiểm tra hình ảnh gravatar hợp lệ. Nếu không tìm thấy hình ảnh hợp lệ, hàm cần trả về FALSE. Trừ khi tôi bỏ qua nó, tôi không thấy mã trong lớp trên cho điều đó. – Jeff

0

là tên tập tin (Content-Disposition: inline; filename = "5ed352b75af7175464e354f6651c6e9e.jpg") phù hợp cho "không tìm thấy/không hợp lệ" Hình ảnh Gravatar? Nếu vậy, bạn có thể sử dụng để xác định hình ảnh không hợp lệ?

+0

Tôi ước nó phù hợp, nhưng nó khác nhau đối với mọi địa chỉ email, cho dù đó là một gravatar hợp lệ hay không. :( – Jeff

+0

Nội dung có giống nhau cho địa chỉ email không hợp lệ ngay cả khi tên tệp không? Có lẽ bạn có thể lấy mã băm MD5 của phản hồi "không hợp lệ" đã biết và sử dụng để so sánh ... –

+0

Có, nội dung giống nhau cho các địa chỉ email không hợp lệ mặc dù tên tệp không phải là vấn đề. Các câu trả lời hợp lệ giống hệt với các câu trả lời không hợp lệ – Jeff

-1

Một giải pháp thực sự unperformant có thể là để gửi email-http://en.gravatar.com/accounts/signup và kiểm tra Sorry, that email address is already used! ...

chỉnh sửa

Được rồi, họ sử dụng một số cookie cho biết nếu một lỗi xảy ra hay không ... ;-)

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

Tôi không nghĩ rằng những người ở Gravatar sẽ quá phấn khích về cách tiếp cận này .;-) – scunliffe

+0

Sau đó họ nên cung cấp API ... ;-) –

+1

lại: API; Tôi đồng ý hết lòng. Gần đây họ đã thay đổi 302 trên một chiếc cốc không hợp lệ thành 200 ... có thể cho mục đích chính xác này. Tại sao họ không cho phép quản trị viên web kiểm tra hình ảnh không hợp lệ? Làm cho không có ý nghĩa. – Jeff

-1

Không chắc chắn chính xác làm thế nào bạn muốn sử dụng thông tin này khi bạn nhận được nó ... nhưng có thể bạn:

Tải hình ảnh trên trang web, với bộ xử lý onload hoặc onerror đính kèm ... nếu onload cháy, bạn có một trận đấu, nếu onerror kích hoạt nó hoặc không tồn tại (hoặc có sự cố khi tải nó)

ví dụ

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

Tôi không nghĩ rằng nó sẽ làm việc vì hình ảnh không bao giờ thất bại ... Luôn luôn là một phản ứng 200. – Jeff

+0

Ah, tiếc quá. Đoán nó trả tiền để đọc các câu hỏi kỹ lưỡng. – scunliffe

1

thêm tham số "mặc định" vào url hình ảnh khi kiểm tra gravatar, điều này sẽ cung cấp chuyển hướng 302 nếu không tìm thấy hình ảnh.

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

hình ảnh null thì có thể trả lại 404 nếu bạn muốn nó :)

+0

không chắc chắn lý do tại sao điều này được modded xuống, tôi có điều này làm việc hoàn hảo trong một môi trường sản xuất. – Jason

+0

Tôi không chắc chắn, có thể vì câu hỏi ban đầu đề cập đến tham số mặc định đã có. Đối với nghiệp và sự giúp đỡ, bỏ phiếu. – Jeff

+0

ah, đã bỏ lỡ .... – Jason

6

Gravatar đã thêm một tùy chọn để tham số 'd', có nghĩa rằng if you pass in d=404, bạn sẽ có một trang 404 (thay vì một số 302 chuyển hướng đến hình ảnh mặc định) nếu không có hình ảnh, thay vì phải sử dụng chẩn đoán.

1

Mở rộng câu trả lời của Andrew Aylett khoảng d = 404, trên thực tế nó có thể soạn một truy vấn Gravatar với d=404 (hoặc default=404), sau đó nhìn vào các tiêu đề nếu chủ chốt [0] chứa một giá trị hoặc .

$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 

Câu hỏi ban đầu có từ ba năm trước. Có lẽ vào thời điểm đó, các tiêu đề của Gravatar hơi khác một chút.

Các vấn đề liên quan