Facebook: Like a Canvas Page?
Vytvárate aplikáciu, ktorá bude používaná pomocou CANVAS PAGE a chcete umožniť určité veci iba fanúšikom? Po novom Vám Facebook moc nepomôže. Prečo? Odhaľujeme problémy s Facebookom.
Vytváral som menšiu aplikáciu, ktorá funguje pomocou canvas page.
Bežný postup je, že umožníte zúčastnenie sa na nejakej hre len používateľom, čo klikli na LIKE. Problém však prichádza, keď chcete zistiť, či užívateľ skutočne dal na Vašu aplikáciu LIKE.
Od dňa, kedy Facebook začal sťahovať stránky aplikácií a začal k nim vytvárať nové (musíte si ich vytvoriť v nastaveniach aplikácie), nemáte šancu sa dostať k tomu, či užívateľ dal alebo nedal like.
Pôvodne, to bolo všetko jednoduché. V tzv. podpísanom requeste (signed_request) boli posielané údaje typu [page][liked]. Canvas Page však tieto informácie nedostáva a preto si musíte zistiť existenciu inak.
Hľadáme riešenie... Nachádzame riešenie
Na internete vygooglite hneď niekoľko možných spôsobov. Dôležité je, či to chcete riešiť pomocou JavaScript API alebo pomocou PHP SDK. V našom príklade pôjdeme na tú horšiu vec a teda PHP SDK, kde to tak jednoduché nie je.
Sú však dve cesty ako sa k jedinému cieľu dostať. Prvá cesta je použitie FQL, kedy budeme musieť od používateľa získať právo na čítanie nástenky (read_stream). Toto však nie je správna cesta, nakoľko používatelia môžu informáciu o tom, že užívateľ dal na niečo LIKE, tento záznam zmazať. To, čo však nezmažú je zoznam stránok, ktoré nám dá príkaz na api.
$facebook->api('/me/likes');
Ak si toto zapíšeme do nejakej premennej, napríklad $likes, budeme mať zoznam v premennej. To však nie je všetko. Musíme zistiť, či je v tom zozname požadovaná aplikácia. Čo však v prípade, keď má užívateľ množstvo rôznych vecí, ktoré lajkol? Zoznam obsahuje limitovaný počet záznamov, no aj to sa dá obísť!
$likes = $facebook->api('/me/likes?limit=0');
Toto nám do premennej $likes uloží zoznam úplne všetkých lajkov, ktoré kedy daný užívateľ dal. Čo nám teda ostáva? Nakoľko je to viacrozmerné pole, klasická funkcia in_array moc nepomôže.
Poďme si preto spraviť nejakú funkciu, ktorá nám vráti to, čo skutočne potrebujeme a to hodnotu true/false.
function isLiked($appID) { // ziskame lajky od aktualneho uzivatela $likes = $facebook->api('/me/likes?limit=0'); // nastavime default false $isLiked = false; // prejdeme vsetky lajky // zoznam je radeny podla datumu pridania, takze nove lajkys su prve foreach($likes['data'] as $like) { // zistime, ci dane ID je zhodne s ID ktore hladame if($like['id'] == $appID) { $isLiked = true; break; } } // vratime true/false return $isLiked; }
Snáď Vám to pomôže. Btw. Nezabudnite ešte, že treba inicializovať $facebook.

Programátor, webdesigner a webdeveloper niekoľkých webových projektov. Má za sebou prácu v reklamnej agentúre, médiách a na rôznych pozíciách v oblasti IT.
18 komentárov k článku:
Komentovať môžu iba prihlásení
Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)
Prihlás sa tu, ak už máš profil na Zajtra.sk:

Ahoj Frantisek: vedel by si mi taku nejaku aplikaciu uribt, resp. naucit ma ich robit. Samozrejme zaplatim za to.
Vies ma prosim kontaktovat na martiano@azet.sk? tam poviem viac detajlov.

Andrej: Ano, daju sa, o tom velmi dobre viem a niektore z casti tiez taham cez FQL, len si myslim, ze tu je to zbytocne...

@Miloš: keď si načítaš list friendov, dostaneš k menu aj jeho ID, no a link na jeho profilový obrázok získaš ľahko: https://graph.facebook.com/user_id/picture, alebo veľký https://graph.facebook.com/user_id/picture?type=large. Samozrejme, user_id treba nahradiť reálnym ID priateľa, alebo jeho FB username
@František „SNiPI“ Čaník: práveže to FQL je veľmy užitočné. Dajú sa ťahať také dáta, ktoré cez Graph API priamo nedostaneš.

