2016-01-22 2 views
0

Я использую codeigniter 3.x и php 5.5+. Я пытался заставить это работать без везения. Я хочу вызвать методы внутри класса контроллера youtube, который я создал, что будет делать разные вещи на основе общения с google или youtube. Проблема в том, что Google_Client я верю, или это с возможностью хранения переменной $client, возможно, поэтому вы можете использовать ее во второй функции. Когда я пытаюсь вызвать это из другой функции, он дает ошибку, не требующую входа в систему, даже если пользователь уже выполнил проверку Google. Как я могу сказать свою вторую функцию, что пользователь уже выполнил авторизацию и получил токен. Кажется, что все работает очень хорошо, когда обе функции находятся в одной и той же функции (я имею в виду только одну функцию). Также я не хочу проверять пользователя для каждой функции или метода, который я выполняю. Таким образом, после первой функции будет сделано, я попадаю с маркером доступа в URL второй функции, но затем я получаю сообщение об ошибке Message: Error calling GET https://www.googleapis.com/youtube/analytics/v1/reports?ids=channel%3D%3DMINE&start-date=2014-01-01&end-date=2016-01-20&metrics=views&filters=video%3D%3DpC900o6JaMc: (401) Login RequiredGoogle API с PHP, вызывающим объект google_client

Первая функция в контроллере Youtubeverify:

class Youtubeverify extends CI_Controller{ 


public function youtube_consent(){ 


$this->load->library('google'); 

$OAUTH2_CLIENT_ID = 'MY_ID'; 
$OAUTH2_CLIENT_SECRET = 'MY_KEY'; 

$client = new Google_Client(); 
$client->setClientId($OAUTH2_CLIENT_ID); 
$client->setClientSecret($OAUTH2_CLIENT_SECRET); 

$client->setScopes(array('https://www.googleapis.com/auth/yt-analytics-monetary.readonly','https://www.googleapis.com/auth/youtube.readonly')); 
$redirect = filter_var('http://' . $_SERVER['HTTP_HOST'] . "/ci/youtubeverify/display_report", 
FILTER_SANITIZE_URL); 
$client->setRedirectUri($redirect); 

$youtubeReporting = new Google_Service_YouTubeReporting($client); 
if (isset($_REQUEST['logout'])) { 
$this->session->unset_userdata('youtube_token'); 
} 

if (isset($_GET['code'])) { 
if (strval($_SESSION['state']) !== strval($_GET['state'])) { 
die('The session state did not match.'); 
} 

$client->authenticate($_GET['code']); 
$youtube_token = $client->getAccessToken(); 
//trying to store the access token in a session 
$newdata = array('youtube_token'=>$youtube_token); 

$this->session->set_userdata($newdata); 

header('Location: ' . $redirect); 
} 

if ($this->session->userdata('youtube_token')) { 
$client->setAccessToken($this->session->userdata('youtube_token')); 
} 

if ($client->getAccessToken()) { 

$client->getAccessToken(); 
} 
else { 
    // If the user hasn't authorized the app, initiate the OAuth flow 
    $state = mt_rand(); 
    $client->setState($state); 
    $_SESSION['state'] = $state; 

    $authUrl = $client->createAuthUrl(); 

redirect($authUrl); 
} 
} 

Вторая функция контроллер Youtubeverify:

public function display_report(){ 

$this->load->library('google'); 

$client = new Google_Client(); 

$client->getAccessToken(); 

$youtubeAnalytics = new Google_Service_YouTubeAnalytics($client); 

$id = 'channel==MINE'; 
$start_date = '2014-01-01'; 
$end_date = '2016-01-20'; 
$optparams = array('filters' => 'video==*********'); 

$metrics = array('views'); 

$api_response = $metrics; 


$api = $youtubeAnalytics->reports->query($id, $start_date, $end_date, $metric,$optparams); 

$data['api_response'] = $api_response['views']; 
$this->load->view('layouts/mainlay',$data); 
} 

ответ

1

Я никогда раньше не работал с API YouTube, но вот шаг в правильном направлении.

class Youtubeverify extends CI_Controller { 
    // Google API Keys 
    const CLIENT_ID   = ''; 
    const CLIENT_SECRET  = ''; 

    // We'll store the client in a class property so we can access it between methods. 
    protected $Client; 

    public function __construct() { 
     parent::__construct(); 
     // setup google client. 
     $this->Client = new Google_Client(); 
     $this->Client->setClientId(self::CLIENT_ID); 
     $this->Client->setClientSecret(self::CLIENT_SECRET); 
     // we call the authenication method for each request 
     $this->_authenticate_client(); 
    } 

    // Authentication method 
    protected function _authenticate_client() { 
     //if we already have a token then we just set it in the client 
     //without going through authentication process again 
     if($accessToken = $this->session->userdata('youtube_token')) { 
      $this->Client->setAccessToken($accessToken); 
     }else{ 
      // preform authentication as usual with a redirect ...etc 
     } 
    } 
} 
+0

Спасибо, что очень помогло мне начать работу и сейчас работает! было бы лучше поставить модель или было бы неплохо оставить ее в контроллере? – zeidanbm

+1

@zeidanbm Это прекрасно, оставляя это в контроллере. Поскольку мы префиксировали его подчёркиванием, это защищенный метод, поэтому он не может быть доступен напрямую. Он достаточно мал, чтобы держать ваш контроллер светлым. Если вам нужна эта модель, вы можете отправить весь объект '' $ this-> Client'' в метод модели. – ahmad

Смежные вопросы