mirror of
https://github.com/towfiqi/serpbear
synced 2025-06-26 18:15:54 +00:00
chore: renames Google Adwords to Google Ads
This commit is contained in:
parent
252ae9aa84
commit
d3938007a9
@ -83,7 +83,7 @@ const DomainHeader = (
|
|||||||
size={14}
|
size={14}
|
||||||
color="#aaa"
|
color="#aaa"
|
||||||
classes="ml-2 hidden lg:inline-block"
|
classes="ml-2 hidden lg:inline-block"
|
||||||
title='Get Keyword Ideas for this domain from Google Adwords'
|
title='Get Keyword Ideas for this domain from Google Ads'
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
</Link>
|
</Link>
|
||||||
|
@ -229,7 +229,7 @@ const IdeasKeywordsTable = ({
|
|||||||
)}
|
)}
|
||||||
{!isAdwordsIntegrated && (
|
{!isAdwordsIntegrated && (
|
||||||
<p className=' p-9 pt-[10%] text-center text-gray-500'>
|
<p className=' p-9 pt-[10%] text-center text-gray-500'>
|
||||||
Google Adwords has not been Integrated yet. Please follow <a className='text-indigo-600 underline' href='https://docs.serpbear.com/miscellaneous/integrate-google-adwords' target="_blank" rel='noreferrer'>These Steps</a> to integrate Google Adwords.
|
Google Ads has not been Integrated yet. Please follow <a className='text-indigo-600 underline' href='https://docs.serpbear.com/miscellaneous/integrate-google-ads' target="_blank" rel='noreferrer'>These Steps</a> to integrate Google Ads.
|
||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
@ -127,7 +127,7 @@ const KeywordIdeasUpdater = ({ onUpdate, settings, domain, searchConsoleConnecte
|
|||||||
<button
|
<button
|
||||||
className={`w-full py-2 px-5 mt-2 rounded bg-blue-700 text-white
|
className={`w-full py-2 px-5 mt-2 rounded bg-blue-700 text-white
|
||||||
font-semibold ${!adwordsConnected ? ' cursor-not-allowed opacity-40' : 'cursor-pointer'}`}
|
font-semibold ${!adwordsConnected ? ' cursor-not-allowed opacity-40' : 'cursor-pointer'}`}
|
||||||
title={!adwordsConnected ? 'Please Connect Adwords account to generate Keyword Ideas..' : ''}
|
title={!adwordsConnected ? 'Please Connect Ads account to generate Keyword Ideas..' : ''}
|
||||||
onClick={() => !isUpdatingIdeas && adwordsConnected && reloadKeywordIdeas()}>
|
onClick={() => !isUpdatingIdeas && adwordsConnected && reloadKeywordIdeas()}>
|
||||||
<Icon type={isUpdatingIdeas ? 'loading' : 'reload'} size={12} /> {isUpdatingIdeas ? 'Loading....' : 'Load Keyword Ideas'}
|
<Icon type={isUpdatingIdeas ? 'loading' : 'reload'} size={12} /> {isUpdatingIdeas ? 'Loading....' : 'Load Keyword Ideas'}
|
||||||
</button>
|
</button>
|
||||||
|
@ -86,7 +86,7 @@ const AdWordsSettings = ({ settings, settingsError, updateSettings, performUpdat
|
|||||||
</div>
|
</div>
|
||||||
<div className='mt-4 border-t mb-4 border-b border-gray-100 pt-4 pb-0 relative'>
|
<div className='mt-4 border-t mb-4 border-b border-gray-100 pt-4 pb-0 relative'>
|
||||||
{!cloudProjectIntegrated && <div className=' absolute w-full h-full z-50' />}
|
{!cloudProjectIntegrated && <div className=' absolute w-full h-full z-50' />}
|
||||||
<h4 className=' mb-3 font-semibold text-blue-700'>Step 2: Connect Google AdWords</h4>
|
<h4 className=' mb-3 font-semibold text-blue-700'>Step 2: Connect Google Ads</h4>
|
||||||
<div className={!cloudProjectIntegrated ? 'opacity-40' : ''}>
|
<div className={!cloudProjectIntegrated ? 'opacity-40' : ''}>
|
||||||
<div className="settings__section__input mb-4 flex justify-between items-center w-full">
|
<div className="settings__section__input mb-4 flex justify-between items-center w-full">
|
||||||
<SecretField
|
<SecretField
|
||||||
@ -98,7 +98,7 @@ const AdWordsSettings = ({ settings, settingsError, updateSettings, performUpdat
|
|||||||
</div>
|
</div>
|
||||||
<div className="settings__section__input mb-4 flex justify-between items-center w-full">
|
<div className="settings__section__input mb-4 flex justify-between items-center w-full">
|
||||||
<SecretField
|
<SecretField
|
||||||
label='AdWords Test Account ID'
|
label='Test Account ID'
|
||||||
onChange={(account_id:string) => updateSettings('adwords_account_id', account_id)}
|
onChange={(account_id:string) => updateSettings('adwords_account_id', account_id)}
|
||||||
value={adwords_account_id}
|
value={adwords_account_id}
|
||||||
placeholder='590-948-9101'
|
placeholder='590-948-9101'
|
||||||
@ -112,7 +112,7 @@ const AdWordsSettings = ({ settings, settingsError, updateSettings, performUpdat
|
|||||||
title={hasAllCredentials ? '' : 'Insert All the data in the above fields to Test the Integration'}
|
title={hasAllCredentials ? '' : 'Insert All the data in the above fields to Test the Integration'}
|
||||||
onClick={testIntegration}>
|
onClick={testIntegration}>
|
||||||
{isTesting && <Icon type='loading' />}
|
{isTesting && <Icon type='loading' />}
|
||||||
<Icon type='adwords' size={14} /> Test AdWords Integration
|
<Icon type='adwords' size={14} /> Test Google Ads Integration
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -130,13 +130,13 @@ const AdWordsSettings = ({ settings, settingsError, updateSettings, performUpdat
|
|||||||
${hasAllCredentials ? 'cursor-pointer' : 'cursor-not-allowed opacity-40'}
|
${hasAllCredentials ? 'cursor-pointer' : 'cursor-not-allowed opacity-40'}
|
||||||
hover:bg-blue-700 hover:text-white transition`}
|
hover:bg-blue-700 hover:text-white transition`}
|
||||||
onClick={updateVolumeData}>
|
onClick={updateVolumeData}>
|
||||||
<Icon type={isUpdatingVolume ? 'loading' : 'reload'} size={isUpdatingVolume ? 16 : 12} /> Update Keywords Volume
|
<Icon type={isUpdatingVolume ? 'loading' : 'reload'} size={isUpdatingVolume ? 16 : 12} /> Update Keywords Volume Data
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p className='mb-4 text-xs'>
|
<p className='mb-4 text-xs'>
|
||||||
<a target='_blank' rel='noreferrer' href='https://docs.serpbear.com/keyword-research' className=' underline text-blue-600'>Integrate Google Adwords</a> to get Keyword Ideas & Search Volume.{' '}
|
Relevant Documentation: <a target='_blank' rel='noreferrer' href='https://docs.serpbear.com/miscellaneous/integrate-google-ads' className=' underline text-blue-600'>Integrate Google Ads</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -28,7 +28,7 @@ const IntegrationSettings = ({ settings, settingsError, updateSettings, performU
|
|||||||
<li
|
<li
|
||||||
className={`${tabStyle} ${currentTab === 'adwords' ? ' bg-blue-50 text-blue-600' : ''}`}
|
className={`${tabStyle} ${currentTab === 'adwords' ? ' bg-blue-50 text-blue-600' : ''}`}
|
||||||
onClick={() => setCurrentTab('adwords')}>
|
onClick={() => setCurrentTab('adwords')}>
|
||||||
<Icon type='adwords' size={14} /> Adwords
|
<Icon type='adwords' size={14} /> Google Ads
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -43,31 +43,31 @@ const getAdwordsRefreshToken = async (req: NextApiRequest, res: NextApiResponse<
|
|||||||
if (r?.tokens?.refresh_token) {
|
if (r?.tokens?.refresh_token) {
|
||||||
const adwords_refresh_token = cryptr.encrypt(r.tokens.refresh_token);
|
const adwords_refresh_token = cryptr.encrypt(r.tokens.refresh_token);
|
||||||
await writeFile(`${process.cwd()}/data/settings.json`, JSON.stringify({ ...settings, adwords_refresh_token }), { encoding: 'utf-8' });
|
await writeFile(`${process.cwd()}/data/settings.json`, JSON.stringify({ ...settings, adwords_refresh_token }), { encoding: 'utf-8' });
|
||||||
return res.status(200).send('Adwords Intergrated Successfully! You can close this window.');
|
return res.status(200).send('Google Ads Intergrated Successfully! You can close this window.');
|
||||||
}
|
}
|
||||||
return res.status(200).send('Error Getting the Adwords Refresh Token. Please Try Again!');
|
return res.status(200).send('Error Getting the Google Ads Refresh Token. Please Try Again!');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('[Error] Getting Adwords Refresh Token!');
|
console.log('[Error] Getting Google Ads Refresh Token!');
|
||||||
console.log('error :', error);
|
console.log('error :', error);
|
||||||
return res.status(200).send('Error Saving the Adwords Refresh Token. Please Try Again!');
|
return res.status(200).send('Error Saving the Google Ads Refresh Token. Please Try Again!');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return res.status(200).send('No Code Provided By Google. Please Try Again!');
|
return res.status(200).send('No Code Provided By Google. Please Try Again!');
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('[ERROR] CRON Refreshing Keywords: ', error);
|
console.log('[ERROR] CRON Refreshing Keywords: ', error);
|
||||||
return res.status(400).send('Error Getting Adwords Refresh Token. Please Try Again!');
|
return res.status(400).send('Error Getting Google Ads Refresh Token. Please Try Again!');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const validateAdwordsIntegration = async (req: NextApiRequest, res: NextApiResponse<adwordsValidateResp>) => {
|
const validateAdwordsIntegration = async (req: NextApiRequest, res: NextApiResponse<adwordsValidateResp>) => {
|
||||||
const errMsg = 'Error Validating Adwords Integration. Please make sure your provided data are correct!';
|
const errMsg = 'Error Validating Google Ads Integration. Please make sure your provided data are correct!';
|
||||||
const { developer_token, account_id } = req.body;
|
const { developer_token, account_id } = req.body;
|
||||||
if (!developer_token || !account_id) {
|
if (!developer_token || !account_id) {
|
||||||
return res.status(400).json({ valid: false, error: 'Please Provide the Adwords Developer Token and Test Account ID' });
|
return res.status(400).json({ valid: false, error: 'Please Provide the Google Ads Developer Token and Test Account ID' });
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// Save the Adwords Developer Token & Adwords Test Account ID in App Settings
|
// Save the Adwords Developer Token & Google Ads Test Account ID in App Settings
|
||||||
const settingsRaw = await readFile(`${process.cwd()}/data/settings.json`, { encoding: 'utf-8' });
|
const settingsRaw = await readFile(`${process.cwd()}/data/settings.json`, { encoding: 'utf-8' });
|
||||||
const settings: SettingsType = settingsRaw ? JSON.parse(settingsRaw) : {};
|
const settings: SettingsType = settingsRaw ? JSON.parse(settingsRaw) : {};
|
||||||
const cryptr = new Cryptr(process.env.SECRET as string);
|
const cryptr = new Cryptr(process.env.SECRET as string);
|
||||||
@ -76,7 +76,7 @@ const validateAdwordsIntegration = async (req: NextApiRequest, res: NextApiRespo
|
|||||||
const securedSettings = { ...settings, adwords_developer_token, adwords_account_id };
|
const securedSettings = { ...settings, adwords_developer_token, adwords_account_id };
|
||||||
await writeFile(`${process.cwd()}/data/settings.json`, JSON.stringify(securedSettings), { encoding: 'utf-8' });
|
await writeFile(`${process.cwd()}/data/settings.json`, JSON.stringify(securedSettings), { encoding: 'utf-8' });
|
||||||
|
|
||||||
// Make a test Request to Google Adwords
|
// Make a test Request to Google Ads
|
||||||
const adwordsCreds = await getAdwordsCredentials();
|
const adwordsCreds = await getAdwordsCredentials();
|
||||||
const { client_id, client_secret, refresh_token } = adwordsCreds || {};
|
const { client_id, client_secret, refresh_token } = adwordsCreds || {};
|
||||||
if (adwordsCreds && client_id && client_secret && developer_token && account_id && refresh_token) {
|
if (adwordsCreds && client_id && client_secret && developer_token && account_id && refresh_token) {
|
||||||
@ -91,7 +91,7 @@ const validateAdwordsIntegration = async (req: NextApiRequest, res: NextApiRespo
|
|||||||
}
|
}
|
||||||
return res.status(400).json({ valid: false, error: errMsg });
|
return res.status(400).json({ valid: false, error: errMsg });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('[ERROR] Validating AdWords Integration: ', error);
|
console.log('[ERROR] Validating Google Ads Integration: ', error);
|
||||||
return res.status(400).json({ valid: false, error: errMsg });
|
return res.status(400).json({ valid: false, error: errMsg });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -55,7 +55,7 @@ const updatekeywordVolume = async (req: NextApiRequest, res: NextApiResponse<Key
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return res.status(400).json({ error: 'Error Fetching Keywords Volume Data from Google Adwords' });
|
return res.status(400).json({ error: 'Error Fetching Keywords Volume Data from Google Ads' });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ const DiscoverPage: NextPage = () => {
|
|||||||
</CSSTransition>
|
</CSSTransition>
|
||||||
|
|
||||||
{showUpdateModal && activDomain?.domain && (
|
{showUpdateModal && activDomain?.domain && (
|
||||||
<Modal closeModal={() => setShowUpdateModal(false) } title={'Load Keyword Ideas from Google Adwords'} verticalCenter={true}>
|
<Modal closeModal={() => setShowUpdateModal(false) } title={'Load Keyword Ideas from Google Ads'} verticalCenter={true}>
|
||||||
<KeywordIdeasUpdater
|
<KeywordIdeasUpdater
|
||||||
domain={activDomain}
|
domain={activDomain}
|
||||||
onUpdate={() => setShowUpdateModal(false)}
|
onUpdate={() => setShowUpdateModal(false)}
|
||||||
|
@ -108,7 +108,7 @@ const Research: NextPage = () => {
|
|||||||
<button
|
<button
|
||||||
className={`w-full py-2 px-5 mt-2 rounded bg-blue-700 text-white
|
className={`w-full py-2 px-5 mt-2 rounded bg-blue-700 text-white
|
||||||
font-semibold ${!adwordsConnected ? ' cursor-not-allowed opacity-40' : 'cursor-pointer'}`}
|
font-semibold ${!adwordsConnected ? ' cursor-not-allowed opacity-40' : 'cursor-pointer'}`}
|
||||||
title={!adwordsConnected ? 'Please Connect Adwords account to generate Keyword Ideas..' : ''}
|
title={!adwordsConnected ? 'Please Connect Google Ads account to generate Keyword Ideas..' : ''}
|
||||||
onClick={() => !isUpdatingIdeas && adwordsConnected && reloadKeywordIdeas()}>
|
onClick={() => !isUpdatingIdeas && adwordsConnected && reloadKeywordIdeas()}>
|
||||||
<Icon type={isUpdatingIdeas ? 'loading' : 'download'} size={14} /> {isUpdatingIdeas ? 'Loading....' : 'Load Ideas'}
|
<Icon type={isUpdatingIdeas ? 'loading' : 'download'} size={14} /> {isUpdatingIdeas ? 'Loading....' : 'Load Ideas'}
|
||||||
</button>
|
</button>
|
||||||
|
@ -14,14 +14,14 @@ export function useTestAdwordsIntegration(onSuccess?: Function) {
|
|||||||
}, {
|
}, {
|
||||||
onSuccess: async (data) => {
|
onSuccess: async (data) => {
|
||||||
console.log('Ideas Added:', data);
|
console.log('Ideas Added:', data);
|
||||||
toast('Google Adwords has been integrated successfully!', { icon: '✔️' });
|
toast('Google Ads has been integrated successfully!', { icon: '✔️' });
|
||||||
if (onSuccess) {
|
if (onSuccess) {
|
||||||
onSuccess(false);
|
onSuccess(false);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onError: (error) => {
|
onError: (error) => {
|
||||||
console.log('Error Loading Keyword Ideas!!!', error);
|
console.log('Error Loading Keyword Ideas!!!', error);
|
||||||
toast('Failed to connect to Google Adwords. Please make sure you have provided the correct API info.', { icon: '⚠️' });
|
toast('Failed to connect to Google Ads. Please make sure you have provided the correct API info.', { icon: '⚠️' });
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ export type KeywordIdeasDatabase = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function `getAdwordsCredentials` reads and decrypts Adwords credentials from the App settings file.
|
* The function `getAdwordsCredentials` reads and decrypts Google Ads credentials from the App settings file.
|
||||||
* @returns {Promise<false | AdwordsCredentials>} returns either a decrypted `AdwordsCredentials` object if the settings are successfully decrypted,
|
* @returns {Promise<false | AdwordsCredentials>} returns either a decrypted `AdwordsCredentials` object if the settings are successfully decrypted,
|
||||||
* or `false` if the decryption process fails.
|
* or `false` if the decryption process fails.
|
||||||
*/
|
*/
|
||||||
@ -86,7 +86,7 @@ export const getAdwordsCredentials = async (): Promise<false | AdwordsCredential
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* retrieves an access token using Adwords credentials for Google API authentication.
|
* retrieves an access token using Google Ads credentials for Google API authentication.
|
||||||
* @param {AdwordsCredentials} credentials - The `credentials` to use to generate the access token,
|
* @param {AdwordsCredentials} credentials - The `credentials` to use to generate the access token,
|
||||||
* @returns {Promise<string>} the fetched access token or an empty string if failed.
|
* @returns {Promise<string>} the fetched access token or an empty string if failed.
|
||||||
*/
|
*/
|
||||||
@ -107,15 +107,15 @@ export const getAdwordsAccessToken = async (credentials:AdwordsCredentials) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function `getAdwordsKeywordIdeas` retrieves keyword ideas from Google AdWords API based on
|
* The function `getAdwordsKeywordIdeas` retrieves keyword ideas from Google Ads API based on
|
||||||
* provided credentials and settings.
|
* provided credentials and settings.
|
||||||
* @param {AdwordsCredentials} credentials - an object containing Adwords credentials needed to authenticate
|
* @param {AdwordsCredentials} credentials - an object containing Google Ads credentials needed to authenticate
|
||||||
* the API request.
|
* the API request.
|
||||||
* @param {IdeaSettings} adwordsDomainOptions - an object that contains settings and options for fetching
|
* @param {IdeaSettings} adwordsDomainOptions - an object that contains settings and options for fetching
|
||||||
* keyword ideas from Google AdWords.
|
* keyword ideas from Google Ads.
|
||||||
* @param {boolean} [test=false] - a boolean flag that indicates whether the function is being run in a test mode or not.
|
* @param {boolean} [test=false] - a boolean flag that indicates whether the function is being run in a test mode or not.
|
||||||
* When `test` is set to `true`, only 1 keyword is requested from adwords.
|
* When `test` is set to `true`, only 1 keyword is requested from adwords.
|
||||||
* @returns returns an array of fetched keywords (`fetchedKeywords`) after processing the Adwords API response.
|
* @returns returns an array of fetched keywords (`fetchedKeywords`) after processing the Google Ads API response.
|
||||||
*/
|
*/
|
||||||
export const getAdwordsKeywordIdeas = async (credentials:AdwordsCredentials, adwordsDomainOptions:IdeaSettings, test:boolean = false) => {
|
export const getAdwordsKeywordIdeas = async (credentials:AdwordsCredentials, adwordsDomainOptions:IdeaSettings, test:boolean = false) => {
|
||||||
if (!credentials) { return false; }
|
if (!credentials) { return false; }
|
||||||
@ -191,8 +191,8 @@ export const getAdwordsKeywordIdeas = async (credentials:AdwordsCredentials, adw
|
|||||||
const ideaData = await resp.json();
|
const ideaData = await resp.json();
|
||||||
|
|
||||||
if (resp.status !== 200) {
|
if (resp.status !== 200) {
|
||||||
console.log('[ERROR] Adwords Response :', ideaData?.error?.details[0]?.errors[0]?.message);
|
console.log('[ERROR] Google Ads Response :', ideaData?.error?.details[0]?.errors[0]?.message);
|
||||||
// console.log('Response from AdWords :', JSON.stringify(ideaData, null, 2));
|
// console.log('Response from Ads :', JSON.stringify(ideaData, null, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ideaData?.results) {
|
if (ideaData?.results) {
|
||||||
@ -203,7 +203,7 @@ export const getAdwordsKeywordIdeas = async (credentials:AdwordsCredentials, adw
|
|||||||
await updateLocalKeywordIdeas(domain, { keywords: fetchedKeywords, settings: adwordsDomainOptions });
|
await updateLocalKeywordIdeas(domain, { keywords: fetchedKeywords, settings: adwordsDomainOptions });
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('[ERROR] Fetching Keyword Ideas from Adwords :', error);
|
console.log('[ERROR] Fetching Keyword Ideas from Google Ads :', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ const extractAdwordskeywordIdeas = (keywordIdeas:keywordIdeasResponseItem[], opt
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves keyword search volumes from Google Adwords API based on provided keywords and their countries.
|
* Retrieves keyword search volumes from Google Ads API based on provided keywords and their countries.
|
||||||
* @param {KeywordType[]} keywords - The keywords that you want to get the search volume data for.
|
* @param {KeywordType[]} keywords - The keywords that you want to get the search volume data for.
|
||||||
* @returns returns a Promise that resolves to an object with a `volumes` and error `proprties`.
|
* @returns returns a Promise that resolves to an object with a `volumes` and error `proprties`.
|
||||||
* The `volumes` propery which outputs `false` if the request fails and outputs the volume data in `{[keywordID]: volume}` object if succeeds.
|
* The `volumes` propery which outputs `false` if the request fails and outputs the volume data in `{[keywordID]: volume}` object if succeeds.
|
||||||
@ -262,10 +262,10 @@ const extractAdwordskeywordIdeas = (keywordIdeas:keywordIdeasResponseItem[], opt
|
|||||||
*/
|
*/
|
||||||
export const getKeywordsVolume = async (keywords: KeywordType[]): Promise<{error?: string, volumes: false | Record<number, number>}> => {
|
export const getKeywordsVolume = async (keywords: KeywordType[]): Promise<{error?: string, volumes: false | Record<number, number>}> => {
|
||||||
const credentials = await getAdwordsCredentials();
|
const credentials = await getAdwordsCredentials();
|
||||||
if (!credentials) { return { error: 'Cannot Load Adwords Credentials', volumes: false }; }
|
if (!credentials) { return { error: 'Cannot Load Google Ads Credentials', volumes: false }; }
|
||||||
const { client_id, client_secret, developer_token, account_id } = credentials;
|
const { client_id, client_secret, developer_token, account_id } = credentials;
|
||||||
if (!client_id || !client_secret || !developer_token || !account_id) {
|
if (!client_id || !client_secret || !developer_token || !account_id) {
|
||||||
return { error: 'Adwords Not Integrated Properly', volumes: false };
|
return { error: 'Google Ads Not Integrated Properly', volumes: false };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate Access Token
|
// Generate Access Token
|
||||||
@ -319,8 +319,8 @@ export const getKeywordsVolume = async (keywords: KeywordType[]): Promise<{error
|
|||||||
const ideaData = await resp.json();
|
const ideaData = await resp.json();
|
||||||
|
|
||||||
if (resp.status !== 200) {
|
if (resp.status !== 200) {
|
||||||
console.log('[ERROR] Adwords Volume Request Response :', ideaData?.error?.details[0]?.errors[0]?.message);
|
console.log('[ERROR] Google Ads Volume Request Response :', ideaData?.error?.details[0]?.errors[0]?.message);
|
||||||
console.log('Response from AdWords :', JSON.stringify(ideaData, null, 2));
|
// console.log('Response from Google Ads :', JSON.stringify(ideaData, null, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ideaData?.results) {
|
if (ideaData?.results) {
|
||||||
@ -344,7 +344,7 @@ export const getKeywordsVolume = async (keywords: KeywordType[]): Promise<{error
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log('[ERROR] Fetching Keyword Volume from Adwords :', error);
|
console.log('[ERROR] Fetching Keyword Volume from Google Ads :', error);
|
||||||
}
|
}
|
||||||
if (Object.keys(keywordRequests).length > 1) {
|
if (Object.keys(keywordRequests).length > 1) {
|
||||||
await sleep(7000);
|
await sleep(7000);
|
||||||
|
Loading…
Reference in New Issue
Block a user