こんにちは、@ketancho です。今日は Amazon Comprehend という AWS の自然言語処理サービスを使って Twitter ボットを作ってみたという話です。
Twitter の名前の部分に天気予報を表示してる方いらっしゃいますよね。ああいう形で何か名前のところで遊びたいなーと思っていまして、もし自分のそのときの感情を絵文字として表示したら、まわりの皆さんから優しくしてもらえるのではないかと思い、作ってみた次第です。イメージはこんな感じです。
元々 Amazon Comprehend が日本語対応されていなかったので Amazon Translate という翻訳サービスを噛ませるつもりだったのですが、ちょうど最近日本語にも対応したのでより使いやすくなりました。
作ったもののざっくり説明
ざっくりとした処理の流れとしては、
- 定期的に Twitter API で直近かつ RT や Reply ではないツイートを取得
- そのツイート文言を Amazon Comprehend で分析
- 返ってきた Sentiment によって名前を Twitter API で変更
- NEUTRAL: 🙂
- POSITIVE: 😆
- NEGATIVE: 🙁
- MIXED: 😇
という形になります。
Sentiment については、4つの項目を数値で取得することもできるので、例えば POSITIVE と NEGATIVE の差が非常に大きければこの顔文字!といったことも可能です。詳細については 公式ドキュメント を見ると他にも色々なシーンで活用できそうです。
この実装を AWS Lambda 上で30分に1回動かすことで、定期的に名前を変更するようにしました。ソースコードは最後に載せます。
個人的メモ
この開発をしたときに調べたことをいくつかメモしておきます。
絵文字を Twitter に投稿/表示する
幾つか方法はありそうでしたが、unicodedata モジュールを利用することにしました。下記のような実装イメージになります。
import unicodedata emoji = chr(128518) params = { "name": "ketancho " + emoji + "|Kei Kanazawa" }
絵文字のユニコードは こちら のサイトを参考にさせていただいた。
Twitter で直近かつ RT や Reply ではない自身のツイートを取得
下記の記事でまとめたので、よければご覧ください。
Twitter アカウントの名前を変更する
こちらの公式ドキュメント を参考にして実装しています。 基本的には、ツイートの取得と変わりません。試していませんが Location や bio も更新できそうですね。また、update_profile_image の方を利用することで、アイコンも変えられそうです。アイコンを笑わせたり怒らせたりしてもいいかもしれません。
emoji = chr(128518) url = 'https://api.twitter.com/1.1/account/update_profile.json' params = { "name": "ketancho " + emoji + "|Kei Kanazawa" } req = twitter.post(url, params = params) return req.status_code == 200
参考: ソースコード全体
あくまで参考としてご覧くださいー。今回は東京リージョンで Lambda Function を定義しているのですが、Amazon Comprehend は東京リージョンでは対応していません。そのため、シンガポールリージョンを region_name="ap-southeast-1"
という形で指定している点だけご注意ください。
import os import json from requests_oauthlib import OAuth1Session import unicodedata import boto3 CK = os.environ['CK'] # * enter your Consumer Key * CS = os.environ['CS'] # * enter your Consumer Secret * AT = os.environ['AT'] # * enter your Access Token * AS = os.environ['AS'] # * enter your Accesss Token Secert * twitter = OAuth1Session(CK, CS, AT, AS) comprehend_client = boto3.client('comprehend', region_name="ap-southeast-1") def lambda_handler(event, context): newest_tweet = _get_newest_tweet() sentiment = _detect_sentiment(newest_tweet) _update_twitter_profile(sentiment) def _get_newest_tweet(): url = 'https://api.twitter.com/1.1/statuses/user_timeline.json' params = { "count": 1, "exclude_replies": True, "include_rts": False } req = twitter.get(url, params = params) if req.status_code == 200: newest_tweet = json.loads(req.text)[0]['text'] return newest_tweet else: return req.status_code def _detect_sentiment(newest_tweet): response = comprehend_client.detect_sentiment( Text=newest_tweet, LanguageCode='ja' ) sentiment = response.get('Sentiment') return sentiment def _update_twitter_profile(sentiment): if sentiment == "POSITIVE": emoji = chr(128518) elif sentiment == "NEGATIVE": emoji = chr(128577) elif sentiment == "MIXED": emoji = chr(128519) else: emoji = chr(128578) url = 'https://api.twitter.com/1.1/account/update_profile.json' params = { "name": "ketancho " + emoji + "|Kei Kanazawa" } req = twitter.post(url, params = params) return req.status_code == 200
その他の参考情報
プログラムから Twitter API を利用するには、Twitter 側でアプリの登録および各種キーの取得が必要になります。やや UI が古くなっていますが、事前準備の部分は下記の記事をご覧いただければと思います。
まとめ
最新のツイートから感情を絵文字で表示するようにしました。Amazon Comprehend 楽しいですね。これで私が喜んでいるか悲しんでいるか分かるはずですので、悲しんでいるときは優しくしてください☺ ちなみに運用して数日しか経っていませんが、いまだに MIXED な感情が現れてないので、もし見つけたら教えて下さい:)