c# gravatar

c# - Gravatar: ¿Cómo puedo saber si un usuario tiene una imagen real?



(7)

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 les ayude a algunos.

He obtenido el servicio Gravatar trabajando en mi sitio. Pero me gustaría saber si el usuario ha subido su foto o no. ¿Hay alguna manera de saber esto?


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, tendrá que modificar la enumeración IconSet (y probablemente sacar el código del control, para que pueda obtener el estado directamente).


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

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


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


Lo que hice:

  • Genera un gravatar con un e-mailadress inexistente
  • Guarda la imagen
  • Haga una suma de comprobación MD5 del contenido de las imágenes y guárdelo como una constante en el código de su aplicación

Después de eso, hice esto para cada solicitud de gravatar:

  • Descargue la imagen gravatar
  • MD5 comprueba el contenido y lo compara con la constante
  • Si coincide con la imagen predeterminada, si no es una imagen personalizada

También guardé en caché la imagen de Gravatar durante 24 horas para que no tengas 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).


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


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