Upload
yusuke-yamamoto
View
3.223
Download
2
Embed Size (px)
DESCRIPTION
JavaでTwitterボット開発簡単!
Citation preview
Botを使った業務効率化平成26年8月22日 山本 裕介
株式会社サムライズム
本研究の目的
•Botを活用し業務効率化を図る
研究の背景•業務効率化が求められる
!
•システム化による業務自動化
研究の背景• 自動化度が高まるにつれて実装コスト増大 • 自動化度を高めてもオペレーションコストの削減効果低
全自動手動 半自動
コスト大
コスト小
システム実装コストとオペレーションコストの関係 (※当社調べ)
オペレーションコスト実装・メンテナンスコスト自動化を進めると費用対効果は急速に低下
本研究のアプローチ•完全な自動化を目指さない
• 自動化コストが高い箇所は人間系が介在
先行研究• HUBOT 【GitHub2011】- https://hubot.github.com
先行研究 - HUBOT• Node.jsで動作するボットフレームワーク
• HipChat、Twitter、IRC等々多彩なチャネルに対応
• 様々なサードパーティープラグインが存在
• Herokuなどに手軽にデプロイ可能
先行研究の課題
•Javaで実装できない
•これは大問題ですね
•ね?
Today's version of Hubot is open source, written in CoffeeScript on Node.js, and
easily deployed on platforms like HerokuHUBOT[14]より
本研究のアプローチ•JavaでBotを実装
•簡単
•そう、Twitter4Jならね
実装してみた• echo ボット
public class BotMain { public static void main(String[] args) { Twitter twitter = TwitterFactory.getSingleton(); TwitterStream twitterStream = TwitterStreamFactory.getSingleton(); twitterStream.addListener(new UserStreamAdapter() { @Override public void onDirectMessage(DirectMessage directMessage) { String[] args = directMessage.getText().trim().split(" "); String command = args[0]; switch (command.toLowerCase()) { case "echo": twitter.sendDirectMessage(YUSUKE, args[1]); break; default: twitter.sendDirectMessage(YUSUKE, "invalid args:" + Arrays.toString(args)); } }); twitterStream.user(); } }
動作の様子
弊社業務用Botの出来ること• ライセンス発注 • 入金消し込み • Botのセルフアップデート (シャットダウン→git pull→起動) などなど
Twitter連携Botのいいところ• リプライで命令: 文脈に応じたコマンドを実行できる
発注処理
処理対象帳票コード
Twitter連携Botのいいところ• UI不要
• Twitterクライアントより操作可能
• HTMLやSwing、JavaFXでUIを書く必要がない
• セキュリティ
• Twitter APIが口となる。SSLの口を用意したり、VPN接続など不要
アンケートによる効果測定• 調査対象者: 株式会社サムライズム全社員
• 無記名
• 有効回答数: 1名
アンケート結果
はい100%
はい いいえ
• Bot利用により業務効率は向上しましたか?
アンケート結果
はい100%
はい いいえ
• 今後Botの利用を拡大していきたいですか?
アンケート結果
はい100%
はい いいえ
• Javaで実装するBotをお友達に勧めたいですか?
アンケート結果
はい、100%
はいはい、Java8らしく書けたらもっと簡単いいえ
• Botの実装は簡単でしたか?
まとめと考察• JavaでBot実装超簡単
• そう、Twitter4Jならね
•Java8ならもっとがんばれる
Java8を使ったBot実装効率化平成26年8月22日 山本 裕介
株式会社サムライズム
本研究の目的
•Botの開発効率向上
研究の背景•先行研究【山本14】よりBot開発効率に課題判明
具体的な不満点(匿名)
匿名クラスとか書いたら負け
Lambdaで書きたい
switch文とかダサい
0 1
つまり
古き良きJava過ぎる• 匿名クラス、switchでコマンド分岐とかダサい
twitterStream.addListener(new UserStreamAdapter() { @Override public void onDirectMessage(DirectMessage directMessage) { String[] args = directMessage.getText().trim().split(" "); String command = args[0]; switch (command.toLowerCase()) { case "echo": twitter.sendDirectMessage(YUSUKE, args[1]); break; default: twitter.sendDirectMessage(YUSUKE, "invalid args:" + Arrays.toString(args)); } }); twitterStream.user(); } }
そこで
Java8で書けるようにした
流れるようにBotを実装
public static void main(String[] args) { new Jenkinsan() .onMention("echo", (status, twitter) -> twitter.reply(status.getText())) .onMention(“hello", (status, twitter) -> twitter.reply("Hello world!")) .start(); }
echoコマンドを受けたらそのままリプライ
helloコマンドを受けたらHello Worldと返す
工夫した箇所• Lambda内の例外処理がめんどいので…
工夫した箇所• BiConsumerを使い、例外を吐かないユーティリティオブジェクトを提供
onMention(BiConsumer<Status, TwitterWrapper> c)
onMention(Consumer<Status> consumer)
ユーティリティオブジェクトのインターフェース
class TwitterWrapper{ public void updateStatus(String text); public void reply(String text); public void updateStatus(StatusUpdate status); public void sendDirectMessage(String message); }
onMention(BiConsumer<Status, TwitterWrapper> c)
@ツイートで返信、ダイレクトメッセージ送信など 例外を投げない便利メソッドを搭載
ユーティリティオブジェクトの効果Twitter twitter = TwitterFactory.getSingleton(); new Kagechiyo() .onMention("help", (message) -> { try { twitter.updateStatus(String.format("@%s %s", message.getUser().getScreenName(), "ググレカス")); } catch (TwitterException e) { e.printStackTrace(); } }) .start();
new Kagechiyo() .onDirectMessage("help", (message, twitter) -> twitter.sendDirectMessage("ググレカス")) .start();
Lambda万歳
Lambdaうざい
アンケートによる効果測定• 調査対象者: 株式会社サムライズム全社員
• 無記名
• 有効回答数: 1名
アンケート結果
はい100%
はい いいえ
• Botの実装は効率化出来ましたか?
まとめと考察• Java8でBot実装簡単
• そう、Twitter4Jならね
• 続きはGitHubで!
https://github.com/yusuke/kagechiyo
ご静聴ありがとうございました
便利なBot作りました• フォローするとグラビアアイドルのステキな画像で
タイムラインが埋まります → @grajiga
フォローなう!