【マストドン】IoTボタンをぽちぽちして、マストドンにTootする。【IoT_MESH】
マストドンブーム、火がついてから一ヶ月くらい?
とりあえず一段落したんですかねー。
私はというと、すっかりtwitterよりmastodon派ですね。
mstdn.jpに参加してるんですが、なんかtwitterよりこっちの空気の方が落ち着く。。
せっかく継続してマストドン使っているので、私もなにかいじってみたいなーということで、やってみました。
1)やりたいこと
さて、以前MESHのボタンタグでブラインドタッチでツイッターに呟くというのを作りました。
MESHというIoTボタンを使っていて、こんな感じにボタンをポチポチして呟くイメージです。
今回はこれを改造して、手元のボタンをポチポチ押すと、マストドンでトゥートできる仕組みを作りました。こんな感じ。
2)開発環境
使用した環境を並べるとこんな感じ。
・MAC OS Sierra 10.12.4
・heroku(Webサーバ)
・JAVA
・mastodon4j( JAVAのmastodon client)
mastodon4jというJAVAのクライアントを公開している型がいたので、こちらを使わせていただきました。感謝。
3)[事前準備]認証情報の取得
APIを叩いてトゥートするためには、認証が必要となるので、
事前に認証情報を取得しておきます。
こちらを参考にさせていただき、AccessTokenを取得しました。
これをメモっておきます。
4)作った構成
構成はこんな感じです。
【入力部分】は前回の記事でそのままでです。【受渡部分】も受渡先を1行書き換えただけ。
今回主に書いたのは、【出力部分】と書いた「POSTで受け取ったデータにハッシュタグを付けてTootする」アプリ部分ですね。
4-1)MESH部分
【入力部分】は、MESHのボタンを押して、文字入力できるように作ってあります。
ボタンの押し方(1回押し、2回連続押し、長押し)と、押した回数の組み合わせで、文章を書いて受け渡すというものです。
【受渡部分】は、受け渡す先のURLだけ書き換えてこんな感じ。
var data = { "name" : messageValues.Text //変数名「name」に「messageValues.Text」を入れる。 }; log("「"+messageValues.Text+"」とつぶやきました。"); ajax({ url : "ほげほげ",//受渡先のアドレス type : "post", //postかget data : data //受け渡すデータ } );
Execute部分に、こんな感じで書きます。
ただもらったデータを次のアドレスに受け渡すだけ。超シンプル。
4-2)トゥート部分
mastodon4jを使って、トゥートするアプリを作ります。
AccessTokenに、上記で取得した値を入れます。
メインはこちら。ただトゥート用のクラスを呼ぶだけ。
MstdnTest2Application.java
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import com.sys1yagi.mastodon4j.api.exception.Mastodon4jRequestException; @SpringBootApplication public class MstdnTest2Application { public static void main(String[] args) throws Mastodon4jRequestException { SpringApplication.run(MstdnTest2Application.class, args); } @Bean ServletRegistrationBean statsServlet() { return new ServletRegistrationBean(new FooServlet(), "/toot"); } }
トゥート用のクラスはこちら。
package com.example; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.gson.Gson; import com.sys1yagi.mastodon4j.MastodonClient; import com.sys1yagi.mastodon4j.api.entity.auth.AccessToken; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.RequestBody; public class FooServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
//POSTで受け取った値を表示 String val = req.getParameter("name"); System.out.println("受け取った値は=="+val+"です。"); //AccessTokenを設定// AccessToken accesstoken = new AccessToken(); accesstoken.setAccessToken("ここにAccessTokenを書く");
//MastodonClientを作成。使ったインスタンスはmstdn.jp。 MastodonClient client = new MastodonClient.Builder ("mstdn.jp", new OkHttpClient.Builder(), new Gson()) .accessToken(accesstoken.getAccessToken()) .build(); //POSTする内容をRequestBodyとして記載 RequestBody formBody = new FormBody.Builder() .add("status", val+"#MESHからトゥート!!")//受け取った値+ハッシュタグ .add("visibility", "private")//非公開に設定 .build(); //mastodonにポスト&その結果を画面上に出力 System.out.println("====="+client.post("statuses",formBody)); } } }
書き方ですが、上記のmastodon4jのドキュメントと、公式のAPI リファレンスを見たら、なんとなく出来ました。
5)完成品
こんな感じで、ぽちぽちボタンを押して文字入力して、
2回連続長押しすると、トゥートします。
無事に、MESHのボタンを押してトゥートできました。
めでたしめでたし。
ちなみに、こんな感じで、twitter用とmastodon用の両方に接続すると、、
同じ内容を、両方に投稿できます。
これを試したときは、ツイッターの方が若干ラグがあって、
一瞬「あれ?マストドンしか動かなくなった。。」って焦りましたが、ログとか確認してる間に反映されてました。
マストドン関係は、まだネット上に(私みたいな素人向きな)ドキュメントが少ないですね。
でもそんなに複雑な仕組みじゃないおかげで、なんとかなって良かったです。
ではまたー。