Oculus GoのブラウザにPCからテキストデータを渡してフォームに入力できるツールを書きました。 擬似的にOculus GoのブラウザでPCのクリップボード貼り付けを行えるよという感じです。

Oculus Goには日本語IMEやクリップボード機能がありません。 これはOculus Go上のブラウザでも同様です。

Chromeがデフォルトです。Samsung Internet VRもapkをadb経由で入れると動きますがこちらもクリップボード機能はありません。

そのため、日本語を入力する手段がなかったり長いテキストをOculus Go上で入力するのは大変です。 この問題が不便だったので、no-clipboard-appというアプリを作りました。

Oculus Go(クライアント)からみた動作は次のような形で任意のテキストをフォームにペーストできます。

  1. フォームにフォーカスする(IMEを表示する)
  2. ブックマークレット(paste clipboard)を実行する
    • ブックマークレットは後述サーバから取得できます

Oculus Go(クライアント)と対となるElectronアプリ(サーバ)が必要です。 クライアントはサーバのクリップボードデータをブックマークレット経由でペーストするためです。

Electronアプリ(サーバ)は次のようなサーバを内容したアプリケーションです。 Oculus Go(クライアント)はこのサーバのクリップボードに対してLocaltunnelを経由してアクセスできます。そのため、Oculus Go(クライアント)からブックマークレットを実行するときはElectronアプリ(サーバ)を起動しておく必要があります。

逆に使わないときはElectronアプリ(サーバ)を終了してください。 Localtunnelを使っているため、原理的にはインターネットからアクセス可能になっています。 自動的に生成されるランダムなURLとシンプルなtokenがアクセスには必要ですが、中間者攻撃された場合はだめなので。

インストール方法

自分用に作成したのでmac用のバイナリしか用意してません。

Electronアプリなので手元にgit cloneして、Node.jsでビルドすればどの環境でも動くと思います。

ビルドにはNode.jsYarnの最新の安定版が必要です。

Run app on local

yarn
yarn start

Build app on local

yarn
yarn make

使い方

Oculus Go(クライアント)とElectronアプリ(サーバ)が連携して動く仕組みなので、ややこしいですがアプリを起動した画面にも使い方は表示されています。

  1. PC: Electronアプリ(サーバ)を起動する
    • macはコンテキストメニューの"開く"じゃないと署名なしアプリは起動できません
  2. Oculus Go: Oculus Goのブラウザを開き、アプリに表示されているhttps://random-id-hogehoge.localtunnel.me/bookmarkletのURLへアクセスする
    • Tips: 同じネットワークにいるなら http://192.16.8.x.x/bookmarklet のようなURLでもアクセスできる
    • 表示された画面の案内に従ってページをブックマーク(copy-clipboard)
    • ブックマークしたURLがjavasript:から始まるように先頭を削る = ブックマークレット化
    • 生成後のブックマークレットにはkeyやrandomなlocaltunnelのurlを埋め込むので、生成済みのブックマークレット自体は共有しないでください
  3. Oculus Go: <input> or <textarea> 要素にフォーカスする
  4. Oculus Go: copy-clipboardのブックマークレットを実行する
    • 実行するとElectronアプリ(サーバ)側のクリップボードデータを取得してフォーム要素に入力されます
    • input.value = "text"してるだけなので、リッチエディター系は動かないかも

ブックマークレットの種類

今実装してあるブックマークレットは次においてあります。

Fetch APIでClipboard データを読み書きできるサーバがあるというだけなので、 なにかいいアイデアのブックマークレットがあったらPull Requestしてください。

セキュリティ

原理的には任意のサイトでブックマークレットを実行しているので、そのブックマークレットの実行自体をhookすればリクエストやレスポンスを奪い取れます。 そのため、センシティブなデータはやり取りしないほうがいいです。

よりセキュアにするにはEnd to Endな何かが必要になるため、その辺を解決できる人のPull Request募集しています。

WebRTCなどを使いP2Pなローカルネットワークで解決できると良かったのですが、そのようなAPIはSecure Contextsじゃないと動かないので、動作しないサイトがでてきて不便そうなのでRest APIに落ち着きました。

リポジトリ