Login de usuários via Facebook + upload de imagens direto na timeline do usuário (php)

Desenvolvimento

Web comentários

por erikaheidi em 28/12/2011 11:28:08




Há poucos dias precisei de uma solução que compartilhasse imagens diretamente no facebook do usuário, e descobri que é bastante fácil implementar essa funcionalidade em php. A maior dificuldade que enfrentei foi com relação ao meu servidor, que apesar de ter a lib Curl já instalada e em funcionamento (as aplicações para o Twitter que eu criei já se utilizam dela há tempos), para usar a biblioteca php que o Facebook disponibiliza era preciso que a lib Curl estivesse compilada com suporte a SSL. Tive que pedir um help a Hugo Reinaldo que resolveu rapidinho o problema pra mim ;)

Com esse problema resolvido, parti para o código php. Usei um exemplo que encontrei no Google, mas ele não estava funcionando corretamente. Dei uma pesquisada na documentação da API do Facebook e consegui corrigir os erros e colocar o código pra funcionar. Então, vou disponibilizar o passo a passo pra vocês. Estou levando em consideração que você já tem um servidor pronto (com a lib Curl + SSL devidamente compilada).

Pra ficar mais "fancy", coloquei um formulário onde você envia uma imagem e escolhe um efeito para aplicar nela antes de publicar no seu Facebook.

Você pode testar o demo desse script aqui: http://entrebits.com.br/labs/facebookshare

1. Criar uma aplicação no Facebook

Acesse http://developers.facebook.com e crie uma aplicação. São necessárias apenas duas informações: o nome da aplicação e o "namespace", que é como uma espécie de login, deve ser sem caracteres especiais ou espaços.

criando uma app no facebook 

Agora é preciso informar ao Facebook o que a sua aplicação vai fazer. No nosso caso iremos apenas utilizar o login de usuário, ou seja, vamos autenticar o usuário pela nossa página e fazer operações na conta do usuário através desta página, fora do Facebook. Marque a opção "Website" e informe a url do site que irá autenticar o usuário (não é uma url de callback, é apenas a url geral do site mesmo. o callback é definido pelo código).

app

2. Código

Agora que a aplicação está criada, vamos ao código. Antes de mais nada, é preciso fazer download da sdk oficial do Facebook para php. Depois de baixar o zip, coloque os arquivos que estão no diretório SRC (você só vai precisar deles - base_facebook.php, facebook.php e fb_ca_chain_bundle.crt) em uma pasta no seu site (vamos usar uma pasta "facebook" na raiz do site para os exemplos) para podermos incluir no código.

A primeira coisa que você precisa fazer é incluir a lib facebook.php e definir os dados de configuração da sua aplicação, passando o app id e o app secret que você obtém ao registrá-la. Fica logo no início da tela de informações sobre a aplicação.

require_once('facebook/facebook.php');
$facebook = new Facebook(array(
  'appId'  => "SEU_APP_ID",
  'secret' => "SEU_APP_SECRET",
  'cookie' => true,
  'fileUpload' => true
));

Depois de configurar o objeto facebook, você deve verificar se o usuário já está logado, e, caso ainda não esteja, obter o link para que ele faça login no facebook. Repare que ao solicitar o link de autenticação ao Facebook, eu passei o parâmetro "scope", com as permissões que vou precisar do usuário (user_status, publish_stream, user_photos) - pois vamos precisar dessas permissões para publicar em sua timeline.

$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

if($user)
	$logoutUrl = $facebook->getLogoutUrl();
else 
{
	$params = array("scope"=> 'user_status, publish_stream, user_photos');
	$loginUrl = $facebook->getLoginUrl($params);
}

if($loginUrl)
{
	echo '<p>Você ainda não está logado. Clique no botão abaixo para logar com seu Facebook.</p>';
	echo '<p><a href="'.$loginUrl.'" title="login with your facebook account"><img src="facebook-connect-button.png" /></a></p>';
}
else
{

	echo '<p>Você está logado como <a href="'.$user_profile['link'].'">'.$user_profile['name']. '</a>. <a href="'.$logoutUrl.'">Clique aqui para fazer logout</a>.</p>';

	//usuário está logado. exibir formulário
}

A parte da publicação no Facebook é bastante simples. Ao receber a imagem por upload, passamos diretamente o seu caminho tmp e postamos:

        $filepath = realpath($_FILES['foto']['tmp_name']);
	$photo = $facebook->api('/me/photos', 'POST', 
		array(
			'source' => '@' . $filepath,
			'message' => $_POST['legenda']
		)
	);

	echo '<p>Montagem publicada com sucesso no seu Facebook :). <a href="http://www.facebook.com/photo.php?fbid='.$photo['id'].'" target="_blank">Clique aqui para visualizar</a>.</p>';

