こんにちは!
今回は、つい最近、アレクサのスキル開発を行ってみたので、その活動記録です。
実際に作ったスキルは、こんな感じです。
『Alexa × Message API でQiitaのトレンド教えてくれる奴』
使うかどうかは置いといて、とりあえず完成
スキル開発というより、トレンド引っ張ってくることに苦戦した pic.twitter.com/5fgMJzZyPX
— tomo (@tksx1227) September 17, 2020
アレクサのスキル開発自体初めてで、まあまあ苦労するポイントもあったのですが、大体4日ほどで完成しました。
ということで、その辺のお話もします!
ゆるーく、読んでいただけるとありがたいです。
使用技術など
今回使用した技術はこちらです。
使用技術など
・Python 3.7.7
・Message API
・Alexa Skills Kit SDK for Python
LINE Bot側、Qiitaのトレンド取得用のプログラムはローカル環境で作成し、アレクサ側のプログラムは、Alexa Developer Console上で作成しました。
スキルの概要
では、今回作ってみたスキルの概要を紹介します。
希望すれば、LINEにもトレンド情報を送信してくれる。
と、まあこんな感じです。
アレクサが読み上げる際は、トレンド記事のタイトルとLGTMの数だけを教えてくれます。
で、LINEに送信してもらう際は、読み上げた2つの情報に加え、記事のURLもセットで送信してくれるようにしました。
おまけ機能として、LINE Bot単体でも機能するようにしています。
(ツイートのリプライ)
これはおまけ機能 pic.twitter.com/u8y8ak6Ei8
— tomo (@tksx1227) September 17, 2020
「おまけの機能だけで十分だろ」とか言わないでね…!
あくまでも、アレクサのスキル開発をしてみたかっただけだから!
処理の流れ
処理の流れは、大きく分けて3つのブロックで成り立っています。
上の図は、ユーザーがスキルを起動してから、トレンド情報を教えてもらうまでの処理の流れになります。
①~⑥までの処理を説明します。
- スキルを起動し、取得するトレンド記事の期間と数を指定
- アレクサは受け取った内容を、AWS lambdaのエンドポイントへ送信
- 発言内容のうち、期間と数の情報だけを抽出し、Flaskサーバーへ送信
- ③で受け取った期間と数に基づき、Qiitaのトレンドを取得後、その情報をエンドポイントへ送信
- ④で受け取った情報から、読み上げ用テキストを作成し、アレクサへ渡す
- テキストを読み上げる
ザックリとした内容はこんな感じです。
上記の処理を終えた後、LINEへの送信を希望する場合は、①~③の経路を辿って、Message APIを叩きます。
そうすれば、取得した情報をLINE botのアカウントから受け取ることができます。
処理の流れは以上です。
苦戦したところ
初めてのAlexaスキル開発だったとはいえ、苦戦したところはアレクサ関係ではなく、意外なところでした。
はい、Qiitaのトレンド情報の取得です。
実際に試した方法は、Qiitaのトレンド記事をスクレイピングにまとめてみました。
1日、週間、月間はURLのパラメータですぐに判別できました。
「じゃあ、scopeを指定して、GETリクエストを飛ばせば終わりだな」、と思ったのですが、そんな簡単な話ではなかったです、、
何度やっても1日のトレンドしか返ってこない謎現象。
数分後に気づいたのですが、なんと、1日のトレンドならまだしも、週間・月間トレンドは、Qiitaにログインしていないと見れないとのことです。
ということで、自動ログインのプログラムを組む必要があったわけですが、これに時間をごっそり持っていかれました。
Seleniumを使えば簡単に実装はできるんですけど、ChromeDriverが必要だったりと、色々と面倒だったので却下。
というわけで、まずは、requestsモジュールを使った方法を色々試していました。
Qiitaや他のブログ記事を参考にしながらプログラムを組んでみるものの、まあうまくいかない。
どうやっても、 <Response [500]> が返ってきて終わり、という笑えない始末。
諦めてSeleniumに頼ってみたところ、時間制限でそもそも使い物にならないという結果に、、
アレクサのスキルは、仕様上、7秒以上かかる処理ができないのだが、Seleniumだと余裕で超える、超える…!
「詰んだわ、、」と思いつつ、打開策を考えました。
で、思いついた方法が、「スキルを起動するタイミングで、ログイン処理を並列処理で行う」というものです。
ログイン情報は、Cookieとセッションをうまく使えば保持できるっぽかったので、これを使いました。
ということで、並列処理を使って、無事自動ログインの実装ができました。
アレクサ側以上に、こいつに手こずった、、
ちなみに、アレクサ側での苦労と言えば、よくわからないオブジェクトをいじる必要があったため、目的の値がどこにあるのかを探す作業が大変でした。
あとは、デバッグの仕方がよくわからなくて、エラーを修正する作業も大変でしたね、、
まあ、苦戦したところはこんな感じです。
あとがき
アレクサのスキル開発は初めてだったのですが、意外に簡単にできる、というのが正直な感想です。
もっと複雑なものかと思っていましたが、公式のチュートリアルを確認すれば、大体の仕様は理解できました。
実際に見ていたチュートリアルはこちらになります。
全部でシーズン6までありますが、僕は、シーズン3までは動画と同じスキルを作ってみて、その後は今回のスキル作りにシフトしました。
実際に見た動画もシーズン4までです。
それだけ見れば、こんな感じのスキルであればサクッと作れるようになります。
という感じで、今回のスキル開発は終わったんですけど、もう少しアイデアがあれば何か作ってみたいです!
音声デバイスって、組み合わせ次第では、結構いい感じのアプリとか作れそうですしね。
僕、音楽聴くのかなり好きなんで、音楽関係で便利そうなやつとか作ってみたいですね。
まあ、ぼちぼち考えてみます!
ということで、アレクサのスキル開発は意外に簡単にできるんで、是非試してみてください。
では、今回はここでおしまい!