Miloš: hlboko pochybujem... signed_request obsahuje [page] array jedine ak je človek na nejakej stránke (nie v canvas-e). Takže funguje len pre TAB na fanpage. Aj keď si dáš cez $facebook->getSignedRequest(); nebude obsahovať pole [page] a teda ani liked a admin.

Jan Gnip: poprosim, precitat este raz, alebo si vyskusaj, ci TI CANVAS PAGE vrati niekedy nejaku hodnotu v signed request-e!

Myslím, že by nezaškodilo pridať aj tento link. Možno si ho už dáal minulých častiach seriálu. V tom prípade ho sem dávam zbytočne:
http://developers.facebook.com/tools/explorer
Ďalej by som chcel upozorniť, že činnosť popisovaná v článku (zistenie Like) je štandardná vec v Graph API a pred pol rokom, keď som robil aplikáciu pre Facebook, tak som to tiež cez Graph API urobil. Z tvojho textu mám pocit, ako keby to nebola bežná vec, hoci to bežná vec je. Ide o to, že asi rok dozadu Facebook komplet všetko zmenil na nové.
Ďaňou za to bolo aj to, že keď som robil pred pol rokom aplikáciu, tak som v dokumentácii nachádzal aj staré veci, ktoré mi to len komplikovali, pretože už nič zo starých vecí nefungovalo.
Mal som hlavne problém s týmto:
- nedokázal som zobraziť zoznam priateľov, aby v nich mohol používateľ vybrať jedného, prípadne zaklikať viacerých (áno, taký dialóg existuje, ale je plne automatizovaný a slúži na odosielanie pozvánok do aplikácie, lenže ja som chcel dostať výstup v podobe IDčiek zakliknutých priateľov)
- cez Graph API hoci v dokumentácii taká možnosť je a práva som mal všetky potrebné, nedokázal som získať link na fotografiu priateľa (chcel som si totiž vyššie spomenutý dialóg spraviť sám)
Je možné, že sa to za pol roka na Facebookovej dokumentácii zlepšilo a pribudli nové veci, lenže tá dokumentácia bola tak nechutne zbúchaná a pozliepaná (nové veci so starými nefunkčnými), že ma prešla chuť s tým ďalej strácať čas.
Takže, pokiaľ by si mi vedel zodpovedať moje dve otázky, tak by ma to celkom potešilo.

Ivan: To je síce fajn, ale nepomôže ti to, pokiaľ potrebuješ obmedziť niečo už pri generovaní obsahu, teda na strane php kódu. FQL som netestoval, pretože podľa rôznych fór a tak to tam dávalo všemožné hlúposti a nič, čo by stálo za otestovanie.

Áno a funguje to, len ešte malá chybička v JS a to tá, že response v prípade isFan nie je String, ale Boolean čiže musí byť bez úvodzoviek
if(response==true) //je fanúšik else //nie je fanúšik

veď napriklad cez file_get_contents alebo inú funkciu v php môžete zistiť, či je fan pomocou tejto url: https://api.facebook.com/method/pages.isFan?page_id=ID STRANKY&uid=USER ID&access_token=ACCESS TOKEN&format=json
toto vráti true alebo false len musíte mať od používateľa povolené v permissions "user_likes"
http://developers.facebook.com/docs/reference/rest/pages.isFan/
alebo ešte cez javascript to môžete riešiť takto(tiež treba mať "user_likes" povolené)
FB.api({ method:"pages.isFan", page_id:"ID STRÁNKY",
},function(response){ if(response=="true") //je fanúšik else //nie je fanúšik
}
);

Andrej: kludne to skus cez FQL, ked myslis, ze ti to pojde :D nasiel som vsak este jeden, jednoduhsi sposob. A to presne tento:
$fbuser = $facebook->api('/me');
$members = $facebook->api('/'.$APPID_OR_PAGEID.'/members/'.$fbuser['id']);
if($members['data'][0]['id'] == $fbuser['id']) {
$liked = true;
} else {
$liked = false;
}

A prečo tak komplikovane? Olajkujem 3000 aplikácií, ďalších 1000 Fan pages a ak bude to čo hľadám na poslednej pozícií v $likes, tak sa mi to natiahne krásne :) Treba použiť FQL na toto!

