From 3120f0999fb332004949fe3ceabf5255c865f453 Mon Sep 17 00:00:00 2001 From: Nayan Das Date: Sun, 12 Jan 2025 19:52:47 +0600 Subject: [PATCH] Universal Pull --- .github/CODE_OF_CONDUCT.md | 33 +++ .github/CONTRIBUTING.md | 29 +++ .github/ISSUE_TEMPLATE/bug_report.md | 25 ++ .github/ISSUE_TEMPLATE/feature_request.md | 17 ++ .github/PULL_REQUEST_TEMPLATE.md | 26 ++ .github/SECURITY.md | 63 +++++ .github/workflows/python-ci.yml | 62 +++++ .gitignore | 41 +++ LICENSE | 21 ++ README.md | 113 ++++++++ assets/icon.ico | Bin 0 -> 432254 bytes auto_website_visitor.egg-info/PKG-INFO | 148 +++++++++++ auto_website_visitor.egg-info/SOURCES.txt | 11 + .../dependency_links.txt | 1 + .../entry_points.txt | 2 + auto_website_visitor.egg-info/not-zip-safe | 1 + auto_website_visitor.egg-info/requires.txt | 4 + auto_website_visitor.egg-info/top_level.txt | 1 + main.py | 243 ++++++++++++++++++ requirements.txt | 4 + setup.py | 52 ++++ version.txt | 1 + whats_new.txt | 45 ++++ 23 files changed, 943 insertions(+) create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/SECURITY.md create mode 100644 .github/workflows/python-ci.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/icon.ico create mode 100644 auto_website_visitor.egg-info/PKG-INFO create mode 100644 auto_website_visitor.egg-info/SOURCES.txt create mode 100644 auto_website_visitor.egg-info/dependency_links.txt create mode 100644 auto_website_visitor.egg-info/entry_points.txt create mode 100644 auto_website_visitor.egg-info/not-zip-safe create mode 100644 auto_website_visitor.egg-info/requires.txt create mode 100644 auto_website_visitor.egg-info/top_level.txt create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 version.txt create mode 100644 whats_new.txt diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..4ece495 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,33 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We, the members, contributors, and maintainers of this project, pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to a positive environment include: +- Using welcoming and inclusive language +- Being respectful of differing viewpoints and experiences +- Gracefully accepting constructive criticism +- Focusing on what is best for the community +- Showing empathy toward other community members + +Examples of unacceptable behavior by participants include: +- The use of sexualized language or imagery and unwelcome sexual attention or advances +- Trolling, insulting/derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or electronic address, without explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +## Enforcement + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +## Reporting + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [nayanchandradas@hotmail.com]. All complaints will be reviewed and investigated, and will result in a response that is deemed necessary and appropriate to the circumstances. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..906bc6e --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# Contributing to Auto Website Visitor + +Thank you for your interest in contributing to **Auto Website Visitor**! + +## How to Contribute + +### Reporting Issues + +If you find a bug or have an issue, please report it via GitHub Issues. Make sure to include a detailed description and steps to reproduce the issue. For feature requests, please use the Feature Request template. + +### Submitting Code + +1. Fork the repository and create a new branch (`git checkout -b feature-branch`). +2. Make your changes in this branch. +3. Commit your changes (`git commit -am 'Add new feature'`). +4. Push your branch to your fork (`git push origin feature-branch`). +5. Open a Pull Request to the `main` branch of the original repository. + +### Code Style + +- Follow the [PEP 8](https://www.python.org/dev/peps/pep-0008/) coding style for Python code. +- Ensure that your code is clean and well-documented. +- Write tests for your code (if applicable). + +## Code of Conduct + +Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md). + +We welcome contributions and look forward to seeing your improvements to the project! diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..2aebdec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,25 @@ +## Bug Report + +**Describe the bug** + +A clear and concise description of what the bug is. + +**To Reproduce** + +Steps to reproduce the behavior: +1. Step 1 +2. Step 2 +3. Step 3 +4. See error + +**Expected behavior** + +A clear and concise description of what you expected to happen. + +**Environment:** +- OS: [e.g., Windows 10, Ubuntu 20.04] +- Python version: [e.g., 3.9] +- Version of Auto Website Visitor: [e.g., v0.0.1] + +**Logs** +- Please provide any relevant logs or screenshots that can help us understand the issue. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..a948b0d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,17 @@ +## Feature Request + +**Is your feature request related to a problem? Please describe.** + +A clear and concise description of what the problem is. Ex. I'm always frustrated when... + +**Describe the solution you'd like** + +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** + +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** + +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..360d015 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +## Description + +**Please describe the changes made and why they are necessary.** + +## Related Issue + +**Please link any related issues (e.g., Fixes #123).** + +## Type of Change + +- [ ] Bug fix +- [ ] New feature +- [ ] Documentation update +- [ ] Other (please describe) + +## Checklist + +- [ ] I have followed the project's code of conduct. +- [ ] I have written tests for my changes. +- [ ] My code is clean and well-commented. +- [ ] I have updated the documentation (if needed). +- [ ] I have tested my changes and they work as expected. + +## Additional Information + +**Is there any other context you'd like to provide?** diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..435cf4c --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,63 @@ +# πŸ”’ SECURITY POLICY πŸ›‘οΈ + +Hey there, awesome devs! πŸ‘‹ We’re super hyped that you’re using **Auto Website Visitor** πŸš€. Let’s make sure it stays secure for everyone. Below are the deets you need to know about reporting security issues. πŸ’»βœ¨ + +--- + +## πŸ†˜ Found a Bug or Vulnerability? πŸ‘€πŸ› + +Uh-oh! If you’ve stumbled upon a security issue, don’t panic πŸ˜…β€”we’ve got you covered: + +1. **Slide into our inbox**: + πŸ“© Email us at **nayanchandradas@hotmail.com** ASAP. + (Keep it secret, keep it safe. Don’t post it publicly! πŸ”) + +2. **Be specific, plz**: + Share all the tea β˜•: + - What happened? + - Steps to reproduce (screenshots or logs? Even better!). + - Why is it a security issue? πŸ‘€ + +3. **Wait for the vibes**: + We’ll hit you back within **48 hours**, tops. Pinky promise! 🀞 + +--- + +## πŸ‘‘ Our Commitment to Security ✨ + +We take security **very seriously** 🫑. That means: +- Patching vulnerabilities πŸ› οΈ FAST. +- Keeping you updated πŸ—žοΈ if something goes south. + +Let’s vibe together to keep this project **safe and sound** for everyone. πŸ’™ + +--- + +## πŸ” Supported Versions + +We only provide security updates for the **latest version** of the project. +So, if you’re still vibin’ with an old version, it’s time to level up! β¬†οΈβœ¨ + +| Version | Supported? πŸ“’ | +|---------|---------------| +| 0.0.1 | βœ… Yessir! | + +--- + +## πŸ› οΈ Security Besties (aka Tools We Use) + +We ❀️: +- **Dependabot** for spotting risky dependencies. +- Regular audits with tools like **Bandit** and **PyUp**. + +Wanna suggest something cool? Hit us up! πŸ’Œ + +--- + +## πŸ–€ Thank You for Helping! πŸ™Œ + +You = a literal superhero πŸ¦Έβ€β™‚οΈπŸ¦Έβ€β™€οΈ for making this project better and safer. +Let’s build something amazing **together**! πŸ’ͺπŸ”₯ + +Stay secure, +**Team Auto Website Visitor** ✨ diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml new file mode 100644 index 0000000..c663acf --- /dev/null +++ b/.github/workflows/python-ci.yml @@ -0,0 +1,62 @@ +name: Python Package CI and Publish + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.9" + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Run tests + run: pytest + + build-and-publish: + needs: test # Ensures this job runs only if the 'test' job succeeds + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.9" + + - name: Install build tools + run: python -m pip install --upgrade pip setuptools wheel twine + + - name: Build the package + run: | + python setup.py sdist bdist_wheel + + - name: Verify the package + run: | + twine check dist/* + + - name: Publish to PyPI + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python -m twine upload dist/* diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a324384 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# Python bytecode files +*.pyc +*.pyo +*.pyd +__pycache__/ + +# Virtual environment directories +.venv/ + +# Windows system files +Thumbs.db + +# Logs +*.log + +# Distribution / packaging +*.egg +*.egg-info/ +dist/ +build/ +*.tar.gz +*.zip + +# PyInstaller files +*.spec + +# Test-related files +nosetests.xml +coverage.xml +*.cover +*.hypothesis/ + +# Jupyter Notebook checkpoints +.ipynb_checkpoints/ + +# Environment variable files +.env + +# Other +*.bak +*.tmp diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..87e2d87 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 nayandas69 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d95cb6a --- /dev/null +++ b/README.md @@ -0,0 +1,113 @@ +# 🌐 Auto Website Visitor + +Welcome to **Auto Website Visitor**! πŸš€ This is your go-to tool to automate website visits effortlessly. Whether you're testing your site’s performance, checking analytics, or just having some fun, this tool has got you covered. Built for Windows (.exe) users and available via `pip` for Python enthusiasts. Let's dive in! 🌟 + +![Issues](https://img.shields.io/github/issues/nayandas69/auto-website-visitor?style=flat-square&color=red&logo=github&logoColor=white) +![Stars](https://img.shields.io/github/stars/nayandas69/auto-website-visitor?style=flat-square&color=yellow&logo=github&logoColor=white) +![Forks](https://img.shields.io/github/forks/nayandas69/auto-website-visitor?style=flat-square&color=brightgreen&logo=github&logoColor=white) + +--- + +## πŸ”₯ Features + +- πŸ’» **Cross-Browser Support**: Works seamlessly with Chrome and Firefox. +- πŸ•ΆοΈ **Headless Mode**: Run it in stealth mode without opening the browser. +- πŸ•’ **Scheduling**: Automate visits at custom intervals. +- 🌐 **Proxy Support**: Browse like a ninja with proxy setup. +- πŸ“ˆ **Logs**: Keep track of every visit with detailed logs. +- πŸš€ **Frequent Updates**: Stay updated with the latest features. + +--- + +## 🎯 How to Use + +### For Windows (.exe): +1. **Download the .exe** file from the [latest release](https://github.com/nayandas69/auto-website-visitor/releases/latest). +2. Run the file and follow the CLI prompts. +3. Sit back and let the tool handle everything! πŸ’Ό + +### For Python Users (via pip): +1. Install the package: + ```bash + pip install auto-website-visitor + ``` +2. Run it directly in Python: + ```bash + python -m auto-website-visitor + ``` +3. Enter the details, and boom – it's running! πŸš€ + +--- + +## πŸ› οΈ Installation + +**Windows Users:** +- Download the `.exe` file from the [Releases Page](https://github.com/nayandas69/auto-website-visitor/releases). + +**Python Users:** +- Install via pip: + ```bash + pip install auto-website-visitor + ``` + +--- + +## 🎨 Aesthetic CLI Vibes +✨ Color-coded prompts for Gen Z energy. +✨ Emojis that make even logs look cooler. +✨ Easy navigation and super chill vibes while working. + +--- + +## πŸ”§ Requirements + +- Python 3.7+ +- Google Chrome or Firefox (latest versions). + +--- + +## πŸ›‘οΈ How It Works + +1. Launch the app. +2. Enter: + - Website URL 🌐 + - Number of visits πŸ“Š + - Interval time (in seconds) ⏳ + - Browser preference (Chrome/Firefox) πŸ” + - Proxy settings (optional) πŸ•΅οΈβ€β™‚οΈ +3. Hit enter and let the magic begin! πŸͺ„ + +--- + +## 🀝 Contribute +Pull requests, issues, and feature suggestions are always welcome. Let’s make this tool even cooler together! ✨ + +1. Fork the repo. +2. Create your feature branch: `git checkout -b feature/my-feature`. +3. Commit your changes: `git commit -m 'Add some feature'`. +4. Push to the branch: `git push origin feature/my-feature`. +5. Open a pull request. πŸ’Œ + +--- + +## πŸ“œ License + +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. + +--- + +## πŸ§‘β€πŸ’» Author +**Nayan Das** +- 🌐 [Website](https://socialportal.nayanchandradas.com) +- πŸ“§ [Email](mailto:nayanchandradas@hotmail.com) + +--- + +## 🀩 Show Some Love +If you found this project helpful, don’t forget to: + +- ⭐ Star the repo! +- πŸ—¨οΈ Join the [discussions](https://github.com/nayandas69/auto-website-visitor/discussions)! +- πŸ› οΈ Contribute your ideas! + +Let’s make browsing automation easy and aesthetic for everyone! πŸ’– diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..fbc4a849163380b3f3fa33437debb9fcfd3384ec GIT binary patch literal 432254 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

