O que é WMS?

O WMS, warehouse management system ou sistema de gestão de armazém. É o sistema que faz toda a gestão do CD, de todos os recursos, dos produtos etc.

Suas principais funcionalidades de operação são:

  1. Recebimento – Esse é o processo de receber produtos de parceiros/fornecedores, quando integrado ao ERP (saiba mais de ERP aqui), o recebimento pode (deveria) estar ligado à uma compra com nota fiscal.
  2. Conferência – Isso é basicamente o batimento dos itens que você combinou de receber contra o que de fato foi recebido. Esse batimento é feito geralmente com base em uma nota fiscal ou em um pedido de compra. Quando o valor não bate é necessário efetuar uma operação fiscal para correção dessa quantidade, seja uma nota fiscal de devolução quando a quantidade é menor, ou uma nota fiscal de venda para alocar os itens a mais no estoque, ou ainda em alguns casos extremos as mercadorias são todas levadas de volta…
  3. Armazenar – Aqui colocamos todos produtos no devido endereço e o WMS com sua base de dados o faz da melhor forma possível, de forma a melhorar a roteirização feita no armazém pelos que nele operam.
  4. Separação – Da mesma forma como é tratado no artigo Separação de produtos
  5. Expedição – Aqui o WMS gerencia o endereçamento dos produtos para as docas, onde os transportadores aguardam para levar os produtos ao seu destino.
  6. Inventário – É o processo de conferência do estoque, e ele pode ser feito em todo o armazém o que faz com que toda a operação do armazém fique por conta disso, ou pode ser parcialmente, onde uma parte do time da operação faz a validação enquanto outra parte do time fica focada no inventário, isso é importante para operações que não podem parar totalmente, além disso é bom para manter o time operando quando a ociosidade na operação. Seja cíclico ou total o inventário feito periodicamente permite a você identificar rapidamente rupturas e de forma pró-ativa sem afetar suas vendas.
  7. Endereçamento – Você poderá criar espaços delimitados fisicamente no seu armazém (andar, corredor, baia, nível e slot), além criar espaços virtuais, como por exemplo, você poder te um pallet ou box em um lugar determinado no armazém e determinar que todos os itens pequenos com avaria devam ser depositados ali.

Espero que esse artigo tenha contribuído no seu conhecimento.

Abs e até mais.

O que é ERP?

Muitas vezes chegamos em um projeto e temos que integrar com o ERP, receber dados de catálogo de produto do ERP, mandar pedidos para o ERP e fazer tudo quanto é comunicação com o tal do ERP! Mas, na prática o que é ERP? 

ERP é uma sigla oriunda do nome Enterprise Resource Planning que, traduzido ao pé da letra, significa “Planejamento dos recursos da empresa”. ERPs são que softwares que integram todos os dados e processos de uma organização em um único sistema.

Esses ERP’s são grandes sistemas compostos por vários módulos que tem por finalidade suportar a gestão e controlar áreas da empresas, tais como contabilidade, financeiro, fiscal, recursos humanos, logística etc., e mais do que isso como os dados estão na mesma base de dados isso dá condição ao ERP de ter os módulos integrados e de fato manter a empresa toda interligada de forma sistêmica. 

Uma grande vantagem de ter um ERP é justamente a possibilidade de diminuir softwares satélites na Operacao tecnológica. Também há ERP’s específicos para determinadas indústrias/ramos como varejo, moda, escolas, manufaturas farmacêuticas etc. 

Espero que esse artigo tenha agregado valor e conhecimento.  

Abs e até a próxima. 

Recorrência de Pagamento no e-Commerce com cartão de crédito (e um pouco de PCI)

Quantos de vocês têm curiosidade de saber como é que o Spotify, Apple, Netflix dentro outros mensalmente cobram seus clientes no cartão de crédito ou de débito e pedindo esse cartão apenas uma vez? Pois bem, aqui vou colocar algumas abordagens que permitem que essa operação seja feita e de forma segura (tanto para o prestador de serviço quanto para o cliente).

É necessário guardarmos dados do cliente dentro da plataforma e efetuando a cobrança de forma automática, é aqui que temos que levar em consideração detalhes de infraestrutura e desenvolvimento do sistema.

 

Desenvolvimento de software/produto segundo padrão PCI DSS

