Я использую 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 Required
Google 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);
}
Спасибо, что очень помогло мне начать работу и сейчас работает! было бы лучше поставить модель или было бы неплохо оставить ее в контроллере? – zeidanbm
@zeidanbm Это прекрасно, оставляя это в контроллере. Поскольку мы префиксировали его подчёркиванием, это защищенный метод, поэтому он не может быть доступен напрямую. Он достаточно мал, чтобы держать ваш контроллер светлым. Если вам нужна эта модель, вы можете отправить весь объект '' $ this-> Client'' в метод модели. – ahmad