?iw5We)OjHJ-$etr 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�W_*xi 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%0A)Mz@54SZ{~!&% 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.6 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: selenium>=4.0.0 +Requires-Dist: colorama>=0.4.4 +Requires-Dist: webdriver-manager>=3.8.0 +Requires-Dist: requests>=2.25.1 +Dynamic: author +Dynamic: author-email +Dynamic: classifier +Dynamic: description +Dynamic: description-content-type +Dynamic: home-page +Dynamic: keywords +Dynamic: license +Dynamic: project-url +Dynamic: requires-dist +Dynamic: requires-python +Dynamic: summary + +# 🌐 Auto Website Visitor + +Welcome to **Auto Website Visitor**! πŸš€ This is your go-to tool to automate website visits effortlessly. Whether you're testing your site’s performance, checking analytics, or just having some fun, this tool has got you covered. Built for Windows (.exe) users and available via `pip` for Python enthusiasts. Let's dive in! 🌟 + +![Issues](https://img.shields.io/github/issues/nayandas69/auto-website-visitor?style=flat-square&color=red&logo=github&logoColor=white) +![Stars](https://img.shields.io/github/stars/nayandas69/auto-website-visitor?style=flat-square&color=yellow&logo=github&logoColor=white) +![Forks](https://img.shields.io/github/forks/nayandas69/auto-website-visitor?style=flat-square&color=brightgreen&logo=github&logoColor=white) + +--- + +## πŸ”₯ Features + +- πŸ’» **Cross-Browser Support**: Works seamlessly with Chrome and Firefox. +- πŸ•ΆοΈ **Headless Mode**: Run it in stealth mode without opening the browser. +- πŸ•’ **Scheduling**: Automate visits at custom intervals. +- 🌐 **Proxy Support**: Browse like a ninja with proxy setup. +- πŸ“ˆ **Logs**: Keep track of every visit with detailed logs. +- πŸš€ **Frequent Updates**: Stay updated with the latest features. + +--- + +## 🎯 How to Use + +### For Windows (.exe): +1. **Download the .exe** file from the [latest release](https://github.com/nayandas69/auto-website-visitor/releases/latest). +2. Run the file and follow the CLI prompts. +3. Sit back and let the tool handle everything! πŸ’Ό + +### For Python Users (via pip): +1. Install the package: + ```bash + pip install auto-website-visitor + ``` +2. Run it directly in Python: + ```bash + python -m auto-website-visitor + ``` +3. Enter the details, and boom – it's running! πŸš€ + +--- + +## πŸ› οΈ Installation + +**Windows Users:** +- Download the `.exe` file from the [Releases Page](https://github.com/nayandas69/auto-website-visitor/releases). + +**Python Users:** +- Install via pip: + ```bash + pip install auto-website-visitor + ``` + +--- + +## 🎨 Aesthetic CLI Vibes +✨ Color-coded prompts for Gen Z energy. +✨ Emojis that make even logs look cooler. +✨ Easy navigation and super chill vibes while working. + +--- + +## πŸ”§ Requirements + +- Python 3.7+ +- Google Chrome or Firefox (latest versions). + +--- + +## πŸ›‘οΈ How It Works + +1. Launch the app. +2. Enter: + - Website URL 🌐 + - Number of visits πŸ“Š + - Interval time (in seconds) ⏳ + - Browser preference (Chrome/Firefox) πŸ” + - Proxy settings (optional) πŸ•΅οΈβ€β™‚οΈ +3. Hit enter and let the magic begin! πŸͺ„ + +--- + +## 🀝 Contribute +Pull requests, issues, and feature suggestions are always welcome. Let’s make this tool even cooler together! ✨ + +1. Fork the repo. +2. Create your feature branch: `git checkout -b feature/my-feature`. +3. Commit your changes: `git commit -m 'Add some feature'`. +4. Push to the branch: `git push origin feature/my-feature`. +5. Open a pull request. πŸ’Œ + +--- + +## πŸ“œ License + +This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. + +--- + +## πŸ§‘β€πŸ’» Author +**Nayan Das** +- 🌐 [Website](https://socialportal.nayanchandradas.com) +- πŸ“§ [Email](mailto:nayanchandradas@hotmail.com) + +--- + +## 🀩 Show Some Love +If you found this project helpful, don’t forget to: + +- ⭐ Star the repo! +- πŸ—¨οΈ Join the [discussions](https://github.com/nayandas69/auto-website-visitor/discussions)! +- πŸ› οΈ Contribute your ideas! + +Let’s make browsing automation easy and aesthetic for everyone! πŸ’– diff --git a/auto_website_visitor.egg-info/SOURCES.txt b/auto_website_visitor.egg-info/SOURCES.txt new file mode 100644 index 0000000..0cfc599 --- /dev/null +++ b/auto_website_visitor.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +LICENSE +README.md +main.py +setup.py +auto_website_visitor.egg-info/PKG-INFO +auto_website_visitor.egg-info/SOURCES.txt +auto_website_visitor.egg-info/dependency_links.txt +auto_website_visitor.egg-info/entry_points.txt +auto_website_visitor.egg-info/not-zip-safe +auto_website_visitor.egg-info/requires.txt +auto_website_visitor.egg-info/top_level.txt \ No newline at end of file diff --git a/auto_website_visitor.egg-info/dependency_links.txt b/auto_website_visitor.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/auto_website_visitor.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/auto_website_visitor.egg-info/entry_points.txt b/auto_website_visitor.egg-info/entry_points.txt new file mode 100644 index 0000000..aa61be6 --- /dev/null +++ b/auto_website_visitor.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +auto-website-visitor = main:main diff --git a/auto_website_visitor.egg-info/not-zip-safe b/auto_website_visitor.egg-info/not-zip-safe new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/auto_website_visitor.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/auto_website_visitor.egg-info/requires.txt b/auto_website_visitor.egg-info/requires.txt new file mode 100644 index 0000000..ba98b03 --- /dev/null +++ b/auto_website_visitor.egg-info/requires.txt @@ -0,0 +1,4 @@ +selenium>=4.0.0 +colorama>=0.4.4 +webdriver-manager>=3.8.0 +requests>=2.25.1 diff --git a/auto_website_visitor.egg-info/top_level.txt b/auto_website_visitor.egg-info/top_level.txt new file mode 100644 index 0000000..ba2906d --- /dev/null +++ b/auto_website_visitor.egg-info/top_level.txt @@ -0,0 +1 @@ +main diff --git a/main.py b/main.py new file mode 100644 index 0000000..c93dd60 --- /dev/null +++ b/main.py @@ -0,0 +1,243 @@ +import os +import time +import logging +import threading +import requests +import argparse +from colorama import Fore, Style, init +from selenium import webdriver +from selenium.webdriver.chrome.service import Service as ChromeService +from selenium.webdriver.firefox.service import Service as FirefoxService +from webdriver_manager.chrome import ChromeDriverManager +from webdriver_manager.firefox import GeckoDriverManager +from selenium.webdriver.chrome.options import Options as ChromeOptions +from selenium.webdriver.firefox.options import Options as FirefoxOptions +import webbrowser +import sys + +# Initialize colorama +init(autoreset=True) + +# Constants +REPO_URL = "https://github.com/nayandas69/auto-website-visitor" +LATEST_RELEASE_API = "https://api.github.com/repos/nayandas69/auto-website-visitor/releases/latest" +CURRENT_VERSION = "0.0.1" + +# Author Information with color +AUTHOR_INFO = f""" +{Fore.CYAN}Author: {Fore.GREEN}Nayan Das +{Fore.CYAN}Version: {Fore.GREEN}{CURRENT_VERSION} +{Fore.CYAN}Website: {Fore.BLUE}https://socialportal.nayanchandradas.com +{Fore.CYAN}Email: {Fore.RED}nayanchandradas@hotmail.com +""" + +# Setup logging +log_file = 'logs/visit_log.log' +if not os.path.exists('logs'): + os.makedirs('logs') + +logging.basicConfig(filename=log_file, level=logging.INFO, + format='%(asctime)s - %(message)s') + +def resource_path(relative_path): + """Get the absolute path to a resource, works for dev and PyInstaller.""" + try: + base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) + except Exception: + base_path = os.path.dirname(os.path.abspath(__file__)) + return os.path.join(base_path, relative_path) + +def get_user_input(): + """Prompt user for all necessary details.""" + website_url = input(f"{Fore.CYAN}Enter the website URL: {Fore.WHITE}") + + # Validate URL + while not website_url.startswith("http"): + print(f"{Fore.RED}Invalid URL. Please enter a valid URL starting with http:// or https://.") + website_url = input(f"{Fore.CYAN}Enter the website URL: {Fore.WHITE}") + + visit_count = input(f"{Fore.CYAN}Enter the number of visits: {Fore.WHITE}") + while not visit_count.isdigit(): + print(f"{Fore.RED}Invalid input for visit count. Please enter a number.") + visit_count = input(f"{Fore.CYAN}Enter the number of visits: {Fore.WHITE}") + visit_count = int(visit_count) + + visit_interval_seconds = input(f"{Fore.CYAN}Enter the visit interval in seconds: {Fore.WHITE}") + while not visit_interval_seconds.isdigit(): + print(f"{Fore.RED}Invalid input for interval. Please enter a number.") + visit_interval_seconds = input(f"{Fore.CYAN}Enter the visit interval in seconds: {Fore.WHITE}") + visit_interval_seconds = int(visit_interval_seconds) + + browser = input(f"{Fore.CYAN}Choose browser (chrome/firefox): {Fore.WHITE}").lower() + while browser not in ["chrome", "firefox"]: + print(f"{Fore.RED}Invalid browser choice. Please choose 'chrome' or 'firefox'.") + browser = input(f"{Fore.CYAN}Choose browser (chrome/firefox): {Fore.WHITE}").lower() + + headless = input(f"{Fore.CYAN}Run in headless mode? (y/n): {Fore.WHITE}").strip().lower() == 'y' + + use_proxy = input(f"{Fore.CYAN}Do you want to use a proxy? (y/n): {Fore.WHITE}").strip().lower() == 'y' + proxy = None + if use_proxy: + proxy = input(f"{Fore.CYAN}Enter your proxy URL (e.g., http://123.45.67.89:8080): {Fore.WHITE}") + + return website_url, visit_count, visit_interval_seconds, browser, headless, proxy + +def create_driver(browser, headless, proxy=None): + """Create a web driver based on the user's choice of browser, headless mode, and proxy.""" + options = None + if browser == "chrome": + options = ChromeOptions() + if headless: + options.add_argument("--headless") + if proxy: + options.add_argument(f"--proxy-server={proxy}") + + driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options) + + elif browser == "firefox": + options = FirefoxOptions() + if headless: + options.add_argument("--headless") + if proxy: + options.set_preference("network.proxy.type", 1) + options.set_preference("network.proxy.http", proxy.split(":")[0]) + options.set_preference("network.proxy.http_port", int(proxy.split(":")[1])) + options.set_preference("network.proxy.ssl", proxy.split(":")[0]) + options.set_preference("network.proxy.ssl_port", int(proxy.split(":")[1])) + driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), options=options) + else: + raise ValueError(f"Unsupported browser: {browser}") + + return driver + +def visit_website(driver, url, visit_number): + """Perform a website visit and log the result.""" + try: + print(f"{Fore.CYAN}Visit {visit_number}: {Fore.GREEN}Visiting {url}") + driver.get(url) + logging.info(f"Visit {visit_number}: Successfully visited {url}") + print(f"{Fore.GREEN}Visit {visit_number}: Visited {url}") + except Exception as e: + logging.error(f"Error visiting {url}: {str(e)}") + print(f"{Fore.RED}Error visiting {url}: {str(e)}") + +def visit_task(website_url, visit_count, visit_interval_seconds, browser, headless, proxy): + """Execute the website visit task based on user inputs.""" + driver = create_driver(browser, headless, proxy) + + for visit_number in range(1, visit_count + 1): + visit_website(driver, website_url, visit_number) + if visit_number < visit_count: + print(f"{Fore.YELLOW}Waiting for {visit_interval_seconds} seconds before the next visit...\n") + time.sleep(visit_interval_seconds) + + print(f"{Fore.GREEN}Visit task completed successfully!") + driver.quit() + +def schedule_visits(visit_func, interval_seconds, visit_count): + """Schedule repeated visits to a website at specified intervals.""" + def run_visits(): + for visit_num in range(1, visit_count + 1): + print(f"Executing scheduled visit {visit_num}...") + visit_func() + if visit_num < visit_count: + time.sleep(interval_seconds) + print("All scheduled visits completed.") + + visit_thread = threading.Thread(target=run_visits) + visit_thread.start() + +def check_for_update(): + """Check the GitHub API for the latest release and compare it with the user's current version.""" + print(f"{Fore.CYAN}Checking for updates...") + try: + response = requests.get(LATEST_RELEASE_API) + response.raise_for_status() + latest_release = response.json() + latest_version = latest_release.get("tag_name", "Unknown") + whats_new = latest_release.get("body", "No information provided.") + + print(f"{Fore.GREEN}Your Current Version: {CURRENT_VERSION}") + + if latest_version != CURRENT_VERSION: + print(f"{Fore.YELLOW}Latest Version Available: {latest_version}") + print(f"{Fore.BLUE}What's New:\n{Style.BRIGHT}{whats_new}\n") + + choice = input(f"{Fore.YELLOW}Would you like to update to the latest version? (y/n): ").strip().lower() + if choice == 'y': + print(f"{Fore.CYAN}Download the latest .exe file here: {REPO_URL}/releases/latest") + print(f"{Fore.CYAN}If using via pip, run: {Fore.GREEN}pip install --upgrade auto-website-visitor") + elif choice == 'n': + print(f"{Fore.YELLOW}New version {latest_version} is waiting for you!") + else: + print(f"{Fore.RED}Invalid choice. Please select 'y' or 'n'.") + else: + print(f"{Fore.GREEN}You are already using the latest version: {CURRENT_VERSION}") + except requests.RequestException as e: + print(f"{Fore.RED}Error while checking for updates: {e}") + +def show_help(): + """Display help information about the app.""" + print(f"{Fore.YELLOW}How to use this CLI Auto Website Visitor:") + print("1. Start - Initiates website visits based on your input.") + print("2. Check Update - Checks for the latest version from the repository.") + print("3. Help - Shows instructions for using the application.") + print("4. Exit - Exits the application with a goodbye message.") + print("Logs are maintained for your convenience.") + print("For issues or suggestions, please contact the author:") + +def exit_app(): + """Exit the program with a goodbye message.""" + print("Thank you for using Auto Website Visitor!") + print("For more information, visit the author's website.") + print("Goodbye!") + sys.exit(0) + +def start(): + """Start the visit task after gathering user inputs.""" + website_url, visit_count, visit_interval_seconds, browser, headless, proxy = get_user_input() + + print(f"\n{Fore.CYAN}You have entered the following details:") + print(f"Website URL: {Fore.GREEN}{website_url}") + print(f"Visit Count: {Fore.GREEN}{visit_count}") + print(f"Visit Interval: {Fore.GREEN}{visit_interval_seconds} seconds") + print(f"Browser: {Fore.GREEN}{browser}") + print(f"Headless Mode: {Fore.GREEN}{headless}") + if proxy: + print(f"Using Proxy: {Fore.GREEN}{proxy}") + else: + print(f"Not using any proxy.") + + confirmation = input(f"{Fore.YELLOW}Do you want to start with these details? (y/n): {Fore.WHITE}").strip().lower() + + if confirmation == "y": + print(f"{Fore.GREEN}Starting the visits...\n") + visit_task(website_url, visit_count, visit_interval_seconds, browser, headless, proxy) + else: + print(f"{Fore.RED}Operation aborted by user.") + +def main(): + """Main CLI menu for user to select options.""" + while True: + print(AUTHOR_INFO) + print(f"{Fore.CYAN}Please choose an option:") + print(f"{Fore.YELLOW}1. Start") + print(f"{Fore.YELLOW}2. Check Update") + print(f"{Fore.YELLOW}3. Help") + print(f"{Fore.YELLOW}4. Exit") + choice = input(f"{Fore.CYAN}Enter your choice (1/2/3/4): ") + + if choice == "1": + start() + elif choice == "2": + check_for_update() + elif choice == "3": + show_help() + elif choice == "4": + exit_app() + break + else: + print(f"{Fore.RED}Invalid choice, please try again.") + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ce65257 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +selenium>=4.0.0 +colorama>=0.4.4 +webdriver-manager>=3.8.0 +requests>=2.25.1 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..eef1ca0 --- /dev/null +++ b/setup.py @@ -0,0 +1,52 @@ +from setuptools import setup, find_packages + +# Read the README.md for a long description +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + +setup( + name="auto-website-visitor", + version="0.0.1", + author="Nayan Das", + author_email="nayanchandradas@hotmail.com", + author_website="https://nayanchandradas.com", + description=("A CLI tool to automate website visits using Selenium and Python."), + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/nayandas69/auto-website-visitor", + project_urls={ + "Bug Tracker": "https://github.com/nayandas69/auto-website-visitor/issues", + "Documentation": "https://github.com/nayandas69/auto-website-visitor#readme", + "Source Code": "https://github.com/nayandas69/auto-website-visitor", + }, + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + keywords=[ + "auto website visitor", "website visitor", "automation", "selenium", + "selenium python", "cli tool", "website traffic", "website automation", + ], + packages=find_packages(include=["*"], exclude=["tests*", "docs*"]), # Automatically finds packages in the root + py_modules=["main"], # Single file module + python_requires=">=3.6", # Python version requirement + install_requires=[ + "selenium>=4.0.0", + "colorama>=0.4.4", + "webdriver-manager>=3.8.0", + "requests>=2.25.1", + ], + entry_points={ + "console_scripts": [ + "auto-website-visitor=main:main", # Command to run the script + ], + }, + include_package_data=True, + zip_safe=False, + license="MIT", +) +# The setup() function is the core of the setup.py script. It takes a lot of arguments, but most of them are optional. +# Here's a breakdown of the arguments used in this script: +# name: The name of the package. This is what users will use to install the package using pip. +# version: The version of the package. This is used by pip to check for updates and dependencies. \ No newline at end of file diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..84576ea --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.0.1 diff --git a/whats_new.txt b/whats_new.txt new file mode 100644 index 0000000..d3428b7 --- /dev/null +++ b/whats_new.txt @@ -0,0 +1,45 @@ +✨ WHAT’S NEW IN AUTO WEBSITE VISITOR ✨ +--------------------------------------- + +🌟 **v0.0.1 - The OG Drop πŸš€** + +πŸ‘‹ Hey fam! We’re stoked to introduce **Auto Website Visitor**, your new bestie for automated site visits. Here’s all the shiny stuff we packed in this version: + +--- + +### πŸ’» **Features that SLAP:** +- **Automated Website Visits**: Just set it and forget it! ⏰ +- **Multiple Browser Support**: Chrome or Firefox? Why not both? 😎 +- **Headless Mode**: Run in stealth like a ninja. πŸ₯·βœ¨ +- **Customizable Intervals**: You decide the vibeβ€”fast or chill. πŸ•’ +- **Proxy Support**: Sneaky-sneak your way through with proxy settings. πŸ•΅οΈβ€β™‚οΈ + +--- + +### πŸ› οΈ **Fixes & Tweaks:** +- First release, so no bugs to fix (yet 🀞). +- Optimized to run smooth AF, even on older systems. + +--- + +### 🧠 **Big Brain Updates:** +- Integrated **auto-update checker**β€”never miss the latest flex! πŸ”„ +- Added **color-coded CLI** for that ✨aesthetic✨ console output. + +--- + +### πŸš€ **Upcoming Hype (aka What’s Next?):** +- **Scheduler Enhancements**: Even more control over visit timing. ⏳ +- **Analytics Dashboard**: Stats for nerds like us πŸ“Š. +- **Better Proxy Configs**: More secure & seamless proxy setups. + +--- + +### πŸ’¬ **Feedback = ❀️** +Got ideas or found a bug? Slide into our **GitHub Issues** section here: +πŸ‘‰ [https://github.com/nayandas69/auto-website-visitor/issues](https://github.com/nayandas69/auto-website-visitor/issues) + +--- + +πŸ–€ Thanks for downloading, fam! Now go automate like a boss. +~ Team Auto Website Visitor ✨