Slackに投稿したニュースの記事をそのままTwitterに投稿するプログラム作ってみた

##やりたいこと
日々、職場でSlackを使っていて社内のチャンネルでニュースの共有と、そのニュースに関してコメントを投稿したりしているのですが、この内容をそのままTwitterに投稿できると時短にもなるし、何より手間なくTwitterも運用できるのでは？と思ったので連携できるプログラムを作ってみました。

いい感じでできたのはいいのですが、Twitter認証と、SlackのEventAPIのところでめっちゃくちゃ躓きました！　もう沼にはまってしまって、くじけそうになったのですが何とか実装できましたので記事に残してみたいと思います。

色々な人の記事も参考にしながら実装しました。先人に感謝感謝です。記事の紹介もしていきたいと思います。

##手順1: TwitterAPIの利用申請を行う

[Twitter APIで遊んでみた ~1. 各種キーの申請と取得~](https://tech-lab.sios.jp/archives/21238)を参考に、まずはTwitterAPIの申請を行いました。英語で入力していくことになりますが、まあGoogle翻訳などを利用しちゃってもいいと思います。

記事通りに進めればここは問題ないかなと思います。API KeyとAPI Key Secretの2つがAPIをたたくときに必要になりますので、適当にメモ帳に保存しておいてください。あとで使います。

##手順2: GoogleAppsScriptを用意し、SlackのEventAPIの準備をする

まずはスクリプトを書くためのファイルを用意します。ファイルの用意は特段説明する必要もないかと思いますが、Googleのページの右上の点々をクリックすると、いろいろなGoogleアプリが出てきますので、そこからGoogleAppsScriptを選んでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/8996187c-e242-a387-f33e-d1474df9d7fc.png)


続きまして、以下の記事を参考にスラックのEventAPIの設定を進めていきます。

https://www.pnkts.net/2020/03/28/slack-event-api

まずは下記のコードをコード.gsに貼り付けちゃってください。

```
function doPost(e){
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}
```

ここまで来たら一度WEBアプリケーションとしてデプロイする必要があります。　
公開＞WEBアプリケーションとして導入、をクリックしデプロイしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/8cc66aa5-0dd2-1e0a-82d0-109fc2e743fe.png)

Who has access to the appと聞かれますので、Anyoneにしてデプロイしちゃってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/c731a21b-3270-22d9-23c6-3350b7249fd3.png)

##手順3: EventAPIのテストをする

以下のサイトにアクセスしてください。

https://api.slack.com/apps

アクセスをするとこんな画面に来るかと思います。記事に従って、右上の『Create New App』からアプリを作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/a8b590e9-cb0b-dd53-d473-a81717d46537.png)


アプリを作成することができましたら、再度以下の記事を参考にしながら、Event APIのテストを行っていきます。

https://www.pnkts.net/2020/03/28/slack-event-api

SlackAPIのEvent Subscriptionという画面に来ていただいて、以下の画像のようにOffになっているものをOnにしてあげてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/1793327d-f9f9-937e-3eff-dde4535430b0.png)

すると、Request URLというのを聞かれますので、ここには先ほどデプロイしたGASのアプリのURLを入れてあげます。GASのスクリプトを書くところに戻っていただいて、current web app URLに記載されてあるURLがRequest URLとなります。すると、『Verified』という文字が出るはずです。　Verifiedが表示されたら無事EvetAPIにて受け取るリクエストをGASのサーバー側で受け取ることができるようになったことを意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/f9e6657f-87c0-4aa5-d750-5df5f67a48d7.png)

続きまして、同じくEvent Subscriptionのページにて『Subscribe to events on behalf of users』の個所をクリックし、利用したいAPIの種類を選んでください。　ここでは、『message.channels』と『message.groups』の2つを選んであげれば大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/362799ca-f63c-eae9-211e-16e4c6ffe66a.png)


そして、最後にいよいよちゃんとdoPostされているかをチェックするわけですが、今回は自分のメールアドレスにSlackからpostされた内容を送ることで確認していきます。なんか、もっといいプログラムあったやろｗと思うのですが、まあいいのです。

```javascript
function doPost(e) {

  var json  = JSON.parse(e.postData.getDataAsString());
  
  var type = json.event.type;
  var channel = json.event.channel;
  var user = json.event.user;
  var postedData = json.event.text;
　var url = postedData.slice(postedData.indexOf("<"));
  var text = postedData.substring(0, postedData.indexOf("<"));
  var newText = text.slice(text.indexOf("】") + 1).trim();
  var channel_type = json.event.channel_type;
  var newUrl = url.replace("<","");
  newUrl = newUrl.replace(">","");
  
  if(user == "UR8SW0FPZ"　&& postedData.indexOf("【共有】") != -1){
    GmailApp.sendEmail("あなたのEmail", "test", "type: " + type + ", channel: " + channel + ", user: " + user + ", text: " + newText + ", channel_type: " + channel_type + ", url: " + newUrl);
    postUpdateStatus(newText, newUrl);
  }

}
```