Há 12 regras/requerimentos que devem ser seguidos quando uma solução precisa seguir os requerimentos do PCI DSS, são elas:

  1. Instalar e manter um firewall para proteger dados de cartão de crédito.
  2. Não utilizar senhas padrão ou outras configurações de segurança dos softwares utilizados.
  3. Proteger dados de cartões de crédito armazenados.
  4. Utilizar criptografia na transmissão de dados de cartões de crédito, manter um programa de Gerenciamento de Vulnerabilidades.
  5. Utilizar regularmente programas anti-vírus.
  6. Desenvolver e manter sistemas e aplicações seguras, implementar um forte controle de acesso.
  7. Restringir acesso a dados de cartões de crédito por negócio e por pessoas que realmente precisam acessá-los.
  8. Designar um único ID para cada usuário da rede e sistemas.
  9. Restringir acesso físico aos dados de cartão de crédito, testar e monitorar a rede regularmente.
  10. Rastrear e monitorar todos os acessos à rede e dados de cartões de crédito.
  11. Testar a segurança de sistemas e processos regularmente, manter um programa de Gerenciamento de Vulnerabilidades.
  12. Manter uma política que enderece informações de segurança.

Não se engane pensando que esses requerimentos são aplicados somente ao software da solução, pois quando você lê o Guia Rápido do PCI DSS fica claro que o hardware também deve ser específico para suportar a operação.

 

Terceirizando a solução

Uma proposição para solução é gravar os dados do cartão dentro de um gateway de pagamento (que por sua vez já deve seguir todas as regas do PCI, portanto o prestador do serviço também já garantiria isso).

Aqui há uma proposição de arquitetura de infraestrutura que a AWS deixou disponível em seu site através do link PCI DSS Compliance on AWS, que está logo abaixo:

pci-on-aws-architecture.png

Talvez seja uma solução muito robusta e complexa para ser mantida por vendedor de serviços ou um varejista.

 

Utilize um gateway de pagamento

Aqui a solução fica bem mais fácil, basicamente vamos guardar os dados dos cartões dos nossos clientes dentro do gateway de pgamento, exatamente da mesma forma como fazemos quando utilizamos a solução de one-click-buy, gravamos um token dentro de nossa plataforma de eCommerce  e apenas passamos o mesmo para o gateway com a requisição de transação.

Aqui tem uma forma que o PayPal sugere para fazer pagamento recorrente, é bem parecido com o que vemos de integração com gateway de pagamento.

RecurringPaymentsFlowUX

Aqui temos temos uma fluxo simples que demonstra que, após ter o dados do cartão gravados na base de dados (qualquer que seja ela), basta ter um agendamento para fazer a requisição da transação novamente.

flow-recurring-payments

Quem é responsável pelas normas do PCI?

É a PCI Security Standards Council que faz a administração dos padrões de segurança do pagamentos de cartão, padrão também conhecido como PCI DSS. Esse órgão foi fundado por instituições como American Express, Discover Financial Services, JCB International, MasterCard Worldwide e Visa Inc.

Quem deve estar dentro desse padrão PCI DSS?

TODAS as empresas que transacionam, armazenam e processam dados do titulas do cartão (CHD – Card Holder Data/Dados do titular do cartão) ou dados que dependem de autenticação (SAD – Sensitive Authentication Data/Dados de autenticação sensíveis), se encaixam nesse perfil varejistas, comerciantes, processadores, compradores, emissores e provedores de serviços.

Bom, espero que isso esse material tenha agregado conhecimento a vocês. Até a próxima!

Referências

https://aws.amazon.com/pt/compliance/pci-dss-level-1-faqs/

https://www.pcisecuritystandards.org/

https://www.pcisecuritystandards.org/pci_security/glossary

https://www.pcisecuritystandards.org/pdfs/pci_ssc_quick_guide.pdf

https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECRecurringPayments/

http://paylane.com/recurring-payments/

Separação de produtos

Bom pessoal, dando continuidade ao que ocorre na operação de um eCommerce, vou falar agora do ponto de separação de produtos.