"Pôvodne, to bolo všetko jednoduché. V tzv. podpísanom requeste (signed_request) boli posielané údaje typu [page][liked]. Canvas Page však tieto informácie nedostáva a preto si musíte zistiť existenciu inak."
Dostává je, ale jen poprvé při vstupu na aplikaci (takže je potřeba to hodit do sešny).
Novinky
1 rokom
Používatelia Chrome začali prechádzať na nový rýchlejší Firefox, avizujú dáta Mozilly
Nový lepší a rýchlejší prehliadač Firefox 57 Quantum vyúsťuje zrejme do viac používateľov prechádzajúcich respektíve vracajúcich sa na tento prehliadač z iných prehliadačov, na osobných počítačoch aj smartfónoch.
1 rokom
Briti dokončili kúpu SK-NIC-u. Nové .sk domény nechávajú za 8.4 eur
Predaj správcu slovenskej domény .sk, SK-NIC, bol dokončený a novým majiteľom po telekomunikačnej skupine Danubiatel, do ktorej patrí napríklad Swan a 4ka, je britská spoločnosť CentralNic.
1 rokom
Šifrovanie diskov v Linuxe sa výrazne zlepšuje, dostáva ochranu integrity
Technológia šifrovania diskov LUKS podporovaná v Linuxe a využívaná mnohými linuxovými distribúciami dostáva výrazné vylepšenie v podobe vydania novej hlavnej verzie nástroja cryptsetup 2.0.0.
1 rokom
Blýská se Tesle na lepší časy? PepsiCo objednala 100 kamionů Semi
Známá automobilka Tesla má v poslední době problémy s plněním ambiciózních výrobních plánů stanovených vizionářem Muskem a pohybuje se v červených číslech.
1 rokom
DSL rozchodili cez mokrý špagát, dosiahli 3.5 Mbps. Nesimulovali slovenské linky?
Technik menšieho britského telekomunikačného operátora Andrews & Arnold uskutočnil zaujímavý experiment, keď sprevádzkoval pripojenie technológiou ADSL cez namočený špagát.
Staršie novinky »TOP dlhšie
- 01 Podporte každoročnú akciu Týždeň práce z domova (5581x)
- 02 Inteligentná domácnosť: III. diel - inštalácia a rozbehanie ovládania (882x)
- 03 Môj život s Philips Hue (535x)
- 04 Java 8 - Lambda výrazy (489x)
- 05 GDPR: Pozor na dáta na vyradených diskoch! (458x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
TOP tento mesiac
- 01 Skvelý dôvod, prečo sa hráči mali zbaviť káblov (213x)
- 02 Nahradí micro LED televízory OLED? (109x)
- 03 PPC – vojna, alebo ako poraziť konkurenta (101x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
Nové články:
- 1.PPC – vojna, alebo ako poraziť konkurenta
feb - 31.Nahradí micro LED televízory OLED?
jan - 30.Skvelý dôvod, prečo sa hráči mali zbaviť káblov
jan - 14.Šifrované SSD Kingston UV500
dec - 10.50 rokov od predstavenia myši
dec - Viac »
- Aj ty môžeš byť najčítanejší. Napíš článok »
Pekné veci
Pekné veci
Pekné veci
Pekné veci
Posledné komentáre
- Zdravím, mám restaurační zařízení v turisticky hojně navštěvované oblasti, kde je však k...
- Kingston je najlepsia znacka na usb,flash discy ako aj na sd karty. Kto by chcel moze vy...
- Tiez pouzivame profit365, v ramci tychto ekonomickyhc softverov nam daval najlepsi vyzna...
- Taketo zariadenie by sa mi zislo. Mam viacero zariadeni od TP Link, skvela znacka na zar...
- Mam doma smart TV Philips s ambilight. Dobre sa pozera na TV ked je zo zadu osvetlene a ...
Kritika
Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!
Reklama
Slovenská IT komunita
Seriály zo Zajtra.sk
· Ako písať blog
· Ako sa stať PHP ninja s Yii Frameworkom
· Aplikácie pre Facebook
· CSS triky
· iOS vývojára príhody a skúsenosti
· Jednoduché programy, ktoré vám ušetria čas
· Modelovanie webového sídla
· Nauč sa CodeIgniter [HD]
· Nauč sa jQuery [HD]
· Nette PHP framework
· OOP v Javascripte
· Programujeme v Jave
· Programujeme v Lazaruse
· Programujeme v Pythone
· Robíme Eshop v ASP.NET Web Pages
· Slovenskí iOS developeri
· Webdizajn krok po kroku
· Yablkov TurboTip [HD]
Troska offtopic ale pre mna dolezita tema :D
Hladam Facebook programatora pre jednoduche az stredne tazke aplikacie. Hlavne PHP a HTML aplikacie cize nie flashove animacie (ale ked ovlada potesi) :)
Freelancera najlepsie, alebo zodpovedneho studenta - ak sú takí :D
Info: grappa@grappa.sk