Integracja z Facebookiem bez logowania użytkowników

Witam,
chcę zintegrować aplikację z Facebookiem, w taki sposób, aby przy każdym dodaniu artykułu w aplikacji dodawał się on także jako post na facebookową tablicę (oś czasu).

Korzystam z gemu koala i próbowałem rozwiązać problem w taki sposób:

  1. @oauth = Koala::Facebook::OAuth.new(app_id, app_secret)
  2. @facebook = Koala::Facebook::API.new(@oauth.get_app_access_token)
  3. @facebook.put_wall_post("testing")

Ale w tym momencie dostaję:
Koala::Facebook::AuthenticationError: type: OAuthException, code: 2500, message: An active access token must be used to query information about the current user. [HTTP 400]

I szczerze mówiąc jestem zmieszany. Aplikacja na facebooku, chyba nie ma swojej własnej tablicy, więc założyłem stronę. Mogę ją jakoś podpiąć pod aplikację?
Jak chcę wygenerować access token dla strony to żąda przełączenia się spowrotem na konto prawdziwego użytkownika.

Wie ktoś jak poprawnie to powinienem rozwiązać?

Post do facebooka dodajesz na oś czasu konkretnego użytkownika, potrzebujesz jego tokena uwierzytelniającego a facebook, więc musisz uwierzytelnić użytkownika przez facebooka.

A co w przypadku, gdy chcę ten post dodać na oś czasu danej strony?

Ponieważ nie chcę, aby aplikacja dodawała posty na mojej osi czasu, a jedynie na stronie, którą dla niej założyłem.

Jak utworzyłeś stronę na facebooku, z tego co się orientuje to oś czasu jest dla danego użytkownika, a nie dla strony.

Chyba że założyłeś osobne konto na facebooku dedykowane dla tej strony, w takim razie musisz się pobrać token dla tego konta, tylko weź pod uwagę, że może wystąpić sytuacja że token wygaśnie, wtedy musisz ponownie pobrać nowy token.

Post możesz też dodać na wall fanpage, nie koniecznie usera…
Jako fanpage autoryzujesz swoją apkę (lub jako admin tej fanpage), uzyskujesz access_token fanpage i go używasz do postowania

@oauth = Koala::Facebook::OAuth.new(app_id, app_secret)
@facebook = Koala::Facebook::API.new(fanpage_access_token)
@facebook.put_wall_post("testing")

Dokładnie, z tym, że tak jak pisałem na początku, miałem problem z pobraniem access tokena dla fanpage’a. Ale już znalazłem sposób:

@user = Koala::Facebook::API.new(user_access_token)
page_access_token = @user.get_connections('me', 'accounts').first['access_token']
@page = Koala::Facebook::API.new(page_access_token)
@page.put_wall_post("testing")

Pozostaje jeszcze tylko jedna kwestia: ten access token użytkownika musiałbym, odświeżać, prawda?
Da się to zrobić przy pomocy samej “koali” czy muszę użyć np. “omniauth-facebook”?

nowy_lub_obecny_access_token = @oauth.exchange_access_token(obecny_access_token)

http://www.ruby-doc.org/gems/docs/k/koala-1.5.0/Koala/Facebook/OAuth.html#method-i-exchange_access_token

Z tym, że ja potrzebuję odświeżyć access token użytkownika, np w przypadku gdy się on wyloguje.

A exchange_access_token() w klasie Koala::Facebook::OAuth chyba jedynie odświeża access token aplikacji - który nie wygasa (do czasu kiedy nie zmienimy app secret), mam rację?

Update:
To może inaczej… jest w ogóle jakaś opcja, aby zalogować użytkownika w tle mając jego login i hasło?
lub ewentualnie umożliwić aplikacji dodawanie postów na jej fanpage’u bez logowania się na jakiegoś użytkownika?

Hmm, ale postować chcesz na wall fanpage, nie usera?
Fanpage ma swój access_token, podobny do ‘userowego’

https://developers.facebook.com/docs/facebook-login/access-tokens/#pagetokens

Imho exchange_access_token powinien zadziałać z takim tokenem fanpage, ale ręki nie dam :slight_smile:

Tak, chcę postować na fanpage’u. Z tym, że o ile się nie mylę, to aby móc postować na fanpage’u, trzeba być zalogowany na jakiegoś użytkownika, który może na niej umieszczać posty lub umieszczać posty w jej imieniu.

Access token dla fanpage’a pozyskuje w taki sposób jak podałem powyżej, czyli w skrócie:

page_access_token = @user.get_connections('me', 'accounts').first['access_token']
@page = Koala::Facebook::API.new(page_access_token)

A Koala::Facebook::API nie ma takiej metody jak exchange_access_token() - chyba, że coś robię źle? :blush:

exchenge_access_token uzywane jest tylko dla użytkowniku, a nie na obiekcie API, służy to do pobrania tokena o długiej ważności “long live token” Poczytaj: https://developers.facebook.com/docs/facebook-login/access-tokens/

Wykorzystałem jednak gem “omniauth-facebook” i właściwie osiągnąłem mniej więcej to czego oczekiwałem.

W każdym razie wielkie dzięki Wam obojgu za pomoc :smile:

Teraz jedynie się męczę z dodaniem postu, który zawiera wiele obrazków. Da się coś takiego zrobić?
Bo zdania na różnych forach są podzielone, w dokumentacji Koali nic na ten temat nie wspominają, a dokumentacja Facebook’a wskazywałaby na to, że można załączyć do 5 obrazków.

Jeśli chodzi o post z jednym obrazkiem, to robię to w taki sposób:

page.put_wall_post("tekst", { name: "tekst obok obrazka", link: "dowolny url", picture: "url obrazka" })

Próbowałem na różne sposoby przesłać więcej obrazków, ale niestety bez powodzenia.