2016/03/11

LinuxのX Window Systemで動作する自動クリック・連打ツールxAutoClick

GNU/LinuxなどのX Window Systemで動作する自動クリックツール(連打ツール)であるxAutoClickについてを扱う。

以前の記事は2014年の7月から8月にかけて書かれたが、これらの記事を統合し、一部の内容を修正したり新しい内容を書き加えたりしている。

  1. 概要とコマンド名
  2. 用途
  3. ディストリのパッケージ
  4. 手動インストール
  5. 使い方
    1. 共通した設定項目
    2. GUI版
    3. 端末の非対話型プログラム(cautoclick)
      1. cautoclickの動作切り替えスクリプト
    4. 端末の対話型プログラム(aautoclick)
  6. 各種改造
    1. GUI部品の初期値変更
    2. クリック数上限の変更
    3. GTK+ 2版の警告メッセージとその対処
    4. GTK+ 3への対応
    5. パッチ群を公開
    6. xmodmapによるボタン割り当て変更時の連打ボタンの扱い修正

概要とコマンド名

xAutoClickを用いると、マウスカーソルの位置で自動的に左(1番)のマウスボタンが連続してクリックされるのと同じ効果が得られる。クリックの間隔にはランダムな幅を付けることができる(幅は指定可)。

端末向けプログラム
種類コマンド名
対話型aautoclick
非対話型cautoclick

GUI版には幾つかのGUIツールキット向けにそれぞれのバージョンが存在する。機能や使い方は共通。

GUIプログラム
GUIツールキットコマンド名
GTK+ 2gautoclick2
Qt4qt4autoclick
FLTKfltkautoclick

上の他に古いバージョンのGUIツールキット向けのものもあるが、ここでは扱わない。

GTK+ 2版

画像はGTK+ 2版。

用途

用途は色々考えられる。

  • クリックによってスコア(数字)が稼げる “Cookie Clicker” のようなゲームで(人間にはできないレベルの超高速連打を行い、可能な限り)効率を上げる
  • 同ゲームなどにおいて(人間にできるレベルの連打速度で動かす場合も含め)マウスへの寿命的な負荷・ダメージを軽減する
  • Webアンケートにおいて、回答必須なラジオボタンやチェックボックスが大量に存在する場合にクリックの労力を軽減する[1]
  • その他、(クリックが多い作業などにおいて)クリック操作による身体的負荷を軽減する

ディストリのパッケージ

Debian/Ubuntuでは、2016年3月時点ではパッケージになっていない。手元の環境で用いるために作成したUbuntu向けパッケージをPPAリポジトリ “ppa:kakurasan/misc” に公開しているので

を参考にしてこれを登録した後でパッケージ情報の再読み込みをすることで “xautoclick” パッケージとしてインストールできるようになる。この自作パッケージでは.desktopファイルは用意していないので、デスクトップ環境などのメニュー項目は作られない。好みに応じてgautoclick2などのコマンド名に対するランチャを作るなどして用いる。

手動インストール

手動でのビルドには

  • libX11
  • libXext
  • libXtst

の開発パッケージが必要で、更にGUI版を追加でビルドしたい場合にはツールキットごとに

  • GTK+ 2
  • Qt4
  • FLTK

上記各GUIツールキットの開発パッケージが必要。

これに加え、バージョン0.31時点ではQt4版をビルドする場合はソース展開後にxautoclick-0.31/Makefile

ifeq ($(__BUILD_QT4__),yes)
INCLUDES += $(INCLUDES_QT4)
LDFLAGS  += $(LDFLAGS_QT4)
endif

の部分を

ifeq ($(__BUILD_QT4__),yes)
INCLUDES += $(INCLUDES_QT4)
LDFLAGS  += $(LDFLAGS_QT4) -lstdc++
endif

にする必要がある。

以下はビルド作業例。

$ tar Jxf /path/to/xautoclick-0.31.tar.xz
$ cd xautoclick-0.31/
[xautoclick-0.31]$ ./configure
[xautoclick-0.31]$ make

ビルドが終了した後で各コマンド名の実行ファイル群を必要に応じてコピーして用いる。

上の変更なしでQt4版のビルドを試みると下のようなエラー(“undefined reference to …” の行)になる。

[xautoclick-0.31]$ LANG=C make
...
g++ -MM -O4 -DHAVE_INTTYPES_H  -DHAVE_MALLOC_H -DHAVE_UNISTD_H  -DQT_SHARED -I/usr/include/qt4 -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I/usr/include/qt4/QtCore   guiqt4-moc.cpp 1>.deps/guiqt4-moc.d
gcc -o qt4autoclick main.o osdep.o  guiqt4.o guiqt4-moc.o  -lm  -lQtGui -lQtCore  -L/usr/lib32 -lX11 -lXext -lXtst
/usr/bin/ld: skipping incompatible /usr/lib32/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib32/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib32/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib32/libc.a when searching for -lc
/usr/bin/ld: guiqt4.o: undefined reference to symbol '__gxx_personality_v0@@CXXABI_1.3'
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:127: recipe for target 'qt4autoclick' failed
make[1]: *** [qt4autoclick] Error 1
...

