Oculus GoのブラウザにPCからテキストデータを渡してフォームに入力できるブックマークレットとアプリ
Oculus GoのブラウザにPCからテキストデータを渡してフォームに入力できるツールを書きました。 擬似的にOculus GoのブラウザでPCのクリップボード貼り付けを行えるよという感じです。
Oculus Goには日本語IMEやクリップボード機能がありません。 これはOculus Go上のブラウザでも同様です。
Chromeがデフォルトです。Samsung Internet VRもapkをadb経由で入れると動きますがこちらもクリップボード機能はありません。
そのため、日本語を入力する手段がなかったり長いテキストをOculus Go上で入力するのは大変です。 この問題が不便だったので、no-clipboard-appというアプリを作りました。
Oculus Go(クライアント)からみた動作は次のような形で任意のテキストをフォームにペーストできます。
- フォームにフォーカスする(IMEを表示する)
- ブックマークレット(paste clipboard)を実行する
- ブックマークレットは後述サーバから取得できます
I've created clipboard app for #OculusGo
— azu (@azu_re) May 26, 2018
Share your pc's clipboard to Oculus Go's browser.
"azu/no-clipboard-app: Share your clipboard text to your device like Oculus Go."https://t.co/jyzdjpEimo#OculusGoDev pic.twitter.com/ZpbJ009OM9
Oculus Go(クライアント)と対となるElectronアプリ(サーバ)が必要です。 クライアントはサーバのクリップボードデータをブックマークレット経由でペーストするためです。
Electronアプリ(サーバ)は、サーバを内蔵したアプリケーションです。 Oculus Go(クライアント)はこのサーバのクリップボードに対してLocaltunnelを経由してアクセスできます。そのため、Oculus Go(クライアント)からブックマークレットを実行するときはElectronアプリ(サーバ)を起動しておく必要があります。
逆に使わないときはElectronアプリ(サーバ)を終了してください。 Localtunnelを使っているため、原理的にはインターネットからアクセス可能になっています。 自動的に生成されるランダムなURLとシンプルなtokenがアクセスには必要ですが、中間者攻撃された場合はだめなので。
アプリ側はこんな感じ。
— azu (@azu_re) May 26, 2018
中でサーバ動いてるだけなので、できるのはクリップボードの更新ぐらい。
仕組み的に絶対に安全というわけじゃないので、使ってないときはアプリを閉じたほうがいい pic.twitter.com/d4ghhSlcdh
インストール方法
自分用に作成したのでmac用のバイナリしか用意してません。
- latest releasesから最新版をダウンロードできます
Electronアプリなので手元にgit cloneして、Node.jsでビルドすればどの環境でも動くと思います。
ビルドにはNode.jsとYarnの最新の安定版が必要です。
Run app on local
yarn
yarn start
Build app on local
yarn
yarn make
使い方
Oculus Go(クライアント)とElectronアプリ(サーバ)が連携して動く仕組みなので、ややこしいですがアプリを起動した画面にも使い方は表示されています。
- PC: Electronアプリ(サーバ)を起動する
- macはコンテキストメニューの”開く”じゃないと署名なしアプリは起動できません
- 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を埋め込むので、生成済みのブックマークレット自体は共有しないでください
- Tips: 同じネットワークにいるなら
- Oculus Go:
<input>
or<textarea>
要素にフォーカスするcopy-clipboard
はactiveElementに依存しています
- 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に落ち着きました。
リポジトリ
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。