【问题标题】:Twitter access to resource error after first connection首次连接后 Twitter 访问资源错误
【发布时间】:2025-12-03 19:55:02
【问题描述】:

我成功设置了 twitteroauth 并发布了一条消息。现在,当我再次尝试发帖时,每次AFTER THE FIRST成功发帖时,我都会收到错误Your credentials do not allow access to this resource. (code 220)

这是我的代码:';

    $message = 'Test';
    $apiKey = Ranger_Application_Util::getConfig('twitter_app_api_key');
    $apiSecret = Ranger_Application_Util::getConfig('twitter_app_api_secret');
    $consumerToken = Ranger_Application_Util::getStorageData('twitter_oauth_token');
    $consumerSecret = Ranger_Application_Util::getStorageData('twitter_oauth_secret');
    $twitterOauthVerifier = Ranger_Application_Util::getStorageData('twitter_oauth_verifier');      
    $_SESSIOM['oauth_token'] = $consumerToken;
    $_SESSION['oauth_token_secret'] = $consumerSecret;
    require_once 'twitter/twitteroauth.php';
    $connection = new TwitterOAuth($apiKey,$apiSecret,$consumerToken,$consumerSecret);
    $connection->host = "https://api.twitter.com/1.1/";
    $accessToken = $connection->getAccessToken($twitterOauthVerifier);
    $_SESSION['access_token'] = $accessToken;
    $parameters = array('status' => $message);
    $status = $connection->post('statuses/update',$parameters);
    Core::dump($status);
    die();

我从getStorageData 检索到的数据是存储在数据库中与该特定用户相关的值。

【问题讨论】:

    标签: php twitter oauth twitter-oauth


    【解决方案1】:

    除非您将 $accessToken 中的信息存储在您尚未发布的一段代码中的数据库中,否则我认为问题可能是您在初始连接后获取了访问令牌,但没有使用永久访问信息尝试发布到连接时从访问令牌中获取。因此,任何未来的请求都不会使用永久凭据,因此会被拒绝。试试这样的:

    $message = 'Test';
    
    $apiKey               = Ranger_Application_Util::getConfig('twitter_app_api_key');
    $apiSecret            = Ranger_Application_Util::getConfig('twitter_app_api_secret');
    $twitterOauthVerifier = Ranger_Application_Util::getStorageData('twitter_oauth_verifier');  
    
    require_once 'twitter/twitteroauth.php';
    
    $hasAccessToken = (
        array_key_exists('oauth_token', $_SESSION) &&
        array_key_exists('oauth_token_secret', $_SESSION));
    
    if ($hasAccessToken)
    {
        $consumerToken  = $_SESSION['oauth_token'];
        $consumerSecret = $_SESSION['oauth_token_secret'];
    }
    else
    {
        $consumerToken  = Ranger_Application_Util::getStorageData('twitter_oauth_token');
        $consumerSecret = Ranger_Application_Util::getStorageData('twitter_oauth_secret');
    
        $connection = new TwitterOAuth($apiKey, $apiSecret, $consumerToken, $consumerSecret);
        $connection->host = "https://api.twitter.com/1.1/";
    
        $accessToken = $connection->getAccessToken($twitterOauthVerifier);
    
        $consumerToken  = $accessToken['oauth_token'];
        $consumerSecret = $accessToken['oauth_token_secret'];
        $_SESSION['oauth_token']        = $consumerToken;
        $_SESSION['oauth_token_secret'] = $consumerSecret;
    }
    
    $connection = new TwitterOAuth($apiKey, $apiSecret, $consumerToken, $consumerSecret);
    $connection->host = "https://api.twitter.com/1.1/";
    
    $parameters = array('status' => $message);
    $status = $connection->post('statuses/update', $parameters);
    
    Core::dump($status);
    die();
    

    您可能希望在从getAccessToken() 接收到 oauth 令牌信息后将其存储在数据库中,而不是使用会话。也许你有Ranger_Application_Util::setStorageData('twitter_oauth_token', $consumerToken)这样的方法?

    【讨论】:

      【解决方案2】:

      这个

      $_SESSIOM['oauth_token'] = $consumerToken;
              ^
      

      应该是

      $_SESSION['oauth_token'] = $consumerToken;
      

      【讨论】:

        最近更新 更多