Desenvolvendo iframe apps no Facebook com PHP – 5 dicas importantes

Em cada aplicativo que desenvolvemos aqui na Polvo aprendo uma porção de coisas novas, as quais gostaria de compartilhar agora. A documentação do Facebook não é excepcional, então tive que ir garimpando muitas coisas na internet.

Como na internet há muita informação boa, mas também muita coisa ruim, em alguns momentos utilizei métodos que acreditava estarem corretos quando, na verdade, tinham uma funcionalidade bastante limitada. Bastava terem alguns votos no fórum do StackOverflow e já via isso como correto.

Na segunda app que fui fazer, alguns códigos que estava utilizando na primeira não funcionavam mais, então fui filtrando um pouco mais o que achava na internet, refiz várias coisas e cheguei a algumas conclusões importantes, que aqui posto como dicas, e são elas:

1) Tudo pode ser feito utilizando a SDK do Facebook

Após baixar a SDK do Facebook (que está nesse link aqui), estava me complicando no momento de fazer a autenticação do usuário. Na segunda app é que fui descobrir como fazer isso de maneira correta. Na internet achei um método chamado oauth(), que eu fazia de maneira separada à SDK do Facebook, e que aparentemente funcionava, mas depois descobri que utilizar este recurso não é saudável para o código da app.

Depois de instanciar a classe Facebook, você pode pegar o endereço de login através de um método chamado getLoginUrl(), através do qual é possível passar uma url de retorno e o scope, que são as autorizações necessárias para o funcionamento da app (fotos, e-mail, etc).

Então, ao acessar a app, fiz o seguinte método:

private function getFacebook(){

   $facebook = $this->constructFacebook();

   if (!$facebook->getAccessToken()){
      $this->retornaHome($facebook);
   }

   try {
      $user_profile = $facebook->api('/me');
   } catch(FacebookApiException $e) {
      $this->retornaHome($facebook);
   }
   return $facebook;
}

Este é um método privado que chamo em todos os métodos da app. Primeiramente, ele chama o método constructFacebook(), que é o método que instancia a classe da SDK do Facebook:

private function constructFacebook(){
   $config = array();
   $config['appId'] = self::APP_ID;
   $config['secret'] = self::SECRET;
   $config['cookie'] = true;

   return new Facebook($config);
}

Onde self::APP_ID e self::SECRET são constantes que criei na classe da minha app com os valores que peguei lá das configurações da app no Facebook.

Tendo o objeto $facebook instanciado, agora eu posso verificar a existência de um access token. Para isso eu utilizo o método $facebook->getAccessToken(). Caso ele não retorne um valor, será chamado o método retornaHome(), que mostrarei abaixo. Depois eu faço uma pequena verificação utilizando a api graph, que tenta pegar alguns dados do usuário atual. Caso não conseguir, ele também chama o retornaHome().

Esse método retornaHome() é responsável por levar o usuário para a tela de login do Facebook, onde ele irá checar as autorizações necessárias para o funcionamento do aplicativo. Se o usuário já estiver logado e tiver autorizado o scope previamente, ele será levado automaticamente à página inicial da app.

O método retornaHome() consiste em:

private function retornaHome($facebook){

   die("<script> top.location.href='" . $facebook->getLoginUrl(array("canvas"=>1, "redirect_uri"=>self::APP_URL_SEM_BARRA,"scope"=>array("publish_stream","user_photos","email"))) . "'</script>");

}

Ou seja, aí ele faz um direcionamento, utilizando javascript, para a página de login do Facebook. Para saber qual é o endereço dessa página, eu chamo o método getLoginUrl(), no meu objeto $facebook já existente. Para este método estou passando três parâmetros:

canvas – Informa se a minha app está dentro de um canvas ou não (1 para verdadeiro e 0 para falso)

redirect_uri - Endereço da minha app sem a última barra. Para parametrizar, preferi salvá-la em uma constante dentro da classe. Ela possui valor de “https://apps.facebook.com/nomedaminhaapp”.

