Обновление статуса твиттера с php - PullRequest
2 голосов
/ 23 февраля 2012

Я работаю над проектом PHP, в котором я хочу иметь возможность автоматически публиковать сообщения в твиттере.

Из моей PHP-программы я авторизовал свое приложение для твиттера и сохранил oauth_token и верификатор в базе данных mysql.

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

'недействительно / истеклотокен '

Ниже приведен код, который я использую

function postToTwitter($twitterMsg)
    {
    require ("../../social/phpHandler/twitterLib/EpiCurl.php");
    require ("../../social/phpHandler/twitterLib/EpiOAuth.php");
    require ("../../social/phpHandler/twitterLib/EpiTwitter.php");
    require ("../../social/phpHandler/twitterLib/secret.php");

    $query = "SELECT * FROM social_sites";
    $result = mysql_query($query);
    if ($result)
    {
        //session_start();
        //$twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
        while ($myrow = mysql_fetch_array($result))
        {
            $oauth_token = $myrow['token'];
            $verifier = $myrow['verifier'];

            $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
                $twitterObj->setToken($oauth_token);
            //echo 'OAuth Token: ' . $_GET['oauth_token'];
            $token = $twitterObj->getAccessToken();
            $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
            $_SESSION['ot'] = $token->oauth_token;
            $_SESSION['ots'] = $token->oauth_token_secret;
            $twitterInfo= $twitterObj->get_accountVerify_credentials();
            $twitterInfo->response;
            //echo '<pre>';
            print_r($twitterInfo->response);

        }
    }

Обновление

Я экспортировал переменную $twitterInfo и записал ее в файл ивыход ниже.Не уверен, поможет ли это вообще.

EpiTwitterJson :: __ set_state (array ('resp' =>
EpiCurlManager :: __ set_state (array ('key' => 'Resource id # 12'), 'epiCurl' => EpiCurl :: __ set_state (массив ('mc' => NULL, 'msgs' => NULL, 'выполняется' => NULL, 'запросы' => массив ('Resource id # 11' => NULL), 'Resource id # 12' => NULL,), 'response' => array ('Resource id # 11' => array ('data' => 'Неверный / просроченный токен
/ oauth / access_token', 'code '=> 401,' time '=> 0.39,' length '=> 136,' type '=>' text / html; charset = utf-8 ',),' Resource id # 12 '=> array ('data '=>' {"error": "Invalid \ / expired Token", "request": "\ / account \ /verify_credentials.json"} ',' code '=> 401,' time '=> 0.156,'length '=> 83,' type '=>' application / json; charset = utf-8 ',),),' properties '=> array (' code '=> 2097154,' time '=> 3145731,' length'=> 3145743,' type '=> 1048594,),)),)),' responseText '=>' {"error": "неверный \ / просроченный токен", "запрос": "\ / account \ / verify_credentials.json "} ',
' response '=> array ('error' => 'Invalid / expired Token', 'request' => '/account/verify_credentials.json',), 'error' => 'Invalid / expired Token', 'request' => '/account / verify_credentials.json ',))

Update 2

Я попытался сохранить токен доступа, сериализовав объект и сохранив его в базе данных, используя код ниже

function authenticate($consumer_key, $consumer_secret)
    {
        $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);

        $twitterObj->setToken($_GET['oauth_token']);
        //echo 'OAuth Token: ' . $_GET['oauth_token'];
        $token = $twitterObj->getAccessToken();
        $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
        $_SESSION['ot'] = $token->oauth_token;
        $_SESSION['ots'] = $token->oauth_token_secret;
        $twitterInfo= $twitterObj->get_accountVerify_credentials();
        $twitterInfo->response;
        //echo '<pre>';
        //print_r($twitterInfo->response);
        //var_dump($twitterInfo);
        $username = $twitterInfo->screen_name;
        $profilePic = $twitterInfo->profile_image_url;

        addToDatabase($username, $profilePic, $_GET['oauth_token'], $_GET['oauth_verifier']);
    }

    function addToDatabase($username, $profilePic, $token, $verifier)
    {
        $token_serialised = serialize($token);
        $query = "INSERT INTO social_sites (social_name, token, verifier, username, profilePicture) VALUES ('Twitter', '$token_serialised', '$verifier', "
            . "'$username', '$profilePic')";

Позже я пытаюсь опубликовать в Твиттере, не загружая страницу авторизации приложения Twitter, получив значение из сохраненной ранее базы данных, и отключив сериализацию для отправки в Твиттер, используя следующий код:

$twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
            while ($myrow = mysql_fetch_array($result))
            {
                //$access_token = unserialize($myrow['token']);
                //$twitterObj->setToken($access_token);
                //$token = $twitterObj->getAccessToken();
                $token = unserialize($myrow['token']);
                $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
                $_SESSION['ot'] = $token->oauth_token;
                $_SESSION['ots'] = $token->oauth_token_secret;
                $twitterInfo= $twitterObj->get_accountVerify_credentials();     

                $myFile = "log.txt";
                $fh = fopen($myFile, 'w') or die("Error");
                fwrite($fh, var_export($twitterInfo->response, true));
                fclose($fh);

//              $twitterMsg = $_REQUEST['tweet'];
                $update_status = $twitterObj->post_statusesUpdate(array('status' => $twitterMsg));
                $tem = $update_status->response;    
                fwrite($fh, var_export($tem, true));
                fclose($fh);
}

Запись файла журнала - это то, где записывается ответ в Твиттере, где говорится, что токен недействителен или истек.

Обновление 3

I 'Мы также заметили, что при десериализации возникает ошибка php:

Примечание: unserialize ();ошибка по смещению 2555 из 2987 байт

, и когда я пытаюсь экспортировать переменную, она кажется пустой

Ответы [ 4 ]

2 голосов
/ 25 февраля 2012

Моя рекомендация:

1) Используйте библиотеку PHP, например http://github.com/abraham/twitteroauth.

2) Выберите ваше приложение на http://dev.twitter.com/apps и нажмите «Мой токен доступа».

3) Мы используем этот токен, как описано в http://dev.twitter.com/pages/oauth_single_token.

Подробнее: link1

link2

0 голосов
/ 01 марта 2012

Вы должны экранировать данные, прежде чем вставлять их в MySQL.Вы можете использовать mysql_escape_string Встроенную функцию PHP.

Редактировать: вам следует использовать библиотеку для связи с сервером (Twitter и другими).Я написал простую, вы можете прочитать об этом больше в этом блоге .Он поддерживает Twitter, Facebook и Google.

0 голосов
/ 27 февраля 2012

Вы должны создать твиттер-приложение. Скачайте и подключите EpiTwitter api. Скопируйте твиттерный ключ приложения и секретный (в настройках приложения) используйте их для инициации twiiter объекта.

 $twitterObj = new EpiTwitter($context["TWITTER"]["APP_KEY"], $context["TWITTER"]["APP_SECRET"]);

, затем проверьте, отправляет ли твиттер токен на вашу страницу или нет

$oauth_token = $_GET['oauth_token'];
if($oauth_token == '')
{
 $url = $twitterObj->getAuthorizationUrl();
 header("Location: $url");
}else{
 $twitterObj->setToken($_GET['oauth_token']);
 $token = $twitterObj->getAccessToken();
 $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
 $_SESSION['ot'] = $token->oauth_token;
 $_SESSION['ots'] = $token->oauth_token_secret;
 $twitterInfo = $twitterObj->get_accountVerify_credentials();
}

если twitter token = '' ваша страница отправляет запрос в twitter и принимает ответ с помощью токена (ответ приходит по адресу, который вы вводите в поле настроек приложения twitter - direct), если у вас есть, вы можете изменить свой статус следующим образом:

 $twitterObj->setToken($_SESSION['ot'], $_SESSION['ots']);
 $update_status = $twitterObj->post_statusesUpdate(array('status' => $tweet_msg));
 $temp = $update_status->response;
0 голосов
/ 27 февраля 2012

Как вы храните oauth_token в базе данных?

Вы не можете сохранить его просто как строку, так как это объект. Вместо этого вам нужно будет сериализовать его перед записью в базу данных и десериализовать при извлечении из базы данных.

http://php.net/manual/en/function.serialize.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...