The jonki

呼ばれて飛び出てじょじょじょじょーんき

Node.jsでGmailを監視してTwitterのプロフィール画像を動的に変更する

以前Postfixでメール受信をトリガーにTwitterの画像をImageMagickで動的に生成しました。

ただちょっとpostfixを自前で用意するのは…というコメントを頂いたので、imapで新着メールを監視する方式に乗り換えました。inboxライブラリがかなり便利で良いですね。。


依存するライブラリは下記のとおりです。すべてnpm installでは入ります。

var gm = require('gm').subClass({ imageMagick: true });

var inbox = require("inbox");
var client = inbox.createConnection(false, "imap.gmail.com", {
    secureConnection: true,
    auth:{
        user: "your-gmail-account@gmail.com",
        pass: "your-password"
    }
});

client.connect();

client.on("connect", function(){
        console.log("successfullly connected to server");
    client.openMailbox("INBOX", function(error, info){
        if(error) throw error;
        // client.listMessages(10, function(err, messages){
        //     messages.forEach(function(message){
        //         console.log(message.UID + ": " + message.title);
        //     });
        // });
    });
});

client.on('close', function (){
    console.log('DISCONNECTED!');
});

client.on("new", function(message){
    console.log("New incoming message " + message.title);
        if(message.from["address"] == "allowed-address") {
                GenerateImage(message.title);
        }
});

var twitterAPI = require('node-twitter-api');
var twitter = new twitterAPI({
            consumerKey: 'xxxxx',
            consumerSecret: 'xxxxx',
            callback: 'http://yoururl.tld/something'
});
var     accessToken = 'xxxxx';
var     accessTokenSecret = 'xxxxx';

function GenerateImage(text) {
        text = text || '';
        var x, y;
        if(text.length < 5) {
                x = 140;
                y = 160;
        } else if(text.length < 9){
                x = 140;
                y = 120;
                text = text.substr(0, 4) + "\n" + text.substr(4);
        }
        gm('pic/jonki.png')
                .font('font/setofont.ttf', 90)
                .drawText(x, y, text)
                .write("pic/jonki-out.png", function (err) {
                        if(err) {
                                console.log(err);
                        } else {
                                console.log("GenerateImage succeeded");
                                console.log(text);
                                twitter.updateProfileImage({'image' : 'pic/jonki-out.png'},
                                        accessToken,
                                        accessTokenSecret,
                                        function(error, data, response) {
                                                if(error) {
                                                        console.log("failed updateProfileImage");
                                                } else {
                                                        console.log("update profileImage succeed");
                                                }
                                        }
                                );
                        }
                });
}