scope – São as autorizações que necessito, passadas por array, sendo elas “publish_stream”, que é a autorização para eu publicar na linha do tempo do usuário, “user_photos”, que é para eu acessar os álbuns dele e “email”, para eu ter essa informação e, por segurança, salvar em minha base.

Feito isso, já tenho como autenticar o usuário em todas as minhas páginas: basta chamar o método getFacebook().

2) Links dentro do iframe

A primeira página está em perfeito funcionamento, consigo pegar informações do usuário, etc. Então eu tinha o seguinte link:

<a href="pagina2.php">Link para a página 2</a>

Aí, quando eu tentava pegar alguma informação do usuário na página 2, não funcionava. Em algumas ocasiões, funcionava no Chrome, mas no Internet Explorer o problema persistia. Então descobri que o signed_request, que a classe Facebook vai ler e pegar as informações do usuário, vem através do cabeçalho do Facebook, e não da app, ou seja, na primeira vez que abria, o cabeçalho do Facebook era carregado, então eu tinha o signed request. Como eu tinha um link dentro do iframe, na segunda página ele não era carregado, então eu perdia as informações.

Isso foi solucionado apontando os links para o próprio facebook, da seguinte maneira:

<a href="https://apps.facebook.com/nomedaminhaapp/pagina2.php?var1=1&var2=2" target="_top">Link para a página 2</a>

Ou seja, ele irá carregar a página que eu queria, só que dando reload na página inteira. Ao dar esse reload, o signed_request é carregado novamente e eu consigo ter informações do usuário. O target=”_top” é importante pois estou direcionando um link de dentro do iframe para fora. Esse endereço irá carregar a página www.enderecodocanvas.com.br/pagina2.php e enviar as variáveis do método get normalmente.

3) Formulários

Depois de ter arrumado os links, percebi que meus formulários não estavam funcionando. O action deles tem que ser alterado da mesma maneira que os links, e também deve ser inserido um target=”_top”. O method deve ser setado para GET.

<form action="https://apps.facebook.com/nomedaminhaapp/targetdoform.php" method="GET" target="_top"></form>

Você também pode fazer o action como o endereço do seu canvas, processar as informações lá e depois voltar para o facebook com um redirect. Isso pode ser útil quando for necessário um upload de arquivo.

<form action="https://www.meucanvas.com.br/targetdoform.php" method="POST" target="_top" enctype="multipart/form-data">
   <input type="file" name="foto">
</form>

4) FQL Multiquery pode economizar muito tempo de processamento na sua app

Na primeira app que fiz, eu trabalhei da seguinte maneira: fiz uma query para pegar a lista de álbuns da pessoa. Depois de ter esse array já no php, dei um foreach() nele e, dentro de cada um, fiz uma nova query para pegar as fotos. Caso a pessoa tivesse 15 álbuns, eu fazia 16 queries: uma para a lista de álbuns e 15 para pegar as fotos de cada um deles. Cada uma levava em torno de 1 segundo para ser executada, gerando um tempo de processamento de 16 segundos. Parece pouco, mas para uma app ou para um piloto de Fórmula 1 é muita coisa.

Então descobri que podia fazer todas essas queries em uma só, ou seja, ao invés de usar:

$albuns = $facebook->api(array(
"method" => "fql.query",
"query" => "SELECT aid FROM album WHERE owner=me()"
));

E depois fazer a mesma coisa para as fotos, passei a usar:

$fql = '{
"data_album" : "SELECT aid FROM album WHERE owner=me()",
"photos" : "SELECT object_id FROM photo WHERE aid IN (SELECT aid FROM #data_album)",
}';

$params = array(
'method' => 'fql.multiquery',
'queries' => $fql
);

$albuns_fotos = $facebook->api($params);

Dessa maneira, consegui colocar todos os álbuns e fotos dentro da variável $albuns_fotos. Isso reduziu o tempo de execução de 16 segundos para 1, uma redução de 93,75%, o que é um valor bastante considerável. Para mais informações de como trabalhar com as FQL’s, clique aqui.

