urushi blog

プログラマでゲーマーのうるしが綴るメモ

SNS 抽象化クライアントライブラリ SocialHub の紹介 (1)

背景

SNS に疲れていませんか? メッセージサービスを行ったり来たりしてうんざりしていませんか? 公私での SNS の使い分けが面倒ではありませんか? コミュニケーションサービスは生活に直結します。むしろそれで時間の大半が取られると言っても、あながち間違いではないのかもしれません。そんな時代にはそんな SNS マネージメントシステムを。その想いから SocialHub の開発がスタートしました。

SocialHub とは?

github.com

GitHub で公開しているマルチ SNS クライアントライブラリです。複数の SNS やメッセージングサービスに対して統一したインターフェースを提供し、クライアントサイドの開発者が各 SNS の仕様の差異の大小を気にすることなく、適度に抽象化された操作によって、様々な SNS を使ったサービスを構築できるようにするための Java で実装されたライブラリになります。

対応 SNS (現状)

現状では Twitter, Mastodon, Slack, Tumblr, Facebook に対応しています。現状、各 SNS の全ての操作に対応していわけではなく、一部の操作に対応しています。また、Pinterest, Linkedin にも対応する予定です。他にも対応したい SNS は多数存在していますが、公開されている API との兼ね合いになるので、順次検討の上 GitHub 上でアナウンスしたいと思います。

サンプル

さっそく実装サンプルを紹介します。といっても、細かい説明は GitHub に記載するとして、ここでは簡単な例のみを紹介をします。

認証ユーザー取得

例えば、各 SNS で認証したアカウントの名前を取得するコードを紹介します。はじめに Twitter での例は以下になります。

// 1. Account オブジェクトを取得 (for Twitter)
TwitterAuth auth = SocialHub.getTwitterAuth(CONSUMER_KEY, CONSUMER_SECRET);
Account account = auth.getAccountWithAccessToken(ACCESS_TOKEN, ACCESS_SECRET);

// 2. SNS から認証ユーザーを取得 (全 SNS 共通)
User user = account.action().getUserMe();
System.out.println(user.getName());

次に Mastodon では以下のようになります。

// 1. Account オブジェクトを取得 (for Mastodon)
MastodonAuth auth = SocialHub.getMastodonAuth(HOST);
Account account = auth.getAccountWithAccessToken(ACCESS_TOKEN);

// 2. SNS から認証ユーザーを取得 (全 SNS 共通)
User user = account.action().getUserMe();
System.out.println(user.getName());

ここで注目して欲しいのが Account クラスを作成した後の操作は TwitterMastodon もここでは紹介しなかった他の SNS についても、同じ操作で実現ができるという点です。このように、様々な SNS についても透過的なインターフェースで扱うことができるので、複数 SNS を扱うサービスでも大幅に実装コストが短縮できます。

ページング

SNS は各サービス毎に様々なページング方法を採用しており、それを個々に実装していくのは非常にコストのかかる作業になります。 SocialHub ではページングもラッピングされており、非常にシンプルに扱うことができます。各 SNSAccount を取得してきた後の HomeTimeLine を取得する操作の例を以下に記載します。 (Slack では general チャンネル、Tumblr ではダッシュボードが SocialHub では HomeTimeLine に該当します)

// 1. Account オブジェクトを取得
Account account = ...

// 2. 基本的なページング設定を作成
Paging paging = new Paging();
paging.setCount(10L);

// 3. 現在の HomeTimeline の最新のコメント情報を SNS から取得
Pageable<Comment> newComments = account.action().getHomeTimeLine(paging);

// 4. 3 から続きで過去のコメント情報を取得
Pageable<Comment> pastComments = account.action().getHomeTimeLine(newComments.pastPage());

このように、例えば Twitter では sinceId や maxId を利用したページングを気にしなくて済みますし、各 SNS サービス毎のページングの意識する必要はありません。もちろん、各サービス毎のページング指定を与えることも可能ですが、あまり使われないという想定の元 SocialHub ではこのようなインターフェースになっています。

なぜ Java なのか?

このライブラリは iOS, Android 向けに SNS クライアントを作成する人をメインターゲットに実装しています。Android 向けには当然 Java で実装しているので Java, Kotlin で使用可能です。またこの SocialHub は Java のコードを Objective-C に変換するプロジェクトである J2ObjC で変換可能なコードのみを用いて構成されています。

github.com

このプロジェクトによって Objective-C に変換され、SocialHub では iOS, Mac OS のプロジェクトでも使用可能になります。このように、マルチターゲットを意識して作成されたものが SocialHub なので、Java で実装しています。

まとめ

スターくれると励みになりますし、PR くれたら嬉しくて発狂します。応援してください。

github.com

もう少し説明したいことあるので、きっと次回もあります。