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

こくちーずから申込者のアイコンをダウンロードし、座席表用のアカウントつき画像を作成する座席表職人のためのGroovyスクリプト

groovy


確かに、アイコンをダウンロードして、Twitterアカウントを入力するのが面倒。
特に人数が多いと時間もかかったりする。
間違えたりするし。


告知サイトは、有名どころだけでも、ATND、こくちーず、Zussar、PARTAKEなどがある。
僕が参加しているイベントは、こくちーずが多いのなので、まずはこくちーずで楽できるようにしたい。



やりたいこと

  • こくちーずの申し込みリストにあるアイコンをダウンロードする。
  • ダウンロードしたアイコンに、下部にTwitterのusernameを表示した画像を作成する

問題点

  • こくちーずのAPIが見つからない
  • RSSだとTwitterのアイコンが取得できない

対処

コード

@Grab("net.sourceforge.nekohtml:nekohtml:1.9.14")

import groovy.swing.j2d.*
import javax.imageio.*;
import org.cyberneko.html.parsers.SAXParser


if (!args || args.size() !=1) {
    println "usge:groovy kokucheese.groovy http://kokucheese.com/event/subscriptions/XXXX/"
    System.exit(1)
}


def parser = new XmlSlurper(new SAXParser()) 
def html = parser.parse(args[0])
def rows = html.'**'.findAll{
    it.name() == "TR"
}

def listFile = new File("list.txt").newWriter()
rows.each{
    id = it.children().A.text() 
    imgSrc = it.children().A.IMG.@src.toString()

    
    if (imgSrc != "") {
        def url = new URL(imgSrc)
        def file =  new File("@${id}.png")
        
        url.withInputStream {input ->
            file.bytes = input.bytes
        }
    
        img = ImageIO.read(file)
        gr = new GraphicsRenderer()
        gr.renderToFile("@${id}.png", img.width + 100, img.height + 20){
            antialias("on")
            image(image: img, x:0,y:0)
            font(new java.awt.Font('Tahoma', java.awt.Font.BOLD, 15))
            text( x:0, y:img.height + 5, text: "@${id}", borderColor: no, fill: 'blue')
        }
        listFile.writeLine("@${id}")
    }
}
listFile.close()

解析しているHTMl

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Template Design by TheWebhub.com | http://www.thewebhub.com | Released for free under a Creative Commons Attribution-Share Alike 3.0 Philippines -->

<html xmlns="http://www.w3.org/1999/xhtml">

省略

<body>

省略