5) Salve informações do usuário em sua base utilizando o método getUser() e a api graph

Caso você quiser pegar o id do usuário que está utilizando sua app, basta utilizar o método $facebook->getUser();

Caso queira pegar mais informações, como nome, sexo, localização ou e-mail (caso você tiver colocado email no seu scope), você poderá fazer a seguinte consulta:

$user_profile = $facebook->api('/me','GET');

A variável $user_profile conterá um array com diversas informações sobre o usuário. Aí basta salvá-las. Vale lembrar que, quanto mais informações você colocar no scope, na hora de fazer o getLoginUrl(), maior é a chance de o usuário desistir de usar sua app. Portanto, use esta ferramenta com moderação. Você também pode salvar a quantidade de usuários que chegam ao método getLoginUrl() mas que acabam não utilizando a sua app, o que pode te dar uma ideia da taxa de conversão. Se estiver muito baixa, verifique se não está pedindo dados demais.

É isso aí, valeu e até a próxima! =)

Armazém Seu Luiz – caixa e sacolas

Ficaram lindas de viver as embalagens de presente que criamos para o Armazém Seu Luiz/Casa da Azeitona. Chiques, resistentes e apetitosas!

4-inteiras

Impressas apenas em preto sobre papel kraft, as sacolas e a caixa podem ser personalizadas de acordo com a loja em que serão usadas, já que a logo é adesivada à superfície do material.

DuckDuckGo – o Google hipster?

Gabriel Weinberg é um moço parecido com Rivers Cuomo. Formado em física no MIT, ganhou seus primeiros milhões antes dos 30 anos, ao vender para o ClassMates.com seu projeto NamesDatabase, empresa que centralizava um grande banco de dados de contatos pelos quais outros contatos pagavam para acessá-los.

Com essa bolada no bolso, os jovens Greinberg e sua esposa foram atrás daquilo que todos deveríamos ir no caso de termos uns milhões à disposição: vida afastada da cidade grande, wi-fi, filhos por perto e tempo para semear e cultivar boas e novas ideias. Enquanto cuidava das crianças durante o dia e a esposa trabalhava fora, Grinberg começou a conceber seu novo projeto: uma ferramenta de busca voltada à praticidade, que ofereça primordialmente respostas ao invés dos habituais links e que não rastreie o usuário para fornecer a ele informações adequadas ao seu perfil, mas sim o retorno prático àquilo que ele está buscando.

Era o nascimento do DuckDuckGo. Um buscador diferente, limpinho e interessado em te atender antes de te vender ou te engambelar. A parceria com o WolframAlpha (nosso velho conhecido) é um dos pontos altos da ferramenta – basta dar uma olhada na imagem abaixo:

Antes de te dar um link, ele te dá uma resposta conceitual. E mais uns anunciozinhos, discretos, que é preciso ganhar dinheiro. E sem saber quem você é. Numa página com rolagem infinita, sem te forçar a ficar clicando páginas e páginas. Com essa forma (e logo) hipster, a  ferramenta de Grinberg é o contraponto ao Google e ao Bing e pode se firmar como uma alternativa “orgânica” aos gigantes. E ganhar força entre o público – crescente – que teme os Grandes Irmãos.

É assim que o DuckDuckGo assina no rodapé da página inicial. :~

Favoritei. Alegria de palhaço é ver o circo pegar fogo, vou fazer a minha parte. Considero que seria saudável demais pararmos de alimentar a roda-viva que o comércio eletrônico vive em sua relação com o AdWords, cada vez mais discreto e agressivo nas páginas de resultados.

A arte de passar roupa

Se sua expectativa era chegar aqui e encontrar umas dicas a respeito de como lidar com colarinhos ou plissados, perdão. O filme abaixo, da DDB Rússia, quer vender ferros de passar roupa mostrando as estripulias que o rapaz (achei interessante usarem a imagem masculina nesse contexto de serviço doméstico) é capaz de fazer com os equipamentos: são reproduções de telas de Van Gogh, Vermeer e Rembrandt.

