🏹
Pythonで連射マクロツールを作る(複数ホットキー&インターバル設定対応)
🔫 はじめに
マインクラフトを友人と遊んでいると、トラップで敵を倒し続けるときや、
長時間の移動や作業でキーを連打する必要が出てくることがよくあります。
マウスやキーボードを手動で押し続けるのはしんどいなぁ…と感じていたので、
複数ホットキーで連射ON/OFFが切り替えられるマクロツールをPythonで作ってみました!
それぞれのキーにクリック間隔 / 連射時間 / 休止時間を設定できるのがポイントです!
💡 作成背景
最初は左クリックの自動連射だけを考えていましたが、
右クリックやWASDなどキー連射にも応用できるように拡張しました。
さらに、複数のマクロを同時に動かせるようにして、
連射中でも別のキーに切り替えられるようにしてみました。
今後はカスタム性の向上や複数マクロの同時管理をさらに強化する予定です😊
🐍 使用したライブラリ
🖥️ 環境構築手順
# Pythonのバージョン確認
python --version
# プロジェクトフォルダ作成
mkdir rapid_fire_macro
cd rapid_fire_macro
# 仮想環境作成
python -m venv venv
# 仮想環境有効化(Windowsの場合)
venv\Scripts\activate
# 必要なライブラリをインストール
pip install pyautogui keyboard
⚙️ 連射マクロプログラム
以下のPythonコードで、複数の「連射プロファイル」を登録できます。
各プロファイルにはホットキー・対象キー・クリック間隔・連射時間・休止時間を設定可能です。
ホットキーを押すたびに、対応するキーの連射がON/OFF切り替わります。
rapid_fire_macro.py
コードをコピーする
import pyautogui
import keyboard
import threading
import json
import os
import tkinter as tk
from tkinter import messagebox, simpledialog
CONFIG_FILE = 'profiles.json'
profiles = []
running_flags = {}
# 設定ファイル読み込み
def load_profiles():
global profiles
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, 'r') as f:
profiles = json.load(f)
else:
save_profiles()
def save_profiles():
with open(CONFIG_FILE, 'w') as f:
json.dump(profiles, f, indent=2)
# 連射処理
def run_profile(profile):
while True:
if running_flags.get(profile['name'], False):
end_time = pyautogui.time.time() + profile['run_duration']
while running_flags.get(profile['name'], False) and pyautogui.time.time() < end_time:
if profile['target'].startswith('mouse'):
btn = 'left' if profile['target'] == 'mouse_left' else 'right'
pyautogui.click(button=btn)
else:
pyautogui.press(profile['target'])
pyautogui.time.sleep(profile['click_interval'])
pyautogui.time.sleep(profile['rest_duration'])
else:
pyautogui.time.sleep(0.1)
# ホットキー登録
def register_hotkeys():
keyboard.clear_all_hotkeys()
for profile in profiles:
keyboard.add_hotkey(profile['hotkey'], toggle_profile, args=(profile['name'],))
def toggle_profile(name):
running_flags[name] = not running_flags.get(name, False)
refresh_status()
# 状態表示更新
def refresh_status():
status_text = ""
for profile in profiles:
state = "ON" if running_flags.get(profile['name'], False) else "OFF"
status_text += f"{profile['name']} : {state}\n"
status_label.config(text=status_text.strip())
# プロファイル追加
def add_profile():
name = simpledialog.askstring("追加", "プロファイル名:")
if not name:
return
hotkey = simpledialog.askstring("追加", "ホットキー:")
target = simpledialog.askstring("追加", "対象キー (mouse_left, mouse_right, wなど):")
click_interval = simpledialog.askfloat("追加", "クリック間隔(秒):")
run_duration = simpledialog.askfloat("追加", "連打時間(秒):")
rest_duration = simpledialog.askfloat("追加", "休止時間(秒):")
profile = {
"name": name,
"hotkey": hotkey,
"target": target,
"click_interval": click_interval,
"run_duration": run_duration,
"rest_duration": rest_duration
}
profiles.append(profile)
save_profiles()
register_hotkeys()
spawn_thread(profile)
refresh_status()
# 連射スレッド生成
def spawn_thread(profile):
t = threading.Thread(target=run_profile, args=(profile,), daemon=True)
t.start()
# GUI
root = tk.Tk()
root.title("連射マクロツール")
root.geometry("400x400")
status_label = tk.Label(root, text="", font=("Helvetica", 12))
status_label.pack(pady=10)
add_btn = tk.Button(root, text="プロファイル追加", command=add_profile)
add_btn.pack(pady=5)
# 初期化
load_profiles()
for profile in profiles:
running_flags[profile['name']] = False
spawn_thread(profile)
register_hotkeys()
refresh_status()
root.mainloop()
📝 ポイントまとめ
- ✅ 各プロファイルは「ホットキー」「対象キー」「クリック間隔」「連射時間」「休止時間」を個別に設定可能
- ✅ 連射のON/OFFはホットキーでトグル式に切り替えられる
- ✅ 休止時間を使って「連射 → 休憩 → 連射 → …」を繰り返すマクロに応用できる
- ✅ マウス(左クリック・右クリック)にも対応
💡 これからの拡張予定
- 複数マクロのGUI上での管理(編集・削除など)
- 高度なプロファイル設定(ホットキー同時押し条件など)
- 1つのアプリで複数マクロをまとめて管理する「マクロマネージャー化」
今回はここまでです。最後まで読んでいただきありがとうございました。
また新しい便利ツールや応用例ができたらZennで発表しますので、お楽しみに!
Discussion