使い方

共通した設定項目

GUI版にもコマンド版にも以下の4つの設定項目があり、用途に応じて調整することができる。

名前説明 [単位]
pre-delay連打開始の操作から実際の自動クリック開始までの(遅延)時間 [ミリ秒]
intervalクリックの間隔 [ミリ秒]
random +/-クリック間隔のランダム幅 [ミリ秒]
number of clicks (# of clicks)クリック数 [回]

端末の非対話型プログラム(cautoclick)以外には “Tap” という操作があり、GUI版では “Tap” ボタンを繰り返し(数回から十数回程度)クリックし続けることでそのクリックのペースから “interval” と “random +/-” の値が自動的に決められる(自動連打のペースを実際のクリック操作から決めることができる)。端末の対話型プログラム(aautoclick)では “t” と入力してEnterを押す作業を “Tap” ボタンのクリックの代わりに行う。

Tap操作で自動的に間隔に関する値が決まる

画像はGTK+ 2のGUI版。"Tap" ボタンをマウスでしばらく連打すると画像のように間隔とランダム幅の値がその連打のペースに合った値に変わる。

GUI版

上記の設定値をGUI部品上で調整の上で “Start” ボタンを押すと、“Stop” ボタンが押されるか、自動クリックされた数が “# of clicks” で指定されたクリック数に達するまでの間連打状態になり、マウスカーソル位置でマウスの1番(左)のボタンが連打されるのと同じ効果になる。連打中はマウスカーソルの位置に注意する必要があり、特に間隔の短い連打を行っている最中はWebブラウザ内のリンクなどの上に乗らないよう十分気を付けなくてはならない。連打対象以外のアプリケーションはワークスペースを分けたり最小化や巻き上げを行ったりするとよい。

GUI版のウィンドウはウィンドウマネージャの設定で最前面に表示するようにしておくと便利。CompizでGTK+ 2版を使用する場合、CompizConfig 設定マネージャ (CCSM)の “Window Rules” プラグインの “Matches” タブの “Above” にウィンドウ・クラスを登録しておく(GTK+ 2版の場合は “class=Gautoclick2” を記述する)と、いちいちウィンドウマネージャのメニューを開かなくても自動的に最前面に表示されるので楽。xAutoClickを起動した後ならウィンドウマネージャを別のものに切り替えても最前面状態は保持されるので、連打時に別のウィンドウマネージャを用いる場合でも最前面切り替えの操作を省く目的でCompizは役に立つ。

端末の非対話型プログラム(cautoclick)

端末の非対話型プログラム(cautoclick)ではオプション指定によって設定を行う。

設定項目オプション既定値
pre-delay-p2000
interval-i1000
random +/--r0
number of clicks (# of clicks)-n32
$ cautoclick -p [クリック開始までのミリ秒数] -i [クリック間隔のミリ秒数] -r [クリック間隔のランダム幅のミリ秒数] -n [クリック数]

このプログラムは非対話型プログラムなので、他のコマンドと組み合わせて用いたり、繰り返し実行したりと高度な使い方ができる。

cautoclickの動作切り替えスクリプト

cautoclickはデスクトップ環境やウィンドウマネージャのコマンド実行機能(設定方法は環境によって異なる)から呼び出すことで、キーボード入力によって自動クリックを行うことができる。

また、下のようなスクリプトを作成し、このスクリプトを実行するための入力キーを設定することで、同一のキーボード入力によって連打状態(オン/オフ)を切り替えることができる。動作にはcautoclickの他にnotify-sendコマンド(Debian/Ubuntuでは “libnotify-bin” パッケージ)が必要。

[任意]ファイル名:toggle-cautoclick.sh
#! /bin/sh

### 設定ここから ###

# cautoclickのパス名
CAUTOCLICK=/usr/bin/cautoclick
# クリック間隔[ミリ秒]
INTERVAL=500
# クリック回数[回]
NUMBER=100
# クリック開始までの時間
# 0だとスクリプトが正常に動作しないため、ある程度の値が必要
DELAY=1000
# クリック間隔のランダム幅[ミリ秒]
RANDOM=0
# ロックファイル
LOCKFILE=/tmp/cautoclick-lock

### 設定ここまで ###

if test -f ${LOCKFILE}; then
  killall ${CAUTOCLICK}
else
  touch ${LOCKFILE}
  notify-send "cautoclick" "$(printf "自動クリックを開始\n 遅延: %d\n 間隔: %d\n ランダム幅: %d\n クリック数:% d\n" ${DELAY} ${INTERVAL} ${RANDOM} ${NUMBER})"
  ${CAUTOCLICK} -i ${INTERVAL} -n ${NUMBER} -p ${DELAY} -r ${RANDOM}
  if test ${?} -eq 0; then
    notify-send "cautoclick" "自動クリックが終了"
  else
    notify-send "cautoclick" "自動クリックを停止"
  fi
  rm ${LOCKFILE} -f
fi

上はWebアンケートの回答などで使用しているもの。設定値部分を変更して別ファイルとして保存して別の入力キーを割り当てることで、高速連打用など用途ごとに使い分けることができる。

端末の対話型プログラム(aautoclick)

端末の対話型プログラム(aautoclick)を実行すると

$ aautoclick
aautoclick

p - set pre-delay
i - set interval
r - set random +/-
n - set number of clicks
t - tap
s - start
q - quit

pre-delay:          2000
interval:           1024
random +/-:         64
number of clicks:   32

> 

操作一覧と現在の設定が表示されるので、操作に応じた文字(“pre-delay” の変更なら “p” ・終了は “q”)を入力してEnterを押す。設定変更の場合は新しい値を入力すると変更が反映された後で入力待ちに戻る。

(pre-delayを2222にする例)
> p
new value: 2222
pre-delay:          2222
interval:           1024
random +/-:         64
number of clicks:   32

> 

これを設定項目ごとに繰り返し、全ての設定が終わったら “s” を入力すると連打が始まり、指定回数に達すると終了する。途中でCtrl-Cを押して終了しても連打は止まる。

各種改造

GUI部品の初期値変更

GUI版を使用する際、見出し:共通した設定項目で書いた4つの設定値(GUI部品上の値)はプログラムが終了しても保存されず、起動の度に初期値から変更する必要がある。同じ用途で頻繁に使う場合にはこれは面倒なので、プログラム内の初期値部分を変更してビルドすることで使いやすくできる。

クリック数上限の変更

xAutoClickのバージョン0.31時点では、GUI版ではクリック数(# of clicks)の値の上限がGUIツールキットによらず “10240回” となっているが、Cookie Clickerなどのゲームで “interval” を小さくした超高速連打を行うと、この回数を指定してもあっという間に連打が終了してしまう。その度に “Start” をいちいち押すのは面倒。

クリック数のカウントは、内部的にはxAutoClick自身もGUIツールキット側も符号付きのint型で行われており、x86_32やx86_64のGNU/Linuxではint型は32bitとなるため、GUI部品部分の上限を “10240” から修正することによってクリック数の上限を最大で2,147,483,647(231 - 1 = 約21.47億 = 約 2.147 billion)回にまで上げることができる。

GTK+ 2版の警告メッセージとその対処

GTK+ 2版は、そのままビルドして実行すると

(gautoclick2:[プロセスID]): Gtk-WARNING **: GtkSpinButton: setting an adjustment with non-zero page size is deprecated

という警告メッセージが端末に複数回出る。これはGTK+の “スピンボタン” というGUI部品(数値入力用の値操作ボタン付きのGUI部品・GtkSpinButtonクラス)をgtk_spin_button_new()で作成する際にgtk_adjustment_new()で別途作成したGtkAdjustmentというクラスのオブジェクトを最初の引数に指定する場合、その中の最後の “page_size” という引数(同名のGObjectプロパティでも指定可)を “0” にする必要があることと関係しており、GTK+ 3では

[引用] https://developer.gnome.org/gtk3/stable/GtkAdjustment.html#GtkAdjustment–page-size より
The page size of the adjustment. Note that the page-size is irrelevant and should be set to zero if the adjustment is used for a simple scalar value, e.g. in a GtkSpinButton.

“GtkSpinButtonなどスカラー値に使われるGUI部品については0にするべき” としており

[引用] https://developer.gnome.org/gtk3/stable/GtkAdjustment.html#GtkAdjustment–upper より
The maximum value of the adjustment. Note that values will be restricted by upper - page-size if the page-size property is nonzero.

0以外が指定されていると最大値を指定しても実際の最大値がこれよりも “page-size” 分だけ低くなる。

対処としては、guigtk1.c内のgtk_adjustment_new()の最後の引数を全て “0” に変更する。

なお、PPAリポジトリ “ppa:kakurasan/misc” で公開しているUbuntuパッケージについてはこの修正は適用済み。

GTK+ 3への対応

xAutoClickはバージョン0.31時点ではGTK+ 3には対応していないが、ソースとビルドシステムを編集することで対応させることはできる。

見出し:GTK+ 2版の警告メッセージとその対処の対処に加え、GtkGridによるレイアウトを行ったものを手元で作業し、動作するものが完成した。詳しくは後述のパッチの内容を参照。

GTK+ 3で動くようにして、更に最大クリック数と初期値を変更したもの

画像はクリック数上限の修正も含んだもので、GTK+ 3で動いている。

パッチ群を公開

上記の実際の変更点をパッチにしたものを

https://drive.google.com/file/d/0BxQwOAhivceedkdYS2dQaFFNdEk/view?usp=sharing

に公開した。変更部分(パッチ自身)はパブリック・ドメインとする。好みに応じて修正して使用する。

ファイル名説明
xautoclick-0.31-gtk2-largenumber.patchGTK+ 2版の警告メッセージを無くし、更にクリック数の初期値と最大値を2,147,483,647にする
xautoclick-0.31-gtk2-largenumber-fast.patch上に加えて超高速連打向けに他の初期値を調整したもの
xautoclick-0.31-gtk3.patchGTK+ 3版のソース追加とビルドシステムへの変更
xautoclick-0.31-gtk3-largenumber.patch上に加えてGTK+ 3版のクリック数の初期値と最大値を2,147,483,647にする
xautoclick-0.31-gtk3-largenumber-fast.patch上に加えて超高速連打向けに他の初期値を調整したもの
xautoclick-0.31-qt4-ldflags.patchQt4の開発パッケージがインストールされている場合にQt4版のリンク時にエラーが出る問題の対処

名前に “gtk2” を含むファイルは他の “gtk2” を含むファイルとは同時には適用できず、同様に “gtk3” を含むファイルは他の “gtk3” を含むファイルとは同時には適用できない(含むものの中から1つを選択して適用する)。先述のPPAリポジトリで公開しているパッケージでは改造版のファイル群を “xautoclick-modified” というパッケージ名で以下のコマンドとして利用できるようにしている。

コマンド名説明
gautoclick2-largenumberGTK+ 2版 / クリック数の初期値と最大値を2,147,483,647に変更
gautoclick2-largenumber-fastGTK+ 2版 / クリック数とその上限を2,147,483,647に変更 / 超高速連打向けに他の初期値を調整
gautoclick3GTK+ 3版
gautoclick3-largenumberGTK+ 3版 / クリック数の初期値と最大値を2,147,483,647に変更
gautoclick3-largenumber-fastGTK+ 3版 / クリック数の初期値と最大値を2,147,483,647に変更 / 超高速連打向けに他の初期値を調整

xmodmapによるボタン割り当て変更時の連打ボタンの扱い修正

で扱ったxmodmapコマンドによるマウスボタン割り当て変更を行うと、xAutoClickで押されるボタンの番号が意図しないものになる場合がある。

物理的な左ボタン以外を1番に割り当てる設定をしている場合、連打されるボタンは物理ボタン1(物理的な左ボタン)に割り当てられた番号となり、1番のボタンとして連打されない。

例えば

(マウスボタン割り当て状態を確認)
$ xmodmap -pp
There are 13 pointer buttons defined.

    Physical        Button
     Button          Code
        1              8
        2              2
        3              9
...
        9              1
...

のように、物理的な左ボタンを8番にしていると、8番のボタンが連打されることになる。[2]

上の場合は “Button Code” が “1” になっている “Physical Button” の番号、つまり “9” をソース[3]中の全てのXTestFakeButtonEvent()の2番目の引数に入れることで1番のボタンが連打される効果が得られる。

(物理ボタン9を1番に割り当てている状態で1番のボタンのクリックを連打したい場合の修正例)
[xautoclick-0.31]$ sed -i 's:XTestFakeButtonEvent(display, 1,:XTestFakeButtonEvent(display, 9,:' gui*.c*

このボタン番号は先述した設定項目とはなっていないため、バージョン0.31時点ではボタン番号の変更が必要な場合は自分でソースを編集してビルドするしかない。もしくは上記記事に追記したxinputコマンドを代わりに用いることで不具合を回避する。

使用したバージョン:
  • xAutoClick 0.31
  • Compiz 0.9.12.2
  • CompizConfig Settings Manager 0.9.12.2
  • xfwm4 4.12.3
[1]: サイトによってはラジオボタンの場合にTabキーと矢印キーを用いて進める回答方法も有効だが、マウスクリックが必須なサイトもあるのでそういったところでは役に立つ
[2]: 連打されるボタンの番号はxevを使うと確認できる
[3]: “gui” で始まるファイル名のもので、ビルド対象以外は編集しなくても可