Usando o PHP-SDK para rodar FQL na API do Facebook

Desde a migração do Facebook para a nova Graph API e o protocolo OAuth 2.0, sua documentação para desenvolvedores virou uma grande confusão, sem eira nem beira, de artigos depreciados, e isso se eu for otimista. O problema é que muitos artigos antigos ainda apontam para práticas não mais recomendadas e muitos deles não possuem alertas sobre estas mudanças, em casos extremos funções que em breve serão removidas da API ainda não possuem equivalentes nas novas APIs.

As novas bibliotecas, ou SDKs, seguem o velho ditado do “filho de peixe, peixinho é”. Embora estejam novas e com cheirinho de carro novo, a documentação de como utlizar elas eficientemente está vaga, ausente ou espalhada em diversos blogs, como este, em posts de usuários que querem compartilhar a informação com futuros sofredores desenvolvedores ou apenas ter a anotação para uso posterior.

Então isto se trata de um exemplo desta situação, tenho usado os novos recursos e as novas bibliotecas e tenho tido diversas dificuldades, portanto decidi começar a colocar algumas destas coisas em meu blog, por dois motivos: espalhar a informação, e ter anotações pra eu me lembrar depois.

Como posso executar queries em FQL usando a nova SDK?

FQL é a alternativa do Facebook para o SQL, permitindo que você busque dados como se estivesse acessando um banco de dados gigante, esta documentação felizmente ainda esta atualizada e você pode ver uma lista de “tabelas” de onde pode buscar informações, o restante dos truques você vi aprendendo enquanto usa.

Na biblioteca antiga, baseada na API REST, era bem simple rodar uma FQL:

$facebook->api_client->fql_query("SELECT uid, pic, pic_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)");

Porém isto (e muitos outros métodos) não está mais disponivel na nova PHP SDK então eu demorei um bucado de tempo para descobrir como poder enviar uma requisição de execução de uma FQL, já que o único método disponível era o api(), um método polimorfíco e não-documentado. Eu finalmente achei a resposta em um blog semelhante ao meu, com alguém que teve a mesma experiência. A requisição é feita assim:

<?php
	//Get Facebook SDK Object
	$config = array(
	  'appId'  => APP_ID,
	  'secret' => API_SECRET,
	  'cookie' => true,
	);

	$facebook = new Facebook($config);

	//Create Query
	$params = array(
	    'method' => 'fql.query',
	    'query' => "SELECT uid, pic, pic_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)",
	);

	//Run Query
	$result = $facebook->api($params);
?>

Uma vez que você finalmente descobre que deve passar o parametro “method” para definir o método da API que pode ser executado, e ai descobre que deve passar sua busca em um parametro chamado “query”, você tem a faca e o queijo na mão. Não preciso nem dizer que isso pode demorar um pouco mais do que esperado.

No meu ponto de vista este pedaço de código porém é horrivel, não gosto de criar arrays para poder passar parametros para uma função, cada vez que for rodar ela. Então decidi que para usar essa SDK corretamente eu ia precisar extender ela e implementar algumas correções, neste caso um Helper Method para FQL. Veja como ficou:

<?php

namespace App\Facebook;

include_once \ROOT_PATH . 'library/vendor/facebook/facebook.php';

class Client extends \Facebook
{
    private $config;
    private $reqPerms;

    /**
     * Runs a FQL query agains the API
     *
     * @param string $query
     * @return array
     */
    public function fql($query)
    {
        $params = array(
            'method' => 'fql.query',
            'query' =>$query,
        );

        return $this->api($params);
    }

}
$config = array(/* insert config here */);

//Using client
$fb = new App\Facebook\Client($config);

$query = "SELECT uid, pic, pic_square, name FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = 111111111)";
$result = $fb->fql($query);

?>

Isso faz chamar uma FQL rápido e simples, além de te dar a vantagem de ter a SDK embrulhada dentro do seu próprio namespace e, de bonus, ter uma forma mais simples de mockar e testar código relacionado, isso porque temos agora um método para mockar e não mais nos preocupar com paramentros passados.

Eu dei um passo além e aproveitando que o SDK esta no GitHub, comitei esta alteração em um pull request. Ele ainda não foi aceito, mas espero que ele seja em breve e que mais pessoas possam se beneficiar com ele.

Espero que gostem e que isso lhe dê mais ideias de como melhorar o uso da nova SDK e eu voltarei em breve com mais dicas.

This post is also available in: Inglês