Elliot Haughin API验证凭据错误

Elliot Haughin API验证凭据错误,api,codeigniter,twitter,Api,Codeigniter,Twitter,我目前正在使用Codeigniter和Elliot Haughin Twitter库为校园项目构建一个Twitter客户端应用程序。它只是像tweetdeck一样的标准应用程序。登录后,用户将被引导到包含timline的配置文件页面。我使用Jquery每20秒刷新一次时间线。开始时,一切都很顺利,直到我在随机时间发现以下错误: ![错误][1] 遇到一个PHP错误 严重性:通知 消息:未定义的属性:stdClass::$request 文件名:libraries/tweet.php 电话号码:2

我目前正在使用Codeigniter和Elliot Haughin Twitter库为校园项目构建一个Twitter客户端应用程序。它只是像tweetdeck一样的标准应用程序。登录后,用户将被引导到包含timline的配置文件页面。我使用Jquery每20秒刷新一次时间线。开始时,一切都很顺利,直到我在随机时间发现以下错误: ![错误][1]

遇到一个PHP错误

严重性:通知

消息:未定义的属性:stdClass::$request

文件名:libraries/tweet.php

电话号码:205

我已经在网上搜索过这个错误,但找不到满意的解释。所以我试着自己找到它,发现这个错误是因为凭证验证错误。我试图var_转储行$user=$this->tweet->call'get'、'account/verify_credentials';并生成一个空数组。我的问题是,当用户已经登录,甚至更新了一些tweet之后,为什么会出现这个错误?我的脚本中是否存在逻辑错误,或者库是否有问题?谁能解释一下我发生了什么事?请帮帮我。。。 这是我的密码:

构造函数Login.php

<?php 

    class Login extends CI_Controller
    {
        function __construct()
        {
            parent::__construct();

            $this->load->library('tweet');
            $this->load->model('login_model');

        }

        function index()
        {
            $this->tweet->enable_debug(TRUE); //activate debug


            if(! $this->tweet->logged_in())
            {
                $this->tweet->set_callback(site_url('login/auth'));
                $this->tweet->login();
            }
            else
            {

                redirect('profile');
            }

        }

        //authentication function
        function auth()
        {
            $tokens = $this->tweet->get_tokens();
            $user = $this->tweet->call('get', 'account/verify_credentials');

            $data = array(
                'user_id' => $user->id_str,
                'username' => $user->screen_name,
                'oauth_token' => $tokens['oauth_token'],
                'oauth_token_secret' => $tokens['oauth_token_secret'],
                'level' => 2,
                'join_date' => date("Y-m-d H:i:s")
            );


            //jika user sudah autentikasi, bikinkan session
            if($this->login_model->auth($data) == TRUE)
            {
                $session_data = array(
                    'user_id' => $data['user_id'],
                    'username' => $data['username'],
                    'is_logged_in' => TRUE 
                );
                $this->session->set_userdata($session_data);
                redirect('profile');
            }

        }

    }
profile.php构造函数

Default.js用于更新时间线的javascript

这就是密码。请帮帮我。毕竟,我真的很感谢你们的评论和解释。谢谢

注意:如果我的英语语法不好,我很抱歉:-

您正在拨打statuses/home\u timeline,这是一个未经验证的电话。未经验证呼叫的速率限制为每小时150个请求

这可以解释为什么您在测试的高峰期看到问题

按照您的设置方式,您将在50分钟或更短的时间后过期您的利率限制

我建议把时间间隔改大一点,30秒就可以了。这样,您将在费率限制下每小时发出120个请求。

您正在拨打statuses/home\u timeline电话,这是一个未经验证的电话。未经验证呼叫的速率限制为每小时150个请求

这可以解释为什么您在测试的高峰期看到问题

按照您的设置方式,您将在50分钟或更短的时间后过期您的利率限制


我建议把时间间隔改大一点,30秒就可以了。这样,您将在速率限制下每小时发出120个请求。

