PHP-пост в Facebook на фан-страницу с cronjob?


Я использую следующий код для публикации на своей фан-странице facebook, и он работает нормально. Теперь я хочу использовать cronjob для публикации в Facebook. Я знаю, что мне нужно использовать в качестве маркера доступа, но я не уверен, как его настроить. Я попытался использовать echo свой собственный токен доступа и токен доступа страницы и использовать его в api post, но это не сработало, я получил эту ошибку:

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://www.example.com/thumbnails/".$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");, но есть очень ограниченные ресурсы о том, как их использовать. Я даже не уверен, будут ли они уместны для этой проблемы. Все, что мне нужно знать, это какой токен доступа мне нужно использовать и какой подходящий код для его настройки ?

Author: Rikesh, 2012-11-04

4 answers

Вот как вы можете это сделать:

  1. Получите кратковременный доступ.
  2. Расширьте его.
  3. Получите доступ к странице с длительным сроком службы. (Не имеет значения, здесь мы будем каждый раз получать новые доступы. Менее сложный и надежный.)

Думал, что я пойду с алгоритмом, вместо этого я добавляю все возможные коды и документацию, так как это может помочь и кому-то еще.

Получение кратковременного токена доступа и расширение это:

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   
} 
?>

Итак, теперь у вас есть готовый доступ к вашей базе данных, текстовый файл или что-то еще.

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://www.example.com/thumbnails/".$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 дней вручную .

Дайте мне знать.

 13
Author: Kishor, 2016-09-04 12:34:08

Это, вероятно, должно исправить ситуацию.

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, получите токен из своей базы данных.

P.S: access_token действителен в течение 60 дней, и его следует продлить снова, и это может быть сделано пользователем, вошедшим в систему вручную. access_token обычно "может" не изменяться, а просто продлевает срок действия.

ДОБАВИТЬ :

Планирование сообщений: Вы также можете запланировать публикацию на срок до 6 месяцев. Просто прочитал об этом и подумал, что я хотел бы указать.

Читать: https://developers.facebook.com/docs/reference/api/page / прокрутите вниз до раздела Создание записей

 8
Author: Kishor, 2012-11-06 12:00:19

Вы можете отказаться от всех накладных расходов API Facebook и следовать этому чрезвычайно простому подходу.

Проверьте, какой адрес электронной почты для вашей страницы указан в разделе "Мобильный" настроек вашей страницы (https://www.facebook.com/pages/edit/?id=INSERT_YOUR_PAGE_ID_HERE&sk=mobile ), а затем используйте его здесь:

<?php
    mail("[email protected]", "New Status Update!", "");
?>

Текст пуст, потому что Facebook говорит: "чтобы обновить свой статус, напишите в теме письма и оставьте текст письма пустым".

 0
Author: Westy92, 2013-12-10 20:11:26

Вы можете посмотреть здесь https://github.com/newbacknew/owloo.com . Это база скриптов из owloo.com для получения данных из Facebook через панель "ОБЪЯВЛЕНИЯ" также необходимо повторно получить аналитические данные из Twitter и Instagram.

С помощью базового скрипта вы можете получить информацию о тенденциях, интересах, поведении, демографических данных, возрасте, гендерном кол-ве каждой страны, города, сцены, страницы фанатов в facebook

База всех скриптов находится в папке WSERVICE папок резервных копий.

 0
Author: alpha, 2015-09-07 18:19:38