Я получил сервис gravatar, работающий на моем сайте. Но я хотел бы знать, загрузил ли пользователь свою фотографию или нет. Есть ли способ узнать это?
Gravatar: Как узнать, есть ли у пользователя реальная фотография?
Ответ 1
При построении URL используйте параметр d = 404. Это заставит Gravatar вернуть ошибку 404, а не изображение, если пользователь не установил изображение.
Если вы используете элемент управления .Net, связанный с сайтом гравитатора, вам нужно будет изменить перечисление IconSet (и, вероятно, вывести код из элемента управления, чтобы вы могли напрямую получить статус).
Ответ 2
Что я сделал:
- Создание гравитатора с несуществующей электронной почтой.
- Сохранить изображение
- Сделайте контрольную сумму MD5 содержимого изображения и сохраните его как константу в коде приложения.
После этого я сделал это для каждого запроса гравитара:
- Загрузите изображение gravatar
- MD5 проверяет содержимое и сравнивает его с константой
- Если это соответствует изображению по умолчанию, если это не пользовательское изображение
Я также кэшировал изображение gravatar в течение 24 часов, поэтому вам не нужно постоянно полагаться на gravatar. При желании вы можете поместить первые 3 точки в функцию и позволить ей запускать время от времени, чтобы гарантировать, что gravatar по-прежнему использует одинаковый образ по умолчанию, хотя они не имеют, по крайней мере, последние пару месяцев (возможно, никогда).
Ответ 3
В 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;
}
Ответ 4
В С# на основе кода 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");
}
Ответ 5
В настоящее время я делаю что-то подобное. У меня есть настройка таблицы для профилей пользователей, и в этой таблице у меня есть один столбец под названием "Аватар". Здесь будет храниться 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 avatar property is set
if (Profile.Avatar != null)
{
uxAvatar.ImageUrl = Profile.Avatar;
}
// by default the profile 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-адрес, который я могу просто добавить в качестве изображенияURL, Когда пользователь удаляет свою ссылку на gravatar, я удаляю столбец базы данных, а imageURL возвращается к моему изображению по умолчанию.
Удачи, и надеюсь, что это поможет вам.
Ответ 6
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");
}
}
Ответ 7
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;
}