Ostatnio opisałem jak możemy odebrać trackback, teraz pora na jego wysyłanie :)
Oczywiście, stoimy przed tymi samymi problemami co w przypadku wysyłania pingback. Do tego, jeżeli mamy zaimplementowany pingback, warto ustalić pewną kolejność wykonywanych poleceń – najpierw trackback a potem pingback czy na odwrót? Powinniśmy także wysłać tylko jedną rzecz, po co zaśmiecać i spamować inne blogi/źródła.
Cały proces wysyłania trackback jest bardzo podobny do tego z pingback:
- Pobieramy wszystkie URLe z naszego tekstu i robimy na nich distinct
- Dla każdego urla
- Pobieramy stronę
- Sprawdzamy czy istnieje RDF (i opcjonalnie
rel=trackback) - Wywołujemy metodę HTTP POST/PUT
Pierwszy krok jest taki sam jak przy pingback, więc go pomijam tutaj.
Wysyłanie trackbacka
Ponownie, RestSharp for rescue:
private static readonly Regex UrlsRegex = new Regex(
@"<a.*?href=[""'](?<url>.*?)[""'].*?>(?<name>.*?)</a>"
, RegexOptions.IgnoreCase | RegexOptions.Compiled
);
public void Send(Post post, Uri itemUri)
{
var uris = get_uris(post.Content);
foreach (var uri in uris)
{
var trackback = send_trackback(post, itemUri, uri);
if (!trackback)
{
send_ping(itemUri, uri);
}
}
}
private bool send_trackback(Post post, Uri itemUri, Uri targetUri)
{
if (itemUri == null
|| targetUri == null)
{
return false;
}
try
{
var request = new RestRequest(Method.GET);
_restClient.BaseUrl = targetUri.AbsoluteUri;
var response = _restClient.Execute(request);
var trackbackUri = trackabck_uri(response.Content);
if (trackbackUri == null)
{
return false;
}
request = new RestRequest(Method.POST);
_restClient.BaseUrl = trackbackUri.AbsoluteUri;
request.AddParameter("title", post.Title);
request.AddParameter("url", itemUri.AbsoluteUri);
request.AddParameter("excerpt", post.Description);
// method query db for blog configuration etc.
request.AddParameter("blog_name", get_blog_name());
response = _restClient.Execute(request);
// we can parse error etc, but this should be enough
return response.StatusCode == HttpStatusCode.OK
&& response.Content.Contains("<error>0</error>");
}
catch (Exception ex)
{
_log.ErrorException("Error occured during sending trackback from: {0} to {1}"
.FormatWith(itemUri, targetUri), ex);
}
return false;
}
private Uri trackabck_uri(string content)
{
var url = TrackbackLinkRegex.Match(content).Groups[1].ToString().Trim();
Uri uri;
return Uri.TryCreate(url, UriKind.Absolute, out uri) ? uri : null;
}
Podsumowanie
Nie było tak żle? :) to chyba kończy temat związany z linkbackami.
Uwagi? Sugestie? Czy uważacie, że w ogóle warto się w to bawić? Czy może to nie ma sensu i wystarczy tylko i wyłącznie implementacja pingback?














