p-hone p-hone.info

pixivの通知をSlackに通知するのを作った

きっかけ

pixiv に絵をアップすると「あなたのイラストがxいいねされました!」といったうれしい通知が来ることがあって、これとてもうれしいので定期的にチェックしたくなります。しかし、スマートフォンのブラウザで pixiv が正直非常に!!!!使いづらい!!!

広告が多すぎる上に通知ボタンが小さい!!!画像で説明すると緑枠(通知ボタン)を押したいのに間違えて赤枠の広告部分を押してしまったりする。

これはスマートではないし、そもそも通知を見たいだけなのにわざわざスマートフォン版のWebページにアクセスするのもおかしい気がしたので、通知があったら Slack に届く、それで十分でしょうと思った。

Google App Engine で監視&通知を実装

上の図みたいな雰囲気で Slack に通知してくれる環境をつくりました。これでかなりストレスフリーになって最高。なぜ Google App Engine で作ったか?最近自分が Google さんにべったりなのもあるけど、明確な理由がいくつかある。

まぁ少し「え、使いづらい…」という部分も正直あるけどメリットがかなり強いので総合的にはアリ!って感じになった。

これは pixiv に限らずいろいろな応用できそうなので、すごくおすすめです。実装は全部 github にあげているので皆さん Google App Engine やっていきましょう。

castaneai/pyxis
_pyxis - Pixiv notifications to Slack on GAE/Go_github.com

実装時にはまったポイント

Google App Engine から HTTP Request を飛ばすときは urlfetch という専用のライブラリを使う必要がある。

なので slack に投稿…楽したいからライブラリ使おう!ってやったら「あれ…通知が来ない…」ということになった。面倒だったけど自前で incoming webhook にHTTP POST する処理をかいた。

type SlackMessage struct {  
 Text    string `json:"text"`  
 IconURL string `json:"icon_url,omitempty"`  
}

func postSlackMessage(ctx context.Context, slackWebHookURL string, message *SlackMessage) error {  
 hc := urlfetch.Client(ctx)  
 buf, err := json.Marshal(message)  
 if err != nil {  
  return err  
 }  
 resp, err := hc.Post(slackWebHookURL, "application/json", bytes.NewReader(buf))  
 if err != nil {  
  return err  
 }  
 defer resp.Body.Close()  
 io.Copy(ioutil.Discard, resp.Body)

if resp.StatusCode >= 400 {  
  return fmt.Errorf("unexpected status code: %d", resp.StatusCode)  
 }  
 return nil  
}

面倒とはいっても、まぁこれぐらいなので Go と Slack 便利だなーって気分になった。とてもよい