Online messaging ────────────────────────────────────────────────────────────────────── An XKCD comic is worth a thousand words. https://imgs.xkcd.com/comics/standards.png There is no standard when it comes to online communication. IRC used to be the way people communicate online. This is not true anymore however, and with all the new protocols, platforms, applications that pop out every now and then, communication is easier than ever ! Easier ? Not so much. To communicate with 3 different groups of people, you need 3 different applications. Be it Facebook Messenger, Telegram, Whatsapp, Matrix, Mattermost, Discord, …, you name it. Each require creating an account, turning on notifications, learning the UI and so on, and so forth. Of course, none of these could agree on a standard way to relay text messages from one device to another! So now this is your problem, as a user, to sort out the problem of switching contexts. But maybe you don't have to… # Matterbridge By relaying messages from one platform the others, [matterbridge][0] is the kind of project that provide an elegant solution to an ugly problem. It creates a bridge between many of the existing messaging platforms, and bridge them together. When a message is received on one platform, the matterbridge gateway will replay this message to all the other platforms configured, so people can effectively talk to each other in a cross-application manner. I use it so I can participate in a local group in my hometown on WhatsApp, which I don't want installed on my personnal phone. It relays all messages on IRC, and to a telegram group, so I can still participate from my phone. # Whatsapp In order to use whatsapp with matterbridge, you need an account (so a phone number), and find a way to "authorize" matterbridge to use this account. The only way to do it (at least for matterbridge v1.18.0), is by tricking whatsapp into thinking that matterbridge is a web browser, so it can use the whatsapp [web version][1]. The web version doesn't replace the original application, so you got to keep it running all the time. As I didn't want whatsapp to run on my phone, I had to find another way. # Android VM The android SDK provide an emulator, that you can run in headless mode. What's happening under the hood is that you get a qemu virtual machine started for your phone's architecture (even x86_64!). The procedure to get whatsapp running on a VM is described here: https://github.com/tulir/mautrix-whatsapp/wiki/Android-VM-Setup This includes feeding the phone's webcam with ffmpeg recording your desktop, so you can scan the QR code created by matterbridge from whatsapp, and allow it to run (you MUST run it in graphical mode at this point, so a working android SDK is needed). Unforturnately, the emulator will only run on Linux, so I couldn't host it on one of my OpenBSD server. To make it simpler, I chose to install a Debian 10, so the SDK installation is easy to do. apt install android-sdk libopengl0 libxdamage1 libtinfo5 libgl1 libegl1-mesa curl -O https://dl.google.com/android/repository/commandlinetools-linux-6609375_latest.zip unzip -d /usr/lib/android-sdk commandlinetools-linux-6609375_latest.zip /usr/lib/android-sdk/tools/bin/sdkmanager 'system-images;android-30;google_apis_playstore;x86_64' emulator /usr/lib/android-sdk/tools/bin/sdkmanager --update You'll need that on both your server and local machine. Then you can create the android emulator locally, and start it: /usr/lib/android-sdk/tools/bin/avdmanager create avd -n whatsapp -k 'system-images;android-30;google_apis_playstore;x86_64' /usr/lib/android-sdk/emulator/emulator -avd whatsapp Once running, install the whatsapp application, connect it to your account and make sure it works. Follow the guide I mentionned earlier to link it to matterbridge. Don't forget to authorize the ADB key fingerprint at boot, so you can later connect to the emulator from the command line. Once done, take a snapshot of the emulator, and shut it down. Your full emulator state should be saved to ~/.android/avd, and the adbkey to ~/.android/adbkey Upload the whole ~/.android to your server, and start the emulator in headless mode: /usr/lib/android-sdk/emulator/emulator -avd whatsapp -no-audio -no-window After some time you should be able to connect to it using `adb shell`. Use this connection to start the application (and eventually, enable the wifi card, if you don't have internet access on the emulator): adb shell 'svc wifi enable' adb shell 'ping web.whatsapp.com' adb shell 'am start -n com.whatsapp/.HomeActivity' At this point, the VM should be up and running, and whatsapp started, and in the foreground ! You can verify it by taking a screenshot: adb shell 'screencap -p' > capture.png In case you want to click on the touchscreen remotely, you can use adb shell 'input X Y' Where X and Y are the coordinates of where you want to click. Not very comfortable to use, but that might be handier than stopping the VM and starting it again locally, snapshot it, reupload, … # Rationale https://imgs.xkcd.com/comics/team_chat.png [0]: https://github.com/42wim/matterbridge [1]: https://web.whatsapp.com 20200825.0843