logo
Published on

Androidに届いたSMSの認証コードを自動でWindowsのクリップボードにコピーする

Authors

この記事では、Rubyプログラミング言語を使用して、Androidから受信したSMS認証コードを自動的にWindows 10のクリップボードにコピーする方法を紹介します。

Screenshot

はじめに

2FAコードを入力する手間が面倒ですが、このプログラムを使えばAndroidデバイスからのSMS認証コードを自動的にWindows 10のクリップボードにコピーできます。

さて、それでは手順を見ていきましょう。

全体の流れ

このプログラムの実装は難しくありませんが、いくつかの技術を組み合わせる必要があるため、時間がかかるかもしれません。しかし、一旦実装できれば、これを応用して他のAndroidデータの操作にも役立つでしょう。

  1. AndroidデバイスでSMSを受信した際、IFTTTを使用してJSONデータをWebリクエストします。
  2. Ubuntu上でSinatraサーバーがこのデータを受け取り、パースおよびフィルタリングを行い、テキストをファイルに保存します。
  3. テキストファイルから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"

手順

それでは、具体的な手順を見ていきましょう。

  1. WiFiルーターでポートフォワーディングの設定を行います。

Port Forwarding

  1. 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}}"}

IFTTT Setup

  1. 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でマウント(同期)する方法

  1. 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

Sinatra Running

  1. Android側でIFTTTの設定を行います。

IFTTTアプリをインストールし、アプレットを有効化します。

IFTTT - Apps on Google Play

  1. 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

WSL Script

  1. 実際に動作をテストします。AndroidからSMSを送信し、クリップボードにテキストがコピーされるか確認しましょう。

これで、SMSの受信からIFTTTへの送信、Sinatraでの処理、ファイル同期、WSLでのクリップボードへのコピーというフローが実行されるはずです。多くのツールを使用するため、問題の切り分けは面倒かもしれませんが、問題があれば質問してください。

あとがき

最後に、Rubyでテキストデータを取得した後、クリップボードにコピーする文字列を制限するために、正規表現やgsubを使用できます。必要に応じてテキストをフィルタリングしてカスタマイズできます。