- Published on
Androidに届いたSMSの認証コードを自動でWindowsのクリップボードにコピーする
- Authors
- Name
- Shou Arisaka / 有坂翔
この記事では、Rubyプログラミング言語を使用して、Androidから受信したSMS認証コードを自動的にWindows 10のクリップボードにコピーする方法を紹介します。
はじめに
2FAコードを入力する手間が面倒ですが、このプログラムを使えばAndroidデバイスからのSMS認証コードを自動的にWindows 10のクリップボードにコピーできます。
さて、それでは手順を見ていきましょう。
全体の流れ
このプログラムの実装は難しくありませんが、いくつかの技術を組み合わせる必要があるため、時間がかかるかもしれません。しかし、一旦実装できれば、これを応用して他のAndroidデータの操作にも役立つでしょう。
- AndroidデバイスでSMSを受信した際、IFTTTを使用してJSONデータをWebリクエストします。
- Ubuntu上でSinatraサーバーがこのデータを受け取り、パースおよびフィルタリングを行い、テキストをファイルに保存します。
- テキストファイルからWSL(Windows Subsystem for Linux)を介してクリップボードにデータをコピーします。
事前準備
以下の事前準備が必要です。
- ポートフォワーディングができるWiFiルーターを使用します。これにより、ローカルで実行しているサーバーをグローバルIPの公開URLからリクエストできます。
光回線工事後、4台のルーターを実際に買って検証した結果導き出された最高のWiFiルーター
- WSL(Windows Subsystem for Linux)をセットアップします。これはLinuxおよびプログラミングの初心者向けのメリットがあるツールです。
WSLを初期から使っている僕がLinuxやプログラミングの初心者向けにWSLのメリットを解説してみる WSL bash on ubuntu on windows インストール手順
- Ruby環境をセットアップします。Sinatraを実行するために必要です。
sudo apt update
sudo apt install build-essential patch zlib1g-dev liblzma-dev ruby{,-dev} -y
sudo gem install bundler
mkdir -p /mnt/c/pg/ruby_dev && cd $_
sudo bundle init
vim Gemfile
sudo bundle install
Gemfileの内容:
gem "pry"
gem "sinatra"
手順
それでは、具体的な手順を見ていきましょう。
- WiFiルーターでポートフォワーディングの設定を行います。
IFTTTでアプレットを作成します。
- イベント: "Any new SMS received"
- アクション: "Webhooks"
- タイトル(例): "If Any new SMS received, then post to WSL"
- URL(例): "http://[Your_IP]:8005/androidsms"
- HTTPメソッド: "POST"
- Content Type: "JSON"
- Body:
{"ContactName": "{{ContactName}}", "Text": "{{Text}}", "OccurredAt": "{{OccurredAt}}", "FromNumber": "{{FromNumber}}"}
- Windowsのフォルダをマウントしてファイルを同期できるように設定します。
sudo mount -t cifs //192.168.0.167/_sync_ ~/share -o user=hoge,pass=hoge,dir_mode=0777,file_mode=0777
Ubuntu 18.04でWindows 10の共有フォルダをマウントする方法 Windows 10のシェア(共有)フォルダをUbuntu 16.04でマウント(同期)する方法
- Sinatraを起動します。
# dev.rb
require "sinatra"
require "open3"
require 'json'
require 'pry'
Encoding.default_external = 'UTF-8'
get "/" do
puts "y"
end
post "/androidsms" do
@body = request.body.read
json = JSON.parse(@body)
text = json["Text"]
stdout, stderr, statusCode = Open3.capture3(%(bash -ic "printf '#{text}' > /home/yuis/share/clipboard.txt || echo ''"))
puts stdout, stderr, statusCode
end
Sinatraを起動:
sudo bundle exec ruby -o 0.0.0.0
-q dev.rb
- Android側でIFTTTの設定を行います。
IFTTTアプリをインストールし、アプレットを有効化します。
- WSL側で定期的にテキストデータを監視するスクリプトを実行します。
以下のスクリプトを実行してください。
while true; do
echo -ne "$(isodate)\tNothing updated on the clipboard.\033[0K\r"
[[ -s "$SHAREDDIR/clipboard.txt" ]] && {
cat "$SHAREDDIR/clipboard.txt" | clip.exe ; > "$SHAREDDIR/clipboard.txt" ; printf "Copied text to clipboard." ;
}
sleep 2s
done
- 実際に動作をテストします。AndroidからSMSを送信し、クリップボードにテキストがコピーされるか確認しましょう。
これで、SMSの受信からIFTTTへの送信、Sinatraでの処理、ファイル同期、WSLでのクリップボードへのコピーというフローが実行されるはずです。多くのツールを使用するため、問題の切り分けは面倒かもしれませんが、問題があれば質問してください。
あとがき
最後に、Rubyでテキストデータを取得した後、クリップボードにコピーする文字列を制限するために、正規表現やgsubを使用できます。必要に応じてテキストをフィルタリングしてカスタマイズできます。