Takuya71 のぶろぐ

外資系ソフトウェア会社で働いてます、認定スクラムマスター

dispatch で Github API をつかい github の starred の情報取得

dispatch で github にOAuth でアクセス

github api を使って自分が star 付けているレポジトリの情報を取得してみるプログラムを実験してみました。

token の取得

まず 最初に Github APIに OAuth でアクセス出来るように、Creating an OAuth token for command-line use の手順とおり、 先にアクセス用の token を取得しておきます。

% curl -u 'takuya71' -d '{"scope":["repo"],"note":"takupatch1"}' https://api.github.com/authorizations

Enter host password for user 'takuya71':

{
  "token": "xxxxxxxxxxxxxxxxxxxxx",
  "app": {
    "url": "http://developer.github.com/v3/oauth/#oauth-authorizations-api",
    "name": "takupatch1 (API)"
  },
  "updated_at": "2012-12-24T04:58:00Z",
  "scopes": [

  ],
  "note": "takupatch1",
  "url": "https://api.github.com/authorizations/xxxxx",
  "created_at": "2012-12-24T04:58:00Z",
  "id": xxxxxx,
  "note_url": null
}

最初の “token” の部分が使用する token です。

starred を取得する API

今回 使用する Star レポジトリを取得するAPIこちら です。

GET /user/starred

プログラム

では プログラムの方ですが Scala での httpのアクセスでは定番の dispatch を使っております。

バージョン

  • Scala 2.9.2
  • Dispatch 0.8.9

build.sbt

name := "disp8-cons"

version := "0.1"

scalaVersion := "2.9.2"

libraryDependencies ++= Seq(
    "net.databinder" %% "dispatch-http" % "0.8.9",
    "net.databinder" %% "dispatch-oauth" % "0.8.9"
)

mystarred.scala

import dispatch.classic._ 
import oauth._ 
import OAuth._ 

val TOKEN = "xxxxxxxxxxx"
val TOKENKEY = "token " + TOKEN

val http = new Http

val u = :/("api.github.com") / "user" / "starred"

val authtoken = Map("Authorization" -> TOKENKEY)

val contents = http(u.secure <:< authtoken as_str)

println(contents)

dispatch の 0.8.9 からは import dispatch.classic._ のように classic としてimport。
認証用の token ですが ヘッダに "Authorization: token mytoken" と指定します、

この部分が

val authtoken = Map("Authorization" -> TOKENKEY)

となります。
ヘッダに指定するには Map(ヘッダ名 -> 値) です。

次に starred の情報を取得する肝心の部分は以下の部分です。

val contents = http(u.secure <:< authtoken as_str)

github APIhttps で接続するため u.secure のように url に secure メソッドを指定します。
secure を付けないと http 接続になってしまい、情報が取得出来ません。 <:< メソッドで ヘッダ情報を追加し、as_str を指定して 結果を文字列として取得します。

  • secure メソッドで https 接続指定
  • <:< で "Authorization:" ヘッダを追加して token を指定

上の例は あえて 一行で書くと

val contents = Http(url("https://api.github.com/user/starred") <:< Map("Authorization" -> "token xxxxxxxxxxxxxxxxx") as_str)

これだけになっちゃいます。

取得結果は

[{"updated_at":"2012-12-13T03:58:10Z","git_url":"git://github.com/banyan/config.git","has_issues":true,"issues_url":"https://api.github.com/repos/banyan/config/issues{/number}","git_tags_url":"https://api.github.com/repos/banyan/config/git/tags{/sha}","clone_url":"https://github.com/banyan/config.git","mirror_url":null,"milestones_url":"https://api.github.com/repos/banyan/config/milestones{/number}","git_commits_url":"https://api.github.com/repos/banyan/config/git/commits{/sha}","stargazers_url":"https://api.github.com/repos/banyan/config/stargazers","languages_url":"https://api.github.com/repos/banyan/config/languages","hooks_url":"https://api.github.com/repos/banyan/config/hooks","owner":{"type":"User","repos_url":"https://api.github.c...

簡単に Github の情報を取得出来そうです。

今日はここまで。