Граватар: как узнать, есть ли у пользователя реальная картинка - PullRequest
33 голосов
/ 20 января 2010

Я получил сервис граватар, работающий на моем сайте. Но я хотел бы знать, загрузил ли пользователь свою фотографию или нет. Есть ли способ узнать это?

Ответы [ 7 ]

88 голосов
/ 25 января 2010

При построении URL используйте параметр d = 404. Это приведет к тому, что Gravatar вернет ошибку 404, а не изображение, если пользователь не установил изображение.

Если вы используете элемент управления .Net, связанный с сайтом гравитара, вам нужно изменить перечисление IconSet (и, вероятно, вытащить код из элемента управления, чтобы вы могли напрямую получить статус).

6 голосов
/ 24 января 2010

Что я сделал:

  • Создать граватар с несуществующим адресом электронной почты
  • Сохранить изображение
  • Создайте контрольную сумму MD5 для содержимого изображений и сохраните ее как константу в коде вашего приложения

После этого я делал это для каждого серьезного запроса:

  • Скачать граватарное изображение
  • Контрольная сумма MD5 содержимого и сравнение с константой
  • Если это совпадает, это изображение по умолчанию, если это не так, это пользовательское изображение

Я также кэшировал изображение граватара в течение 24 часов, поэтому вам не нужно постоянно полагаться на граватар. При желании вы можете поместить первые 3 точки в функцию и позволить ей запускаться время от времени, чтобы гарантировать, что gravatar по-прежнему использует одно и то же изображение по умолчанию, хотя они не использовали его по крайней мере в последние пару месяцев (вероятно, никогда).

3 голосов
/ 25 января 2010

В PHP:

function hasGravatar($email)
{
    return (md5(file_get_contents(sprintf('http://www.gravatar.com/avatar/%s?default=identicon&size=32', md5($email)))) == '02dcccdb0707f1c5acc9a0369ac24dac') ? false : true;
}
2 голосов
/ 26 января 2010

В C #, основанном на ранее опубликованном PHP-коде (непроверенный - исходный код перед обедом следует):

using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Net.WebClient;

public string GenerateMD5(string plaintext)
{
    Byte[] _originalBytes;
    Byte[] _encodedBytes;
    MD5 _md5;

    _md5 = new MD5CryptoServiceProvider();
    _originalBytes = ASCIIEncoding.Default.GetBytes(plaintext);
    _encodedBytes = _md5.ComputeHash(_originalBytes);

  return BitConverter.ToString(_encodedBytes).ToLower();
}

public string file_get_contents(string url) 
{ 
    string sContents = string.Empty; 

    if (url.ToLower().IndexOf("http:") > -1) {
        System.Net.WebClient wc = new System.Net.WebClient(); 
        byte[] response = wc.DownloadData(url); 
        sContents = System.Text.Encoding.ASCII.GetString(response); 
    } else { 
        System.IO.StreamReader sr = new System.IO.StreamReader(url); 
        sContents = sr.ReadToEnd(); 
        sr.Close(); 
    } 

    return sContents;
}

public bool hasGravatar(string email)
{
    string _mailMD5 = GenerateMD5(email);
    string _url = String.Format("http://www.gravatar.com/avatar/{0}?default=identicon&size=32", _mailMD5);
    string _fileMD5 = GenerateMD5(file_get_contents(_url));

    return !(_fileMD5 == "02dcccdb0707f1c5acc9a0369ac24dac");
}
1 голос
/ 18 марта 2011
private bool HasUserPublicGravatar(string email)
    {
        try
        {
            var gravatarPath = GravatarService.GetGravatarUrlForAddress(email,
            new GravatarUrlParameters { DefaultOption = GravatarDefaultUrlOptions.Error });

            WebRequest wReq = HttpWebRequest.Create(gravatarPath);
            var wRes = wReq.GetResponse();
            return true;
        }
        catch (System.Net.WebException ex)
        {
            if (ex.Message.Contains("404"))
                return false;
            else
                throw new Exception("Couldn't determine if ueser has public avatar");
        }
    }
1 голос
/ 28 января 2010

Я сейчас занимаюсь чем-то похожим. У меня есть таблица настроек для профилей пользователей, и в этой таблице у меня есть один столбец с именем Аватар. Здесь будет храниться URL Gravatar. Следующий код используется для управления этим столбцом.

// first gather the email address that is going to be associated with this user as
// their gravatar.
// once you have gathered the email address send it to a private method that
// will return the correct url format.
protected void uxAssocateAvatar_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
    string emailAddress = uxEmailAddress.Text;
    try
    {
        Profile.Avatar = GetGravatarUrl(emailAddress);
        Profile.Save();
        Response.Redirect("Settings.aspx", true);
    }
    catch (Exception ex)
    {
        ProcessException(ex, Page);
    }
}
}

// use this private method to hash the email address, 
// and then create the url to the gravatar service.
private string GetGravatarUrl(string dataItem)
{
    string email = dataItem;
    string hash =
        System.Web.Security.FormsAuthentication.
        HashPasswordForStoringInConfigFile(email.Trim(), "MD5");
    hash = hash.Trim().ToLower();
    string gravatarUrl = string.Format(
       "http://www.gravatar.com/avatar.php?gravatar_id={0}&rating=G&size=100",
        hash);
    return gravatarUrl;
}

// on the page where an avatar will be displayed, 
// just drop in an asp.net image control with a default image.
<asp:Image ID="uxAvatar" runat="server" ImageUrl="~/images/genericProfile.jpg"
AlternateText="" CssClass="profileAvatar" BorderWidth="1px"/>

// and on page_load or something like that, 
// check to see if the profile's avatar property is set 
if (Profile.Avatar != null)
{
    uxAvatar.ImageUrl = Profile.Avatar;
}

// by default the profile's avatar property will be null, and when a user decides
// that they no longer want an avatar, the can de-associate it by creating a null 
// property which can be checked against 
// to see if they have one or don't have one.
protected void uxRemoveAvatar_Click(object sender, EventArgs e)
{
    Profile.Avatar = null;
    Profile.Save();
    Response.Redirect("Settings.aspx", true);
}

Мне кажется, это хорошо работает. У меня всегда отображается аватар по умолчанию, и когда пользователь на самом деле хочет, чтобы его собственный аватар отображался, он связывает свою электронную почту Gravatar (которую я хэширую и никогда не сохраняю как адрес электронной почты), которая создает URL, который я могу просто вставить как imageURL , Когда пользователь удаляет свою граватационную ссылку, я обнуляю столбец базы данных, и imageURL возвращается к моему изображению по умолчанию.

Удачи, и надеюсь, что это поможет вам.

0 голосов
/ 19 мая 2012
function get_gravatar( $email, $s = 80, $d = '404', $r = 'x', $img = false, $atts = array() ) {

$url = 'http://www.gravatar.com/avatar/';
$url .= md5(strtolower(trim($email)));
$url .= "?s=$s&d=$d&r=$r";

if ( $img ) 
{
$url = '<img src="' . $url . '"';
foreach ( $atts as $key => $val )
$url .= ' ' . $key . '="' . $val . '"';
$url .= ' />';
return $url;

}

$headers = @get_headers($url);

if (!preg_match("|200|", $headers[0])) 
{
$has_valid_avatar = 'no';
} 
else 
{
$has_valid_avatar = 'yes';
}

return $has_valid_avatar;

}
...