The jonki

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

Twitterのアイコンに動的な吹き出しをつけてみた

自分のTwitterアイコンを書き換えた記念に、吹き出しをつけたpngを用意してそこに動的にテキストを突っ込んでみました。そしてこの画像はTwitterプロフィール画像に反映されます。
f:id:jonki:20140504003149p:plain:w180:leftf:id:jonki:20140504003049p:plain:w180:left

実現方法

最終的にはどこかのサーバーで動かしつつ、面白い発話を半自動で取りたいと思いますが、今回はまず手動で動作を確認します。

  1. 発話させたいテキストの一覧を作る
  2. ImageMagick(後述)をPythonで動かして空の吹き出しに文字を入れてpng保存する。
  3. PythonTwitterライブラリ、TweepyでTwitterプロフィール画像を変更する。

ImageMagickのインストール

ImageMagickは画像を色々と操作するためのソフトウェアになります。私はMacですが、WindowsLinuxでも問題なく動きます。

Macではportで10分ほどかかって入りました。

sudo port install ImageMagick

試しにシェルスクリプトで試してみましたが、いい感じに動きます。色々とオプションをモリモリしていく感じですね。drawオプションのところではテキストラベルのXY座標と引数の文字をたべるようにしています。

#! /bin/sh
if [ $# -ne 1 ]; then
        echo "指定された引数は$#個です。" 1>&2
        exit 1
fi
convert jojonki-fukidashi.png \
        -font './setofont.ttf'\
        -pointsize 48\
        -fill black\
        -draw "text 88,115 '$1'"\
        output.png

ImageMagickシェルスクリプトは下記を参考に。

フォントは瀬戸フォントさんを使っています。

tweepyのインストール

Pythonの老舗Twitterライブラリです。今はpipで簡単に入るようですね。easy_installがない方は便利なのでこれを機に入れちゃいましょう。またWandというImageMagickPythonライブラリも入れましょう。

$ curl -O http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py
$ sudo easy_install pip
$ sudo pip install tweepy
$ pip install Wand

Twitterアプリケーションキーを取得する

Twitterのページからプロフィール画像を変更するアカウントでログインした状態でアプリを新規に作成しましょう。デフォルトだとAccess LevelがRead onlyになっているのでRead and writeに変えておいてください。またOAuthのためのコンスーマーとアクセスのキーとシークレット、計4つの文字列をコピーできるようにしておいてください。

ソースコード

まだ道通程度なのでソースコードがベタ書きで申し訳ないです。words.txtというのは初登場ですが、発話させたい文が行毎に書いてあるただのテキストファイルです。Wandの使い方に関しては公式に多く例が載っていますね。

Wand — Wand 0.3.7

今回は先程のシェルスクリプト相当のものをPythonで記述し、それをOAuthを通過したTwitterAPIクライアントを通してプロフィール画像を更新します。

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

import sys
import random
import tweepy

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

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

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)

ORIGIN_FILE_NAME = 'jojonki-fukidashi.png'
output_file_name = ''

with open('words.txt') as f:
    data = f.read()
    lines = data.split('\n')
    randWord = lines[random.randint(0, len(lines)-2)]
print randWord

with Drawing() as draw:
    with Image(filename='jojonki-fukidashi.png') as img:
        with img.clone() as i:
            draw.font = './setofont.ttf'
            draw.font_size = 32
            draw.text(138, 110, randWord)
            draw(i)
            output_file_name = randWord + '_' + ORIGIN_FILE_NAME
            i.save(filename=output_file_name)
            # display(i)
            api.update_profile_image(output_file_name)

最後に

吹き出しが思った以上に小さいので見にくかったり、自分で吹き出しの内容を用意していたり、更新がマニュアルだったりするのはイケてないので、近いうちにもう少し良い感じな仕組みに帰る予定です。