Skip to content

Instantly share code, notes, and snippets.

@rafaelromao
Last active May 2, 2016 13:25
Show Gist options
  • Save rafaelromao/e10f69094b60176bd33e1e6b4541b422 to your computer and use it in GitHub Desktop.
Save rafaelromao/e10f69094b60176bd33e1e6b4541b422 to your computer and use it in GitHub Desktop.
Buscapé API C# Sample
// Realiza a busca no Buscapé e trata os resultados
private async Task ExecuteSearchAsync(string uri, CancellationToken cancellationToken)
{
using (var request = new HttpRequestMessage(HttpMethod.Get, uri))
{
using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
var buscapeResponse = await WebClient.SendAsync(request, cancellationTokenSource.Token);
if (buscapeResponse.StatusCode != HttpStatusCode.OK)
{
Console.WriteLine(@"Não foi possível obter uma resposta do Buscapé!");
}
else
{
var resultJson = await buscapeResponse.Content.ReadAsStringAsync();
dynamic responseMessage = JsonConvert.DeserializeObject(resultJson);
try
{
foreach (JObject product in responseMessage.product)
{
try
{
var resultItem = ParseProduct(product);
await Console.WriteLine(resultItem);
}
catch (Exception e)
{
Console.WriteLine($"Exception parsing product: {e}");
}
}
}
catch (Exception e)
{
Console.WriteLine($"Exception parsing response from Buscapé: {e}");
Console.WriteLine("Nenhum resultado encontrado");
return;
}
await Task.Delay(TimeSpan.FromSeconds(2), cancellationTokenSource.Token);
Console.WriteLine("Response sent!");
}
}
}
}
// Faz o parse do Json retornado pelo Buscapé
private static string ParseProduct(JObject product)
{
var obj = product.Properties().First();
var name = obj.Value["productname"]?.Value<string>() ??
obj.Value["productshortname"]?.Value<string>() ?? "Produto Desconhecido!";
var pricemin = obj.Value["pricemin"]?.Value<string>();
var pricemax = obj.Value["pricemax"]?.Value<string>();
var text = name;
if (pricemin != null && pricemax != null)
text += $"\nDe R$ {pricemin} a R$ {pricemax}.";
var thumbnail =
obj.Value["thumbnail"]["formats"].Single(
f => f["formats"]["width"].Value<int>() == 100)["formats"]["url"]
.Value<string>();
var link =
obj.Value["links"].Single(
l => l["link"]["type"].Value<string>() == "product")["link"]["url"]
.Value<string>();
var resultItem = $"{thumbnail} - {text} - {link}";
return resultItem;
}
// Monta a uri de busca, dada uma keywork
private async Task<string> ComposeSearchUriAsync(string keyword)
{
var originalKeyword = keyword;
var categoryId = await DecodeCategoryIdAsync(keyword);
if (categoryId > 0)
keyword = string.Join("+", keyword.Split(' ').Skip(1));
const int pageSize = 3;
var page = 1;
var parameters = $"myBuscapeAppToken/BR?results={pageSize}&page={page}&keyword={keyword}&format=json&sort=price";
if (categoryId > 0)
parameters += $"&categoryId={categoryId}";
var uri = $"http://sandbox.buscape.com.br/service/findProductList/{parameters}";
return uri;
}
// Identifica a categoria de busca, uma vez que o parametro keywork pode conter mais de uma palavra, e nesse caso a primeira deve ser considerada uma categoria
private async Task<int> DecodeCategoryIdAsync(string keyword)
{
try
{
var keywords = keyword.Split(' ');
if (keywords.Length > 1)
{
var category = keywords[0];
var categoryParameters = $"myBuscapeAppToken/BR?keyword={category}&format=json";
var categoryUri = $"http://sandbox.buscape.com.br/service/findCategoryList/{categoryParameters}";
using (var request = new HttpRequestMessage(HttpMethod.Get, categoryUri))
{
using (var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
var buscapeResponse = await WebClient.SendAsync(request, cancellationTokenSource.Token);
if (buscapeResponse.StatusCode != HttpStatusCode.OK)
return 0;
var resultJson = await buscapeResponse.Content.ReadAsStringAsync();
var responseMessage = JsonConvert.DeserializeObject<JObject>(resultJson);
return responseMessage["subcategory"][0]["subcategory"]["id"].Value<int>();
}
}
}
return 0;
}
catch (Exception)
{
return 0;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment