I'm making Web Application for Extracting data from Youtube Videos then analyze it and find the best keywords
All I need is finding the best keywords from Keywords Planner of Google depends on the volume search i did extract the youtube video data, I followed this library https://github.com/googleads/googleads-php-lib
I have Clientid, Clientsecret and Developer Token After I installed the library successfully and tried to test GetCampaigns() class, I get this Error
Fatal error: Uncaught InvalidArgumentException: All of 'clientId', 'clientSecret', and 'refreshToken' must be set when using installed/web application flow. in C:\xampp\htdocs\seosystem\googleads-php-lib\src\Google\AdsApi\Common\OAuth2TokenBuilder.php:225 Stack trace: #0 C:\xampp\htdocs\seosystem\googleads-php-lib\src\Google\AdsApi\Common\OAuth2TokenBuilder.php(173): Google\AdsApi\Common\OAuth2TokenBuilder->validate() #1 C:\xampp\htdocs\seosystem\googleads-php-lib\examples\AdWords\v201809\BasicOperations\GetCampaigns.php(81): Google\AdsApi\Common\OAuth2TokenBuilder->build() #2 C:\xampp\htdocs\seosystem\googleads-php-lib\examples\AdWords\v201809\BasicOperations\GetCampaigns.php(90): Google\AdsApi\Examples\AdWords\v201809\BasicOperations\GetCampaigns::main() #3 C:\xampp\htdocs\seosystem\index.php(4): require_once('C:\\xampp\\htdocs...') #4 {main} thrown in C:\xampp\htdocs\seosystem\googleads-php-lib\src\Google\AdsApi\Common\OAuth2TokenBuilder.php on line 225
I went to OAuth2TokenBuilder and replaced and still get the same Error Message no worries i'll change the key later
private $clientId ='847786194979-n0udvkdi41r9fd5arlma6gadlm2kueot.apps.googleusercontent.com'; private $clientSecret ='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'; private $refreshToken ='Af8L57gifnGl1b4M324_Tg';
and this's the whole file
<?php /** * Copyright 2016 Google Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace Google\AdsApi\Common; use Google\Auth\Credentials\ServiceAccountCredentials; use Google\Auth\Credentials\UserRefreshCredentials; use InvalidArgumentException; /** * Builds OAuth2 access token fetchers. * * @see FetchAuthTokenInterface */ final class OAuth2TokenBuilder implements AdsBuilder{ private $configurationLoader; private $jsonKeyFilePath; private $scopes; private $impersonatedEmail; private $clientId ='847786194979-n0udvkdi41r9fd5arlma6gadlm2kueot.apps.googleusercontent.com'; private $clientSecret ='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'; private $refreshToken ='Af8L57gifnGl1b4M324_Tg'; public function __construct(){ $this->configurationLoader = new ConfigurationLoader(); } /** * Reads configuration settings from the specified filepath. The filepath is * optional, and if omitted, it will look for the default configuration * filename in the home directory of the user running PHP. * * @see AdsBuilder::DEFAULT_CONFIGURATION_FILENAME * * @param string $path the filepath * @return OAuth2TokenBuilder this builder populated from the configuration * @throws InvalidArgumentException if the configuration file could not be * found */ public function fromFile($path = null){ if ($path === null) { $path = self::DEFAULT_CONFIGURATION_FILENAME; } return $this->from($this->configurationLoader->fromFile($path)); } /** * @see AdsBuilder::from() */ public function from(Configuration $configuration){ $this->jsonKeyFilePath = $configuration->getConfiguration('jsonKeyFilePath', 'OAUTH2'); $this->scopes = $configuration->getConfiguration('scopes', 'OAUTH2'); $this->impersonatedEmail = $configuration->getConfiguration('impersonatedEmail', 'OAUTH2'); $this->clientId = $configuration->getConfiguration('clientId', 'OAUTH2'); $this->clientSecret = $configuration->getConfiguration('clientSecret', 'OAUTH2'); $this->refreshToken = $configuration->getConfiguration('refreshToken', 'OAUTH2'); return $this; } /** * Includes an absolute path to an OAuth2 JSON key file when using service * account flow. Required and only applicable when using service account flow. * * @param string|null $jsonKeyFilePath * @return OAuth2TokenBuilder this builder */ public function withJsonKeyFilePath($jsonKeyFilePath){ $this->jsonKeyFilePath = $jsonKeyFilePath; return $this; } /** * Includes OAuth2 scopes. Required and only applicable when using service * account flow. * * @param string|null $scopes a space-delimited list of scopes * @return OAuth2TokenBuilder this builder */ public function withScopes($scopes){ $this->scopes = $scopes; return $this; } /** * Includes an email of account to impersonate when using service account * flow. Optional and only applicable when using service account flow. * * @param string|null $impersonatedEmail * @return OAuth2TokenBuilder this builder */ public function withImpersonatedEmail($impersonatedEmail){ $this->impersonatedEmail = $impersonatedEmail; return $this; } /** * Includes an OAuth2 client ID. Required when using installed application or * web application flow. * * @param string|null $clientId * @return OAuth2TokenBuilder this builder */ public function withClientId($clientId){ $this->clientId = $clientId; return $this; } /** * Includes an OAuth2 client secret. Required when using installed application * or web application flow. * * @param string|null $clientSecret * @return OAuth2TokenBuilder this builder */ public function withClientSecret($clientSecret){ $this->clientSecret = $clientSecret; return $this; } /** * Includes an OAuth2 refresh token. Required when using installed application * or web application flow. * * @param string|null $refreshToken * @return OAuth2TokenBuilder this builder */ public function withRefreshToken($refreshToken){ $this->refreshToken = $refreshToken; return $this; } /** * @see AdsBuilder::build() */ public function build(){ $this->defaultOptionals(); $this->validate(); if ($this->jsonKeyFilePath !== null) { return new ServiceAccountCredentials( $this->scopes, $this->jsonKeyFilePath, $this->impersonatedEmail ); } else { return new UserRefreshCredentials( null, [ 'client_id' => $this->clientId, 'client_secret' => $this->clientSecret, 'refresh_token' => $this->refreshToken ] ); } } /** * @see AdsBuilder::defaultOptionals() */ public function defaultOptionals(){ // Nothing to default for this builder. } /** * @see AdsBuilder::validate() */ public function validate(){ if (($this->jsonKeyFilePath !== null || $this->scopes !== null) && ($this->clientId !== null || $this->clientSecret !== null || $this->refreshToken !== null)) { throw new InvalidArgumentException( 'Cannot have both service account ' . 'flow and installed/web application flow credential values set.' ); } if ($this->jsonKeyFilePath !== null || $this->scopes !== null) { if ($this->jsonKeyFilePath === null || $this->scopes === null) { throw new InvalidArgumentException( 'Both \'jsonKeyFilePath\' and ' . '\'scopes\' must be set when using service account flow.' ); } } elseif ($this->clientId === null || $this->clientSecret === null || $this->refreshToken === null) { throw new InvalidArgumentException( 'All of \'clientId\', ' . '\'clientSecret\', and \'refreshToken\' must be set when using ' . 'installed/web application flow.' ); } } /** * Gets the JSON key file path. * * @return string|null */ public function getJsonKeyFilePath(){ return $this->jsonKeyFilePath; } /** * Gets the scopes. * * @return string|null */ public function getScopes(){ return $this->scopes; } /** * Gets the impersonated email. * * @return string|null */ public function getImpersonatedEmail(){ return $this->impersonatedEmail; } /** * Gets the client ID. * * @return string|null */ public function getClientId(){ return $this->clientId; } /** * Gets the client secret. * * @return string|null */ public function getClientSecret(){ return $this->clientSecret; } /** * Gets the refresh token. * * @return string|null */ public function getRefreshToken(){ return $this->refreshToken; } }