Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@NoOne

AWSとJavaで、できるだけシンプルにtwitter botを作る

背景

会社の査定目標で自社の中途採用に貢献するという目標を掲げたので、せっかくだしbotを作って自社の宣伝すれば面白いのでは?ということで作ってみました。AWSやJavaを使わなくともbotは作れるらしいですがせっかくなので!

つくるもの

配列で用意したハリーポッターのキャラクター名を自動でつぶやくアプリ

用意するもの

EclipseでMavenプロジェクトを開発できる環境
AWS無料アカウント

①twitterdevアカウントを開設

https://developer.twitter.com/en/apply-for-access
こちらから開設しましょう。英語で質問をいくつかされますがそこまで厳密にみられてはいないと
思うので最低文字数をクリアすれば問題ありません。

②twitterdevのダッシュボードでプロジェクト作成

ダッシュボード上でプロジェクトを作成します。
作成したらデフォルトではReadのみの権限を下記のように変更します。
image.png

③twitterapiとやり取りするためにJavaに埋め込む鍵を4つ取得する

作成したプロジェクトのKeys and tokensタブで4つ鍵を生成できるのでメモしましょう。
鍵は何回でも作りなおせます。
image.png

④Mavenプロジェクト作成&Javaコーディング

まずはMavenPJの作成
image.png

Javaのコーディングはいくつかポイントがあります。
-関数名はhandleRequestというLambdaのデフォルト関数名にしていますが名前は何でもOKです。
-今回のように別段パラメータを渡す必要がなければ極力handleRequest()という風に引数なしにしましょう。LambdaやCloudwatchの設定でこけるリスクが減ります(私だけですかね)。
-twitterAPI規約で同一内容の投稿を行うと187エラーになるので最新の自分のツイートを取得し・それと被らない処理を書いてます。

Job.java
package jobs;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import twitter4j.ResponseList;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class Job {
    public static void handleRequest() {

        final String consumerKey = "③で取得したconsumerKey";
        final String consumerSecret = "③で取得したconsumerSecret";
        final String accessToken = "③で取得したaccessToken";
        final String accessTokenSecret = "③で取得したaccessTokenSecret";
        String tweet;
        // 前回のツイート(これと同一だとツイートできない)
        String latestTweet = "";
        // ツイートしたい内要
        List<String> msgList = new ArrayList<String>(Arrays.asList(
                "ハリーポッター", "マルフォイ", "ロン", "ハーマイオニー", "ネビル", "シリウス",
                "ヴォルデモート", "スネイプ", "マクゴナガル", "ダンブルドア")
        );

        //ツイッターAPIとのやり取りをできるようにする処理
        Twitter twitter = new TwitterFactory().getInstance();
        twitter.setOAuthConsumer(consumerKey, consumerSecret);
        twitter.setOAuthAccessToken(new AccessToken(accessToken,accessTokenSecret));


        try {
            //ここからbreakまで最新のツイートを取得するための処理
            ResponseList<Status> latestTweets = twitter.getHomeTimeline();
            for (Status lTweet : latestTweets) {
                latestTweet = lTweet.getText();
                break;
            }
        } catch (TwitterException e){
            System.err.println("最新ツイート取得失敗"+e.getMessage());
        }

        Random rnd = new Random();
        tweet = decideTweetContent(rnd.nextInt(10), msgList, latestTweet);

        // ツイート処理
        try{
            twitter.updateStatus(tweet);
        } catch(TwitterException e){
            System.err.println("ツイート失敗"+e.getMessage());
        }

    }

    //ツイート内容を決める
    public static String decideTweetContent(int num, List<String> msgList, String latestTweet) {
        // 最新のツイートと被っていたらduplicateエラー回避のため再帰処理
        if(msgList.get(num).equals(latestTweet)){
            Random rnd = new Random();
            decideTweetContent(rnd.nextInt(5), msgList, latestTweet);
        }
        return msgList.get(num);
    }

}

いちおう構造も
image.png

⑤POM.xml記述

追加部分だけ記述しています。

pom.xml
<dependencies>
    <dependency>
      <groupId>org.twitter4j</groupId>
      <artifactId>twitter4j-core</artifactId>
      <version>4.0.7</version>
    </dependency>
  </dependencies>

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-shade-plugin</artifactId>
          <version>3.2.1</version>
          <configuration>
            <createDependencyReducedPom>false</createDependencyReducedPom>
          </configuration>
          <executions>
            <execution>
              <phase>package</phase>
              <goals>
                <goal>shade</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>

⑥Jarファイル作成

作成したPJ上で右クリックするとメニューが開くのでMavenビルド選択します。
image.png

ゴールにpackageと入力し実行します。
image.png

⑦Lambda関数の作成

ランタイムはjava(corretto)です。
image.png

コードソースのアップロード元から⑥で作ったJarファイルをアップします。
image.png

ランタイム設定を編集します。ハンドラは{パッケージ名}.{クラス名}::{関数名}です。
大文字小文字に注意しましょう(私は大文字小文字のせいでClassNotFoundExceptionに苦しみました)。
image.png

⑧LambdaのトリガーとしてCloudWatchEvent(EventBridge)を作成

CloudWatchの右メニューからイベントのルールを選択します。
image.png

左のイベントソースではどれくらいの間隔でLambdaを呼ぶ(今回だとツイート)か設定、右のターゲットでは⑦でつくったLambda関数を選択します。
image.png

感想

シンプルといいつつ結構手順多いですね。。。
これで査定もばっちり?
もし試してみて再現できませんということあればお気軽にお声がけください。
私はめっちゃこけました(笑)。

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
NoOne
こけたところとその解決策を書いていきたいです。 最近はJavaとAWSで個人開発しています。 関西のSESで勤務してます。一緒に働いてくれる方を探してますので、SESを視野に入れた就活をされている方はぜひお声がけください。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?