AlexaにTwitterのタイムラインを読ませようとしたら泥沼（大袈裟）にはまった話

# 概要
- AlexaにTwitterのタイムラインを読んでほしくてそんなの無いか探したら、意外と無かった。
- じゃぁ自分で作るか！　と思ったら意外とうまくいかなかった。
- 先人様の知恵をありがたくかき集めて一応できたけど、スキル公開できるかは怪しい。（多分無理）
- プログラミングやばい、楽しい。
- (2020/1/7追記)　スキル公開しました。

# 事の始まり
先日のAmazonのセールで安くなってたので、Amazon echo show 5 を買って自室にAlexaさんをお迎えしました。
Amazon echo show の商品ページは[こちら](https://www.amazon.co.jp/dp/B07KD87NCM)。
2年ほど前お仕事でAlexaをいじっていたので、久しぶりの再会。
主に目覚ましとキッチンタイマーとスマートホームで使ってますが、
どうせならツイッターも画面見るのめんどくさいから読み上げてほしいな、と思い立ったのでした。

# 便利なのを探したら
たぶん誰かスキル作ってくれてるだろう！
と探してみたのですが・・・意外と、無い。
[自分のツイートを読み上げてくれるスキル](https://www.amazon.co.jp/Nakano-Hitoshi-%E9%9D%92%E3%81%84%E9%B3%A5%E3%81%AE%E3%81%95%E3%81%88%E3%81%9A%E3%82%8A-Twitter%E8%AA%AD%E3%81%BF%E4%B8%8A%E3%81%92%E3%82%B9%E3%82%AD%E3%83%AB/dp/B07GXC2ZZ9)はあったのですが。
（この方なら一瞬で作れたんだろうなぁ）

スキルが無くても[IFTTT](https://ifttt.com/)あたりでできるだろう！
と思ったら、Alexaをトリガーにはできるけれど、アクションにはできず。
「アレクサ、○○○」と言ったらツイートする、みたいなのは（多分）できるけれど、逆方向はダメ、と。
（ちなみに私はIFTTT使って「アレクサ、スマホ探しをトリガー」と言うとスマホが鳴るようにしました。部屋でよく無くす。）

うーん、困った。

# 簡単にOAuth連携できると思ったら
見つけられなかっただけかもしれないけれど、無いなら作るかー、と思い立ち、
AlexaのスキルはOAuthでアカウントリンキングできるんだし、
TwitterAPIもOAuthで認証できるんだから余裕でしょ！
と気楽に情報集め開始。

※Alexaのスキルの開発もTwitterAPIの利用も開発者登録が必要なのでご注意
※私は元々持っていたのでそこに障害はなし

[TwitterAPIのリファレンス](https://developer.twitter.com/en/docs/api-reference-index)を眺めて
[Alexa側のアカウントリンキングの設定](https://developer.amazon.com/ja-JP/docs/alexa/account-linking/account-linking-for-custom-skills.html)を考えていると・・・・
なんだかパラメータが合わない。

おっかしいなぁ、とあれこれ調べると、ありがたい先人様方の記事が。
[AlexaスキルでTwitterのアカウントリンクを行う](https://qiita.com/quotto/items/865326ac1e7aa3ac9c3c)
[【Amazon Echo入門#6】AlexaちゃんとTwitterアカウントを連携してみる](https://tech.mof-mof.co.jp/blog/amazon-echo-alexa-skill-link-twitter.html)

- AlexaはOAuth2.0（の Inplicit grant または Authorization code grant） を要求
- TwitterAPIはOAuth1.0の認証を提供　（ユーザに依存しないAPIはOAuth2.0のApplication-only authenticationでも）

ということで、チャチャっと設定してできた、とはならないとのこと。
なんてこった！

もしTwitterAPIでのOAuth2.0のやり方見落としてたりしたら超ごめんなさい。

とはいえ、偉大な先人たちの記事に解決策もありまして、
AlexaとTwitterAPIの間に一段かませばいい、しかもRubyで作ってくれてる方がいらっしゃる、と。

[こちら](https://github.com/bignerdranch/developing-alexa-skills-solutions/tree/master/5_accountLinking)

ありがたく頂戴して、
Ruby使ったことないけどいい機会と思って環境整えて、
[Heroku様](https://jp.heroku.com/)でホストできると知って、デプロイして・・・
（この辺も先人様の記事の通り）

というか、ローカルでもビルドできてませんでした。Ruby初心者。
ソースがRuby2.3.0用でして、今のはRuby2.6.5。
なんだか環境の作り方も今とは違うらしい。
DevKit？　よく分からん。
2.3.0の環境作ろうとしたのですが、なかなかうまくいかないので断念。
そもそもサポート切れみたいだし。
2.6.5でビルド通してしまえ！
と、Gemfileとやらをいじってビルドすると・・・

なんかjsonのライブラリがエラーになる。
まぁ依存関係適当にやると問題起きるよね、仕方ないね、
と思いつつ情報収集すると、やはりありがたい先人様が。

[Ruby 2.4.0 で json gem v1.8.3 をビルドできない問題](https://qiita.com/shinichinomura/items/41e03d7e4fa56841e654)

記事の通りの対処で解消、
あらためてHeroku様にデプロイしてアカウントリンキングの準備完了！

# ついついPython触りたくなった
続いてAlexaの準備。
タイムラインを読むだけなのでたくさん喋る必要はないので対話モデルはシンプルにチャチャっと。
「読み上げて」と、組み込みインテントだけ。
見たことないインテントが増えてましたね。

[AMAZON.FallbackIntentが日本、フランス、イタリア、スペインで使用可能になりました](https://developer.amazon.com/ja/blogs/alexa/post/0f854225-e681-4ec8-b2b1-6a0e8f4bc566/use-the-new-fallback-intent-to-respond-gracefully-to-unexpected-customer-requests-jp)

ちょっと面白そう。

バックグラウンド処理をするWebサービスはAWSのLambdaで用意。
Jaxa, JavaScript(Node.js), Pythonが使えます。
（Alexa Skills Kit SDKs が、3言語で提供されている。）
JavaとかJavaScriptは年単位で使ったことあるし、さらさらっとしか触ったことないPythonやりたい！
と欲が出て採用。

環境を新しくするところからでちょっと時間かかったけれど、
[ドキュメントもサンプルコードも](https://alexa-skills-kit-python-sdk.readthedocs.io/ja/latest/)あるし、
これはたいして問題ありませんでした。
やることもTwitterAPI叩くだけですしね。
PythoneでTwitterAPIを・・・みたいな先人様もたくさんいらっしゃいます。

一部だけ紹介
[PythonでTwitter API を利用していろいろ遊んでみる](https://qiita.com/bakira/items/00743d10ec42993f85eb)
[PythonでTwitter APIを使いたい！](https://qiita.com/h_tashiro/items/ed119c237f5595c3d7b8)

Alexaスキル開発でPythonを採用する場合、
Alexa開発ドキュメント中のサンプルコードはJava, Node.js より少ないので注意かもしれません。
APIリファレンスがしっかりしてるのでちゃんと読めば大丈夫ですが。

そんなこんなでAlexa側も準備完了！

# 最後の障害は、プライバシーポリシー
動作確認もできたので、スキルストアに出すべく、Amazonの審査に出すぞ！　と思ったら。

プライバシーポリシーのWebページURLが設定されていません、って。

アカウントリンキング使うとこれ必須でしたね。2年前は知ってたはずなのに。
個人でちゃんとしたの用意するのは難しいですし、
スキルは公開できないかもしれません・・・。

# プログラミング（？）楽しい！

本日の私
- 当初　スキル探して入れておしまいかな →　予定5分
- スキル作るっても簡単でしょ！　→予定2時間
- Rubyホストするとかできんの？　→もう6時間経った
- もうPythonもやるべ！　→半日経った
- プライバシーポリシー？　→あきらめた

わけあって職業プログラマ辞めて2年近く経ちますが、
久々に時間を忘れてやってしまいました。
やっぱりプログラミング（というほどの事してないけど）楽しいです。

もし気力が沸いて、プライバシーポリシー問題を何とか出来たら、スキル公開するかもしれません。
今は最新10件のツイートとってくるだけしか作ってないのですが、公開出来たら機能増強するかも。
その時は是非使ってやってください。

###ふと思うこと
公開できないで自分で使うだけなら、
認証情報ハードコーディングすればいいわけで、
アカウントリンキングとか考える必要なかったわー。
悲しみ。

#(2020/1/7追記)スキル公開しました
スキル名、「タイムライン読み上げ」です。
プライバシーポリシーのWebページを用意して、どうにか公開できました。
他に、アカウントリンク時の認証は直接Twitterの認証ページに飛ばしちゃダメと審査で指摘を頂き、間に挟むページも用意。
パラメータの引き渡しとかあって、Ruby、というか、[Sinatra](http://sinatrarb.com/intro-ja.html)に慣れず若干ハマりましたが…。

画面付きデバイスで使った時の見た目がだらーっとテキスト並ぶだけであんまりなので、
そのうちちゃんと作りたいですね。
[Alexa Presentation Language（APL）](https://developer.amazon.com/ja-JP/docs/alexa/alexa-presentation-language/understand-apl.html)
スクロール制御とかできるそうなので気になってますが、未調査。