2010-01-20 11 views

Respuesta

88

Al construir la URL, use el parámetro d = 404. Esto hará que Gravatar devuelva un error 404 en lugar de una imagen si el usuario no ha configurado una imagen.

Si está utilizando el control .Net vinculado desde el sitio gravitar, necesitará modificar la enumeración IconSet (y probablemente extraiga el código del control, para que pueda obtener el estado directamente).

+4

-> http://www.gravatar.com/avatar/aaa?default=404 – thijs

+0

Esa es una respuesta mucho más limpia que el resto. Me gusta, vale la pena leer la documentación que parece. – Paddy

+0

Una vez que tienes el 404, ¿cómo lo conviertes en gravatar = falso? – woodenfox

6

Lo que hice:

  • generar un gravatar con un no-existente e-mailadress
  • Guardar la imagen
  • Hacer una suma de comprobación MD5 de los contenidos imágenes y almacenarlo como una constante en su código

aplicación Después de que hice esto para cada solicitud gravatar:

  • descargar la imagen gravatar
  • suma de control MD5 de los contenidos y compararla con la constante
  • Si coincide que es la imagen por defecto, si lo hace, no se trata de una imagen personalizada

también almacena en caché el Gravatar la imagen durante 24 horas para que no tenga que depender de Gravatar todo el tiempo. Opcionalmente, puede poner los primeros 3 puntos en una función y dejar que se ejecuten de vez en cuando para asegurarse de que Gravatar todavía use la misma imagen predeterminada aunque no hayan aparecido en los últimos dos meses (probablemente nunca).

+0

Bastante bueno idea..What es una suma de comprobación MD5? – Luke101

+0

La suma de comprobación MD5 es un hash MD5 del contenido completo del archivo; Fragmento de código para C# aquí: http: // sharpertutorials.com/calculate-md5-checksum-file/ – fijter

+0

La respuesta elegida es mucho mejor, pero este truco es útil en algunos casos. Por ejemplo, en Javascript en una página web o extensión de navegador si no desea que su navegador registre un error "404 no encontrado" en las herramientas de desarrollo. –

3

En 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; 
} 
+0

¿Hay un traductor de código en línea para convertirlo en C#? – Luke101

+0

@ Luke101: No lo sé, y todavía estoy dando los primeros pasos en C#. Lo siento. –

+0

¿Por qué la comprobación de igualdad a 02dcccdb0707f1c5acc9a0369ac24dac? – adrianbanks

2

En C#, basado en el código PHP publicado anteriormente (no probado - código fuente antes del almuerzo sigue):

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

Actualmente estoy haciendo algo similar. Tengo una configuración de tabla para los perfiles de los usuarios y en esa tabla tengo una columna llamada Avatar. Aquí es donde se almacenará una URL de Gravatar. El siguiente código es lo que uso para administrar esta columna.

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

Esto parece funcionar bastante bien para mí. Siempre tengo un avatar predeterminado que muestra, y cuando un usuario realmente desea que se muestre su avatar personalizado, asocian su correo electrónico Gravatar (que hechizo y nunca almacena como dirección de correo electrónico), lo que crea una URL que puedo incluir como imageURL . Cuando el usuario elimina su enlace gravatar, anulo la columna de la base de datos y el imageURL vuelve a mi imagen predeterminada.

Buena suerte, y espero que esto ayude a algunos.

1
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"); 
     } 
    } 
0
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; 

} 
Cuestiones relacionadas