<table>
<tr>
<th width="10">No</th>
<th width="70">お名前</th>
<th width="50">Twitter</th>
<th>メッセージ</th>
<th width="60">申込日時</th>
</tr>
<tr>
<td>1</td>
<td class="">nobusue</td>
<td class="">
<a href="http://twitter.com/nobusue" target="_blank"><img src="http://img.tweetimag.es/i/nobusue_n" /><br />nobusue</a>
</td>
<td class="">これは見逃せない!
<br />今年はDevOps元年になりそうですね。</td>
<td class="">2012/02/09 09:28:18</td>
</tr>
<tr>
<td>2</td>
<td class="">cointoss1973</td>
<td class="">
<a href="http://twitter.com/cointoss1973" target="_blank"><img src="http://img.tweetimag.es/i/cointoss1973_n" /><br />cointoss1973</a>
</td>
<td class="">今月は原著に目を通したいと思います。
<br /></td>
<td class="">2012/02/09 10:43:58</td>
</tr>
<tr>
<td>4</td>
<td class="">inda_re</td>
<td class="">
<a href="http://twitter.com/inda_re" target="_blank"><img src="http://img.tweetimag.es/i/inda_re_n" /><br />inda_re</a>
</td>
<td class="">リア充に継続的に爆弾をデリバリーすると聞いて。</td>
<td class="">2012/02/09 11:34:27</td>
</tr>
<tr>
<td>5</td>
<td class="">shinyaa31</td>
<td class="">
<a href="http://twitter.com/shinyaa31" target="_blank"><img src="http://img.tweetimag.es/i/shinyaa31_n" /><br />shinyaa31</a>
</td>
<td class="">少し先の話なので予定は未定ですが・・・参加出来た暁には名古屋の美味いもん食っておきたいところです。</td>
<td class="">2012/02/09 11:38:25</td>
</tr>
<tr>
<td>7</td>
<td class="">irof</td>
<td class="">
<a href="http://twitter.com/irof" target="_blank"><img src="http://img.tweetimag.es/i/irof_n" /><br />irof</a>
</td>
<td class="">よろしくお願いします。</td>
<td class="">2012/02/09 12:31:17</td>
</tr>
<tr>
<td>8</td>
<td class="">pocketberserker</td>
<td class="">
<a href="http://twitter.com/pocketberserker" target="_blank"><img src="http://img.tweetimag.es/i/pocketberserker_n" /><br />pocketberserker</a>
</td>
<td class="">よろしくお願いします</td>
<td class="">2012/02/25 01:00:49</td>
</tr>
<tr>
<td>9</td>
<td class="">kiy0taka</td>
<td class="">
<a href="http://twitter.com/kiy0taka" target="_blank"><img src="http://img.tweetimag.es/i/kiy0taka_n" /><br />kiy0taka</a>
</td>
<td class="">名古屋初心者ですが、どうぞよろしくお願いいたします。</td>
<td class="">2012/03/01 09:20:27</td>
</tr>
<tr>
<td>11</td>
<td class="">Tsutomu Takeuchi</td>
<td class="">
<a href="http://twitter.com/nightmare_tim" target="_blank"><img src="http://img.tweetimag.es/i/nightmare_tim_n" /><br />nightmare_tim</a>
</td>
<td class="">転職前の知識アップに!ぜひ参加させてください。それにしても豪華なメンバー!!</td>
<td class="">2012/03/20 00:19:56</td>
</tr>
<tr>
<td>13</td>
<td class="">natsu_nanana</td>
<td class="">
<a href="http://twitter.com/natsu_nanana" target="_blank"><img src="http://img.tweetimag.es/i/natsu_nanana_n" /><br />natsu_nanana</a>
</td>
<td class="">色々と検討した結果、やはりこちらに参加します!お手数かけてすみません</td>
<td class="">2012/03/27 18:13:39</td>
</tr>
<tr>
<td>14</td>
<td class="">いじゅういん</td>
<td class="">
<a href="http://twitter.com/kei10in" target="_blank"><img src="http://img.tweetimag.es/i/kei10in_n" /><br />kei10in</a>
</td>
<td class="">自動化が好きです.</td>
<td class="">2012/03/27 19:06:35</td>
</tr>
<tr>
<td>15</td>
<td class="">SG</td>
<td class="">
<a href="http://twitter.com/smallgeek" target="_blank"><img src="http://img.tweetimag.es/i/smallgeek_n" /><br />smallgeek</a>
</td>
<td class="">自動化したいです。よろしくお願いします</td>
<td class="">2012/03/27 23:59:34</td>
</tr>
<tr>
<td>17</td>
<td class="">まえかわひろし</td>
<td class="">
<a href="http://twitter.com/Posaune" target="_blank"><img src="http://img.tweetimag.es/i/Posaune_n" /><br />Posaune</a>
</td>
<td class="">多分海外出張用のスーツケースを抱えていくので、場所取るかもしれませんが、ご容赦ください。</td>
<td class="">2012/03/31 01:11:09</td>
</tr>
<tr>
<td>18</td>
<td class="">近藤大介</td>
<td class="">
<a href="http://twitter.com/gim_kondo" target="_blank"><img src="http://img.tweetimag.es/i/gim_kondo_n" /><br />gim_kondo</a>
</td>
<td class="">無事書籍を入手できましたので申し込みます。
<br />当日までにどれだけ読めるか判りませんが、よろしくお願いします。</td>
<td class="">2012/04/16 21:15:11</td>
</tr>
<tr>
<td>19</td>
<td class="">akuraru</td>
<td class="">
<a href="http://twitter.com/akuraru" target="_blank"><img src="http://img.tweetimag.es/i/akuraru_n" /><br />akuraru</a>
</td>
<td class="">Ustしに行きます。よろしくお願いします。</td>
<td class="">2012/04/20 19:30:48</td>
</tr>
</table>
省略

準備

http://groovy.codehaus.org/GraphicsBuilder
からGraphicsBuilderをダウンロードして、GROOVY_HOME/bin、GROOVY_HOME/lib
にコピーする。
grabでは解決できそうにないようだ。



実行方法

groovy -c UTF-8 ..\kokucheese.groovy http://kokucheese.com/event/subscriptions/27710/


カレントディレクトリに、作成した座席表用の画像とTwitterアカウントの一覧を記載したlist.txtが作成される。



実行結果

  • 作成した座席表用の画像

これをGoogle Docsの図形描画に貼り付ければいい。

  • list.txtの内容
@nobusue
@cointoss1973
@inda_re
@shinyaa31
@irof
@pocketberserker
@kiy0taka
@nightmare_tim
@natsu_nanana
@kei10in
@smallgeek
@Posaune
@gim_kondo
@akuraru

これははてなダイアリ用。
これだけで、Twitterにメンションを飛ばしてくれる。



添削歓迎

ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバックはてブTwitter @orange_clover宛 で、お願いします。



実行環境







関谷 和愛、上原 潤二、須江 信洋、中野 靖治
価格: ¥ 3,360
価格は記載時点のものです。購入前にAmazonでご確認ください。




「プログラミングGROOVY」正誤表







木村佳代、アスキー書籍編集部
価格: ¥ 1,491


価格は記載時点のものです。購入前にAmazonでご確認ください。