Agora o código completo, com a parte de efeitos usando a lib GD e os detalhes restantes - formulário, etc...

<?php
session_start(); //essencial
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="content-language" content="pt" />
	<meta http-equiv="pragma" content="no-cache" />
	<meta http-equiv="reply-to" content="erika@entrebits.com.br" />
	<meta name="robots" content="index,follow" />
	<meta name="revisit-after" content="1" />
	<meta name="classification" content="entretenimento" />
	<meta name="distribution" content="global" />
	<meta name="rating" content="general" />
	<meta name="language" content="pt-br" />
	<meta name="title" content="SharetoFace" />
	<meta name="description" content="Facebook php share example" />
	<meta name="keywords" content="facebook, share, example, php, app" />
	<meta name="author" content="Erika"/>
	<meta name="copyright" content="ErikaHeidi" />
    

<title>FaceShare - entrebits labs</title>
<style>
body {
	background-color: #E5E5E5;
	text-align: center;
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12px;
}

form {
	padding: 10px;
	text-align: left;
	margin: 0 auto;
	border: 1px solid #CCC;
}

small {
	font-size: 10px;
}

</style>


<?php

require_once('facebook/facebook.php');
$facebook = new Facebook(array(
  'appId'  => "SEU_APP_ID",
  'secret' => "SEU_APP_SECRET",
  'cookie' => true,
  'fileUpload' => true
));
     
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

if($user)
	$logoutUrl = $facebook->getLogoutUrl();
else 
{
	$params = array("scope"=> 'user_status, publish_stream, user_photos');
	$loginUrl = $facebook->getLoginUrl($params);
}

if($loginUrl)
{
	echo '<p>Você ainda não está logado. Clique no botão abaixo para logar com seu Facebook.</p>';
	echo '<p><a href="'.$loginUrl.'" title="login with your facebook account"><img src="facebook-connect-button.png" /></a></p>';
}
else
{

	echo '<p>Você está logado como <a href="'.$user_profile['link'].'">'.$user_profile['name']. '</a>. <a href="'.$logoutUrl.'">Clique aqui para fazer logout</a>.</p>';

	//usuário está logado. exibir formulário
?>

	<form method="post" enctype="multipart/form-data">
	<input type="hidden" name="submitted" value="1" />
	<p>Foto (jpg): <input type="file" name="foto" /></p>
	<p>Aplicar efeito: 
	<select name="efeito">
	<option value="col">Estou com Sorte</option>	
	<option value="pb">Preto e Branco</option>
	<option value="sep">Sépia</option>
	<option value="0">Nenhum</option>
	</select>
	</p>
	<p>Legenda: <input type="text" name="legenda" /></p>
	<p><input type="submit" value="Postar no Facebook" />
	</form>
<?

}

if($_POST['submitted'])
{

	//compartilhar imagem
	$filepath = realpath($_FILES['foto']['tmp_name']);
	
	if($_POST['efeito'])
	{
		$im = imagecreatefromjpeg($filepath);
		
		switch($_POST['efeito'])
		{
			case "pb":
				imagefilter($im, IMG_FILTER_GRAYSCALE);
				break;
			
			case "sepia":
				imagefilter($im, IMG_FILTER_COLORIZE, 90, 60, 40);
				imagefilter($im, IMG_FILTER_CONTRAST, 10);
				break;
			
			case "col":
				imagefilter($im, IMG_FILTER_COLORIZE, rand(0,255), rand(0,255), rand(0,255));
				break;
		}
		
		imagejpeg($im,$filepath,95);
	}

	// add a status message
	$photo = $facebook->api('/me/photos', 'POST', 
		array(
			'source' => '@' . $filepath,
			'message' => $_POST['legenda']
		)
	);

	echo '<p>Montagem publicada com sucesso no seu Facebook :). <a href="http://www.facebook.com/photo.php?fbid='.$photo['id'].'" target="_blank">Clique aqui para visualizar</a>.</p>';
}


?>


sobre Erika Heidi

Desenvolvedora Web PHP graduada em publicidade. Especial interesse pelo mundo geek, manipulação de imagens no php e desenvolvimento voltado para redes sociais.


veja o perfil de Erika Heidi no entrebits


Você também pode se interessar por:


Comentários

blog comments powered by Disqus