powershellからyammerにアクセス(yammer REST API)

そんなわけではてなブログに技術メモを書きます。

Wordpressで慣れているので、記法はmarkdownを選択。

あとpowershellシンタックスハイライト効かないので、以下記事を参照にする。

ちょっと用事でyammerのデータを取得する必要があったので調査。yammerはAPIを提供してくれているのでそれ使えばよい。

developer.yammer.com

RESTでのアクセスとなる。

昔、rubyfacebooktwitterのデータを取得していたがそれはrubyの便利ライブラリを使ってのことであって、REST APIを生で使うのは初めてであるので'yammer rest api powershell'で調べた結果がこちら。

blog.kloud.com.au

結論から言うとこの記事の通りにやってデータを取得することができた。

…という記事だけだと寂しすぎるので、少し解説。

1. yammerアプリケーション登録

プログラム以前の問題として、yammerにアプリケーション登録し、クライアントIDと秘密鍵を発行してもらわないといけない。

  • (本人)yammerにアプリ登録
  • (yammer)クライアントIDと秘密鍵を発行
  • (本人)REST API経由でアクセス(クライアントIDと秘密鍵でトークンを作成)
  • (yammer)クライアントIDと秘密鍵(実際はトークン)を照合し、正しいリクエストであることを確認してデータを返す

なんでこんな事するかってーと、REST API経由でのアクセスをyammer側で管理するため。例えば1秒間に100回リクエストを送ってくるクライアントIDは一時的にアクセス不可にするとか。同等の仕組みはfacebooktwitterにもあります(よくAPI制限がどうたら~ってのはこの事)

アプリケーションの登録はこちらから↓

https://www.yammer.com/client_applications

'アプリ'といっても実際WebアプリやiPhoneアプリを作るわけではないが、REST界隈ではそういう言い方をします。名前は適当に作ってclientIDと秘密鍵をゲット。アプリの名前などを変えたければ新規アプリを登録して、そちらのclientIDと秘密鍵を使えばいい。

2. 認証コードの取得

clientIDを使って認証コードをゲット。

以下のようなURLにアクセスすれば認証コードをゲットできる。

https://www.yammer.com/dialog/oauth?client_id=$clientID&redirect_uri=$RedirURL

powershellでやる場合はこちら。

$clientID = "xxxxx"
$clientsecret = "xxxxx"
$RedirURL = "https://www.yammer.com/xxxxx.com"
 
$ie = New-Object -ComObject internetexplorer.application
$ie.Visible = $true
$ie.Navigate2("https://www.yammer.com/dialog/oauth?client_id=$clientID&redirect_uri=$RedirURL")

# この時点で秘密鍵は不要

そうすると、

http://www.xxxxx.com/?code=xxxxxxxxxxxxxxxxxx

みたいなページに飛ぶ。ここのcode=xxxxxxxxxxxxxxxxxxが認証コードになります。

3. 認証トークンの取得

認証コードが分かったら

の3点セットがそろうので、以下のページにアクセスして認証トークンをゲット。

https://www.yammer.com/oauth2/access_token.json?client_id=$clientID&client_secret=$clientsecret&code=$Authcode

powershellで書くならこちら。

$ie = New-Object -ComObject internetexplorer.application
$ie.Visible = $true
$ie.Navigate2("https://www.yammer.com/oauth2/access_token.json?client_id=$clientID&client_secret=$clientsecret&code=$Authcode")

4. APIにアクセス

適当な場所にダウンロードしたトークンをパースして、認証ヘッダーに含めてAPIにアクセスします。

$Openjson = $(Get-Content 'C:\Tokens\access_token.json' ) -join "`n" | ConvertFrom-Json
$token = $Openjson.access_token.token

$uri = "https://www.yammer.com/api/v1/messages.json"
$uri = "https://www.yammer.com/api/v1/search.json"
     
$Payloadjson = '{
"search": "test"
}'
 
$Headers = @{
"Accept" = "*/*"
"Authorization" = "Bearer "+$token
"accept-encoding" = "gzip"
"content-type"="application/json"
}
 
Invoke-RestMethod -Method Post -Uri $uri -Header $Headers -Body $Payloadjson