Basicamente os produtos eleitos na Geração de onda serão separados agora, cada separador/picker terá uma lista de produtos que deverá buscar no armazém. O processo é relativamente simples: ir até um endereço no armazém (geralmente o armazém é dividido em:

Divisão de um layout de armazém

  1. Andar – Há muitos armazéns com apenas um andar, então não utilizam essa característica
  2. Corredor – São as “ruas” do armazém
  3. Baia – Em uma comparação com a cidade seriam os números das residências
  4. Nível – A altura da baia
  5. Slot – Dentro no nível, isso é como uma subdivisão no nível

Estrutura do código de barras do endereço

E essa mesma estrutura é utilizada para fazer o endereço do item também é utilizada como a etiqueta para guardar os itens, conforme abaixo:

wmsbarcodesample.PNG

E mais do que isso, quando o separador vai em busca dos produtos o WMS cria uma rota para ele, para que a separação seja mais efetiva, e obviamente utiliza os dados de endereçamento dos itens.

Layout/Mapa de Armazém

Abaixo segue um exemplo de layout/mapa de armazém:

Warehousing_layout_example.jpg

Processo de separação

De forma resumida o que o separador faz aqui é:

  1. Pegar a lista de separação de produtos, bem como sua rota;
  2. Seguir o roteiro fazendo a leitura do código de barras dos itens e pegando os mesmo de cada endereço;
  3. Colocar todos esses itens em uma área de consolidação pré-faturamento.

Essa é uma visão simplificada do processo, pois, há operações nas quais os separadores colocam os itens em uma área de pré-consolidação em pontos do corredores e outros separadores levam esses itens para a área de consolidação. Há casos nos quais robôs e esteiras fazem a separação.

Abs e até a próxima!

Referências

How to layout your warehouse?

How to map and label your eCommerce warehouse

Baixar arquivo da Web com Java

Depois de efetuar download de arquivos com C# resolvi fazer o mesmo com Java, como estou estudando essa tecnologia agora talvez tenha alguma forma melhor de fazer do que a eu utilizei, de qualquer forma está bem fácil de entender. Veja o código abaixo:


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class Arquivo {
 public static void main(String[] args) throws IOException {

URL url = new URL("http://localhost/catalog.xml");
 String destino = "C:\\Temp\\catalog_java.xml";

InputStream is = url.openStream();

FileOutputStream fos = new FileOutputStream(destino);

int bytes = 0;

while ((bytes = is.read()) != -1) {
 fos.write(bytes);
 }

 is.close();

 fos.close();
 }
}

Até o próxima!

Baixar arquivos da Web com C#

Este exemplo mostra como baixar arquivos a partir de qualquer website para o disco local. Uma maneira simples para efetuar o download do arquivo é usar a classe WebClient e seu método DownloadFile. Este método tem dois parâmetros, primeiro é a url do arquivo que você deseja fazer o download e o segundo parâmetro é o caminho para o disco local para o qual deseja salvar o arquivo.

De forma síncrona

O código a seguir mostra como fazer o download de arquivos de forma síncrona. Este método bloqueia a thread principal até que o arquivo é baixado ou ocorrer um erro (neste caso, o WebException é lançada).


using System.Net;

WebClient webClient = new WebClient();
webClient.DownloadFile("http://localhost/arquivo.txt", @"c:\temp\arquivo.txt");

De forma assíncrona

Para baixar um arquivo sem bloquear o segmento principal uso DownloadFileAsync método assíncrono. Você também pode definir manipuladores de eventos para mostrar o progresso e para detectar que o arquivo é baixado. Faça o exemplo abaixo com uma aplicação Windows Forms.


private void btnDownload_Click(object sender, EventArgs e)
{
 WebClient webClient = new WebClient();
 webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completo);
 webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressoFeito);
 webClient.DownloadFileAsync(new Uri("http://localhost/arquivo.txt"), @"c:\temp\arquivo.txt");
}

private void ProgressoFeito(object sender, DownloadProgressChangedEventArgs e)
{
 progressBar.Value = e.ProgressPercentage;
}

private void Completo(object sender, AsyncCompletedEventArgs e)
{
 MessageBox.Show("Download efetuado!");
}

Até a próxima.

Encurtador de URL’s

Essa semana, aproveitei para colocar um pequeno projeto para funcionar, arquitetei e montei um Encurtador de URL’s que faz utilização do Dot Net Framework 4, SQL Server 2008, C#, integração com Web Services.

Da forma como foi feito encurtará apenas um pouco mais de 6 milhões de URL’s, mas está muito fácil para alterar o algorítimo para ter 5 caracteres ao invés de 4 na chave da URL.

A idéia é evoluir esse software e se aumentar muito a quantidade de acessos utilizar um banco de dados como o Apache Cassandra.

O Encurtador de URL’s está disponível no link http://devd.im, e o código fonte está em http://sourceforge.net/projects/devdim.

http://devd.im/

Formatar XML com XSL usando Dot Net

Nesse artigo utilizei Visual C# 2010 Express, Framework 4.0 e para o aplicativo teste fiz um console application.