Artchi.

Presença na web

Sua empresa criou um site, uma página no Facebook, um perfil no Twitter, um canal no YouTube e uma conta no Instagram, mas ainda não sabe o que vai fazer com todas essas ferramentas?

Se você chegou até aqui quer dizer que tem interesse e se preocupa com a impressão da sua marca, empresa, produto ou serviço na internet. Esse é um ótimo começo, mesmo! Mas pode ser que todas estas ferramentas listadas acima não sejam úteis para seu público-alvo e consequentemente para sua empresa. Porque nas redes sociais seu trabalho deve ser totalmente focado no seu cliente, que também pode ser chamado de fã ou seguidor, ou seja, ele é quem guia a sua atuação nessas mídias.

Importante é gerar conteúdo interessante e que agregue algum valor, conhecimento ou informação que seu “fã” julga valiosa para ele. Para que lhe agregue algo e depois ele lembre que sua marca disse isso, mostrou uma solução para o problema dele.

A presença online de uma empresa é baseada em dois pontos: na geração de conteúdo relevante para seu cliente e no conteúdo relativo à sua empresa que esses clientes publicam nas redes sociais. E é nessa questão de conteúdo publicado pelos clientes que é preciso cuidado. Considerando que não há como proibir na internet, é possível reverter uma situação negativa gerada, mas é mais importante evita-la. É nesse momento que faz a diferença contar com profissionais da área que sabem o quê e como deve ser feito esse trabalho. Para que eventuais dificuldades maiores sejam evitadas e sua marca só ganhe com a presença nas redes sociais.

Venha trabalhar na Polvo

someecards.com - I'm sorry the posting you applied for on the internet was your own position

Venha trabalhar na Polvo

A Polvo Digital abriu quatro vagas na área de Comunicação Digital e Programação Web. Como sempre, buscamos profissionais entusiasmados, versáteis e atualizados. Procuramos gente disposta a se envolver integralmente nos projetos e a compartilhar suas ideias e bookmarks.

Conheça as vagas disponíveis no momento:

  • Programador Web Sênior
  • Analista de Redes Sociais
  • Redator Sênior
  • Analista SEO

Vá até nossa Página de Oportunidades e saiba mais detalhes.

Massas variadas e molhos são cardápio de degustação na Casa da Azeitona

Diferentes receitas de massas e molhos serão o prato principal da degustação que acontece no dia 29/09, a partir das 11h, no Armazém Seu Luiz (Av. 7 de Setembro, 6131) e nas lojas da Casa da Azeitona da Av. Iguaçu, 481 e da Al. Júlia da Costa, 1829. Os produtos que compõem as receitas, especialmente desenvolvidas pelo chef da rede, Jean Marchese, são da tradicional marca italiana Barilla. Para o cardápio da degustação, Marchese criou uma refeição completa, que inclui uma Salada de berinjela Mediterrânea com Mini Penne Rigate, Spaghetti com Pimentão Concassé e Gergelim e, de sobremesa, Rigatone Romeu e Julieta. As ações são abertas ao público e durante o dia serão entregues brindes da Barilla aos presentes.

Sobre a Barilla – Fundada em 1877 na cidade de Parma, a Barilla é a maior indústria de massas do mundo. Está presente em 125 países, com uma produção de mais de 30 tipos de macarrões, e outros variados de molhos, temperos, pães e bolachas. Possui 27 fábricas pelo mundo e, dentre as novidades, está a linha Barilla Integrale (que pode ser encontrada nas lojas da Casa da Azeitona), macarrão feito 100% de sêmola integral trigo duro.

