Skip to content

Instantly share code, notes, and snippets.

@shashankmehta
Created December 14, 2014 20:41
Show Gist options
  • Save shashankmehta/d7d0233d8e919aaa5c35 to your computer and use it in GitHub Desktop.
Save shashankmehta/d7d0233d8e919aaa5c35 to your computer and use it in GitHub Desktop.

Revisions

  1. shashankmehta created this gist Dec 14, 2014.
    178 changes: 178 additions & 0 deletions placements.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,178 @@
    var cheerio = require('cheerio');
    var request = require('request');
    var fs = require('fs');
    var exec = require('child_process').exec;
    var twitterAPI = require('node-twitter-api');

    var phpsessid = '<get it from your channeli account. Chrome developer console is your friend>';
    var consumerKey = '<get it from twitter.js>';
    var consumerSecret = '<get it from twitter.js>';
    var accessToken = '<get it from twitter.js>';
    var accessTokenSecret = '<get it from twitter.js>';

    var scraper = {
    data: {
    count: 0,
    companies: {}
    },

    init: function(){
    this.handleInitial();
    },

    clone: function(a) {
    return JSON.parse(JSON.stringify(a));
    },

    handleInitial: function(){
    var initialData = fs.readFileSync('data.json').toString();
    initialData = JSON.parse(initialData);
    console.log("Initially known " + initialData.count);
    this.data = this.clone(initialData);

    var that = this;
    setInterval(function(){
    that.getPage.call(that, that.handleNewHTML);
    }, 60000);
    },

    getPage: function(callback){
    var that = this;

    var j = request.jar();
    var cookie = request.cookie('PHPSESSID=' + phpsessid);
    var url = 'https://channeli.in/placement/results/2014/company/';
    j.setCookie(cookie, url);
    request({url: url, jar: j}, function (error, response, html) {
    if (!error && response.statusCode == 200) {
    callback.call(that, html);
    }
    });
    },

    getPageMocked: function(callback){
    var html = fs.readFileSync('test-1.html').toString();
    callback.call(this,html);
    },

    scrape: function(html){
    var $ = cheerio.load(html);
    var count = $('table tr').last().children().first().text();
    var companies = {};
    var links = {};
    $('table tr').each(function(i, element){
    if (i !== 0) {
    var data = $(this).children();
    var name = $(data[1]).text();
    var selected = $(data[2]).text();
    var link = 'https://channeli.in' + $(data[3]).children().last().attr('href');
    companies[name] = selected;
    links[name] = link;
    }
    });


    return {
    'count': Number(count),
    'companies': companies,
    'links': links
    }
    },

    handleNewHTML: function(html){
    var newData = this.scrape(html)
    this.writeToFile('data.json', newData);

    if(newData.count !== this.data.count){
    for(var i in newData.companies){
    if(this.data.companies[i] === undefined){
    this.notify(i, newData.companies[i], newData.links[i]);
    }
    }

    this.data = this.clone(newData);
    }
    },

    getPeopleList: function(link, company){
    var that = this;

    var j = request.jar();
    var cookie = request.cookie('PHPSESSID=' + phpsessid);
    j.setCookie(cookie, link);
    request({url: link, jar: j}, function (error, response, html) {
    if (!error && response.statusCode == 200) {
    that.tweet.call(that, html, company);
    }
    });
    },

    getPeopleListMocked: function(link, company){
    var html = fs.readFileSync('test-2.html').toString();
    this.tweet(html, company);
    },

    notify: function(name, count, link){
    // sends a desktop notification
    var cmd = 'notify-send -u critical "'+name+ '" "'+count+' selected"';
    console.log(name, count);
    exec(cmd);
    var tweet = name + ' has just released their results. '+ count +' selected. Details coming up soon.';
    this.sendTweet(tweet);
    this.getPeopleList(link, name);
    },

    tweet: function(html, company){
    var $ = cheerio.load(html);
    var people = {};
    var that = this;
    $('table tr').each(function(i, element){
    if (i !== 0) {
    var data = $(this).children();
    var name = $(data[2]).text();
    var branch = $(data[3]).text();
    var c = company.split(' ');
    if (c.length > 1)
    company = [c[0], c[1]].join(' ');
    else
    company = c[0];
    var tweet = company + ': ' + name + '/' + branch;
    if(tweet.length > 140){
    tweet = tweet.substring(0,140);
    }
    that.sendTweet(tweet);
    }
    });
    },

    sendTweet: function(tweet){
    var twitter = new twitterAPI({
    consumerKey: consumerKey,
    consumerSecret: consumerSecret,
    callback: 'http://localhost'
    });
    var accessToken = accessToken;
    var accessTokenSecret = accessTokenSecret;
    twitter.statuses("update", {
    status: tweet
    },
    accessToken,
    accessTokenSecret,
    function(error, data, response) {
    if (error) {
    console.error('Error in tweeting', tweet, error);
    }
    }
    );
    },

    writeToFile: function(file, data){
    fs.writeFile(file, JSON.stringify(data), function(err) {
    if(err) {
    console.error('Failed to write to file', err);
    }
    });
    }
    }

    scraper.init();
    47 changes: 47 additions & 0 deletions twitter.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,47 @@
    var twitterAPI = require('node-twitter-api');

    consumerKey = '<get it from twitter developer page>';
    consumerSecret = '<get it from twitter developer page>';

    var twitter = new twitterAPI({
    consumerKey: consumerKey,
    consumerSecret: consumerSecret,
    callback: 'http://localhost'
    });

    twitter.getRequestToken(function(error, requestToken, requestTokenSecret, results){
    if (error) {
    console.log("Error getting OAuth request token : " + error);
    } else {
    console.log(requestToken, requestTokenSecret);
    }
    });

    var requestToken = '<use return value from previous function>';
    var requestTokenSecret = '<use return value from previous function>';
    var oauth_verifier = '<get it from twitter developer page>';

    twitter.getAccessToken(requestToken, requestTokenSecret, oauth_verifier, function(error, accessToken, accessTokenSecret, results) {
    if (error) {
    console.log(error);
    } else {
    console.log(accessToken, accessTokenSecret);
    }
    });

    var accessToken = '<use return value from previous function>';
    var accessTokenSecret = '<use return value from previous function>';

    twitter.statuses("update", {
    status: "Hello, world!"
    },
    accessToken,
    accessTokenSecret,
    function(error, data, response) {
    if (error) {

    } else {
    console.log('Tweet Sent!');
    }
    }
    );