それが僕には楽しかったんです。

いろんなレイヤーに居ます

Twitter APIのScalaラッパーを作っている話

はじめに

夏休み、特にすることがなかったのとTwitter4Jに憧れてScalaでTwitter4SというTwitter APIのラッパーを作り始めた。
初めは標準ライブラリだけでごり押すつもりが色々ありいくつかライブラリを使用しているがある程度出来た為、概要をまとめる。

ただまだまだ作りこまないといけないため、今後の更新によってはこのブログの記事は当てにならなくなる。
Github上で管理してるものが全てであり、どのように動作するかはソースコードが物語っている。

Github

このライブラリは次のレポジトリで公開されている。

github.com

また、github pagesでこれらのjarファイルを公開しているため次をbuild.sbtに追加すると自分のプロジェクトで使用できるようになる。

resolvers += "Maven Repo on github" at "https://lrf141.github.io/Twitter4S/"

libraryDependencies ++= Seq(
     "Twitter4S" % "twitter4s_2.12" % "1.0.0"
)

主要なクラスやオブジェクトに関するドキュメントを次のリンクで公開しているので何かあればそちらも参照して欲しい。

https://lrf141.github.io/Twitter4S/

ソースコード概要

ドキュメントで公開してるソースファイルとは別にnet,utilパッケージが存在する
ディレクトリ構成は次の通り。

├── src
│   ├── main
│   │   └── scala
│   │       └── twitter4s
│   │           ├── APIKeys.scala
│   │           ├── HomeTimeLine.scala
│   │           ├── SearchBase.scala
│   │           ├── Status.scala
│   │           ├── StatusBase.scala
│   │           ├── TimeLineBase.scala
│   │           ├── TimeLineUser.scala
│   │           ├── Tweet.scala
│   │           ├── Tweets.scala
│   │           ├── Twitter.scala
│   │           ├── TwitterFactory.scala
│   │           ├── TwitterImpl.scala
│   │           ├── UserArray.scala
│   │           ├── UserStatus.scala
│   │           ├── UserTimeLine.scala
│   │           ├── net
│   │           │   ├── HttpRequest.scala
│   │           │   ├── HttpResponse.scala
│   │           │   └── oauth
│   │           │       └── OAuthRequest.scala
│   │           └── util
│   │               └── JsonDecoder.scala

net package

このパッケージではhttp requestやOAuthに関するクラスを管理している。
OAuthRequest.scalaOAuth認証に必要なパラメータや署名などを生成できる。
Twitter APIを利用するにあたってOAuthはver 1.0に準拠している。
それらを利用してHttpRequest.scalaでPOST/GETに関する機能を実装している。


ここでのBase64変換にapache commons codecを利用している。

util package

このパッケージではこのプロジェクトで使用するネットワークや本体に関係ないクラスを管理している。
この記事公開時点ではJsonDecoder.scalaという中身が非常に行儀悪いクラスのみである。

このクラスではStringの値として受け取ったjsonを解析しcase classのメンバに代入することを主としている。
jsonの解析にcirceというscala製のライブラリを使用している。

src/main/scala直下 twitter4s package

ここではtwitter apiを利用するための色々なクラスやオブジェクト、トレイトが存在する。
主にjsonを解析した際、データの受け皿となるcase classだが、リクエストに必要なメソッドを含むトレイトやそれを実際に実装しているTwitterImpl.scalaなどがメインになっている。

必要な機能は***Base.scalaという名前でトレイトとして存在しそれらはTwitter.scalaのトレイトにミックスインされている。
このライブラリを使用する際にはそれらを実装したTwitterImplのメソッドを呼び出している。

またそのクラスを継承したTwitterFactoryクラスがありライブラリユーザはこれからインスタンスを受け取り各種メソッドを呼び出す仕組みになっている。
このクラスはシングルトンである。

加えてcase classをjson解析で多用しているため解析によって受け取った値は好きなように使用することが出来る。

使用方法

最初に書いたようにbuild.sbtもしくはBuild.scala内にresolversとlibraryDependenciesを追加してもらえるとすぐに使用できる。
具体的な使用方法については公開しているレポジトリのREADME.mdを参照して欲しい。

プルリクについて

プルリクについては、たまに「英語でないとダメ」という意見も見受けられるがこのレポジトリに関しては日本語でのプルリクも受け付けている。
公開されているソースコードをみて、「このコードクソだな」などある場合は積極的にプルリクを送って欲しい。