Skip to content

shaneiseminger/google-alerts-api

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status NPM Downloads NPM Downloads

google-alerts-api

Google Alerts API for nodejs. See tests for all features coverage.

Features

  • Creating alerts (no support for few parameters)
  • Fetching alerts
  • Modifing alerts (no support for few parameters)
  • Removing alerts

Getting started

$ npm i -S google-alerts-api
const alerts = require('google-alerts-api');

Configuration

Fetching alerts forces us to authenticate. Pass your credentials using configure method:

  • using mail/password
alerts.configure({
    mail: '[email protected]',
    password: '**********'
});

IMPORTANT: Due to the latest changes in Google, authentication with disabled JavaScript is permited. Still, you can generate cookies on your own and reuse it later on (see how to get cookies)

alerts.configure({
    cookies: 'W3sia2V5IjoiR0FQUyIsInZhbHVlIjoiMTpCRXRtZEpjc...saGRasC==',
});

How to use

Fetch alerts:

const alerts = require('google-alerts-api');
const { HOW_OFTEN, DELIVER_TO, HOW_MANY, SOURCE_TYPE } = alerts;

alerts.configure({
    mail: '[email protected]',
    password: '**********'
});

alerts.sync((err) => {
    if(err) return console.log(err);
    const alertList = alerts.getAlerts();
    alertList.forEach(alert => printAlertInfo);
});

function printAlertInfo(alert) {
    console.log('name:', alert.name);
    //'How Many' property information:
    if (alert.howMany === HOW_MANY.BEST) {
    	console.log('How many: Only the best results');
    } else if (alert.howMany === HOW_MANY.ALL) {
    	console.log('How many: All Results');
    }
}

Example alert object:

{
    name: '"Donald Trump * ISIS"',
    id: '4f94515ec736ef62:ade5b03803caa237:com:en:PL:R',
    howOften: 2, //use HOW_OFTEN enum to find out proper meaning
    sources: '...', // some of SOURCE_TYPE enum property, SOURCE_TYPE.AUTOMATIC by default
    lang: 'en',
    region: 'PL',
    howMany: 3, //use HOW_MANY enum to find out proper meaning
    deliverTo: 2, //use DELIVER_TO enum to find out proper meaning
    deliverToData: '', //email address, available when deliverTo === DELIVER_TO.MAIL
    rss: 'https://google.com/alerts/feeds/00357582442749620569/11537740808718742679' //field available, when deliverTo === DELIVER_TO.RSS
}

Modify alert (see tests for more examples):

const { HOW_OFTEN, DELIVER_TO, HOW_MANY } = alerts;

alerts.sync((err) => {
    if(err) return console.log(err);
    const alertToModify = alerts.getAlerts()[0];
    alerts.modify(alertToModify.id, {
    	name: '"(Donald OR Melania) Trump"'
    }, () => {
        alerts.sync(() => {
            const syncedAlertsList = alerts.getAlerts();
            //search in syncedAlertsList to check updated alert
        });
    });
});

function printAlertInfo(alert){
    console.log('name:', alert.name);
    //'How Many' property information:
    if (alert.howMany === HOW_MANY.BEST) {
    	console.log('How many: Only the best results');
    } else if (alert.howMany === HOW_MANY.ALL) {
    	console.log('How many: All Results');
    }
}

Available source types:

const SOURCE_TYPE = {
    AUTOMATIC,
    NEWS,
    BLOGS,
    WEB,

    NEWS_AND_BLOGS,
    NEWS_AND_WEB,
    BLOGS_AND_WEB,

    VIDEO,
    BOOKS,
    DISCUSSIONS,
    FINANCE,
};

Create alert:

alerts.sync(() => {
    const alertToCreate = {
    	howOften: HOW_OFTEN.AT_MOST_ONCE_A_DAY,
	sources: SOURCE_TYPE.AUTOMATIC, // default one
        lang: 'en',
        name: 'NodeJS AND "Chrome V8"',
        region: 'PL', // or do not specify it at all, if you want "All Regions"
        howMany: HOW_MANY.BEST,
        deliverTo: DELIVER_TO.RSS,
        deliverToData: ''
    };

    alerts.create(alertToCreate, (err, alert) => {
        console.log(alert);
    });
});

Remove alert:

alerts.sync((err) => {
    const alertToRemove = alerts.getAlerts()[0];
    alerts.remove(alertToRemove.id, (err) => {
    	alerts.sync((err) => {
            const syncedAlertsList = alerts.getAlerts(); //alertToRemove does not exists here.
        });
    });   
});

Generate cookies:

You can authenticate once, and then use your cookies. Unfortunatelly it requires an additional action from you:

  1. Run "Dev Tools" tools and navigate "Network" tab (If you are in Chrome "Dev tools" make sure you have "Preserve log" option checked)
  2. Log in to Google
  3. Filter requests for "/signin/sl/challenge" pattern
  4. In "Response" section search for "set-cookie: " entries. You will need 3 values: SID (71 characters), HSID, SSID (both 17 characters). Then you can use it to generate cookies, just run the function with your variables:
const fs = require('fs')
const alerts = require('google-alerts-api')

const SID = ''
const HSID = ''
const SSID = ''

fs.writeFileSync('cookies.data', alerts.generateCookiesBySID(SID, HSID, SSID))

Then, put this output to "cookies" configuration:

const fs = require('fs')
const alerts = require('google-alerts-api')

alerts.configure({
    cookies: fs.readFileSync('cookies.data').toString()
});

alerts.sync((err) => {
    if(err) return console.log(err)
    const alertList = alerts.getAlerts()
});

Problem with authentication?

api.reqHandler.login({
    mail: MAIL,
    password: PASSWORD
}, (err, debug) => {
    console.log(debug.statusCode); 
    // For success, you should see here '302'.
    console.log(debug.headers); 
    // For success, in 'set-cookie' header content, you should see SID, LSID, HID, SSID (etc.) definitions.
    console.log(debug.body); 
    // For success, this should be short and include "LoginDoneHtml" and "Moved Temporarily" text inside.
});

Packages

No packages published

Languages

  • JavaScript 100.0%