Com o advento de integração, SOA, Web Services, cada dia mais temos que adaptar o conteúdo de nossos dados com agilidade, no meu caso eu atuo em uma empresa na qual temos vários parceiros comerciais que consomem nosso catálogo de produtos, e a forma de integração que temos é com o uso de XML, bom para acelerar o desenvolvimento do XML para cada parceiro, nós criávamos um XML para cada um, só que isso não era feito de forma automática, a codificação de cada XML era feita individualmente, os objetos eram reutilizados, mas ai tivemos problemas com performance, pois a consulta era feita em tempo real, ou seja, os parceiros concorriam com os clientes que navegavam no site, o XML demorava para ser carregado, quando era necessário efetuar algum filtro por categoria, gênero, marca etc, isso era feito na aplicação, ou seja, o catalogo era carregado inteiro e filtrado através de um delegate, quando eram poucos parceiros, poucos clientes, tudo bem, mas 1 ano depois com muito mais acessos o negócio ficou ruim, e é isso que vou mostrar como fazer aqui, como esse problema foi resolvido, os passos foram:

  1. Não acessar mais o banco diretamente, mas sim um XML base;
  2. Efetuar a formatação dos dados baseado em um XSL e não mais fazer isso na codificação;
  3. Colocar os critérios dentro do XSL ao invés de fazer na aplicação ou em query.

O que é um arquivo XSL e para que serve

Segundo a Wikpedia “XSL Transformations, ou XSLT (eXtensible Stylesheet Language for Transformation – linguagem extensível para folhas de estilo de transformações), é uma linguagem de marcação XML usada para criar documentos XSL que, por sua vez, definem a apresentação dos documentos XML nos browsers e outros aplicativos que a suportem.” ou seja, serve para formatar a saída de dados do XML

Fonte: http://pt.wikipedia.org/wiki/XSLT

Agora que estamos alinhados com o cenário vamos começar.

XML Base

Isso é algo muito tranquilo, foi criado um JOB que gera um XML em uma pasta visível pela aplicação com todo catálogo de produtos, para esse estudo vamos usar o exemplo abaixo:

<?xml version="1.0"
encoding="utf-8" ?>
<catalogo>
  <item>
    <Sku>500135</Sku>
<Descricao><![CDATA[Bola de Tênis Wilson Championship ]]></Descricao>
<CodigoCategoria>102</CodigoCategoria>
    <Categoria>RACKET</Categoria>
<CodigoMarca>15</CodigoMarca>
<Marca>WILSON</Marca>
 </item>
 <item>
    <Sku>500139</Sku>
