googleカレンダー(iCal)の内容を読み取ってSlackのユーザーステータスを更新する

Slackでユーザーのステータスを更新できる様になりました。

Set your status in Slack – Several People Are Typing — The Official Slack Blog

これを知ったときにカレンダーの予定を読み取って自動的にステータス更新できたら自分の予定を自分に声をかけようとしている人に対して知らせることができるなと思って、APIでも更新できることを知ったので雑に社内で使っている自分のGoogleカレンダーの予定をiCal経由で読み取ってSlackのステータスを更新してみるのを試してみました。

もしこれができると、自分が社内の用事で離席をしていたり外出しているときなどにSlackで何らか声をかけていただいても反応できないときに状況を把握してもらえたり、外部から御電話いただいたときも代表電話を受け付けていただいた方がわざわざ自分のカレンダーを開いて予定を確認していただくといった手間も多少は緩和できそうだな。と。

ということで、こういうときの実験台には当方作成のevacで実験をします。入力をiCal、出力をPOSTリクエスト指定すればよさそう。

なお、出力で指定しているtokenはこのページで取得できます。

以下の様なYAMLを用意して、evacで実行。

in:
ical:
url: https://calendar.google.com/calendar/ical/hideack〜/basic.ics
within: 1
out:
httpPost:
url: "https://slack.com/api/users.profile.set"
body:
form:
token:profile: '{"status_emoji":":clock2:", "status_text":"__word__"}'

これを定期的に実行すると実行時から1時間以内の予定があればSlackのステータスが更新されます。

例えば、下は4月16日 12:00〜 「slackステータス更新試してみるテスト」という予定があった場合。

ステータスを示すアイコンにマウスカーソルを合わせると

f:id:hideack:20170416113246p:plain

といった感じで表示されますし、DMを送ろうとすれば入力欄に

f:id:hideack:20170416113310p:plain

と表示される様になるので当方がいま外出しているかだったり、ミーティング中なのかだったりはお知らせできそうな感じがします。

Slackはこういった形で基本的なコミュニケーションツールとしての基礎の上にプログラマブルに拡張できたりしていく仕掛けを備わっているのが本当に素敵だなぁ。といつも思う。

参考

qiita.com

特定単語のGoogle検索順位をSlackなどに通知したりGoogle analyticsに記録したりする

タイトルが全てシリーズ。

