An advanced out-of-process fishing automation tool for World of Warcraft using Windows API hooks
Features
Β·
How It Works
Β·
Getting Started
Β·
Configuration
Report Bug
Β·
Request Feature
Β·
Original C++ PoC
This tool is for educational purposes only. Using automation tools may violate the Terms of Service of World of Warcraft and could result in account suspension or ban. The authors are not responsible for any consequences of using this software.
- Features
- How It Works
- Requirements
- Getting Started
- Configuration
- Usage
- Troubleshooting
- Architecture
- Contributing
- License
- Out-of-process operation - Uses Windows API hooks without injecting into the game
- Universal compatibility - Works with any WoW version (Classic, TBC, WotLK, Retail)
- Audio-based detection - Detects fish by monitoring Windows master volume
- Cursor change detection - Identifies bobber location via cursor icon changes
- Automatic lure application - Supports up to two different lures with configurable timers
- Wintergrasp support - Automatically logs out during Wintergrasp battles (WotLK)
- State machine architecture - Predictable and debuggable behavior
- Configuration validation - Clear error messages for misconfigured settings
- Resource efficient - Minimal CPU usage with optimized polling
Phishy uses a clever combination of Windows APIs to automate fishing without reading or modifying game memory:
- The Eyes ποΈ - Monitors cursor icon changes (
EVENT_OBJECT_NAMECHANGE
) to detect when hovering over the fishing bobber - The Ears π - Listens for volume spikes in Windows master audio to detect fish splashing
- The Brain π§ - State machine that coordinates the fishing process
- The Hands β - Simulates mouse clicks and keyboard inputs to catch fish
Start β Apply Lure (optional) β Cast Line β Find Bobber β Wait for Fish β Catch Fish β Repeat
β
Logout (Wintergrasp) β Wait β Login
- Operating System: Windows 10/11 (Windows-specific APIs)
- .NET Runtime: .NET 9.0 Desktop Runtime
- Development (if building from source):
- Visual Studio 2022 with .NET Desktop workload
- .NET 9.0 SDK
-
Download the appropriate version for your system:
- For most users: Download the latest Windows 64-bit version from the Releases page
- For 32-bit systems: Download the Windows x86 version from the Releases page
Not sure which version to choose? If you're running Windows 10/11, choose the 64-bit version.
-
Extract the ZIP file to a folder of your choice
-
Run
guess.exe
(intentionally generic name) -
On first run, a
configuration.yaml
file will be created and opened in Notepad -
Configure the settings according to your WoW setup (see Configuration)
-
Run
guess.exe
again to start fishing
-
Clone the repository:
git clone https://github.com/stdNullPtr/Phishy.git cd Phishy
-
Open
Phishy.sln
in Visual Studio 2022 -
Build the solution (Ctrl+Shift+B) in Release mode
-
Find the executable at:
Phishy\bin\Release\net9.0-windows\guess.exe
Alternatively, using the command line:
dotnet build -c Release
The bot uses a YAML configuration file (configuration.yaml
) with the following options:
# Window Configuration
game-window-name: World of Warcraft # Must match your WoW window title exactly
# Keybinds (use lowercase letters)
keyboard-key-start-fishing: 1 # Key bound to fishing ability
keyboard-key-apply-lure: 2 # Key bound to first lure (optional)
keyboard-key-apply-second-lure: 3 # Key bound to second lure (optional)
keyboard-key-logout: l # Key bound to /logout macro (for Wintergrasp)
# Lure Settings
lure-buff-duration-minutes: 10 # Duration of first lure buff
second-lure-buff-duration-minutes: 5 # Duration of second lure buff (optional)
# Fishing Settings
fishing-channel-duration-seconds: 21 # How long to wait for a fish (default: 21)
# Audio Settings
setup-sound: true # Auto-configure Windows volume settings
# Wintergrasp Settings (WotLK only)
wait-for-wintergrasp: false # Enable Wintergrasp logout/login cycle
-
Window Name: Must match exactly (case-sensitive). Common values:
World of Warcraft
(Retail/Classic)World of Warcraft Classic
- Custom names if you've renamed your window
-
Keybinds: Use single lowercase letters or numbers that match your in-game keybinds
-
Lure Duration: Set slightly lower than actual buff duration to ensure reapplication
-
Channel Duration: Default is 21 seconds, increase if you have fishing skill bonuses
-
In-game preparation:
- Bind your fishing ability to key
1
(or configure differently) - Bind your lure(s) to keys
2
and3
(optional) - Create a
/logout
macro and bind it (for Wintergrasp feature) - Position yourself at a fishing spot
- Zoom in completely (first-person view works best)
- Set game sound to ~80%, disable ambient sounds
- Bind your fishing ability to key
-
Windows preparation:
- The bot will automatically set Windows volume to maximum and mute it
- Ensure no other applications are making sounds
-
Running the bot:
- Start
guess.exe
- Focus the WoW window
- The bot will begin fishing automatically
- Press
DELETE
key to stop
- Start
- Test manual fishing first to ensure bobber lands near screen center
- Fish in quiet areas to avoid sound interference
- Keep the WoW window in focus and don't minimize it
- Don't move the mouse while the bot is running
"Failed retrieving window handle"
- Ensure the window name in config matches exactly
- WoW must be running before starting the bot
Bot doesn't detect bobber
- Zoom in completely
- Ensure bobber lands near screen center
- Try adjusting camera angle
- Check that cursor changes to "interact" icon over bobber
Bot doesn't catch fish
- Increase game sound volume
- Disable all ambient sounds
- Ensure Windows volume is not muted by other apps
- Fish in quieter areas
Configuration validation errors
- Check the error message for specific issues
- Ensure all required fields are filled
- Verify keybinds are single characters
Run from Visual Studio in Debug mode to see detailed logging output.
The project follows SOLID principles with recent architectural improvements:
- State Machine (
FishingStateMachine.cs
) - Manages fishing states and transitions - Hooks - Windows API hooks for input/output:
WinEventHook
- Cursor change detectionMouseHook
- Mouse input monitoringKeyboardHook
- Keyboard input monitoring
- Services - Business logic implementations:
AudioDetector
- Sound detectionWindowManager
- Window operationsInputSimulator
- Input simulationConsoleLogger
- Logging
- Utils - Low-level Windows API wrappers
- Interfaces - Contracts for dependency injection
- Thread-safe operations with proper locking
- Comprehensive error handling with Win32 error codes
- Resource disposal for COM objects
- Configuration validation
- Reduced CPU usage by 80%
- Clean architecture with interfaces
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature
) - Commit your changes (
git commit -m 'feat: add amazing feature'
) - Push to the branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Please ensure your code follows the existing patterns and includes appropriate error handling.
This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0) - see the LICENSE file for details.
- β Free to use, modify, and distribute
- β Commercial use is allowed
- β All derivatives MUST be open source
- β Network use requires source disclosure
β οΈ Strong copyleft - changes must use AGPL-3.0
The AGPL ensures that all modifications and derivatives remain open source, even when used as a network service. If you modify this code and provide it as a service, you must share your source code.
- Original C++ proof-of-concept: wow-fishbot
- Windows API documentation and community
- NAudio library for audio processing