Slíbil jsem sám sobě, že když se na něčem zaseknu, budu to publikovat na blogu – abych ušetřil čas lidem, kteří se dostanou do podobné situace jako já. U prvního příspěvku se ukázalo, že i přesto, že se mi podařilo problém vyřešit, existuje spousta dalších a mnohdy i lepších řešení. Když jsem se tedy teď “zasekl” na dva dny u docela jednoduchého problému, který jsem nemohl vyřešit, napadlo mě, že ho zkusím jednoduše sepsat a uvidím, jestli mě náhodou někdo nenavede na správnou cestu, nebo alespoň nepřesvědčí, že po té správné cestě jdu, jen je trochu víc komplikovaná.

Zadání: aplikace pro přidávání příspěvků na zeď dané facebook page

V rámci CMS je dobré mít možnost publikovat novinku rovnou i na facebook page – ušetříte tím uživateli čas. Samozřejmě je dobré mít na paměti to, že na facebookovou stránku by bylo dobré přidávat i jiný obsah, než odkazy z CMSka. To ale teď nechme stranou.

Příprava – získání oprávnění

Navazuji na článek Publish to Facebook page or application’s wall with PHP

1. Vytvoření facebookové aplikace

https://developers.facebook.com/apps/?action=create

2. Autorizace nově vytvořené aplikace s uživatelem:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&client_secret=YOUR_APP_SECRET&redirect_uri=YOUR_SECURE_CANVAS_URL&scope=publish_stream,offline_access,read_stream,manage_pages&response_type=token

Poznámka: do konstant je potřeba doplnit údaje o aplikaci, které jsou dostupné ihned po jejím vytvoření v kroku 1. Scope označuje práva aplikace.

Výsledkem tohoto dotazu je přesměrování na Vaši URL, za kterou je přidán access_token#1, kterým je potvrzena autorizace.

3. Získání přístupu ke stránkám, u nichž je uživatel administrátorem

Použijeme access_token#1 vrácený v předchozím kroku.

https://graph.facebook.com/me/accounts?access_token=YOUR_TOKEN

Odpovědí je seznam dostupných zdrojů – stránek. Zde si si vezmeme nový access_token. Pokud bychom to neudělali a použili původní access_token#1, budeme na facebook page publikovat pod svým jménem, nikoli přímo pod jménem stránky.

Publikujeme!

Nyní nám nic nebrání poslat příspěvek na facebook. Níže uvedený kód je převzatý z Publish to Facebook page or application’s wall with PHP. Funguje bezproblémově a není potřeba jej více rozvádět.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Facebook
{	    
    /**
     * @var The page id to edit
     */
    private $page_id = 'XXX';	
 
    /**
     * @var the page access token given to the application above
     */
    private $page_access_token = 'YYY';	
 
    /**
     * @var The back-end service for page's wall
     */
    private $post_url = '';
 
    /**
     * Constructor, sets the url's
     */
    public function Facebook()
    {
        $this->post_url = 'https://graph.facebook.com/'.$this->page_id.'/feed';
    }
 
    /**
     * Manages the POST message to post an update on a page wall
     * 
     * @param array $data
     * @return string the back-end response
     * @private
     */
    public function message($data)
    {   
        // need token
        $data['access_token'] = $this->page_access_token;
 
        // init
        $ch = curl_init();
 
        curl_setopt($ch, CURLOPT_URL, $this->post_url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 
        // execute and close
        $return = curl_exec($ch);
        curl_close($ch);
 
        // end
        return $return;        
    }
}
 
$facebook = new Facebook();
 
$facebook->message(array( 'message'     => 'The status header', 
                          'link'        => 'http://theurltopoint.to', 
                          'picture'     => 'http://thepicturetoinclude.jpg',
                          'name'        => 'Name of the picture, shown just above it', 
                          'description' => 'Full description explaining whether the header or the picture' ) );

Problémy a omezení

Výše uvedený kód funguje bezva, nicméně má některá omezení. Hlavním je životnost access_token#1. Ve chvíli, kdy se uživatel z Facebooku odhlásí, tak zaniká. Pro další publikování na facebook page wall je potřeba, aby se uživatel přihlásil. Nicméně pokud posíláme příspěvky z CMS, vůbec nás nezajímá, jaký uživatel je zrovna do CMS přihlášen. Jaké je řešení? Napadá mě pouze vytvoření účtu na facebooku, do kterého se aplikace automaticky přihlásí, a pod tímto účtem si vyžádá tokeny. To má ale taky omezení – pokud náhodou bude uživatel přihlášený, budeme ho muset odhlásit. Takže to nebude úplně ono.

Něco mi uniká

Prostě a jednodušše nechápu, proč může aplikace, které uživatel dá své svolení, publikovat na facebook page pouze, když je přihlášen. Napadá Vás, jak to obejít?

Další problém, na který jsem narazil, byla nemožnost zachycení hlavičky “Location” v kroku 2 (viz výše). Z Google Chrome konzole je jasné, že se posílá a pomocí ní dochází k přesměrování.

Bohužel když použiju funkci get_headersLocation se v ní nenachází. Napadá někoho, proč? To byl mimochodem zásek, na kterém jsem strávil nejvíc času.

Předem díky za komentáře!

Credits: http://jorgealbaladejo.com/2011/06/13/publish-to-facebook-page-or-applications-wall-with-php/