Sobre a Casa da Azeitona – a primeira loja da Casa da Azeitona foi fundada em 1958 juntamente com o Mercado Municipal de Curitiba. A matriz, que existe até os dias atuais, traduziu o conceito de secos e molhados com grande variedade de produtos. Atualmente, a rede possui outras duas lojas, localizadas em regiões nobres da capital paranaense, e o Armazém Seu Luiz, a mais nova unidade, uma homenagem ao “seu Luiz”, fundador da Casa da Azeitona. As lojas disponibilizam ao consumidor um grande mix de produtos, como acetos, azeites, azeitonas, bacalhau, biscoitos, castanhas, queijos, cereais, cervejas, champagnes, conservas, destilados, embutidos, enlatados, frios, geléias, mel, massas, molhos, torradas, patês, queijos, sucos, temperos e condimentos, vinhos nacionais e importados. Além de mais de 15 tipos de frutas secas, como damasco, figo, ameixas, tâmaras, entre outros.

 

Serviço – Degustação Massas e Molhos Barilla
Data: 29/09 – sábado
Local:
- Armazém Seu Luiz – Av. 7 de Setembro, 6131 – (41) 3068-6101
- Casa da Azeitona Iguaçu – Av. Iguaçu, 481 – (41) 3078-9470
- Casa da Azeitona Bigorrilho – Al. Júlia da Costa, 1829 – (41) 3336-9000
Horário: das 11h às 16h
Entrada gratuita

Pesquisa avançada no Gmail ou ‘Como eu amo o Gmail’

Ontem eu descobri que podemos abrir duas contas diferentes do Gmail no mesmo navegador sem sincronizá-las (agora posso abrir meu e-mail pessoal e o e-mail do trabalho no Chrome). Disseram que não é novidade e isso quer dizer que eu estava fazia tempo usando o Mozilla junto ao Chrome de boba.
Me animei e decidi que chegou o dia de fazer uma limpa nas contas de Gmail – que acumulam 2.500 mensagens. Pensei em começar apagando e-mails de um ou outro cliente cujo trabalho já foi concluído, ou apagar todos e-mails com indicação de links, mas percebi que eu não sei realizar buscas no Gmail. Com uma pesquisa rápida no Google achei dicas de como realizar buscas rápidas no Gmail (oba!) e separei aqui as que considero mais úteis. Para quem quiser, a lista completa está aqui.

to: / from:
Encontra as mensagens enviadas ou recebidas de uma pessoa.
exemplo: “to:Carla”, encontra as mensagens enviadas pra Carla.

subject:
Encontra as mensagens com uma palavra específica no assunto.
exemplo: “subject:jantar”, encontra mensagens cujo assunto traz a palavra jantar.

OR
Encontra mensagens com o termo A ou termo B – lembrando que OR deve estar em caixa alta.
exemplo: “from:Karen OR from:Polvo”, busca todas as mensagens recebidas da Karen ou do Polvo.

- (menos)
Igual ao Google, exclui resultados com uma palavra específica.
exemplo: “from:Carla -trabalho”, busca todas as mensagens enviadas pela Carla que não contenham a palavra trabalho.

has:attachment
Busca mensagens que tenham anexo. Muito útil para quem tem uma conta do Gmail pesada demais.
exemplo: “Bianca has:attachment”, busca as mensagens da Bianca que tenham anexo.

in:inbox / in:trash / in:spam / in:anywhere
Busca mensagens em algum lugar específico. O Gmail automaticamente exclui mensagens do spam ou do lixo nas buscas.
exemplo: “in:inbox from:Vanessa”, achei isso muito útil porque exclui os bate-papos da busca.

after: / before:
Encontra e-mails trocados em uma certa época. A data deve ser escrita no formato yyyy/mm/dd.
exemplo: “before:2012/01/01 from:João”, encontra as mensagens do João do ano passado ou antes.

Lips like sugar, Sugarpova

Maria Sharapova, pra quem não conhece, é tenista russa. Além de ser jovem, linda e a  desportista mais bem paga do mundo, a moça resolveu vender yummi <3.
É normal mulheres famosas, lindas e ricas venderem roupas e perfumes (ver exemplo da Victoria Beckham, Jennifer Lopes, Kate Von D, Uma Thurman e tantas outras) mas a russa, muito inovadora, preferiu vender balinhas que agradam todo mundo e são muito mais acessíveis.
A identidade visual ficou incrível e o site é inteiro colorido, doce e sensual. Vale a pena dar uma olhada, mas tenha uma balinha por perto.

 