<Descricao><![CDATA[Haltere Ferro Centauro MeioKg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500140</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 1 Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500141</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 2Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodSubGrupo>34</CodSubGrupo>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500142</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 3kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
  <item>
    <Sku>500143</Sku>
<Descricao><![CDATA[Halteres Ferro Centauro 4Kg]]></Descricao>
<CodigoCategoria>107</CodigoCategoria>
    <Categoria>BODY
               </Categoria>
<CodigoMarca>999</CodigoMarca>
<Marca>FORTE</Marca>
  </item>
</catalogo>

XSL’s

Bom, o XSL pode ficar ao gosto de cada um, eu vou colocar dois exemplos aqui, o primeiro nos dará a seguinte saída do XML Base:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' indent='yes' version='1.0' encoding='UTF-8' standalone='yes' cdata-section-elements='NOME'/>
<xsl:template match="/">
<produtos>
<xsl:for-each select="catalogo/item[CodigoCategoria='102' and CodigoMarca='999']">
<PRODUTO>
<SKU>
<xsl:value-of select="Sku"/>
</SKU>
<NOME>
<xsl:value-of select="Descricao"/>
</NOME>
<CATEGORIA>
<xsl:value-of select="Categoria"/>
</CATEGORIA>
</PRODUTO>
</xsl:for-each>
</produtos>
</xsl:template>
</xsl:stylesheet>

O segundo nos dará a saída abaixo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method='xml' indent='yes' version='1.0' encoding='UTF-8' standalone='yes' cdata-section-elements='NOME'/>
<xsl:template match="/">
<produtos>
<xsl:for-each select="catalogo/item[CodigoCategoria='102']">
<ITEM>
<CODIGO>
<xsl:value-of select="Sku"/>
</CODIGO>
<DESCRICAO>
<xsl:value-of select="Descricao"/>
</DESCRICAO>
</ITEM>
</xsl:for-each>
</produtos>
</xsl:template>
</xsl:stylesheet>

Esses arquivos devem ser criados em um local que a aplicação posso lê-los.

Agora vamos entender algumas tag’s do XSL:

Aqui é feita a declaração do XSL, a versão e qual namespace (xmlns) é utilizado, a tag deve ser fechada

<xsl:stylesheet version="1.0" xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>">

A saída do arquivo é definida aqui, o método/formato (method), a versão do formato (version), a codificação (encoding) e as tags que terão a saída com CDATA (cdata-section-elements).

<xsl:output method='xml' version='1.0' encoding='UTF-8' cdata-section-elements='NOME'/>

Nesse momento o nó raiz é escolhido para trabalhar, a tag deve ser fechada.

<xsl:template match="/">

Tudo o que não estiver usando o prefixo xsl será escrito da mesma forma como estiver no XSL. Vamos ver o loop agora

Aqui é o começo do loop

<xsl:for-each select="catalogo/item">

E aqui é o seu final

</xsl:for-each>

Tudo o que estiver entre essas tag’s será repetido até que todos os nós tenha sido lidos.

Para escrever os valores que estão no XML basta usar a tag value-of e no atributo select colocar o campo que deseja conforme o exemplo

<xsl:value-of select="Sku"/>

Adicionando critérios no XSL

Assim como em uma query é possível adicionar critérios em XSL, basta adicioná-los conforme o código abaixo na tag for-each, no primeiro exemplo o XSL trará apenas os produtos com o campo CodigoCategoria igual a 102, no segundo exemplo, todos com CodigoCategoria igual a 102 e o CodigoMarca igual 999.

<xsl:for-each select="catalogo/item[CodigoCategoria='102']">
<xsl:for-each select="catalogo/item[CodigoCategoria='102' and CodigoMarca='999']">

Usando XSL para formatar o XML

O Dot Net Framework nos dá suporte para trabalhar com arquivos XML através do Namespace System.Xml e para trabalhar com XSL com o Namespace System.Xml.Xsl

Vamos utilizar a classe XslCompiledTransform para formatar o XML com nosso XSL, essa classe é um processador de XSL e XSLT, ela é a sucessora da classe XslTransform, e segundo a MSDN oferece ganhos de performance com relação a classe antiga (e obsoleta na versão 4.0 do Dot Net Framework)

Uma das sobrecargas do construtor do XslCompiledTransform recebe um XmlReader, então carreguei o XSL dentro de um XmlReader e criei o objeto do XslCompiledTransform, o método Transform de nosso objeto XslCompiledTransform tem uma sobrecarga que recebe o xml base, uma lista de argumentos de Xslt que será passado como nulo e um objeto que terá o resultado da transformação, nesse caso é passado um StringWriter, pronto, agora o objeto StringWriter tem o XML carregado conforme as definições do XSL, tudo bem simples,

Código

Aqui está todo o código utilizado para a aplicação funcionar corretamente.

using System;
using System.Xml;
using System.Xml.Xsl;
using System.IO;
namespace GeradorXmlParceiro
{
class Program
{
static string caminhoXmlBase = @"C:\XmlBase\XmlBase.xml";
static string caminhoXsl = @"C:\Xsl\Xsl1.xsl";
static string caminhoXmlFormatado = @"C:\XmlTransformado\XmlTransformado.xml";
static void Main(string[] args)
{
CriarXmlComXsl();
}

static void CriarXmlComXsl()
{
XmlDocument xml = new XmlDocument();
xml = FormartarXmlBaseParaFormatoComXsl(caminhoXsl);
xml.Save(caminhoXmlFormatado);
}

static XmlDocument FormartarXmlBaseParaFormatoComXsl(string caminhoXsl)
{
XmlDocument xml = new XmlDocument();
XslCompiledTransform xsl = new XslCompiledTransform();
XmlDocument xmlBase = ObterXmlBase();
try
{
XmlReader reader = XmlReader.Create(caminhoXsl);
xsl.Load(reader);
StringWriter writer = new StringWriter();
xsl.Transform(xmlBase, null, writer);
xml.LoadXml(writer.ToString());
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao efetuar a transformação do XML.", ex.InnerException);
}
return xml;
}

static XmlDocument ObterXmlBase()
{
XmlDocument xml = new XmlDocument();
try
{
xml.Load(caminhoXmlBase);
}
catch (Exception ex)
{
throw new Exception("Ocorreu um erro ao carregar o XML.", ex.InnerException);
}
return xml;
}
}
}

É isso ai! Espero que esse artigo posso contribuir para o crescimento da comunidade! Até a próxima!

Referências

http://www.w3schools.com/xsl/

http://www.w3schools.com/xml/

http://msdn.microsoft.com/en-us/library/system.xml.xsl.xslcompiledtransform.aspx

Integração com redes sociais usando .NET

Primeiro, vamos definir o que é uma rede social:

Uma rede social é uma estrutura social compostapor pessoas (ou organizações, territórios, etc.) – designadas como nós – que estão conectadas por um ou vários tipos de relações (de amizade, familiares, comerciais, sexuais, etc.), ou que partilham crenças, conhecimento ou prestígio – Wkipedia

Do meu ponto de vista, vejo as ferramentas de networking como Facebook e Linkedin com redes sociais também.

Encurtando URL

Para encurtar a URL utilizaremos o serviço do site tinyurl.com, é muito simples, basta passar chamar a URL http://tinyurl.com/api-create.php, passando o parâmetro url com o caminho completo da sua url, ou seja, ficaria assim, se fôssemos implementar:

http://tinyurl.com/api-create.php?url=SUA_URL

Pré-requisitos

  • .Net Framework 2.0 ou superior
  • Visual Studio 2005 ou compatível

Projeto

Crie um novo Website, na Default.aspx adicione os seguintes controles:

Tipo ID
TextBox UrlTextBox
Button GerarUrlsButton
LinkButton OrkutLinkButton
LinkButton TwitterLinkButton
LinkButton FacebookLinkButton
Label UrlLabel

 

O código da página ficará semelhante com o código abaixo:

<asp:TextBox ID="UrlTextBox" runat="server"></asp:TextBox> <asp:Button ID="GerarUrlsButton" runat="server" Text="Gerar URL's" OnClick="GerarUrlsButton_Click"> </asp:Button> <br /> <asp:LinkButton ID=" OrkutLinkButton" runat="server" Text="Orkut"></asp:LinkButton> <br /> <asp:LinkButton ID="TwitterLinkButton" runat="server" Text="Twitter"></asp:LinkButton> <br /> <asp:LinkButton ID="FacebookLinkButton" runat="server" Text="Facebook"></asp:LinkButton> <br /> asp:Label ID="UrlLabel" runat="server"></asp:Label>

Namespaces

Inclua os seguintes namespaces na sua página:

  • System.Net
  • System.IO
  • System.Text

Code Behind

Eu fiz um método que busca a url resumida no tinyurl, dessa maneira basta apenas adicioná-la a um link.

  /// <summary> /// Devolve a url resumida /// </summary> /// <param name="url">url completa</param> /// <returns>url resumida</returns> protected string ObterUrlCurta(string url) { try { if (!url.ToLower().StartsWith("http") && !url.StartsWith("ftp")) { url = "http://" + url; } WebRequest request = WebRequest.Create("http://tinyurl.com/api-create.php?url=" + url); WebResponse response = request.GetResponse(); string urlCurta = string.Empty; using (StreamReader reader = new StreamReader(response.GetResponseStream())) { urlCurta = reader.ReadToEnd(); } // se tudo der certo, devolve a url resumida return urlCurta; } catch (Exception) { // se ocorrer erro devolve a mesma url return url; } }

Para obter a url do Facebook eu utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Facebook /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tituloPagina">título da página</param> /// <returns>url resumida do facebook</returns> public string ObterUrlFacebook(string urlParaCompartilhar, string tituloPagina) { StringBuilder url = new StringBuilder(string.Format("http://www.facebook.com/sharer.php?u={0}&t={1}", ObterUrlCurta(urlParaCompartilhar), tituloPagina)); return url.ToString(); }

Para obter a url do Twiiter eu utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Twitter /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tweet">mensagem/tweet</param> /// <param name="usuarioTwitter">por quem ou qual canal</param> /// <returns>url resumida do twitter</returns> public string ObterUrlTwitter(string urlParaCompartilhar, string tweet, string usuarioTwitter) { StringBuilder url = new StringBuilder(string.Format("http://twitter.com/home?status={0} {1}", ObterUrlCurta(urlParaCompartilhar), tweet)); if (usuarioTwitter != string.Empty) url.Append(string.Format(" - por (@{0})", usuarioTwitter)); return url.ToString(); }

E para o Orkut, utilizei o seguinte código:

 /// <summary> /// Devolve a url resumida do Orkut /// </summary> /// <param name="urlParaCompartilhar">url que será compartilhada</param> /// <param name="tituloPagina">título da página</param> /// <returns>url resumida do orkut</returns> public string ObterUrlOrkut(string urlParaCompartilhar, string tituloPagina) { StringBuilder url = new StringBuilder(string.Format("http://promote.orkut.com/preview?nt=orkut.com&tt={0}&du={1}", ObterUrlCurta(urlParaCompartilhar), tituloPagina)); return url.ToString(); }

No evento onclick do botão GerarUrlsButton, adicione o seguinte código:

/// <summary> /// Gera url's para os links /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void GerarUrlsButton_Click(object sender, EventArgs e) { // limpa os atributos link orkut OrkutLinkButton.Attributes.Clear(); // adiciona o evento onclick chamando a função javascript abrirPagina e passa o parâmetro url OrkutLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlOrkut( UrlTextBox.Text, "Teste Orkut"))); TwitterLinkButton.Attributes.Clear(); TwitterLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlTwitter( UrlTextBox.Text, "Teste Twitter", "seu_usuario_twitter_ou_outro"))); FacebookLinkButton.Attributes.Clear(); FacebookLinkButton.Attributes.Add( "onclick", string.Format( "abrirPagina('{0}');", ObterUrlFacebook( UrlTextBox.Text, "Teste Facebook"))); UrlLabel.Text = UrlTextBox.Text; UrlTextBox.Text = string.Empty; }

Muito simples e bem legal, a possibilidade de o visitante ou cliente do site poder compartilhar o conhecimento e gerar conteúdo em redes sociais é muito boa, desde que seu site seja bom, ou sua empresa realmente preste um bom serviço.

Mais uma vez espero que esse artigo contribua para a comunidade.

Referências

Postando no Twitter com .NET

Olá, pessoal! Após um tempo sem escrever, volto aqui com um assunto bem bacana, integração com redes sociais. Vamos dar uma olhada em como usar uma API que o Twitter disponibiliza e uma API do site Migre.me para mandarmos as mensagens “via API” com a URL encurtada. Podemos fazer isso com aplicações web e desktop.

Vamos lá!

Web

Crie um novo website e, no code behind da página Default.aspx, adicione os seguintes usings/imports:

  • System.Net;
  • System.IO;
  • System.Xml;
  • System.Web

C#

  • using System.Net;
  • using System.IO;
  • using System.Xml;
  • using System.Web;

VB.NET

  • Imports System.Net
  • Imports System.IO
  • Imports System.Xml
  • Imports System.Web

Agora, na página Default.aspx, adicione os seguintes controles:

ID Tipo
EmailTextBox TextBox
SenhaTextBox TextBox TextMode=Password
ByTextBox TextBox
UrlTextBox TextBox
MensagemTextBox TextBox
PostarButton Button Text=Postar

Seu código deve ter ficado parecido com este:

            <table>

                <tr>

                    <td>

                        E-mail

                    </td>

                    <td>

                        <asp:TextBox ID="EmailTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        Senha

                    </td>

                    <td>

                        <asp:TextBox ID="SenhaTextBox" runat="server" TextMode="Password"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        Mensagem

                    </td>

                    <td>

                        <asp:TextBox ID="MensagemTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        URL

                    </td>

                    <td>

                        <asp:TextBox ID="UrlTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td>

                        By

                    </td>

                    <td>

                        <asp:TextBox ID="ByTextBox" runat="server"></asp:TextBox>

                    </td>

                </tr>

                <tr>

                    <td colspan="2">

                        <asp:Button ID="PostarButton" runat="server" Text="Postar" OnClick="PostarButton_Click" />

                    </td>

                </tr>

            </table>

Migre.Me

Nesse momento iremos fazer nossa aplicação conversar com a API do migre.me. Vamos usar a API que retorna um XML.

No Code Behind, crie uma função que retorna uma string chamada CreateMigreMeUrl, que recebe três parâmetros também do tipo string, denominadas by, url, message, conforme os exemplos abaixo:

C#

    public string CreateMigreMeUrl(string by, string url, string message)

    {

        string retorno = string.Empty;

        // essa url será acessada pelo nosso sistema para gerar a url encurtada

        string urlMigreMe = string.Format("http://migre.me/api.xml?url={0}", url);

         // o WebClient é classe que irá "baixar" o retorno da URL do Migre.me

        WebClient client = new WebClient();

 // O Stream irá ler o retorno do WebClient

        Stream stream = client.OpenRead(urlMigreMe);

         // O XmlTextReader é utilizado para receber os dados do Stream

        XmlTextReader xmlReader = new XmlTextReader(stream);

         // Nesse momento é feita uma busca pelo nó do XML que contém no valor o texto "http://migre.me/", assim que o texto é encontrado a variável retorno é montada

        while (xmlReader.Read())

        {

            if (xmlReader.NodeType == XmlNodeType.Text)

            {

                if (xmlReader.Value.ToLower().Contains("http://migre.me/"))

                {

                    retorno = string.Format("{0} {1} {2}", message, xmlReader.Value, by);

                }

            }

        }

        return retorno;

    }

VB.NET

   Public Function CreateMigreMeUrl(ByVal by As String, ByVal url As String, ByVal message As String)

        Dim retorno As String = String.Empty

        Dim urlMigreMe = String.Format("http://migre.me/api.xml?url={0}", url)

        Dim client As New WebClient

        Dim stream As Stream

        stream = client.OpenRead(urlMigreMe)

        Dim xmlReader As New XmlTextReader(stream)

        While xmlReader.Read

            If xmlReader.NodeType == XmlNodeType.Text  Then

                If xmlReader.Value.ToLower().Contains("http://migre.me") Then

                    retorno = String.Format("{0} {1} {2}", message, xmlReader.Value, by)

                End If

            End If

        End While

        Return retorno

    End Function

Twitter

Agora faremos a função que será responsável por postar nosso tweet. É bastante simples: crie uma função do tipo void chamada PostTweet, que recebe três parâmetros do tipo string, denominados username, password e tweet.

C#

    public static void PostTweet(string username, string password, string tweet)

    {

        try

        {

// Os dados do usuário são "Codificados" nesse momento

            string user = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password));

            // a variável byte recebe a saída do post

            byte[] bytes = System.Text.Encoding.UTF8.GetBytes("status=" + tweet);

            // Inicializa o HttpWebRequest

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml");

// Define o método como POST

            request.Method = "POST";

            // se verdadeiro espera respostas para requisições POST. O valor padrão é true.

            request.ServicePoint.Expect100Continue = false;

            // adiciona o cabeçalho de autenticação da API do Twitter

            request.Headers.Add("Authorization", "Basic " + user);

            // Definie o cabeçalho

            request.ContentType = "application/x-www-form-urlencoded";

            // Tamanho do buffer

            request.ContentLength = bytes.Length;

// Pega o retorno

            Stream reqStream = request.GetRequestStream();

// Escreve o retorno

            reqStream.Write(bytes, 0, bytes.Length);

// Fecha a requisção

            reqStream.Close();

        }

        catch (Exception ex)

        {

            // As exceções devem ser tratadas aqui

        }

    }

