はてなブックマークとYammerを連携する

Yammerという情報共有ツールがあります。

Pocketで読んでる記事を職場で共有したい場合はPocket上でタグを付けるとYammerに投稿するというIFTTTレシピを使ってました。

![ifttt](http://barcelona-prototype.com/sandbox/yammer/ifttt_pocket_yammer.png "ifttt")

これはこれで便利だったのですが、IFTTTがYammerの対応をやめるというのと、前から、はてなブックマークと連携させたいと思ってたので、この機会に自作してみました。

# 事前準備

## サーバの用意

Yammer APIにはPythonのSDKがあるので、これを使うことにします。今回は、さくらインターネットの５００円プランでPythonを動かすことにしました。setup.pyのときに`--user`を付けるのがポイントです。

```
 $  wget https://github.com/yammer/yam-python/archive/master.zip
 $  cd yam-python-master/
 $  python setup.py install --user
```

## Yammerでアプリ登録

ライブラリの動作確認ができたら、こちらのサイトを参考にアプリ名とリダイレクトURLを登録し、client_idとclient_secretを入手します。今回は、さくらインターネットを使うので、redirect_uriに`http://xxxx.sakura.ne.jp/yammer/redirect.cgi`と設定します。

https://developer.yammer.com/docs/app-registration

## はてなブックマークでWebHook登録

次に、はてなブックマークでWebhookを登録します。下記の手順を参考に「イベント通知を受けとるURL」に`http://xxxx.sakura.ne.jp/yammer/post.cgi`と設定します。

http://developer.hatena.ne.jp/ja/documents/bookmark/apis/webhook

# コーディング

最初に、うっかりclient_idとclient_secretを漏洩してしまわないよう、別ファイルにして、htaccessでアクセス制限をかけておきます。

```:yammer.conf
[Yammer]
client_id = xxxx
client_secret = xxxx
redirect_uri = http://example.com/redirect.cgi
access_token = xxxx
```

```:.htaccess
AddHandler cgi-script cgi
<Files ~ ".conf">
deny from all
</Files>
```

## access_tokenの取得

OAuthですので、こんな感じの処理をApplication側に書くことになります。（画像はmashapeの[OAuth Bible](http://oauthbible.com/)から）

![](http://puu.sh/2pJ4y)

Yammerからのリダイレクトはredirect.cgi?code=xxxxという形式で返ってくるので、URLに`code=`がない場合は図の`Get Request Token`と`Direct User To Service Provider`の処理を、`code=`がある場合は`Exchange Request Token for Access Token`の処理を実行するように書いています。

```py:redirect.cgi
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import yampy
import cgi
import ConfigParser

config = ConfigParser.RawConfigParser()
config.read('yammer.conf')

client_id = config.get('Yammer','client_id')
client_secret = config.get('Yammer','client_secret')
redirect_uri = config.get('Yammer','redirect_uri')

authenticator = yampy.Authenticator(client_id=client_id, client_secret=client_secret)

form = cgi.FieldStorage()
if form.has_key("code"):
    # Yammerから取得したCode(Request Token)からaccess_tokenを生成する
    code = form["code"].value
    access_token = authenticator.fetch_access_token(code)
    print "Content-Type: text/html"
    print ""
    print access_token
else:
    # 認証用URLを生成しYammerの認証画面へリダイレクトする
    auth_url = authenticator.authorization_url(redirect_uri=redirect_uri)
    print "Location: "+auth_url
    print ""
```

このファイルをサーバに配置して`http://xxxx.sakura.ne.jp/yammer/redirect.cgi`にアクセスすると、Yammerのログイン画面にリダイレクトされます。この画面でYammerにログインして承認ボタンを押すと、access_tokenが表示されます。

このaccess_tokenをコピーしてyammer.confに書けば、下記のpost.cgi経由でyammerに投稿できるようになります。（この部分は自動化しませんでした・・・）

```py:post.cgi
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cgi
import yampy
import ConfigParser

config = ConfigParser.RawConfigParser()
config.read('yammer.conf')
access_token = config.get('Yammer','access_token')

form = cgi.FieldStorage()
if form.has_key("comment"):
    comment = form["comment"].value
    # コメントにyammerの文字列がある場合、Yammerに投稿する
    if comment.find('yammer') > -1:
        url = form["url"].value
        title = form["title"].value
        body = title + ' ' + url
        yammer = yampy.Yammer(access_token=access_token)
        yammer.messages.create(body)

print "Content-Type: text/html"
print ""
print body
```

これで、はてなブックマークでyammerというタグを付けると、Yammerへ投稿してくれます。