Ubuntu上のDocker環境でWeChat/微信を使う


## 概要

WeChat/微信とは中国大陸で広く使われているLINEのようなチャットサービスです．WeChatはスマートフォン向けアプリの他に，PC環境においても使用でき，それらはWeb版とアプリ版に大別できます．しかし，Windows/MacOS向けにはアプリ版がありますが，Ubuntu等のLinux向けにはそのようなアプリはリリースされておりません．そのため，多くのLinuxユーザはWeb版を使用しています．ところが，人によってはWeb版にログインできないことがあります．[^1]

[^1]: ログインを試みても， "To protect your account, logging in to WeChat via the web has been suspended. Use WeChat for Windows or WeChat for Mac to log in on a computer. Download WeChat for Windows or Mac at http://wechat.com." というメッセージが表示され，ログインできない．この問題については，https://github.com/wechaty/wechaty/issues/872#issuecomment-336015830 において指摘されているとおり，Tencentのポリシー変更により，2017年6月以降に作られたアカウントはWeb Clientを使えなくなったことに起因するようです．

本稿では，Ubuntu上でWeChatを使用するために，Wineを使用しWindow版アプリを使う方法について記述します．ただし，Wineのインストールは多少やっかいであるため，Dockerを用いてその環境を作ろうと思います．しかし，調べているうちに，そもそもWeChatをDockerで使えるようにしてくれているものを見つけましたので，それを使用することとしました．

真新しい情報はありませんが，この話題について日本語で書かれたものはあまりありませんので，必要な方の手助けになると幸いです．

## 環境

- HOST OS: Ubuntu 19.10 [^2]
- Docker version 19.03.6, build 369ce74a3c
- docker-compose version 1.25.1, build a82fef07

[^2]: Linuxであれば他の環境でも動作すると思います．実際，このdocker imageを提供してくれている方はFedoraを使用しているようです．

Docker, docker-composeのインストール方法は[参考文献](#docker-installation)をご参照ください．

以下では，すでにdocker, docker-composeは導入されているものとして進めます．

## 手順

1. [Docker hub](https://hub.docker.com/r/bestwu/wechat) で公開されているimageをpullしてくる．

```bash
$ docker pull bestwu/wechat
```
    
1. [作成者のGithub上のレポジトリ](https://github.com/bestwu/docker-wechat) にかかれている内容を参考にして，`docker_compose_wechat.yml` を作成．

```docker_compose_wechat.yml
version: '2'
services:
  wechat:
    image: bestwu/wechat
    container_name: wechat
    devices:
      - /dev/snd
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - $HOME/WeChatFiles:/WeChat Files
    command: apt update && apt install tzdata # (Optional) Set the timezone
    environment:
      - DISPLAY=unix$DISPLAY
      - QT_IM_MODULE=fcitx
      - XMODIFIERS=@im=fcitx
      - GTK_IM_MODULE=fcitx
      - AUDIO_GID=29 # (Optional) Default 29（ubuntu）host audio gid. Solve access permission of sound device.
      - GID=1000 # (Optional) Default 1000 Host current user gid. Solve access permission of mounted directory.
      - UID=1000 # (Optional) Default 1000 Host current user uid. Solve access permission of mounted directory.
      - TZ=Asia/Tokyo # (Optional) Set the timezone to Asia/Tokyo.
    ipc: "host"
```

3. docker のコンテナを立ち上げる．

```bash
$ docker-compose -f docker_compose_wechat.yml up
```

これでWechatのGUIが起動されます．お疲れ様でした．


## トラブルシューティング

基本的には以上の手順で終了のはずですが，環境によっては以下の問題が発生するかもしれません．私の環境で実際に発生した問題とその解決方法を共有します．

### 言語設定が中国語

言語設定の変更は，Window版WeChatと同様設定画面から行うことができます．
画面左下の $\equiv$ から「设置」を開き，「通用设置」タブを選択し，「语言」から言語を選択できます．選択可能な言語は，英語，簡体中文，繁体中文の3種類でした．

### 日本語入力ができない

この`docker_compose_wechat.yml`では，入力法フレームワークが __Fcitx__ となっています．__iBus__ を使っている人は，次のように書き換えます． [^3]
 
```diff
-      - QT_IM_MODULE=fcitx
-      - XMODIFIERS=@im=fcitx
-      - GTK_IM_MODULE=fcitx
+      - QT_IM_MODULE=ibus
+      - XMODIFIERS=@im=ibus
+      - GTK_IM_MODULE=ibus
```
[^3]: 参考: https://github.com/bestwu/docker-wechat/issues/10

### モバイル端末での認証後に画面が消える

PCでのWeChatのログイン時にモバイル端末での認証を求められますが，認証を行うと次のようなエラーが出力されウィンドウが消えることがあります．

```bash
wechat    | [0326/093138:ERROR:network_change_notifier_win.cc(156)] WSALookupServiceBegin failed with: 8
wechat    | X Error of failed request:  BadValue (integer parameter out of range for operation)
wechat    |   Major opcode of failed request:  130 (MIT-SHM)
wechat    |   Minor opcode of failed request:  3 (X_ShmPutImage)
wechat    |   Value in failed request:  0x360
wechat    |   Serial number of failed request:  xxxx
wechat    |   Current serial number in output stream:  xxxx
```

アプリがXから共有メモリにアクセスしようとし，失敗したため．通常ホストとコンテナはメモリを共有していないため，このような問題が起きるようです．
したがって，コンテナがホストのメモリにアクセスできるようになればよいので，`docker_compose.yml` に`ipc: "host"` を追加することで解決できました.[^4][^5][^6]

[^4]: https://github.com/bestwu/docker-wechat/issues/5#issuecomment-542476237 
[^5]: https://github.com/webanck/docker-wine-steam/issues/13#issuecomment-340247020
[^6]: https://github.com/suchja/wine/issues/8#issuecomment-283151227

### 時刻設定が中国標準時

`tzdata`を用いて，タイムゾーンを`Asia/Tokyo`に変更します．

## 参考文献

### Docker Installation

公式ドキュメンテーションに沿ってインストールしました．

- Docker: https://docs.docker.com/install/linux/docker-ce/ubuntu/
- Docker-compose: https://docs.docker.com/compose/install/

### WeChat on WINE

Wineのインストールが結構大変な感じがします．

- https://qiita.com/nanbuwks/items/bc6c3c171b7a3be981c9
    - 日本語で書かれた，WeChatの使用のために様々な方法を試された記録です．
- https://puzy.site/2019/11/27/Wine-on-Ubuntu-19-10/
    - Ubuntu 19.10でのWine + WeChatの使用手順．中国語．

## おまけ

[WeChat Work](https://work.weixin.qq.com/)版作った．https://github.com/Abemii/docker-wechat