GitHub
Experimental

QR Exchange

QRコードを使用して、対面でActivityPubアカウントを簡単に交換するための仕様です。 LINEの友だち追加のような体験を分散SNSで実現します。

概要

QR Exchangeは、ActivityPubアカウントの情報を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形式の場合

  1. URLにAccept: application/activity+jsonでリクエスト
  2. アクターオブジェクトを取得

acct形式の場合

  1. WebFingerでアクターURLを解決
  2. アクターオブジェクトを取得

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コード

プライバシー

UI/UXガイドライン

QRコード表示画面

スキャン画面

プロフィールプレビュー

相互運用性

URL形式を使用することで、Yurucommu以外のActivityPub実装でも QRコードを読み取ってフォローすることができます。 特別な拡張プロトコルは不要です。

ヒント: URL形式を使用すれば、QRコードをスマートフォンの標準カメラアプリで スキャンしてもWebブラウザでプロフィールページを開くことができます。