ポケモンを一括で博士に送りたい：AndroidDebugBridge (ADB) を使ってちょっとだけ楽にする

ポケモンGoブームもそろそろ陰りが見えてきましたね。

私は格安スマホを使っているため、ARモードができないのはもとよりPokemonGo全体的に動作がもっさりしています。特に博士にポケモンを送るのが大変で、ポケモン詳細画面のスクロールがうまく行かない上に一匹ずつしか送れないので、かなりストレスフル。ということでADBとBashの練習がてら、博士へのポケモン転送を軽く自動化することで、半一括みたいな感じにして負担を減らしてみました。
思いつきなのでもっと簡単にリピートタスク自動化する方法は他にありそう。ぜひ教えてください。

免責：バグ等があっても責任は負いません。私は開発中に誤ってラッタを送ってしまいました。__なお、間違えたくないポケモンはお気に入りに追加しておくと、誤送信を防げるようです。__

# ADBの導入
``adbコマンド　Windows``などでググってください。ここが一番ハードルが高い。

# 実行
0. ``source pokemon-go.sh``
コードはあとで。

0. スマホとPCをUSBで繋ぎ、USBデバッグをオンにする。

0. ポケモンGoを起動してポケモン一覧を表示
<img width="120px" src="https://qiita-image-store.s3.amazonaws.com/0/38363/e71ce01c-647f-3260-4fa4-9bad2d9f481d.png" alt="pokelist">

0. 番号順にソートして~~消したい~~送りたいポケモン（コラッタ）を一番上に持ってくる
<img width="120px" src="https://qiita-image-store.s3.amazonaws.com/0/38363/b13af35c-8934-380c-a8fe-1ea2a3b4fe53.png" alt="sorted-pokelist">

0. ``send-pokemons right 3``
今回は、一番上の右から順に３体のポケモンを博士に送ります。

0. 待つ
<img width="120px" src="https://qiita-image-store.s3.amazonaws.com/0/38363/0cc6a021-1298-e5b3-caf2-a95786c5928e.png" alt="sendbutton.png">
順に博士に送り始めます。日付の下の空白はなんなんでしょうね。

0. 完了!
<img width="120px" src="https://qiita-image-store.s3.amazonaws.com/0/38363/d09f5178-cc3d-c82e-af13-ba8f89a6580f.png" alt="sendend.png">

# コード
数値とか自分の実機専用です。
__2016年7月31日に「博士に送る」周りのUIが変更されてからのものに対応をしました。__
ゆっくりスクロールを強制されるバグがなくなり、送信時間が短縮されました。

```bash:pokemon-go-after-2016_07_31.sh
function send-pokemons () {
  echo "Begin";
  for ((i=1; i<=$2; i++)); do
    echo $i
    send-pokemon $1
  done
  echo "Finished";
}


function send-pokemon () {
  case "$1" in
    "left")   x=130;;
    "center") x=360;;
    "right")  x=590;;
    *) echo "unknown position"
       return;;
  esac

  # ポケモンリストで、一番上の指定した位置のポケモンをタップ
  adb shell input tap $x 360
  sleep 1

  # フローティングアクションボタンをタップ
  adb shell input tap 620 1180

  # 「博士に送る」ボタンを押し確認画面で「はい」を押す
  adb shell input tap 620 1040
  adb shell input tap 360 670
  sleep 3
}
```

```bash:pokemon-go-before-2016_07_30.sh
function send-pokemons () {
  echo "Begin";
  for ((i=1; i<=$2; i++)); do
    echo $i
    send-pokemon $1
  done
  echo "Finished";
}


function send-pokemon () {
  case "$1" in
    "left")   x=130;;
    "center") x=360;;
    "right")  x=590;;
    *) echo "unknown position"
       return;;
  esac

  # ポケモンリストで、一番上の指定した位置のポケモンをタップ
  adb shell input tap $x 360
  sleep 1

  # 「博士に送る」ボタンが表示されるまでスクロール。
  #  私の場合時間をかけてゆっくりスクロールしないとアプリに認識されませんでした。
  adb shell input swipe 700 1200 700 250 4300
  sleep 1

  # 「博士に送る」ボタンを押し確認画面で「はい」を押す
  adb shell input tap 360 1050
  adb shell input tap 360 670
  sleep 3
}
```

## 解説
__座標・待機時間を自分のスマホに調整する必要があります。__
各値を調べるときは``開発者向けオプション``で``ポインタの位置``をオンにすると便利です。
画面サイズは``adb shell dumpsys window | grep "mUnrestrictedScreen"``で取れます。

``send-pokemons (position) (count)``
特に説明することも無いかと思いますが指定された(count)回数だけ``send-pokemon (position)``を実行します。

``send-pokemon (position)``
一番上の(position)の位置にあるポケモンを博士に送ります。

``adb shell input tap X Y``
``adb shell input swipe X1 Y1 X2 Y2 DURATION``
adbのコマンドです。タップやスワイプを再現します。

``sleep N``
N秒停止するbashのコマンドです。スマホがサクサクなら必要ないかも。



# ToDo
- もっといっぺんにいろんなポケモンを送れるようにする
- 以下でスクリーンショットができるので画像識別してもっと簡単にやりたい。
    - ``adb shell screencap -p | sed 's/\r$//' > XXX.png``