我注意到发生了错误,大约每30分钟自动修复一次。。但是,我不确定。这真的是随机的。我尝试登录并发布一些tweet,这很好,但30分钟后错误再次出现:-我注意到错误发生,大约每30分钟自动修复一次。。但是,我不确定。这真的是随机的。我试图登录并发一些tweet,这很好,但30分钟后错误再次出现:-哇,非常感谢。现在,我将请求间隔限制为30秒,不再看到错误。根据您的计算,我将安全地设置为30秒,但仍有30多个访问请求。但是,坦率地说,我仍然担心如果我的用户在一小时内发出超过30个请求会怎么样?我也会犯同样的错误,对吗?我已经阅读了文档,说明POST请求不受限制,但我的应用程序的工作流应该在用户发布任何帖子后立即刷新时间线,以便他/她能够实时看到自己的更新。有什么建议吗?谢谢:-另外,我在响应标题中发现了类似于X-RateLimit-Limit:20000和X-RateLimit-Remaining:19999的内容。那到底是什么意思?我在文档中发现,基于特性的速率限制与API-REST限制一起应用,如果任一限制用尽,请求将失败。如果超级强大的REST-API限制仍然适用于某些功能,为什么它们需要这个特殊限制?这没有道理,对吧?你能给我解释一下这到底是什么吗?谢谢:-好的,我会告诉你我是否能得到+1:。总之,您集成了CI库。我有一个WebApp,它可以进行不同数量的调用,所以我需要像你描述的那样,在JS端发出请求,并将请求转发给POST。只要您从Javascript进行实际的API调用,您的服务器将不会受到限制,您的用户将:。我听说20k限制适用于测试中的应用程序&在特别白名单上。嘿,我试图给你+1,但我现在没有足够的声誉来这么做。所以,对不起:-哦,是的,看起来你需要更多的代表。没关系,我半开玩笑的。德国劳埃德船级社的项目。哇,非常感谢你。现在,我将请求间隔限制为30秒,不再看到错误。根据您的计算,我将安全地设置为30秒,但仍有30多个访问请求。但是,坦率地说,我仍然担心如果我的用户在一小时内发出超过30个请求会怎么样?我也会犯同样的错误,对吗?
我已经阅读了文档,说明POST请求不受限制,但我的应用程序的工作流应该在用户发布任何帖子后立即刷新时间线,以便他/她能够实时看到自己的更新。有什么建议吗?谢谢:-另外,我在响应标题中发现了类似于X-RateLimit-Limit:20000和X-RateLimit-Remaining:19999的内容。那到底是什么意思?我在文档中发现,基于特性的速率限制与API-REST限制一起应用,如果任一限制用尽,请求将失败。如果超级强大的REST-API限制仍然适用于某些功能,为什么它们需要这个特殊限制?这没有道理,对吧?你能给我解释一下这到底是什么吗?谢谢:-好的,我会告诉你我是否能得到+1:。总之,您集成了CI库。我有一个WebApp,它可以进行不同数量的调用,所以我需要像你描述的那样,在JS端发出请求,并将请求转发给POST。只要您从Javascript进行实际的API调用,您的服务器将不会受到限制,您的用户将:。我听说20k限制适用于测试中的应用程序&在特别白名单上。嘿,我试图给你+1,但我现在没有足够的声誉来这么做。所以,对不起:-哦,是的,看起来你需要更多的代表。没关系,我半开玩笑的。德国劳埃德船级社负责该项目。
<?php

class Profile extends CI_Controller
{
    function __construct()
    {
        parent::__construct();

        $this->load->library('tweet');
        $this->load->model('user_model');

    }

    function index()
    {
        if($this->session->userdata('is_logged_in') == TRUE)
        {
            //jika user telah login tampilkan halaman profile

            //load data dari table user
            $data['biography'] = $this->user_model->get_user_by_id($this->session->userdata('user_id'));

            //load data user dari twitter
            $data['user'] = $this->tweet->call('get', 'users/show', array('id' => $this->session->userdata('user_id')));

            $data['main_content'] = 'private_profile_view';
            $this->load->view('includes/template', $data);
        }
        else
        {
            //jika belum redirect ke halaman welcome
            redirect('welcome');
        }
    }

    function get_home_timeline()
    {
        $timeline = $this->tweet->call('get', 'statuses/home_timeline');
        echo json_encode($timeline);

    }

    function get_user_timeline()
    {
        $timeline = $this->tweet->call('get', 'statuses/user_timeline', array('screen_name' => $this->session->userdata('username')));
        echo json_encode($timeline);
    }

    function get_mentions_timeline()
    {
        $timeline = $this->tweet->call('get', 'statuses/mentions');
        echo json_encode($timeline);
    }

    function logout()
    {
        $this->session->sess_destroy();
        redirect('welcome');
    }
}

/** end of profile **/
$(document).ready(function(){

                //bikin tampilan timeline jadi tab
                $(function() {
                                $( "#timeline" ).tabs();
                            });


                //home diupdate setiap 20 detik
                update_timeline('profile/get_home_timeline', '#home_timeline ul');
                var updateInterval = setInterval(function() {
                    update_timeline('profile/get_home_timeline', '#home_timeline ul');
                },20*1000);   

                //user timeline diupdate pada saat new status di submit
                update_timeline('profile/get_user_timeline', '#user_timeline ul');

                //mention diupdate setiap 1 menit
                update_timeline('profile/get_mentions_timeline', '#mentions_timeline ul');
                var updateInterval = setInterval(function() {
                    update_timeline('profile/get_mentions_timeline', '#mentions_timeline ul');
                },60*1000);


});

function update_timeline(method_url, target)
{
        //get home timeline
        $.ajax({
          type: 'GET',
          url: method_url,
          dataType: 'json',
          cache: false,
          success: function(result) {
            $(target).empty();
            for(i=0;i<10;i++){
                $(target).append('<li><article><img src="'+ result[i]['user']['profile_image_url'] +'"><a href="">'+ result[i]['user']['screen_name'] + '</a>'+ linkify(result[i]['text']) +'</li></article>');
            }
          }
        });
}


function linkify(data)
{
    var param = data.replace(/(^|\s)@(\w+)/g, '$1@<a href="http://www.twitter.com/$2" target="_blank">$2</a>');
    var param2 = param.replace(/(^|\s)#(\w+)/g, '$1#<a href="http://search.twitter.com/search?q=%23$2" target="_blank">$2</a>');
    return param2;      
}