spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

František Čaník 6.1.2012, článok je súčasťou seriálu Aplikácie pre Facebook
Hodnoť článok:
0 0

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.

František Čaník František Čaník

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.


Hodnoť článok:
0 0

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:


Zabudol som heslo

0 0 Zoltán Mitlík 27.1.2012 15:20:23
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
0 0 sadf sdfasf 21.1.2012 16:05:41
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.
0 0 František Čaník 13.1.2012 22:06:08
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...
0 0 Andrej Badin 13.1.2012 21:04:53
@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š.
0 0 František Čaník 11.1.2012 23:35:02
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.
0 0 Miloš 11.1.2012 15:49:45
František: On má možno starú aplikáciu a skúša to v tej. Staré aplikácie fungujú stále, len nové už nemajú funkčnosť starých.
0 0 František Čaník 11.1.2012 15:10:58
Jan Gnip: poprosim, precitat este raz, alebo si vyskusaj, ci TI CANVAS PAGE vrati niekedy nejaku hodnotu v signed request-e!
0 0 Ján Gnip 11.1.2012 13:54:05
Tak znovu:
Proč to dělat takhle složitě? signedRequest["page"]["liked"] pořád funguje!
0 0 Miloš 9.1.2012 13:13:09
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.
0 0 Miloš 9.1.2012 12:43:53
Počuj, keď sa už toľko venuješ Facebooku, popíš aj nejaké tie pravidlá pre súťaže, lebo mnohí nevedia dodnes, že súťaž na Facebooku môže byť len v aplikáciách a to sa jedná aj o veľké "zvery" ako webnoviny a podobne.
0 0 František Čaník 8.1.2012 19:10:07
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.
0 0 Ivan Sivák 8.1.2012 16:58:13
Á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
0 0 František Čaník 8.1.2012 16:38:03
Ivan: a skúšal si to v CANVAS PAGE?
0 0 Ivan Sivák 8.1.2012 15:42:58
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
}
);
0 0 František Čaník 7.1.2012 17:37:31
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;
}
0 0 Andrej Badin 7.1.2012 09:58:19
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!
0 0 Ján Gnip 7.1.2012 03:10:01
"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).
0 0 Moďerný Občan 6.1.2012 12:21:22
A pomocou js api sa to robi ako?
Zajtra.sk > Programovanie > FBML/Facebook > Facebook: Like a Canvas Page?


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama