Я использую следующий код для публикации на моей странице фейсбука, и он работает нормально. Теперь я хочу использовать cronjob для публикации в Facebook. Я знаю, что мне нужно использовать токен доступа, но я не уверен, как его настроить. Я попытался использовать echo
свой токен доступа и токен доступа к странице и использовать его в post api, но это не сработало. Я получил эту ошибку:
Uncaught OAuthException: An active access token must be used to query information about the current user.
Вот мой код, который я пробовал:
require_once('scripts/facebook.php'); $config = array('appId' => 'xxx','secret' => 'xxx'); $params = array('scope'=>'user_likes,publish_actions,email,offline_access,publish_stream,manage_pages'); $facebook = new Facebook($config); $user = $facebook->getUser(); if($facebook->getUser()) { try { $user_profile = $facebook->api('/me'); $access_token = $facebook->getAccessToken(); //echo "1. ".$access_token; } catch(FacebookApiException $e) { $login_url = $facebook->getLoginUrl($params); error_log($e->getType()); error_log($e->getMessage()); } } else { $login_url = $facebook->getLoginUrl($params); } $page_id = "xxxxxxxxxxxxx"; $page_access_token = ""; $result = $facebook->api("/me/accounts"); foreach($result["data"] as $page) { if($page["id"] == $page_id) { $page_access_token = $page["access_token"]; //echo '<br>'; //echo "2. ".$page_access_token; break; } } $args = array( 'access_token' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'message' => stripslashes($image_caption).$animaged_gif, 'name' => stripslashes($image_caption).$animaged_gif, 'link' => "http://www.example.com/images.php?i=".$image_name, 'picture' => "http://img.ruphp.com/php/".$image_name.".png", 'actions' => array( 'name' => 'See Pic', 'link' => "http://www.example.com/images.php?i=".$image_name ) ); $post = $facebook->api("/$page_id/feed","post",$args);
Как вы можете видеть, я попытался использовать фактический токен доступа, который я получил, когда я выхожу из своего токена доступа. Но это не сработало. Я также использовал токен доступа к странице, но это также не сработало. Не могли бы вы рассказать, что мне здесь не хватает, или как это сделать? После некоторого дальнейшего поиска я наткнулся на setAccessToken
и $page_info = $fb->api("/".$sInfo['pageId']."?fields=access_token");
но есть очень ограниченные ресурсы о том, как их использовать. Я даже не уверен, что они будут соответствовать этой проблеме. Все, что мне нужно знать, это тот токен доступа, который мне нужно использовать, и каков соответствующий код для его настройки?
Так вы можете это сделать:
Думал, что я поеду с algo, вместо этого я добавлю все возможные коды и документацию, так как это может помочь кому-то еще.
Получение краткосрочного токена доступа и его расширение:
fetchtoken.php
<?php //read more : https://developers.facebook.com/docs/howtos/login/server-side-login/ session_start(); $app_id = "xxxxxxxxxxxxxx"; $app_secret = "xxxxxxxxxxxxxxxx"; $my_url = "www.stackoverflow.com/"; // redirect url $code = $_REQUEST["code"]; if(empty($code)) { // Redirect to Login Dialog $_SESSION['state'] = md5(uniqid(rand(), TRUE)); // CSRF protection $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" . $_SESSION['state'] . "&scope=publish_stream,read_friendlists,email"; echo("<script> top.location.href='" . $dialog_url . "'</script>"); } if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) { $token_url = "https://graph.facebook.com/oauth/access_token?" . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $response = file_get_contents($token_url); $params = null; parse_str($response, $params); $longtoken=$params['access_token']; //save it to database } ?>
Итак, у вас теперь есть готовый к проживанию accesstoken в вашей базе данных, текстовый файл или что-то еще.
cronjob.php
<? require_once('scripts/facebook.php'); // Pull access token from the file/db $access_token = "access token from file or db"; $facebook->setAccessToken($access_token); // sets our access token as the access token when we call something using the SDK, which we are going to do now. $config = array('appId' => 'xxx','secret' => 'xxx'); $params = array('scope'=>'user_likes,publish_actions,email,publish_stream,manage_pages'); $facebook = new Facebook($config); $user = $facebook->getUser(); if($facebook->getUser()) { try { $user_profile = $facebook->api('/me'); } catch(FacebookApiException $e) { $login_url = $facebook->getLoginUrl($params); error_log($e->getType()); error_log($e->getMessage()); } } else { $login_url = $facebook->getLoginUrl($params); } $page_id = "xxxxxxxxxxxxx"; $page_access_token = ""; $result = $facebook->api("/me/accounts"); foreach($result["data"] as $page) { if($page["id"] == $page_id) { $page_access_token = $page["access_token"]; //echo '<br>'; //echo "2. ".$page_access_token; break; } } $args = array( 'access_token' => $page_access_token, 'message' => stripslashes($image_caption).$animaged_gif, 'name' => stripslashes($image_caption).$animaged_gif, 'link' => "http://www.example.com/images.php?i=".$image_name, 'picture' => "http://img.ruphp.com/php/".$image_name.".png", 'actions' => array( 'name' => 'See Pic', 'link' => "http://www.example.com/images.php?i=".$image_name ) ); $post = $facebook->api("/$page_id/feed","post",$args); ?>
Убедитесь, что вы еще не захватили access_token (токен доступа пользователя / $ access_token) в скрипте.
Кроме того, access_token
в $args
который является токеном доступа к странице, должен быть вставлен переменной $ page_access_token, а не вручную.
Если offline_access
в области не делает ничего, кроме как показывать в диалоговом окне разрешения, что их данные могут быть доступны в любое время, которое может быть выполнено без этого уведомления.
Это должно работать до тех пор, пока вы посещаете fetch.php один раз в начале и один раз каждые 60 дней вручную .
Дай мне знать.
Вероятно, это исправить.
offline_access устарел. В настоящее время он заменяется системой, в которой вы получаете расширенный срок доступа access_token.
Когда вы запускаете его вручную, вы создаете токен доступа, который недействителен через 1-2 часа после его фактического запуска. И вы не можете создать другой access_token с помощью cron. Создание токена доступа должно выполняться вручную.
Поэтому, чтобы исправить это, прочитайте: https://developers.facebook.com/roadmap/offline-access-removal/
и реализуйте это: https://developers.facebook.com/docs/howtos/login/server-side-login/
И сохраните токен доступа в своей базе данных. Когда вы запустите cron, получите маркер из своей базы данных.
PS: access_token действителен в течение 60 дней, и он должен быть расширен снова и может быть выполнен путем входа пользователя вручную. Access_token обычно «может» не изменяться, а просто расширяет срок действия.
ДОБАВИТЬ :
Планирование сообщений: вы также можете запланировать сообщение до 6 месяцев. Просто прочитал об этом и подумал, что хочу указать.
Читайте: https://developers.facebook.com/docs/reference/api/page/ прокрутите вниз до сообщений Создать разделы
Вы можете отказаться от всех накладных расходов API Facebook и следовать этому чрезвычайно простому подходу.
Проверьте, что ваш адрес электронной почты, указанный в вашей странице, находится в разделе «Мобильные» параметров вашей страницы ( https://www.facebook.com/pages/edit/?id=INSERT_YOUR_PAGE_ID_HERE&sk=mobile ), а затем используйте его здесь:
<?php mail("thatEmailAddress@facebook.com", "New Status Update!", ""); ?>
Тело пуста, потому что Facebook говорит «обновить свой статус, написать в строке темы письма и оставить тело электронной почты пустым».
Вы можете посмотреть здесь https://github.com/newbacknew/owloo.com . Это база скриптов от owloo.com для получения данных из Facebook через панель мониторинга ADS, также необходимо извлекать аналитические данные из Twitter и Instagram.
С базовым скриптом вы можете получать тенденции, интересы, поведение, демографические данные, возраст, пол каждой страны, города, сцены, фан-страницы из facebook
База всего скрипта находится в папке WSERVICE в папках резервных копий.