A geração Z vai mudar o mundo

Que época para se viver!


(a menina sisuda com os pés no chão é minha avó, em 1910)

Há algumas décadas, uma criança nada mais era do que uma pessoa pequena. O conceito recente de infância e toda a relação social, psicológica e afetiva que existe hoje entre adultos e crianças são fenômenos recentes e, até por isso, inconsistentes. Isso me permite acreditar que possamos estar vivendo o declínio de uma era vencida. Talvez seja apenas uma questão de tempo para que esses jovens nascidos hiperconectados passem a ditar as regras. Aos fatos:

Janeiro de 2012: Pedro Franceschi, brasileiro de 15 anos, desenvolveu extraoficialmente um aplicativo que habilitava a app Siri, do iPhone 4S, a entender o português.

Abril de 2012: Martha Payne, escocesa de 9 anos, dá início a um blog em que registra a apresentação e qualidade da merenda servida aos alunos de sua escola. Suas manifestações ganharam força e a menina foi responsável pelo início de um movimento de revisão dos lanches escolares em seu país.

Maio de 2012 (veja mesmo o vídeo antes de ler a matéria): Jack Andraka, norte-americano de 15 anos, conquistou o prêmio principal na Feira Internacional de Engenharia e Ciências da Intel. Seu feito? Um teste para detecção do câncer de pâncreas 68 vezes mais rápido, 400 vezes mais sensível e 26 mil vezes mais barato que o padrão usado hoje para detectar a doença, passível de cura para apenas 2% dos doentes com diagnóstico realizado em estágio avançado.

Julho de 2012: Isadora Faber, brasileira de 13 anos, dá início a uma página no Facebook para relatar o cotidiano da escola pública que frequenta em Florianópolis (SC). Funcionários, professores e até a diretora tentam impedir a menina de dar continuidade a seu trabalho. Diz ela: “estou fazendo essa página sozinha, para mostrar a verdade sobre as escolas públicas. Quero melhor não só pra mim, mas pra todos.”

Posso começar dizendo que é preciso somar a idade de pelo menos três dos personagens acima para chegar à minha. E que nunca fiz nada que chegasse nem próximo da mesma representatividade que o trabalho deles está tendo – e ainda vai ter, aposto – para eles mesmos e para a sociedade. Mas, qual a diferença entre a minha juventude e a deles? Acesso à informação e noção de coletividade, digo eu. Pensar no todo, sair do próprio umbigo, usar a vida para um bem maior, que vá além das suas causas próprias.

Minha geração nasceu no intervalo entre a juventude reprimida e a hiperconectividade atual. Quando começamos a usar a internet, ainda não tínhamos muita noção de até onde ela poderia nos levar. O acesso era restrito (podia mais quem tinha mais dinheiro para equipamentos e para o acesso propriamente dito), os recursos da própria web eram limitados e nossa cabeça ainda não estava minimamente preparada para lidar com a vazão de informação útil e inútil a que estávamos sendo expostos. Nem me passaria pela cabeça há 10 anos que hoje a internet seria meu meio de vida, meu supermercado, meu cinema e minha estante de CDs, pra dizer pouco sobre o quanto a rede hoje tem importância cotidiana pra mim, que fui apresentada à www em 1995. O que a web representa hoje pra quem estava nascendo em 1995?

Estou ansiosa pelo futuro. Quero muito viver um tempo mais generoso, mais libertário, mais igual pra todo mundo, e tenho certeza que a web é o passaporte de todas as cores e todas as classes para esse tempo. Meu conselho para a próxima geração é: use filtro solar. manifeste-se. Junte-se a quem pensa como você, faça a diferença de verdade. Deixar sua marca no mundo é muito mais do que desenhar um coração na árvore do parque.

PS: Álvaro Borba, muso desta escriba, entrevistou a jovem Isadora e escreveu sobre ela e sobre muitos outros assuntos relevantes e imperdíveis em seu blog.