J'ai réussi à faire fonctionner le service gravatar sur mon site. Mais je voudrais savoir si l'utilisateur a téléchargé sa photo ou non. Existe-t-il un moyen de le savoir ?
Réponses
Trop de publicités?Lors de la construction de l'URL, utilisez le paramètre d=404. Cela permettra à Gravatar de renvoyer une erreur 404 plutôt qu'une image si l'utilisateur n'a pas défini d'image.
Si vous utilisez le contrôle .Net dont le lien figure sur le site de gravitar, vous devrez modifier l'énumération IconSet (et probablement retirer le code du contrôle, afin de pouvoir accéder directement à l'état).
Ce que j'ai fait :
- Générer un gravatar avec une adresse e-mail inexistante
- Sauvegarder l'image
- Faites une somme de contrôle MD5 du contenu des images et stockez-la comme une constante dans le code de votre application.
Après cela, j'ai fait cela pour chaque demande de gravatar :
- Télécharger l'image gravatar
- MD5 checksum le contenu et le comparer à la constante
- Si elle correspond, c'est l'image par défaut, sinon, c'est une image personnalisée.
J'ai également mis en cache l'image gravatar pendant 24 heures pour que vous n'ayez pas à compter sur gravatar en permanence. En option, vous pouvez mettre les 3 premiers points dans une fonction et la laisser tourner de temps en temps pour vous assurer que gravatar utilise toujours la même image par défaut, bien qu'ils ne l'aient pas fait depuis au moins deux mois (probablement jamais).
En C#, basé sur le code PHP posté plus tôt (non testé - le code source avant le déjeuner suit) :
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");
}
Je suis en train de faire quelque chose de similaire. J'ai une table configurée pour les profils des utilisateurs et dans cette table, j'ai une colonne appelée Avatar. C'est là que l'URL de Gravatar sera stockée. Le code suivant est ce que j'utilise pour gérer cette colonne.
// 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);
}
Cela semble fonctionner assez bien pour moi. J'ai toujours un avatar par défaut, et lorsqu'un utilisateur souhaite afficher son avatar personnalisé, il associe son e-mail Gravatar (que je hache et ne stocke jamais comme adresse e-mail), ce qui crée une URL que je peux simplement déposer comme imageURL. Lorsque l'utilisateur supprime son lien Gravatar, je vide la colonne de la base de données et l'imageURL revient à mon image par défaut.
Bonne chance, et j'espère que cela vous aidera un peu.