くりにっき

フルスタックキュアエンジニアです

go-doorkeeperを作った

github.com

go-doorkeeperについて

golangDoorkeeper API を利用するためのAPIクライアントです

最近golangでDoorkeeperのAPIを叩きたい需要が発生したんですが誰も作ってなさそうだったので作りました。*1

使い方

READMEからコピペ

package main

import (
    "github.com/sue445/go-doorkeeper"
    "os"
)

func main() {
    accessToken := os.Getenv("DOORKEEPER_ACCESS_TOKEN")
    if accessToken == "" {
        panic("DOORKEEPER_ACCESS_TOKEN is required")
    }

    client := doorkeeper.NewClient(accessToken)

    // List all featured events
    events, rateLimit, err := client.GetEvents(&doorkeeper.GetEventsParams{})
    // more options
    events, rateLimit, err := client.GetEvents(&doorkeeper.GetEventsParams{Query: "golang", Sort: doorkeeper.SortByPublishedAt()})

    // List a community's events
    groupName := "trbmeetup"
    events, rateLimit, err := client.GetGroupEvents(groupName, &doorkeeper.GetEventsParams{})

    // Show a specific event
    eventID := 28319
    event, rateLimit, err := client.GetEvent(eventID)
    // or
    event, rateLimit, err := client.GetEvent(eventID, doorkeeper.WithLocale("en"))

    // Show a specific group
    groupName := "trbmeetup"
    group, rateLimit, err := client.GetGroup(groupName)
    // or
    group, rateLimit, err := client.GetGroup(groupName, doorkeeper.WithLocale("en"))
}

*1:「doorkeeper api」でググると全く関係ない方のdoorkeeper gemしか見つからなかったのでそいつがノイズになって見つけられなかった説はある

Doorkeeper APIレスポンスメモ

先日AZusaar!!がDoorkeeperに対応しましたが、リファレンスページにレスポンスが載ってなかったので後進のためにメモっときます。

あくまで僕自身の解釈なので間違ってるかもしれません。あしからず。

レスポンスサンプル

[
  {
    "event": {
      "title": "RejectTokyoRubyKaigi10",
      "id": 1974,
      "starts_at": "2012-12-08T05:00:00Z",
      "ends_at": "2012-12-08T10:00:00Z",
      "venue": "Drecom さま会議室",
      "address": "東京都目黒区下目黒1-8-1",
      "ticket_limit": 40,
      "description": "<h3>概要</h3>\n\n<p>TokyoRubyKaigi10 に Reject  された人 or されてなくても何か喋りたい人が集まって発表する会です。</p>(略)",
      "participants": 11,
      "waitlisted": 0
      "public_url": "http://reject-tkrk10.doorkeeper.jp/events/1974",
    }
  },
  {
    "event":{}
  }]

実際はユニコードエスケープされていますが、分かりやすいように日本語にしています

eventの中身

名前 説明
title イベント名
id イベントID
startsAt 開始日時
endsAt 終了日時
venue 開催場所
address 住所
ticketLimit 定員人数
description 概要
participants 参加者数
waitlisted 補欠人数
publicUrl イベントページのURL
  • startsAtとendsAtはGMTなのでJSTにする場合は+9時間

Java用サンプルコード

実際にAZusaar!!で使ってるソースコードの一部です。(要: JSONIC)

AZusaar!! のPARTAKEユーザイベント APIの仕様について

需要あるかどうか分かりませんが一応まとめておきます

概要

  • PARTAKEのユーザIDから、参加・開催しているイベントを取得します
    • User API の /api/user/events と /api/user/tickets をAZusaar!!のサーバサイドでラップしています
  • レスポンスはJSONとJSONPだけに対応しています
  • 基本的にはATND API(以降ATND仕様)に準拠していますが、AZusaar!!で必要のない項目は削っています
  • 同じ名前のパラメータでも意味が違うものがあるのでご注意を

API詳細

リクエストURL

PARTAKE
http://azusaar.appspot.com/api/partakeUser

検索クエリ

パラメータ 項目名 説明
user_id 参加者のユーザID
owner_id 主催者のユーザID PARTAKE APIでいうところのowner(主催者)とeditor(編集者)の両方を取得します
ym 検索対象年月 YYYYMMで指定(例:201206)。省略時は年月で絞り込みません
callback JSONPのコールバック関数名 callbackがある場合はJSONP, ない場合はJSONで返却
  • 他のイベント検索APIと違ってページングはありません
    • ページングするだけの量もないだろうしw
  • user_idとowner_idはどちらか1つだけ指定できます

レスポンスフィールド

フィールド 説明 備考
results_returned 含まれる検索結果の件数
results_start 検索の開始位置 ページングがないので0で固定
event [複数要素]
└ title タイトル
└ event_url PARTAKEのイベントページのURL
└ started_at イベント開催日時 「2012-06-20T19:30:00+09:00」のようなフォーマット
└ address 開催場所
└ place 開催会場

