nodejs+passportでYammerで投稿

#背景
社のYammerの方にMicrosoft flowとGoogle alertを使って投稿していたのですが、「毎日ものすごい数 投稿されて見にくい!」という批判が続発したため間にnodejs挟んで1日に数回まとめて投稿するようにかえました。

#やり方
スクリーンショット 2017-04-12 15.34.35.png
こんな感じのを1日に1回〜2回やる感じ

##読み込み
feedparserとrequestを利用します。
こんな感じでインストール。

npm install --save feedparser request  

こんな感じで実装。

var FeedParser = require('feedparser'),  
    request = require('request');  
var req=  request(url);  
var feedparser = new FeedParser({});  
var items=[];//ここに記事が入る。  
    feedparser.on('meta', function(meta) {});  
    feedparser.on('readable', function() {  
      while(item = this.read()) {  
        items.push(item);  
      }  
    });  
  
    var out="";  
    feedparser.on('end', function() {  
      if(items.length > 0){  
            //ここでYammerに出す記事を生成。  
        items.forEach(function(item) {  
          out = out + item.title +"\n"+ item.link + "\n\n";  
        });  
        out=out+"#"+val.name;  
        console.log(val.name+">post");  
      }else{  
        console.log(val.name+">no post");  
      }  
    });  
  

##投稿
passportとpassport-yammer3とyammerを使います。

実際はこんな感じ。

スクリーンショット 2017-04-12 16.52.10.png

まずは関係する所をインストール

npm install --save passport-yammer3 yammer express express-session fs  

access tokenを発行する所はこんな感じ…

var express = require('express'),  
    session = require('express-session'),  
    passport= require('passport'),  
    request = require('request'),  
    fs      = require("fs"),  
    YammerStrategy = require('passport-yammer3').Strategy;  
var app = express();  
app.use(session({ secret: 'keyboard cat' }));  
app.use(passport.initialize());  
app.use(passport.session());  
  
passport.use(new YammerStrategy({  
    clientID:'*****************',  
    clientSecret:'*****************',  
    callbackURL:'http://localhost:3000/auth/yammer/callback'  
  },  
  function(accessToken, refreshToken, profile, done) {  
    console.log(accessToken);//ここでtoken発行  
    fs.writeFileSync("accessToken.txt",accessToken);  
    return done(null, profile);  
  }  
));  
passport.serializeUser(function(user, done) {done(null, user);});  
passport.deserializeUser(function(user, done) {done(null, user);});  
app.all('/ng',function(req,res){res.send('ng');});  
app.all('/ok',function(req,res){res.send('ok');});  
app.all('/auth/yammer',passport.authenticate('yammer'));  
app.all('/',function(req,res){res.send('<a href="/auth/yammer">ここクリック!</a>');});  
  
app.all('/auth/yammer/callback',  
  passport.authenticate('yammer', {successRedirect: '/ok', failureRedirect: '/ng' })  
);  
app.listen(3000, function () {  
  console.log('Example app listening on port 3000!');  
});  

上記を動かしてlocalhost:3000にアクセスすれば動くはず。

最後に、投稿はこんな感じで。

var Yammer = new require('yammer').Yammer;  
  
var yammer_news_post = function(s){  
  var accessToken=fs.readFileSync("accessToken.txt",'utf-8');//これがアクセストークン  
  console.log(accessToken);  
  var yam = new Yammer({ access_token: accessToken });  
  var formdata={body:s,group_id:*********};  
  yam.createMessage(formdata, {},function(r1,r2){});  
}