Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Automatyczne wystawianie postów na firmowym facebooku
Forum PHP.pl > Forum > Przedszkole
trifek
Witam serdecznie,
Mam profil na Facebooku firmowy oraz prywatny.
Chciałbym zrobić skrypt do automatycznej publikacji postów na moim profilu firmowym.

Mam taki skrypt:
  1. require_once( 'Facebook/autoload.php' );
  2.  
  3. $fb = new Facebook\Facebook([
  4. 'app_id' => '0000000000000000000',
  5. 'app_secret' => '123456789098765432123',
  6. 'default_graph_version' => 'v2.5',
  7. ]);
  8.  
  9. $helper = $fb->getRedirectLoginHelper();
  10.  
  11. $_POST['backurl'] = str_replace("facebook_create.php", "facebook_create2.php", $_POST['backurl']);
  12.  
  13. $permissions = ['email', 'manage_pages ', 'user_photos', 'publish_actions', 'publish_pages', 'pages_manage_instant_articles', 'public_profile', 'user_friends', 'pages_messaging', 'user_posts', 'user_website' ];
  14. $loginUrl = $helper->getLoginUrl($_POST['backurl'], $permissions);
  15. header("location: ".$loginUrl);

oraz (facebook_create2.php):
  1. require_once( 'Facebook/autoload.php' );
  2.  
  3. $fb = new Facebook\Facebook([
  4. 'app_id' => '0000000000000000000',
  5. 'app_secret' => '123456789098765432123',
  6. 'default_graph_version' => 'v2.5',
  7. ]);
  8.  
  9. $helper = $fb->getRedirectLoginHelper();
  10.  
  11. try {
  12. $accessToken = $helper->getAccessToken();
  13. } catch(Facebook\Exceptions\FacebookResponseException $e) {
  14. // When Graph returns an error
  15.  
  16. echo 'Graph returned an error: ' . $e->getMessage();
  17. exit;
  18. } catch(Facebook\Exceptions\FacebookSDKException $e) {
  19. // When validation fails or other local issues
  20.  
  21. echo 'Facebook SDK returned an error: ' . $e->getMessage();
  22. exit;
  23. }
  24.  
  25.  
  26. try {
  27. // Get the Facebook\GraphNodes\GraphUser object for the current user.
  28. // If you provided a 'default_access_token', the '{access-token}' is optional.
  29. $response = $fb->get('/me?fields=id,name,email,first_name,last_name', $accessToken->getValue());
  30. // print_r($response);
  31. } catch(Facebook\Exceptions\FacebookResponseException $e) {
  32. // When Graph returns an error
  33. echo 'ERROR: Graph ' . $e->getMessage();
  34. } catch(Facebook\Exceptions\FacebookSDKException $e) {
  35. // When validation fails or other local issues
  36. echo 'ERROR: validation fails ' . $e->getMessage();
  37. }
  38. $me = $response->getGraphUser();
  39. //print_r($me);
  40. echo "<br/><br/><br/>";
  41. echo "<pre>";
  42. print_r($me);
  43. echo "</pre>";
  44. echo "<br/><br/><br/>";
  45. echo "Full Name: ".$me->getProperty('name')."<br>";
  46. echo "First Name: ".$me->getProperty('first_name')."<br>";
  47. echo "Last Name: ".$me->getProperty('last_name')."<br>";
  48. echo "Email: ".$me->getProperty('email')."<br>";
  49. echo "TOKEN: ".$accessToken."<br>";
  50. echo "Facebook ID: <a href='https://www.facebook.com/".$me->getProperty('id')."' target='_blank'>".$me->getProperty('id')."</a>"."<br>";
  51.  
  52.  
  53.  
  54. echo "<br/><br/><br/>";
  55. echo "<pre>";
  56. print_r($_GET);
  57. echo "</pre>";
  58.  
  59. $finalna_data = date('Y-m-d', strtotime('+55 days', time()));
  60. $tajny_token = $accessToken;
  61.  
  62.  
  63. $stmt = $db->prepare("UPDATE cms_admin_firma SET facebook_enable=:facebook_enable, facebook_data=:facebook_data, facebook_token=:facebook_token WHERE gt_id=:gt_id;");
  64. $stmt->bindValue(':facebook_enable', '1', PDO::PARAM_STR);
  65. $stmt->bindValue(':facebook_data',($finalna_data), PDO::PARAM_STR);
  66. $stmt->bindValue(':facebook_token',($tajny_token), PDO::PARAM_STR);
  67.  
  68. $stmt->bindValue(':gt_id', ($_SESSION['cms_user_id']), PDO::PARAM_INT);
  69. $stmt->execute();
  70. $stmt->closeCursor();