google-search-rankというnpmを作った - テノニッキ (@hideack 's diary)というエントリで書いたとおり検索語に対する特定サイトの検索順位を取得できる様なnpmを作ったので弊作のevacの入力として指定できる様にしました。

例えば、

in:
searchrank:
key: "(google custom search API key)"
cx: "(google custom search engine ID)"
site: pickup.calamel.jp
maxPage: 5
format: ":google: 検索語「__word__」 = __rank__位"
word:
- "よしざわ窯"
out:
ikachan:
url: http://*********
join: false
channel: "#hideack"
message: "__word__"

という設定をYAMLで定義してevacに渡すと指定したSlackのチャンネルに

f:id:hideack:20160820214103p:plain

といった具合でSlack通知させることができます。

Slack以外にも出力としてGoogle analyticsへ順位をアウトプットすることもできるので、そうすると検索順位と実際にサイトのPV等をまとめて管理できるのできっと便利。少なくとも自分は便利。

evacでtwitter検索の結果を拾える様にした

evac - Node.js based simple aggregator -で入力としてtwitter検索を拾える様にしたのでこんなことができる様になります

  • twitter検索で見つかったツイートを....
    • IRCやSlackに通知する
    • 特定のキーワードが含まれた場合のみ特定のアドレスにメールする

例えば「twitter検索した結果をtakosan経由でSlack通知する」という設定は以下の様な形で書けます

in:
twitter:
consumerKey: '****'
consumerSecret: '****'
accessTokenKey: '**-****'
accessTokenSecret: '****'
target: 'search'
query: 'よむよむカラメル'
format: 'ID: __screen_name__ 「__tweet__」 https://twitter.com/__screen_name__/status/__id__'
out:
ikachan:
url: http://takosan.url:4979
join: false
channel: "#sample"
message: "__word__"

上の様に書くと

f:id:hideack:20160423143054p:plain

といった形でtwitter検索した結果がSlackに通知できる様になります。

自分が必要な機能を自分が好きなタイミングで足していく開発の一環でした。


www.npmjs.com

閲覧数が多かったコンテンツをGoogle analytics APIで取得してSlack通知する

コンテンツサイトを運営していると毎朝Google analyticsで昨日公開したコンテンツの反応だったり過去公開したものが盛り上がっていたりしないかをコマメに見る様になるのですが、それを簡単に運営に携わっている全員に共有できないものかな。と思っていたのでevacで一日前の各コンテンツのPV数をGoogle analytics API経由で取得してtakosan経由でSlack通知させる様にしてみました。*1

恥ずかしながらサンプルとして当ブログに一日分の閲覧数トップ5を取得してみます。(このエントリを書いているときに実行したので1日前の元旦終日のPVに相当)

{
"in": {
"googleanalytics": {
"timeago": {
"period": "days",
"ago": 1
},
"metrics": "ga:pageviews",
"dimensions": "ga:pagePath",
"sort": "-ga:pageviews",
"clientId": "xxxxxxx-yyyyyyyy.apps.googleusercontent.com",
"serviceEmail": "xxxxxxx-yyyyyyyy@developer.gserviceaccount.com",
"key": "/Users/hideack/ga.pem",
"ids": "ga:xxxxxx",
"format":"URL: hideack.hatenablog.com{0} = {1}PV",
"limit": 5,
"results": "rows"
}
},
"out": {
"ikachan": {
"url": "http://〜",
"join": false,
"channel": "#evac",
"message": "__word__"
}
}
}

で、上のレシピをevacで実行すると以下の様に前日にアクセスが多かったページのURLがtakosan通知されます。

毎朝決まった時間に実行すれば、注目された記事をGoogle analytics開かずとも知ることができて便利。

ちなみにレシピ中のclientIdとかserviceEmail、keyはGoogle developer consoleから取得します。やり方はこちらに書いてます。もう少し楽に扱えるとよいけどな。

*1:ちなみにtakosan使っているのは一つのエントリポイントで複数のチャンネルに通知ができて便利という理由。incoming webhookを設定しておけばoutputにSlackを直接指定することももちろんできます。(参照)

evacにtwitterのタイムラインを入力にできるプラグインを追加した

evactwitterのタイムラインを入力にできるプラグインを追加してみました。

具体例がわかりやすいので、以下の様なYAMLを用意します。

in:
twitter:
format: '@__screen_name__ 「__tweet__ 」 http://twitter.com/__screen_name__'
consumerKey: '(consumer key)'
consumerSecret: '(consumer secret)'
accessTokenKey: '(access token key)'
accessTokenSecret: '(access token secret)'
filter:
match:
regexp: ".*(Node|node).*"
out:
ikachan:
url: http://ikachan.url
join: false
channel: "#evac"
message: " :nodejs: タイムラインにNode.jsの話題が! \n__word__"

この様に準備すると自分のタイムラインにNodeとかnodeという単語があるとSlack通知されます。

f:id:hideack:20151108162356p:plain

やれることはこれだけなのですが、これをすると何ができるかというとタイムラインに流れた特定のツイートを自動的に検知できるということができます。

上のレシピの例だとNode.jsに関するニュースを逃したくないから通知させるといったモチベーションですが、実務的な例だと、自分が携わっているサービスの公式アカウントなどがあれば、そのアカウントでユーザーをフォローします。そうすると、その公式アカウントのタイムラインは自分のサービスを利用しているユーザの声(=ツイート)が流れます。

そのツイートに対して特定のキーワードが含まれていればSlack通知する等すると、可能な限り早くサービスに関する意見等々を吸い上げる等できる様になったりできるのではないかな。と思っています。*1

相変わらずの自分が欲しい機能を足したという話でした。

v1.4.7 以降で利用できる様になっています。

www.npmjs.com

*1:始終twitterのタイムラインを見るわけにもいかないので...

evacにGAERプラグインを追加した

GAERというとてもクールなツールがあります。

t32k.me

コマンドラインからJSON文字列を与えるとその内容をGoogle analyticsのイベントトラッキングレポートとして情報を渡してくれるもので、任意のキーと値の組み合わせで与えられる情報の推移をグラフとしてAnalytics上で閲覧できる様になるのでWebサイトのアクセス等のトラフィックと各種指標を並べて閲覧できる様になるのでとても便利なツールです。

GAER自体はGoogle analyticsMeasurement Protocolを利用して通知させていますがnpmとして公開されているのでそれを利用すればAPIとして自身のツールの中で埋め込んでも利用することができます。

t32k/gaer · GitHub

今回、これを利用させてもらって弊作のevacの出力として利用できる様にしました。

例えば、Instagramのフォロワー数をGoogle analytics上のイベントに記録するには先日の手順に倣ってInstagramのフォロワー数をAPI経由で取得してGAERを通じてGoogle analyticsに通知してみます。

以下の様なYAMLファイルを用意します。

in:
jsonRequest:
targetProperty: data.counts.followed_by
url: https://api.instagram.com/v1/users/xxxxxxxxx/?access_token=*******
out:
gaer:
id: UA-xxxxxx-99
reportName: Instagram
parameterName: Follower

で、これをevacに食わせます。

$ evac -v instagram_follower.yaml
2015-10-17T07:49:20.287Z - info: Settings are loaded from a file :instagram_follower.yaml
2015-10-17T07:49:20.992Z - info: Input plugin called.
(snip)
Sending [||||||||||||||||||||||||] 100%
Success: The data is sent to UA-xxxxxx-99

Google analyticsのイベントにGAER > Instagram というレポートが追加され、Followerの値が記録される様になります。実際にGoogle analyticsを確認してみるとイベントのレポートの箇所に記録されているのがわかります。

これを定期実行すれば、以下の様な形で日毎のInstagramフォロワー数を記録していくことができ、それをグラフとして確認できる様になります。

evacの入力にはWebページのスクレイピング結果やMySQLへのクエリ発行の結果、iTunes connectを通じたアプリのダウンロード数の取得等ができるので、サービスにまつわるKPIを一括で確認できるダッシュボードとしてGoogle analyticsが使える様になります。(きっと)

Instagramのフォロワー数をevacで通知する

サービスで運用しているInstagramのフォロワー数をパラメータとして注視する様になってきたので、弊作のevacInstagramのフォロワー数を定期的にSlack上へIkachan(takosan)を経由して通知させられる様にしてみた*1のでその際のメモです。

Instagram API のアクセストークン取得

以下の記事が手順を詳しく記載されているので参照ください。

qiita.com

APIを利用するために必要な access_tokenuserのID を控えます。

evacのレシピ作成

以下の様なレシピを作成します。先に控えたuserのIDとアクセストークンを指定します。

in:
jsonRequest:
targetProperty: data.counts.followed_by
url: https://api.instagram.com/v1/users/*****/?access_token=*****
out:
ikachan:
url: http://〜
join: false
channel: "#hideack"
message: ":instagram: フォロワー数 = __word__ 人"

これをevacのレシピとして指定して実行すると今回の場合は以下の様にtakosan通知することができます。

f:id:hideack:20150927115253p:plain


www.npmjs.com

*1:基本、自分が使う機能しか拡張していかない

evacを使ってスケジュール(iCal)をSlack経由で通知する

evacを公開した時のエントリで、iCalの予定を読み込んでMac上のgrowlに通知する等を紹介したのですが、ペパボ社内でSlackが使われる様になったので通知をSlackに移しました。

やり方としては自分用のチャンネルをSlack上に開設してmention付きで通知させることでMacの前で作業しているときはSlackのnoticeで通知され、ミーティング等でMacの前にいない場合もiPhoneにプッシュ通知されるので便利。(だと思います。)

ペパボでは誰でも利用できる形でtakosanが用意されているので、evacのikachanプラグインを使うことでslack通知させることができます。

といったフローになります。

$ npm install -g evac

evacはインストールができますので、以下の様なレシピを用意します。

ここでは実行時点から1時間以内の予定を通知対象にします。

in:
ical:
url: http://〜/****.ics
within: 1
out:
ikachan:
url: http://******
join: false
channel: "#evactest"
message: "@hideack __word__"

あるいは、incoming webhook が確保できればそちらを使うこともできます。

in:
ical:
url: http://〜/****.ics
within: 1
out:
slack:
url: https://hooks.slack.com/services/****/****/****
format: "@hideack __word__"

こういったYAMLファイルを用意した上でcron等で定期的に以下の様な形でevacに設定を渡すと...

$ evac /home/hideack/evac/plan-notice.yaml

以下の様にslack上で予定が通知されます。

これできっと「あ!」っということが減るはずです。

evac weekly – スクリーンショット取得プラグイン追加

evac - Node.js based simple aggregator - でこの一週間改良した箇所まとめです。

screenshotプラグイン追加

outputプラグインとしてPhantomJSでスクリーンショットを撮影できるプラグインを追加しました。入力として与えられたURLのスクリーンショットを撮影できる様になりました。

例えばこの様なレシピを用意して、

in:
textfile:
name: /home/hideack/recipe/url.txt
filter:
through:
out:
screenshot:
path: /home/hideack/recipe/screenshots

入力としてURLのリスト、

www.remp.jp/hello
www.yahoo.co.jp
hideack.github.io/evac/

を与えれば、以下の様にスクリーンショットをまとめて撮影することができます。

スクリーンショットはレシピで指定したパスにPNGファイルとして保存されます。

evac Ver.1.3 以降で利用可能です。

evac

evac weekly – ikachanプラグインを少し修正

evac - Node.js based simple aggregator - でこの一週間改良した箇所まとめです。

ikachanプラグインにjoinフラグ追加

ikachanに通知するアウトプットプラグインが今まで必ずjoinしてからメッセージを送る形になっていたので、joinコマンドの結果に関わらず直接メッセージ送れる様にするため、joinフラグを追加しました。*1

joinフラグをfalseにするとjoinを省略します。

以下のレシピの例では、某サイトから「◯◯.◯%」といった形式で評価値が掲載されているページからその数値のみをスクレイピングして #hideack チャンネルに「現在の評価 = ◯◯.◯%」といった形でikachan通知させる例。

in:
webPageParse:
url: http://〜
target: "body > div.maincol > table"
filter:
match:
regexp: "\\d\\d.\\d\\s%"
out:
ikachan:
url: http://〜
join: false
channel: "#hideack"
message: 現在の評価 = __word__

*1:目的は業務で使っていたikachan通知をtakosanに移行したところevacからoutputできなくなったので...