Skip to content

Instantly share code, notes, and snippets.

@izinin
Forked from tablekat/main.ts
Last active December 23, 2020 19:03

Revisions

  1. @tablekat tablekat created this gist Jun 30, 2016.
    183 changes: 183 additions & 0 deletions main.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,183 @@

    import * as request from 'request';
    import * as fs from 'fs';
    import * as readline from 'readline';
    var google = require('googleapis');
    var googleAuth = require('google-auth-library');

    /*************** STEPS
    - made a project on https://console.cloud.google.com/cloudpubsub/topicList?project=testmabs thing?
    - made a pubsub topic
    - made a subscription to the webhook url
    - added that url to the sites i own, i guess? I think I had to do DNS things to confirm i own it, and the error was super vague to figure out that was what i had to do, when trying to add the subscription
    - added permission to the topic for "gmail-api-push@system.gserviceaccount.com" as publisher (I also added ....apps.googleusercontent.com and youtrackapiuser.caps@gmail.com but i dont think I needed them)
    - created oauth client info and downloaded it in the credentials section of the google console. (oauthtrash.json)
    ****************/

    var SCOPES = [
    'https://mail.google.com/',
    'https://www.googleapis.com/auth/gmail.modify',
    'https://www.googleapis.com/auth/gmail.readonly'
    ];
    var TOKEN_DIR = './.credentials/';
    var TOKEN_PATH = TOKEN_DIR + 'gmail-nodejs-fun.json';

    var key = require('../config/oauthtrash.json');
    authorize(key, (auth) => {
    listLabels(auth);
    listEmails(auth);
    //watchEmails(auth);
    });

    // https://developers.google.com/gmail/api/quickstart/nodejs#step_2_install_the_client_library
    function authorize(credentials, cb) {
    var clientSecret = credentials.installed.client_secret;
    var clientId = credentials.installed.client_id;
    var redirectUrl = credentials.installed.redirect_uris[0];
    var auth = new googleAuth();

    var authClient = new auth.OAuth2(clientId, clientSecret, redirectUrl);
    //var authClient = new google.auth.JWT(key.client_email, null, key.private_key, SCOPES, null);

    // authClient.authorize((err, tokens) => {
    // if(err) return console.log(err);
    // //cb(authClient);
    // console.log(authClient);
    // });

    //Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, function(err, token) {
    if (err) {
    getNewToken(authClient, cb);
    } else {
    authClient.credentials = JSON.parse(token.toString());
    cb(authClient);
    }
    });
    }
    function getNewToken(oauth2Client, callback) {
    var authUrl = oauth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES
    });
    console.log('Authorize this app by visiting this url: ', authUrl);
    var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
    });
    rl.question('Enter the code from that page here: ', function(code) {
    rl.close();
    oauth2Client.getToken(code, function(err, token) {
    if (err) {
    console.log('Error while trying to retrieve access token', err);
    return;
    }
    oauth2Client.credentials = token;
    storeToken(token);
    callback(oauth2Client);
    });
    });
    }
    function storeToken(token) {
    try {
    fs.mkdirSync(TOKEN_DIR);
    } catch (err) {
    if (err.code != 'EEXIST') {
    throw err;
    }
    }
    fs.writeFile(TOKEN_PATH, JSON.stringify(token));
    console.log('Token stored to ' + TOKEN_PATH);
    }



    function listLabels(auth) {
    var gmail = google.gmail('v1');
    gmail.users.labels.list({
    auth: auth,
    userId: 'me',
    }, function(err, response) {
    if (err) {
    console.log('The API returned an error: ' + err);
    return;
    }
    var labels = response.labels;
    if (labels.length == 0) {
    console.log('No labels found.');
    } else {
    console.log('Labels:');
    for (var i = 0; i < labels.length; i++) {
    var label = labels[i];
    console.log('- %s', label.name);
    }
    }
    });
    }

    function listEmails(auth) {
    var gmail = google.gmail({ auth: auth, version: 'v1' });

    var emails = gmail.users.history.list({
    //maxResults: 5,
    startHistoryId: 1392, //1401,
    userId: "youtrackapiuser.caps@gmail.com"
    }, function (err, results) {
    // https://developers.google.com/gmail/api/v1/reference/users/history/list#response
    if(err) return console.log(err);
    console.log("users.history.list result:", results);
    //console.log("-----------------------");
    if(!results.history || !results.history.length) console.log("No history");

    results.history[0].messages.map((emailInfo, i) => {
    gmail.users.messages.get({ userId: "youtrackapiuser.caps@gmail.com", id: emailInfo.id }, (err, results) => {
    if(err) return console.log(err);
    console.log(`Email ${i} (${emailInfo.id}):`, results);
    if(i == 0){
    //console.log("----------------------");
    //console.log(JSON.stringify(results, null, 2));
    }
    });
    });
    });

    // var emails = gmail.users.messages.list({
    // includeSpamTrash: false,
    // //maxResults: 5,
    // startHistoryId: 1401,
    // q: "",
    // userId: "youtrackapiuser.caps@gmail.com"
    // }, function (err, results) {
    // if(err) return console.log(err);
    // console.log(results);
    // //console.log("-----------------------");
    // results.messages.map((emailInfo, i) => {
    // gmail.users.messages.get({ userId: "youtrackapiuser.caps@gmail.com", id: emailInfo.id }, (err, results) => {
    // if(err) return console.log(err);
    // console.log(`Email ${i} (${emailInfo.id}):`, results);
    // if(i == 0){
    // //console.log("----------------------");
    // //console.log(JSON.stringify(results, null, 2));
    // }
    // });
    // });
    // });
    }

    function watchEmails(auth) {
    // https://developers.google.com/gmail/api/guides/push#create_a_topic
    var gmail = google.gmail({ auth: auth, version: 'v1' });

    gmail.users.watch({
    userId: "youtrackapiuser.caps@gmail.com",
    resource: {
    topicName: "projects/testmabs/topics/testpusho",
    }
    }, (err, result) => {
    console.log("Error:", err);
    console.log("Watch reply:", result);
    })
    }