An open-source Skroutz web scraper and price monitor. Receive automated push notifications when products reach your desired price.
Important
Skroutz is a registered trademark of Skroutz S.A. This project is an independent, unofficial tool and is not affiliated with, authorized, maintained, sponsored, or endorsed by Skroutz S.A. in any way.
Click to expand
- Automated Monitoring: Set it and forget it. Tracks products silently in the background.
- Instant Notifications: Get instant push notifications (Telegram, Discord, Slack, Email, etc.) for price drops.
- Custom Target Prices: Define specific price drop thresholds for every individual product.
The scraper supports all Skroutz domains, dynamically detecting the locale and currency:
.gr(Greece - β¬).cy(Cyprus - β¬).bg(Bulgaria - β¬).de(Germany - β¬).ro(Romania - Lei)
- Linux/Unix environment (
systemdavailable for scheduling). - Python 3.7+ installed (
python3,python3-venv).
-
Install required system packages:
Debian / Ubuntu / Raspberry Pi OS / Linux Mint
sudo apt update sudo apt install git python3-venv
Fedora / RHEL / Rocky Linux
sudo dnf install git python3
Arch Linux / Manjaro
sudo pacman -S git python
-
Clone the repository:
git clone https://github.com/CVasilakis/scrooge-alert cd scrooge-alert -
Run the installation script:
chmod +x install.sh ./install.sh
The
install.shscript will automatically create a Python virtual environment, install the required dependencies, and set up an hourly systemd user timer pointing to the script wrapper. Nosudoor elevated privileges are required for the installation. -
Configure your settings:
Proceed to the Configuration section for more information regarding your Push Notification Settings and your Product Tracking List
All custom user parameters reside outside the source code logic. Apprise Notification URLs go in the .env file, and the Skroutz products you want to monitor go inside the config/skroutz.json file.
This script leverages the Apprise library to deliver push notifications across numerous platforms, including Discord, Telegram, Slack, and Email. To format your specific Apprise URL, consult the Apprise Supported Services Documentation or use their interactive URL Builder Tool. Copy the provided .env.example template to a new .env file and configure the NOTIFICATION_URLS variable:
cp .env.example .env
nano .envYou can specify multiple platforms by separating their URLs with commas. For instance, to receive alerts on both Telegram and Discord simultaneously, your .env file would look like this:
NOTIFICATION_URLS = tgram://<token>/<chat_id>, discord://<webhook_id>/<webhook_token>The config/ directory stores your product monitoring list. Copy the provided config/skroutz.json.example template to create your initial tracking file:
cp config/skroutz.json.example config/skroutz.json
nano config/skroutz.jsonAfterwards, open config/skroutz.json and populate it with the items you want to keep an eye on. For example, if you wish to track two products, your file should be structured like this:
{
"products": [
{
"name": "Awesome Monitor",
"url": "https://www.skroutz.gr/s/xxxxxxxx/product_url.html",
"target_price": 150
},
{
"name": "Great Game",
"url": "https://www.skroutz.cy/s/xxxxxxxx/product_url.html",
"target_price": 30
}
]
}| Field | Type | Source | Description |
|---|---|---|---|
name |
String | User-defined | A friendly naming label used inside the notifications. |
url |
String | User-defined | The direct link to the Skroutz product page. |
target_price |
String/Number | User-defined | The maximum price threshold. If the price drops below this, you get alerted. |
skip |
Boolean | User-defined | Optional. Set to true to skip monitoring this product. Defaults to false. |
last_price |
Number | Internal | Auto-generated by the script. Do not modify. Stores the latest scraped down price. |
last_checked |
String | Internal | Auto-generated by the script. Do not modify. Timestamp of the last successful price check. |
Note
You do not need to manually add the internal fields. The script will generate and maintain them during execution.
There are two ways to execute the script: automatically via the scheduled systemd timer, or manually for testing.
Once install.sh has run successfully, the script executes automatically via a systemd timer every hour. The systemd timer applies a randomized up-to-5m startup delay before launching the execution wrapper (scripts/run.sh) to simulate human timing and avoid exact scheduling footprints.
You can manually interact with the application using the wrapper script. The wrapper safely loads the virtual environment and passes commands along to the backend application.
./scripts/run.sh [FLAGS]| FlagΒ Β Β Β Β Β Β Β Β Β Β Β | Action |
|---|---|
--quiet |
Suppresses all console output. This is used by the systemd setup to prevent log spam. |
--status |
Performs a comprehensive health check. It validates the configuration, and verifies the background systemd service and timer status. |
--ping |
Sends a test notification directly to your configured Apprise URLs, then immediately exits. Helps pinpoint .env misconfigurations. |
If you run the script without any flags, it will execute normally and output its progress logs directly to the terminal. You can safely interrupt the manual execution at any time by pressing Ctrl+C.
./scripts/run.shNote
Only one instance of the script is allowed to run at a time to avoid triggering anti-bot protections. If a background execution is currently in progress, your manual run will be blocked until it completes. If you need to forcefully stop the active background execution to run the script manually, you can safely use the stop script: ./scripts/stop.sh. This stops the current background run but will not break any future scheduled executions.
If you run the script using the --status flag, the script verifies the integrity of your config/skroutz.json file, validates your environment variables in .env file, and queries systemd to display the following background execution details:
./scripts/run.sh --status- Linger Enabled: Checks if user lingering is configured for background execution.
- Systemd Timer Active: Shows whether the timer is currently active.
- Last Execution Time: Displays when the script was last run.
- Last Execution Status: Indicates last execution results and if any errors happened.
- Next Scheduled Execution: Displays the next scheduled run or if it's currently running.
If you want to test whether your .env notification URLs are configured correctly without waiting for a scheduled run or a real price drop, you can use the --ping flag.
./scripts/run.sh --pingThis will send a test message to each configured Apprise URL(s). It will output a report of successes and failures, helping you quickly identify and debug any misconfigured notification endpoints.
Tip
If the script fails to run in the background or you do not receive expected notifications, please consult the Troubleshooting & Debugging section. If your problem persists, feel free to open an issue.
You might receive the following push notification alerts throughout the lifecycle of the script:
| Notification Title | Body / Cause |
|---|---|
| Skroutz Price Drop Alert! | "{Product} is now available for ..." Sent when a product's price falls below your price limit. |
| Skroutz Tracking Stale | "The scraping for "{Product}" hasn't been successfully completed in over 48 hours..." Sent if a specific product continuously fails the scrape. |
| Skroutz Scraping Errors | "The Scrooge Alert script encountered errors while checking some of your products..." Sent if the application hits fatal request limits or unhandled exceptions. |
| Skroutz Script Crash | "The Scrooge Alert script failed unexpectedly. Please review the error logs..." Sent if the script completely failed to run. |
| Skroutz Test Notification | "This is a test message to confirm that your Scrooge Alert notifications are configured correctly!" Sent when manually invoking the script with the --ping flag. |
To completely remove the background service and clean up the Python virtual environment, execute the uninstallation script:
./scripts/uninstall.shThe uninstallation process safely performs the following actions:
- Stops and disables the systemd scheduled timer and service.
- Removes the associated systemd configuration files.
- Deletes the Python virtual environment (
venv).
Note
User Data: Your personal configurations, specifically the .env and config/skroutz.json files, are preserved by the uninstallation script to prevent accidental data loss. If you wish to completely purge the application, simply delete the scrooge-alert directory after running the uninstallation script.
User Lingering: The script purposefully leaves systemd user lingering enabled, as other background services on your system may rely on it. If you are certain that no other services require this functionality, you can manually disable it by running: loginctl disable-linger $USER
1. Failing to Fetch Products:
If the script cannot retrieve data for certain items, begin by checking for broken links in your config/skroutz.json file. Invalid URLs are often redirected to similar products by Skroutz.
If the URLs are correct but failures persist across multiple products, your connection has likely been temporarily restricted by the website's anti-bot protection. To mitigate this, reduce your network traffic by tracking fewer products, or decrease the script's run frequency by editing ~/.config/systemd/user/skroutz-scraper.timer.
Tip
For the best results, this script should not be run behind a VPN and should ideally be executed from a standard Greek residential IP address. High traffic coming from known VPS providers, data centers, or VPNs is very likely to trigger strict anti-bot mechanisms, causing the script to fail.
2. Not Receiving Notifications:
If you do not receive a test message, carefully review the Notification Settings section and verify that your Apprise URLs inside the .env file are formatted correctly.
You can easily test your notification setup using the --ping flag:
./scripts/run.sh --ping3. Application Logs & Crash Reports:
The application maintains comprehensive logs to help you monitor background executions and diagnose issues. You can find these files in the logs/ directory:
- Background Execution Logs (
logs/skroutz.log): When the script runs automatically in the background, all standard output is saved here. These logs rotate daily at midnight, and the system automatically retains the last 7 days of history to prevent excessive disk usage. - Crash Reports (
logs/error_log.txt): If the script unexpectedly fails or encounters a critical exception, it saves the detailed stack trace and error information directly to this file for easier debugging.
The default configuration applies rate limiting to reduce traffic and increase the success rate of the web scraper:
- A randomized startup delay (up to 5 minutes) is applied by the systemd timer before each background execution to avoid exact scheduling footprints.
- Products are checked sequentially, not concurrently.
- A base 20s delay, plus randomized jitter (1-5s), is enforced between requests.
Tip
Periodically remove items from config/skroutz.json once you purchase them or abandon interest. Also avoid decreasing the scraping delays. Over-frequent scraping will trigger strict anti-bot mechanisms and the script will fail to fetch the product data.
1. How can I tell if the script is actively running in the background?
To confirm the script is running in the background, use the --status flag. If the script reports no errors, you can be sure it is configured correctly and running in the background:
./scripts/run.sh --statusThe systemd execution metrics reported by the --status flag only reflect background scheduled executions, not manual runs.
If the command reveals any warnings, please run ./update.sh which re-installs the background service and ensures that you are on the latest version. If the issue persists after updating, please open an issue for further assistance.
2. Can I get notifications sent to Discord, Telegram, or other specific services?
Most likely, yes! The script uses the Apprise push notification library, which supports almost every major platform available. As long as you can configure your target URL(s) inside your .env file, it will work perfectly. Check out their Supported Services page for the full list.
3. How do I update the script to the latest version?
Navigate to the project directory and run the update script. This will pull the latest changes using Git and automatically run the installation script again to ensure any new dependencies are installed and your environment is properly updated:
./update.shWhen run manually, the script automatically checks the online repository for updates. If a newer version is found, a message is displayed in the terminal.
4. Is it safe to edit my product list while the script is running?
Absolutely. You can safely add, edit, or remove products at any time. The script uses an atomic save mechanism, meaning your changes will be safely preserved and seamlessly picked up during the next scheduled execution cycle without causing any file conflicts.
5. How many products can I track at once using the default settings?
Because the script intentionally pauses for about 25 seconds per product to avoid being blocked by the website, monitoring too many items might cause the execution to exceed the 60-minute window before the next cycle starts. While the script has safety locks to prevent overlapping runs, a practical soft limit is around 100 products per instance when using the default hourly schedule.
6. How long does a full scrape take to complete?
To mimic human behavior, the script spaces out its requests. It applies a base delay of 20 seconds per product, plus an unpredictable jitter of 1β5 seconds. If you are tracking 10 products, a full manual run will take approximately 4 minutes. (Note: Background runs via systemd also have a randomized startup delay of up to 5 minutes, which is not applied to manual executions).
7. Why are the timestamps in my product list showing the wrong time?
The script relies entirely on your system's clock to generate the timestamps saved in config/skroutz.json. If the time looks wrong, your operating system's clock or timezone is likely out of sync. You can usually fix this by updating your server's time settings.
8. How do I move the project to a different folder?
- Run
./scripts/uninstall.shin the old folder to clean up the existing background processes. - Clone the repository into your new desired folder using Git.
- Move your
config/skroutz.jsonand.envfiles from the old folder to the new one. - Run
./install.shin the new location to rebuild the environment and background timers. - Safely delete the old project folder.
9. What is systemd "lingering," and why does the installer enable it?
By default, Linux kills all background processes associated with a user the moment they log out of their SSH session. Enabling "lingering" tells the system to keep your user's background services running continuously, even after you disconnect. It is a completely safe, standard Linux feature that allows the scraper to run automatically without requiring root (sudo) privileges. The installer simply checks if it's enabled for your user and turns it on if it isn't, and because other services might rely on this setting, the uninstallation script intentionally leaves it enabled.
10. How can I temporarily disable background executions?
If you want to stop the script from running automatically in the background without completely uninstalling it, you can use the disable script:
./scripts/disable.shTo re-enable background scheduled executions later, run:
./scripts/enable.sh- Enhanced Evasion: Rotate TLS sessions and request fingerprints intelligently.
- Multi-Marketplace Expansion: Support more scrapers for other marketplaces.
- User Interface: Introduction of a Web UI for non-CLI management.
- Docker Support: Add an alternative Dockerized setup via docker-compose configuration.
To see all the undergoing feature requests or to request a new feature, please check the open issues.
Contributions are always welcome! If you have an idea to make this project better, feel free to fork the repository and submit a pull request. If you encounter a bug or run into any issues, please open an issue. To help me resolve it quickly, include as much detail as possible.
Did this project save you time or help you snag a deal? Leaving a β on the repository means a lot! If you'd like to further support my work, consider buying me a coffee. Thanks!
Please use this script responsibly. This script is intended for personal, educational use. Users are solely responsible for how they use the script and must comply with Skroutz's Terms of Service. The author is not responsible for any bans, blocks, or legal issues that may arise from using this software.
This project is licensed under the MIT License - see the LICENSE file for details.