自分のTwitterアイコンを書き換えた記念に、吹き出しをつけたpngを用意してそこに動的にテキストを突っ込んでみました。そしてこの画像はTwitterのプロフィール画像に反映されます。
実現方法
最終的にはどこかのサーバーで動かしつつ、面白い発話を半自動で取りたいと思いますが、今回はまず手動で動作を確認します。
ImageMagickのインストール
ImageMagickは画像を色々と操作するためのソフトウェアになります。私はMacですが、WindowsやLinuxでも問題なく動きます。
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というImageMagickのPythonライブラリも入れましょう。
$ 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の使い方に関しては公式に多く例が載っていますね。
今回は先程のシェルスクリプト相当のものをPythonで記述し、それをOAuthを通過したTwitterのAPIクライアントを通してプロフィール画像を更新します。
# /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)
最後に
吹き出しが思った以上に小さいので見にくかったり、自分で吹き出しの内容を用意していたり、更新がマニュアルだったりするのはイケてないので、近いうちにもう少し良い感じな仕組みに帰る予定です。