読者です 読者をやめる 読者になる 読者になる

The jonki

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

IFTTTのメール連携を利用して自前のアクションを行う

最近流行のIFTTTをちょっと応用して使ってみます。IFTTTは様々なサービスをトリガーにして様々なアクションを作ることができます。既に色々なトリガーとアクションがWebで簡単に登録できるので、それを組み合わせてレシピとして通常は活用します。


今回は応用例としてTwitterでふぁぼったら自前のメールサーバーにふぁぼった内容を件名にしたメールを飛ばし、それをトリガーにしてTwitterのアイコンの吹き出しにふぁぼり内容を書き出します。トリガーは正直なんでも良いのですが、その後のアクションはメールを活用して自分好みの処理をほぼなんでも行うというものです。アイコンの吹き出しに文字を出す、というのは前の記事で行ったものです。

f:id:jonki:20140505225044p:plain

メール受信の活用

今回自前のサーバーではpostfixを動かし、my.mail.net(仮称)で運用しているます。.forwardを利用することで、メールの受信をトリガーに任意のプログラムを動かすことができます。さらに実行されたプログラムには受信したメール内容が入るのでそれを元に色々と遊べるわけです。つまりIFTTTのアクションをメールにしておき、さらにそれをトリガーにして自分のプログラムをアクションとして動かすイメージです。

\jonki@my.mail.net
"| python /path/to/program-file.py"
メールの件名を吹き出しの文字に適用

下記がメール受信の際に実行されるプログラムです。かなり雑に作ったもので恥ずかしいのですが、標準入力でメールのSubjectを抜き出して、前回の記事のようにImageMagickで吹き出しの文字を作り、それをTweepyライブラリでTwitterプロフィール画像を変更します。ここはお好みでなんでも良いのですがメールにIFTTTのアクション生成時に色々なものを詰め込んでおけば、カスタマイズも自由ですね。

# /usr/bin/python
# -*- coding: utf-8 -*-

import sys
import tweepy
import base64
import quopri
import re

import quopri
import re

from wand.image import Image
from wand.drawing import Drawing
from wand.font import Font

CONSUMER_KEY = 'xxxxxx'
CONSUMER_SECRET = 'xxxxx'
ACCESS_KEY = 'xxxxx'
ACCESS_SECRET = 'xxxxx'

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth_handler=auth, api_root='/1.1', secure=True)

subheader = 'Subject: '
r_base64 = re.compile('\?UTF-8\?B\?(\S+)\?=')
r_qp = re.compile('\?UTF-8\?Q\?(\S+)\?=')
for line in sys.stdin:
        if(line.startswith(subheader)):
            title = line.split(subheader)[1]
            m = r_base64.search(title)
            if m:
                # print(m.group(1))
                print 'base 64 decoding...'
                title = base64.b64decode(m.group(1))
            else:
                m = r_qp.search(title)
                if m:
                    print 'quoted print  decoding...'
                    title = quopri.decodestring(m.group(1))
            with Drawing() as draw:
                with Image(filename='/path/to/original/image.png') as img:
                    with img.clone() as i:
                        draw.font = '/path/to/somefont.ttf'
                        draw.font_size = 24
                        draw.text(138, 110, title)
                        draw(i)
                        output_file_name = '/path/to/output/image.png'
                        i.save(filename=output_file_name)
                        api.update_profile_image(output_file_name)

f.close()
最後に

自前のメールサーバーを作るのはかなりコストが高いかもしれませんが、IFTTTで何らかのトリガーをメール越しにほぼ自由に活用できるのでアイデア次第でもっと面白いことできそうです。たとえばiOSのLocationと組み合わせて特定のエリアに入ったらホゲホゲするとか簡単にできるようになりました。もちろん自分のやりたいアクションが既にIFTTTにあるならそれを使ったほうが良いんですけどね。