APIの利用について

  • 節度を守ってご利用ください
  • 事前、事後ともに報告は不要です

他のAZusaar!! APIについて

http://sue445.hatenablog.com/category/API

AZusaar! 検索API仕様 その2

Twitterで質問があったので補足。

リアルタイムな検索結果とそうでない検索結果

  • リアルタイムな検索結果(イベント内容が変更された時にAZusaar!で即座に反映される)
    • ATND
    • Zusaar
    • eventATND
    • connpass
  • そうでない検索結果(イベント内容が変更された時にAZusaar!で反映されません)
    • こくちーず
    • PARTAKE

リアルタイムでない検索結果が返ってくる理由は、サーバ側で保存している検索結果を返しているからです。

こくちーず API

APIがないため定期的に新着RSSを取得して保存し、それを検索で使っています。

今まではソースがRSSだけだったので、こくちーずでイベントページが作られてからしばらく経って公開された場合、新着RSSに出なくなるのでAZusaar!で検索できませんでした。

今はTwitterのタイムラインからこくちーずのURLを拾ってくるようにしたため、以前よりはヒットするイベントは増えていると思います。

ただしイベント内容は

<meta property="og:description" content="~" />

から引っ張ってるため、イベント内容での検索精度は低いです。(RSSでも大差ないですが)

ちなみにdescriptionじゃないのは、og:descriptionの方が長いからですw
スクレイピングはめんd(ry

PARTAKE API

PublicWebAPI - partakein - 公開WebAPIの仕様について議論してまとめるページ - A web application for event management - Google Project Hosting

AZusaar!ではこのAPIを使っているのですが、日付で検索することができないため新着イベントを定期的に取得してDatastore*1に保存し、検索の時はそれを表示しています

                          • -

こくちーずにしろPARTAKEにしろ、サーバに保存されていないイベントしか保存していないので、途中で内容が変更された場合には対処できません(古い内容で検索がヒットする)

そのため、AZusaar!では基本的にサーバ側でデータは極力持たないようにしています。

                          • -

追記:はてなブログ内をリンクするのってどうやるんだろ・・・

AZusaar! 検索API仕様

はてな記法の練習のためにAZusaar!APIの仕様をまとめてみます

概要

  • Zusaar, こくちーず, PARTAKE, doorkeeper の検索に対応しています
  • レスポンスはJSONとJSONPだけに対応しています
  • 基本的にはATND API(以降ATND仕様)に準拠していますが、AZusaar!で必要のない項目は削っています
  • 同じ名前のパラメータでも意味が違うものがあるのでご注意を

API詳細

リクエストURL

Zusaar
http://azusaar.appspot.com/api/zusaar
こくちーず
http://azusaar.appspot.com/api/kokucheese
PARTAKE
http://azusaar.appspot.com/api/partake
Doorkeeper
http://azusaar.appspot.com/api/doorkeeper

検索クエリ

パラメータ 項目名 説明
keyword 検索キーワード(AND) 文字コードUTF-8。複数指定した場合はAND検索
ym 検索対象年月 YYYYMMで指定(例:201206)
ymd 検索対象年月日 YYYYMMDDで指定(例:20120601)
start 取得開始位置(1~) 初期値:1
count 取得件数(1〜100) 初期値:100
allReturn 全件取得フラグ 検索結果を全件取得する。allReturnが指定されていた場合startとcountは無視される
dayUnique 日付重複無視フラグ 同じ日付のイベントは最初の1件だけしか返さない
callback JSONPのコールバック関数名 callbackがある場合はJSONP, ない場合はJSONで返却
  • ATND仕様と違い複数指定できるのはkeywordだけ
    • 複数指定する場合はkeyword=aaa&keyword=bbbのようにしてください (カンマ区切りはダメです)
  • ymとymdのどちらか片方だけ指定可能
    • 両方ある場合はymdが優先
    • 両方ない場合は今月分を検索
  • フラグは1もしくはtrueを指定すれば有効になります
  • Zusaarは本来形態素検索*1しかできませんが、AZusaar!では全文検索を行います

レスポンスフィールド

フィールド 説明 備考
results_returned 含まれる検索結果の件数
results_start 検索の開始位置
event [複数要素]
└ title タイトル
└ event_url Zusaar,こくちーず,PARTAKEのイベントページのURL
└ started_at イベント開催日時 「2012-06-20T19:30:00+09:00」のようなフォーマット。こくちーずのイベントの時刻は常に「00:00:00」です
└ address 開催場所
└ place 開催会場
└ lat 開催会場の緯度
└ lon 開催会場の経度
  • results_returnedには実際の件数ではなくkeywordで絞り込むの値が返ってきます
    • keywordを指定した場合、results_returnedよりも実際の件数は少ないことがあります
    • ページングしたい場合は results_returned == count かどうかで判断してください

APIの利用について

  • 節度を守ってご利用ください
  • 事前、事後ともに報告は不要です

2013/2/9更新

  • doorkeeperについて追記

*1:キーワードにマッチしたものだけを検索