Mój kod do dodawania postów (do crona):

  1. $data_startu = date("Y-m-d", strtotime("-0 day"));
  2.  
  3. $stmt = $db->prepare("SELECT gt_id, facebook_token FROM cms_admin_firma WHERE facebook_enable = '1' and facebook_token <>'';");
  4. $stmt->execute();
  5. foreach ($stmt as $wartt) {
  6.  
  7.  
  8.  
  9. define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__.'/Facebook/');
  10. require_once(__DIR__.'/Facebook/autoload.php');
  11.  
  12.  
  13.  
  14.  
  15. $fbData = array(
  16. 'app_id' => '0000000000000000000',
  17. 'app_secret' => '123456789098765432123',
  18. 'default_graph_version' => 'v2.5',
  19. );
  20.  
  21. $fb = new Facebook\Facebook($fbData);
  22.  
  23. //// get following data from the db or just replace them ////
  24. $title = "Auto Post on Facebook Using PHP SDK v5";
  25. $targetUrl = "https://www.nazwa.pl";
  26. $imgUrl = "https://www.nazwa.pl/images/logo.png";
  27. $description= "opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, opis, ";
  28.  
  29. $params["message"] = $title;
  30. $params["link"] = $targetUrl;
  31. $params["picture"] = $imgUrl;
  32. $params["description"] = $description;
  33.  
  34. // get access token from the database or you can directly put here
  35. $access_token = baza_odczyt($wartt['facebook_token']);
  36.  
  37. // post to Facebook
  38. try {
  39. // Returns a `Facebook\FacebookResponse` object
  40. $response = $fb->post('/me/feed', $params, $access_token);
  41. } catch(Facebook\Exceptions\FacebookResponseException $e) {
  42. echo 'Graph returned an error: ' . $e->getMessage();
  43. } catch(Facebook\Exceptions\FacebookSDKException $e) {
  44. echo 'Facebook SDK returned an error: ' . $e->getMessage();
  45. }
  46.  
  47. $graphNode = $response->getGraphNode();
  48.  
  49. echo 'Posted with id: ' . $graphNode['id'];
  50.  
  51. }


Skrypt działa super, bez problemu publikuje posty na PRYWATNYM profilu Facebooka.
Chciałbym jednak żeby posty były publikowane na profilu FIRMOWYM.

Jak to zrobić?
Wydaje mi się iż zapisuję w 1 skrypcie token użytkownika prywatnego, nie firmowego - i dlatego posty idą na profil prywatny?

Wiecie może jak naprawić ten problem?

Bardzo proszę o pomoc.
Trifek
ps. nie mam za dużo uprawnień w tej aplikacji?
trueblue
Token powinien być wygenerowany na koncie administratora fanpage z uprawnieniami manage_pages i publish_pages (o ile dobrze pamiętam).
Publikujesz na /PAGE_ID/feed, nie na /me/feed (PAGE_ID to oczywiście id fanpage).
trifek
Dziękuję bardzo za odpowiedź.
Czyli te pozostałe uprawienia mogę usunąć? smile.gif


Czyli zamiast tego:
  1. $response = $fb->post('/me/feed', $params, $access_token);


Powinno być:
  1. $response = $fb->post('/PAGE_ID/feed', $params, $access_token);


questionmark.gif

Jak pobrać to page ID? Gdzieś na etapie logowania?smile.gif

trueblue
Nie pamiętam czy tylko takie uprawnienia, czy więcej.

