特定のタグを含むツイートに英訳をつけてインスタに投稿したかった

## やりたかったこと

**特定のタグを含むツイートに英訳をつけてインスタに投稿したい**  
なんでこんなことをしようとしたのか。
2019年6月からPS4でFF14をやっていまして、あるツイートをしたところ、
ちょっと反響がありました。
<img width="500" alt="d0dfa62c-4f40-9e98-e63c-e2730f1f5a27.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/d0dfa62c-4f40-9e98-e63c-e2730f1f5a27.jpeg">

2020年になり、せっかくなら毎日投稿しようと思い、1月から日々投稿しています。
ただし、TwitterのアカウントがFF14以外のことをツイートしていること、
インスタ界隈も盛り上がっていることから、FF14用のアカウントをインスタで作成し、
インスタで投稿を始めました。

ところが、インスタでは外国人のアカウントが多数。
もっと見てもらうには、英訳も必要なのです。  
<img width="500" alt="insta_post.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/da1b1e8a-95fc-e451-7956-96a0187a6da6.png">

今はPS４からツイートした後、スマホでツイートを英訳、画像をダウンロードして、
インスタに投稿しており、ちょっと面倒です。
ですので、今回自動化しようとした次第です。

しかし、**インスタのAPIには投稿用エンドポイントがありません。**
厳密にはクローズドβでありますが、どうやら企業用アカウントでないといけない。
かつ、Sereniumで自動化しようにも、[インスタの規約](https://www.facebook.com/help/instagram/478745558852511)を見ると、
スクレイピング等はできない様子。
<img width="500" alt="insta_rule.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/de6fac03-17a9-4e2c-12d0-4e8725eafbb7.png">

ですので、投稿の自動化は断念して、インスタ用のツイートをしたら
英訳付きの文章、画像URLをスマホに通知する仕組みを作りました。

## 概要
構成は以下の通りです。
Twitter、API Gateway間は、IFTTTでやっています。  

<img width="600" alt="flow.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/ce4d9d3b-2c0b-b55f-0b56-b1edddf5ac15.png">

## コード

コードはシンプルです。
Amazon Translateで英訳した内容と、画像のURLをSNSで通知します。
実装にあたり、以下のサイトを参考にしています。

* [Amazon Translate を使用してみる](https://idealive.jp/blog/2019/10/16/amazon-translate-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)
* [AWS SNSでSMSを送信する](https://qiita.com/spring_i/items/71d73a4c89bdfcc2ea1a)

```javascript

const Aws = require('aws-sdk');
const translate = new Aws.Translate({region: 'ap-northeast-1'});

exports.handler = async (event) => {
    let text = event.text;
    let photoUrl = text.match(/https:\/\/.*/);
    let noUrlText = text.replace(photoUrl[0], '');
    let translated = await execAwsTranslate(noUrlText, 'ja', 'en');
    await publishSns(translated.TranslatedText);
    await publishSns(photoUrl[0]);
    const response = {
        statusCode: 200,
    };
    return response;
};

function execAwsTranslate(text,in_Language,out_Language) {
    return new Promise(((resolve, reject) => {
        let params = {
            Text: text,
            SourceLanguageCode: in_Language,
            TargetLanguageCode: out_Language
        };
        translate.translateText(params, function(err,data){
            if (err) {
                console.log(err);
                reject();
            } else {
                resolve(data);
            }
        });
    }));
}

function publishSns(tweet) {
    return new Promise(function (resolve, reject) {
        var params = {
            Message: tweet,
            PhoneNumber: '「+81」形式の電話番号'
        };
        // Create promise and SNS service object
        new Aws.SNS({apiVersion: '2010-03-31'}).publish(params, function(err, data) {
            if (err){
                console.log('ERROR! : SendSMS');
                console.log(err, err.stack); 
                reject(err);
            } else {
                console.log('SUCCESS! : SendSMS');
                console.log(data);  
                resolve(data);
            }
        });
    });
}

```

## 動作確認してみる
結果はこんな感じで、スマホにSMSで通知されます。
<img width="250" alt="sns_result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/e90e8c0c-d373-4fb6-3979-c3a81b99bcb5.jpeg">

## できた！と思いきや…
できた！と言いたいのですが、動作確認すると、SMSが届かない…
結果を見ますと、たくさん失敗していることがわかります。
<img width="505" alt="graph.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245973/d4cf9c05-5db0-b194-5a3e-941cfeb4f094.png">


原因を知るために、CloudWatchにログを吐き出すと…

```json
{
    "notification": {
        "messageId": "7a24bd83-1034-58b7-b39c-eb31c3ac5dab",
        "timestamp": "2020-02-04 02:05:12.595"
    },
    "delivery": {
        "destination": "電話番号",
        "smsType": "Promotional",
        "providerResponse": "No quota left for account",
        "dwellTimeMs": 251
    },
    "status": "FAILURE"
}
```

…どうやら制限がかかっているようです。SNSはデフォルトで、[月1ドル分までしか使えません。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-sms-spending-limit-increase/)
そのため、AWSに「もっとサービス使いたい！」という**緩和申請**をする必要があります。

## 今後
もうちょっと楽にしたい場合、通知用のAndroidアプリを作って、
そっからインスタにすぐ投稿できるようにするとか、考えてる最中です。
いかんせん、インスタへの投稿を自動でできないのは辛いですね。

また、今後は個人でサイトを作ることを見越して、
S3にツイートの画像を保存する処理を作る予定です。

---

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。
Copyright (C) 2010 - 2020 SQUARE ENIX CO., LTD. All Rights Reserved.