QR Exchange
QRコードを使用して、対面でActivityPubアカウントを簡単に交換するための仕様です。 LINEの友だち追加のような体験を分散SNSで実現します。
概要
QR Exchangeは、ActivityPubアカウントの情報をQRコードにエンコードし、 スマートフォンのカメラでスキャンすることで簡単にフォローできる機能です。
ユースケース
- 対面でのアカウント交換
- 名刺やポスターへのQRコード印刷
- イベントでの参加者同士の繋がり
QRコードフォーマット
QRコードには以下の形式でデータをエンコードします。
URL形式(推奨)
WebブラウザでもアクセスできるURL形式を推奨します:
https://example.com/@alice
または
https://example.com/users/alice
acctスキーム
WebFingerのacctスキームも使用可能です:
acct:alice@example.com
ActivityPub IRI
アクターのActivityPub IRIを直接使用することも可能です:
https://example.com/users/alice
スキャン処理フロー
1. QRコードのスキャン
カメラでQRコードを読み取り、URLまたはacctアドレスを取得します。
2. アクター情報の取得
取得した情報からActivityPubアクターを解決します:
URL形式の場合
- URLに
Accept: application/activity+jsonでリクエスト - アクターオブジェクトを取得
acct形式の場合
- WebFingerでアクターURLを解決
- アクターオブジェクトを取得
3. プロフィール表示
取得したアクター情報をユーザーに表示します:
- アイコン
- 表示名
- ユーザー名
- 自己紹介
- フォロワー/フォロー数
4. フォローアクション
ユーザーが「フォロー」ボタンを押すと、通常のActivityPub Followアクティビティを送信します。
実装例
QRコード生成(React)
import QRCode from 'qrcode.react';
function MyQRCode({ actorUrl }) {
return (
<QRCode
value={actorUrl}
size={256}
level="M"
/>
);
}
QRコードスキャン
import { Html5QrcodeScanner } from 'html5-qrcode';
function startScanner(onSuccess) {
const scanner = new Html5QrcodeScanner("reader", {
fps: 10,
qrbox: 250
});
scanner.render((decodedText) => {
onSuccess(decodedText);
scanner.clear();
});
}
アクター解決
async function resolveActor(qrData) {
// acct形式の場合
if (qrData.startsWith('acct:')) {
const [user, domain] = qrData.slice(5).split('@');
const webfinger = await fetch(
`https://${domain}/.well-known/webfinger?resource=${qrData}`
);
const data = await webfinger.json();
const actorUrl = data.links.find(
l => l.rel === 'self' && l.type === 'application/activity+json'
)?.href;
return fetchActor(actorUrl);
}
// URL形式の場合
return fetchActor(qrData);
}
async function fetchActor(url) {
const response = await fetch(url, {
headers: { 'Accept': 'application/activity+json' }
});
return response.json();
}
セキュリティ考慮事項
悪意あるQRコード
- フォロー前に必ずプロフィールを表示し、ユーザーに確認を求める
- 自動フォローは行わない
- 外部URLへのリダイレクトに注意
プライバシー
- QRコードに個人情報を含めすぎない
- 公開プロフィールのURLのみを使用
UI/UXガイドライン
QRコード表示画面
- QRコードを大きく中央に配置
- ユーザー名を表示
- 共有ボタンを配置(Web Share API)
- 画像として保存できるオプション
スキャン画面
- カメラプレビューを表示
- スキャン枠のガイドを表示
- スキャン成功時のフィードバック
- 手動入力へのフォールバック
プロフィールプレビュー
- アクター情報を見やすく表示
- 「フォロー」ボタンを目立つ位置に
- キャンセルオプションを明確に
相互運用性
URL形式を使用することで、Yurucommu以外のActivityPub実装でも QRコードを読み取ってフォローすることができます。 特別な拡張プロトコルは不要です。
ヒント:
URL形式を使用すれば、QRコードをスマートフォンの標準カメラアプリで
スキャンしてもWebブラウザでプロフィールページを開くことができます。