上記のコードを張り付けましたら、もう一度デプロイをしてあげてください。注意点としては必ずバージョンはNewでデプロイしてあげてください。コードを変更するたびにnewでデプロイしてあげる必要があります。ほかのバージョンでデプロイを最初していたのですが、なぜかEvent APIをうまく受け取れなくなってしまいました。newならなぜかうまくいきます。理由は知りませんｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/9c1703f1-6bce-88d6-a4c5-ee92db9d644a.png)


さあ、ようやくここまで来ました。　まだ半分も行ってないかと思いますが、最後に適当に自分で作成したスラックチャンネルにこのような感じでスラックを投稿してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/6886185c-e025-dcdd-6f8b-3b94377e83e3.png)

こんな感じで自分にメールが送られてきておりましたら無事にスラックからのリクエストをdoPostが受け取って、何らかの処理をすることができるようになっている証拠です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/8452b15b-681a-b475-7d84-809fdb0dd1bb.png)



##手順4:TwitterAPIの認証をするための準備をする

doPostによってSlackからリクエストを受け取ることはできるようになったはずです。ここからは、受け取ったリクエストを利用してTwitterへ投稿するようにしたいと思います。まずはTwitterのAPIを利用するための準備を進めます。

TwitterAPIの認証には、
・OAuth1
・TwitterWebService
という二つの種類のライブラリを使うことになります。
参考にした記事は以下でございますので、早速2種類のライブラリを導入してみてください。

https://note.com/enjoy_asia/n/n5c8c4ba00bb5

無事にライブラリが導入できましたでしょうか。最新のバージョンでも動くかとは思いますが、それぞれバージョン12とバージョン2にしております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/4c16241f-895c-c1a7-6f49-a0db8e5efc87.png)


無事にライブラリの導入ができましたら、次はいよいよ認証用のコードを用意することになります。コードは以下の記事を参考にして、用意してみました。

https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c

実際のコードは以下になります。

```javascript
var twitter = TwitterWebService.getInstance(
  'あなたのAPIKey',       // 作成したアプリケーションのConsumer Key
  'あなたのAPI Secret'  // 作成したアプリケーションのConsumer Secret
);

// 認証
function authorize() {
  twitter.authorize();
}

// 認証解除
function reset() {
  twitter.reset();
}

// 認証後のコールバック
function authCallback(request) {
  return twitter.authCallback(request);
}

// ツイートを投稿
function postUpdateStatus(newText, newUrl) {
  var service  = twitter.getService();
  var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
    method: 'post',
    payload: { status: newText + " " + newUrl }
  });
}
```


##手順5:　コールバックURLを設定し、TwitterAPIの認証をする

あともう少しです！　ここまで来ましたら後は実際にTwitterAPIの認証をしていきます。念のためもう一度最新版のコードをデプロイし、TwitterのDeveloper Portalの以下の画面に行ってください。　『App permissions』はデフォルトですと、Readだけになっているかと思いますので、Read + Postに変更をしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/986df9ef-6ad0-b0d6-c504-7d8861fa8cd2.png)

続きまして、上記画像の『Authentication settings』のEditを押していただき以下3点を対応してください。

・Enable 3-legged Oauthにチェックを入れる
・Callback URLsのところに以下のURLを入れる。

```
https://script.google.com/macros/d/あなたのスクリプトID/usercallback
//スクリプトIDはGASのプロパティというところから確認できます。
```

・Website URLを入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/50a31920-34fd-842c-e42e-19dc621e41c4.png)


その後、後は、以下の記事と同じような手順となります。authorize関数を実行→ログを確認→ログに残っているURLをコピーしてブラウザに張り付ける→許可しますか？みたいに聞かれるので許可する


https://qiita.com/akkey2475/items/ad190a507b4a7b7dc17c



##いざ！実践！

長かった。。。　あとは実際に動くかをテストするだけです。
スラックにて、適当に何かをツイートしてみて、その後にTwitterにも投稿がされていたら成功です。

こちらをスラックに投稿して、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/d77cb771-efab-0b6a-96b0-a98631ed85fe.png)

その後、Twitterにも同様の内容がTweetされています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271600/6898a3fe-5cf0-1b7b-8dc3-79e3627199dc.png)

成功です！　長かった！


躓きながらなんとかできるようになりました。
それにしてもSlackのEventAPIは超絶便利ですね。これを応用すれば様々な自動処理を作ることもできると思います。

この記事を読む人にとって少しでも参考になれば幸いです。
そして、ネットに転がっている先人達の記事に感謝です。