http://findmyfbid.com/
trifek
Dziękuję za odpowiedź smile.gif

Coś nie do końca to działa sad.gif
Podany przez Ciebie kod publikuje POST'y na moim prywatnym FB, jednak na firmowym zgłasza błąd:
Graph returned an error: (#200) The user hasn't authorized the application to perform this action
podczas wysyłania...

Czy mógłbym się odezwać do Ciebie na PRV?smile.gif
trueblue
Spróbuj: http://stackoverflow.com/a/31641572/5889778
Powinieneś otrzymać page access token (https://developers.facebook.com/docs/facebook-login/access-tokens#pagetokens), aby publikować jako fanpage (nie jako osoba).
trifek
Zrobiłem coś takiego:
  1. $response = $fb->get('/PAGE-ID?fields=access_token', $accessToken->getValue());
  2.  
  3. $result = $response->getGraphObject()->asArray();

ale nie zwraca mi to tokena sad.gif
Widzisz może gdzie mam błąd z tym page access token?
trueblue
Nie chcę Ci namieszać, bo nie pamiętam dokładnie.
Na 100% token był generowany z konta administratora fanpage i na 100% postujesz na /PAGE_ID/feed.

Generowałem, albo 2 albo 3 tokeny. Ostatni był never-expired, ale on nie jest konieczny, bo wystarczy long-lived (60-dniowy).

Podrzucam Ci zapamiętane linki, z których chyba korzystałem:
http://www.devils-heaven.com/facebook-access-tokens/
http://stackoverflow.com/a/8235011/5889778
http://stackoverflow.com/a/18029423/5889778
trifek
Mógłbym się do Ciebie odezwać jakoś na PRV?
Opisałbym co i jak....
Logowanie i wystawianie postów (na prywatnych tablicach userów mam).
Chciałbym żeby to działało tak:
- user loguje się (to mam)
- pobieramy jego strony którymi zarządza (tego nie mam, nie chce mi to działać),
- zapisujemy page token i id page do bazy (to wiem jak zrobić),
- publikacja postów (pewnie tak samo jak mam obecnie, tylko zamiast tokena usera - będzie token strony).

Każdy user może zarządzać innymi stronami...
Chciałbym wystawiać na ich profilach firmowych te posty. Aktualnie działa mi to tak, że wystawiam post na prywantym i firmowym - jako osoba prywatna.
A chciałbym jako firmowa. Podejrzewam że mam jakiegoś małego buga, którego nie rozumiem sad.gif

Udało mi się zrobić krok na przód smile.gif Uzyskałem wartości restauracji smile.gif
  1. $request = $fb->get('/me/accounts', $accessToken->getValue());
  2. echo "<pre>";
  3. print_r($request);
  4. echo "</pre>";


zwraca mi:
http://pastebin.com/HRUg5LDe


Widzę że tu są te Page Tokeny i ID smile.gif
jak mogę je sobie pobrać z tych krzaczków i przypisać do zmiennych?smile.gif
trueblue
Zdebuguj access token, który podałeś w narzędziu: https://developers.facebook.com/tools/debug/accesstoken
To jest never-expired token.

Teraz powinieneś go użyć bezpośrednio w (już nie pobierasz tokenu w kodzie):
  1. $response = $fb->post('/PAGE_ID/feed', $params, $access_token);

Sprawdź jako kto postujesz.
trifek
tak, to jest ten long time token smile.gif
Za pomocą takiego wywołania:
  1. $response2 = $fb->post('/582721165136213/feed', $params, $access_token);
  2. $response3 = $fb->post('/1055846191130232/feed', $params, $access_token);


Publikuje jako osoba prywatna - na profilu firmowym. A ma być profil firmowy - na swoim profilu smile.gif

Zobacz proszę te tablice które podesłałem w poprzednim poście.

Tam są te moje ID page i tokeny (chyba) przypisane do danego użytkownika.

Podejrzewam że jak je pobiorę z tych dziwnych tablic i zapiszę do zmiennych, to wtedy te fb->post zadziałają?smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.