Python 自動デスクトップクリック

## 背景
自動でクリックしたいときってありますよね。

このプログラムはクリックしたい画像や入力したい項目をスクショしておくだけで、自動でクリックや入力をしてくれるように作りました。

スクショするときは、画像をリサイズしないように気を付けてください。

細かい説明はごめんなさい🙇
あと汚いコードでごめんなさい🙇
お好きなように、皆さん改造してください。
誰かがこちらをGUI化してくれることを祈ります（涙）

ソフトウェアエンジニアなら、ソフトウェアの力を借りて楽に生きよう～。

## ターゲット画像の遷移 3段階
1. デスクトップからターゲットを探す -> クリック
2. デスクトップからターゲットを探す -> クリック
3. デスクトップからターゲットを探す -> "Qiita"と入力
![X_Dammy_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/8a7390b4-624f-64a1-966e-6908382043bf.png)


## 実行結果
![fl7a5-yoz3n.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/f040cca5-89f4-1271-7b46-baa3d743acbf.gif)


## サンプルコード

```python:Auto_Click.py
import numpy as np
import pyautogui
import imutils
import time
import cv2

class AUTO_DKK(): # p

    def __init__(self):
        self.max_val_of_TH = 0.9
        self.show_width = 300
        self.show_height = 300
        self.time_counter = 5

    def set_template_img(self, tmp_file_name):
        self.tmp = cv2.imread(tmp_file_name)
        self.tmp_, self.tmp_w, self.tmp_h = self.tmp.shape[::-1]

    def show_tmp(self):
        if self.tmp_w > self.tmp_h :
            cv2.imshow("Template", imutils.resize(self.tmp, width=self.show_height))
            print("self.tmp_w > self.tmp_h", self.tmp_w, self.tmp_h)
        else :
            cv2.imshow("Template", imutils.resize(self.tmp, height=self.show_width))
            print("self.tmp_w < self.tmp_h", self.tmp_w, self.tmp_h)
        cv2.waitKey(1)

    def get_screenshoot_image_for_cv(self):
        self.img = pyautogui.screenshot()
        self.img = cv2.cvtColor(np.array( self.img ), cv2.COLOR_RGB2BGR)

    def detect_target(self):
        res = cv2.matchTemplate(self.img, self.tmp, cv2.TM_CCOEFF_NORMED)
        self.min_val, self.max_val, self.min_loc, self.max_loc = cv2.minMaxLoc(res)

    def over_SH_or_not(self):
        if self.max_val > self.max_val_of_TH :
            print("\rDetect Target : Point = {:.4}".format(self.max_val), end="")
            return True
        else :
            print("\rNo Detect Target : Point = {:.4}".format(self.max_val), end="")
            return False

    def count_down_3_2_1(self):
        print()
        for i in range(self.time_counter):
            print("\rMove mouse, Count Down : {} s".format(self.time_counter - int(i)), end="")
            time.sleep(1)
        print()
        print("Go on target")

    def move_to_terget_point(self):
        top_left = self.max_loc
        btm_right = (top_left[0] + self.tmp_w, top_left[1] + self.tmp_h)
        x_center = int((top_left[0] + btm_right[0])/2)
        y_center = int((top_left[1] + btm_right[1])/2)
        self.terget_point = (x_center, y_center)
        pyautogui.moveTo(self.terget_point[0], self.terget_point[1])

    def input_text_word(self, intput_word):
        self.word = intput_word

    def choice_option(self, option):
        if option == "input_text" :
            pyautogui.click()
            time.sleep(0.1)
            pyautogui.typewrite(self.word, interval = 0.5)
            pyautogui.press('enter')
        elif option == "one_click" :
            pyautogui.click()
        elif option == "double_click" :
            pyautogui.doubleClick()

    def doubleclick_target(self):
        pyautogui.doubleClick()

    def oneclick_target(self):
        pyautogui.click()()

a_dkk = AUTO_DKK()
tmp_file_name = ["dammy_1.png",  "dammy_2.png",  "dammy_3.png"] # dammy_1
tmp_file_name = ["X_dammy_1.png",  "X_dammy_2.png",  "X_dammy_3.png"] # dammy_1
CHOICE_       = ["double_click", "double_click", "input_text"]#input_text
input_word    = ["",              "",            "Qiita"]#input_text
""" choice_option
* input_text
* one_click
* double_click
"""

for t_f_n, choise_, i_w in zip(tmp_file_name, CHOICE_, input_word):
    a_dkk.set_template_img(t_f_n)
    a_dkk.show_tmp()
    while True:
        a_dkk.get_screenshoot_image_for_cv()
        a_dkk.detect_target()
        Judgement = a_dkk.over_SH_or_not()
        if Judgement :
            a_dkk.count_down_3_2_1()
            a_dkk.move_to_terget_point()
            if choise_ == "input_text" :
                a_dkk.input_text_word(i_w)
            a_dkk.choice_option(choise_)
            break
    print("Next")
    time.sleep(1)
```