VB.NET

    Public Sub PostTweet(ByVal username As String, ByVal password As String, ByVal tweet As String)

        Try

            Dim user As String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + ":" + password))

            Dim bytes() As Byte = System.Text.Encoding.UTF8.GetBytes("status=" + tweet)

            Dim request As HttpWebRequest

            request = HttpWebRequest.Create("http://twitter.com/statuses/update.xml")

            request.ServicePoint.Expect100Continue = False

            request.Headers.Add("Authorization", "Basic " + user)

            request.ContentType = "application/x-www-form-urlencoded"

            request.ContentLength = bytes.Length

            Dim reqStream As Stream = request.GetRequestStream()

            reqStream.Write(bytes, 0, bytes.Length)

            reqStream.Close()

        Catch ex As Exception

            'As exceções devem ser tratadas aqui

        End Try

    End Sub

No evento, click no botão postar adicione o seguinte código:

C#

PostTweet(EmailTextBox.Text, SenhaTextBox.Text, CreateMigreMeUrl(ByTextBox.Text, UrlTextBox.Text, MensagemTextBox.Text));

VB.NET

PostTweet(EmailTextBox.Text, SenhaTextBox.Text, CreateMigreMeUrl(ByTextBox.Text, UrlTextBox.Text, MensagemTextBox.Text))

Referências

http://migre.me/api-migreme/

http://dev.twitter.com/

Com isso, finalizamos o desenvolvimento dessa integração, basta agora utilizarmos um usuário válido para postar alguma coisa no Twiiter.

Espero que isso tenha agregado valor a vocês.

Um grande abraço e até a próxima.