This tool is designed for educational purposes to understand GitHub automation, CI/CD workflows, and API integration. Use responsibly and in accordance with GitHub's Terms of Service.
Automate PR creation and merging to unlock all achievement tiers!
A powerful Python automation framework that streamlines GitHub Pull Request workflows at scale. Perfect for developers who want to:
| 🎯 Use Case | 📊 Benefit |
|---|---|
| Batch Documentation Updates | Update README files across multiple branches |
| Configuration Management | Apply settings changes repository-wide |
| CI/CD Testing | Stress-test your automation pipelines |
| Achievement Hunting | Earn GitHub badges efficiently |
| Learning & Research | Study automation patterns and workflows |
| 🌟 Features | 🏗️ Architecture | 📦 Installation | ⚙️ Configuration |
|---|---|---|---|
| 🚀 Usage | 🔧 Components | ⚡ Performance | 🔐 Security |
| 🐛 Troubleshooting | 📈 Optimization | 🤝 Contributing | 📄 License |
%%{init: {'theme':'dark','themeVariables': {'primaryColor':'#ff6b6b','primaryTextColor':'#fff','primaryBorderColor':'#ff6b6b','lineColor':'#4ecdc4','secondaryColor':'#ffe66d','tertiaryColor':'#a8dadc'}}}%%
graph TB
Start([🚀 Start Automation]) --> Config[📋 Load Configuration]
Config --> Mode{🔀 Choose Mode}
Mode -->|Sequential| Seq[📝 main.py<br/>Single Thread]
Mode -->|Parallel| Par[⚡ parallel_automation.py<br/>Multi-Thread]
Seq --> Git[🔧 Git Operations]
Par --> Git
Git --> Branch[🌿 Create Branch]
Branch --> Commit[💾 Commit Changes]
Commit --> Push[📤 Push to Remote]
Push --> PR[🎯 Create PR]
PR --> AutoMerge{🤖 Auto-merge?}
AutoMerge -->|Yes| Merge[✅ Merge PR]
AutoMerge -->|No| Next{📊 More PRs?}
Merge --> Next
Next -->|Yes| Git
Next -->|No| Notify[📢 Send Notifications]
Notify --> End([🎉 Complete!])
style Start fill:#2ecc71,stroke:#27ae60,stroke-width:3px,color:#fff
style End fill:#e74c3c,stroke:#c0392b,stroke-width:3px,color:#fff
style PR fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
style Merge fill:#f39c12,stroke:#e67e22,stroke-width:2px,color:#fff
┌─────────────────────────────────────────────────────────────────┐
│ 🦈 Pull Shark Automation │
│ Core Orchestration Layer │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
│ │
┌───────▼────────┐ ┌────────▼───────┐
│ 📝 Sequential │ │ ⚡ Parallel │
│ main.py │ │ parallel_*.py │
│ Reliable │ │ Fast & Async │
└───────┬────────┘ └────────┬───────┘
│ │
└──────────────┬───────────────┘
│
┌──────────────────────┼──────────────────────┐
│ │ │
┌────▼─────┐ ┌─────▼────┐ ┌──────▼─────┐
│ 🔧 Git │ │ 🐙 GitHub│ │ 🔑 Token │
│ Manager │ │ Tool │ │ Manager │
│ Ops │ │ API Wrap │ │ Rotation │
└────┬─────┘ └─────┬────┘ └──────┬─────┘
│ │ │
└─────────────────────┼──────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│ 🌐 Proxy │ │ 📢 Notify│ │ 📝 Logger│
│ Rotation │ │ Webhooks │ │ System │
└──────────┘ └──────────┘ └──────────┘
| Component | Role | Performance | Features |
|---|---|---|---|
| main.py | 📝 Sequential | ⭐⭐⭐⭐⭐ Stable | Single-thread, persistent |
| parallel_automation.py | ⚡ Parallel | ⭐⭐⭐⭐⭐ Fast | Multi-thread, async |
| git_manager.py | 🔧 Git Ops | ⭐⭐⭐⭐ | Branch, commit, push |
| github_tool.py | 🐙 API | ⭐⭐⭐⭐ | PR create/merge, limits |
| token_manager.py | 🔑 Tokens | ⭐⭐⭐⭐⭐ | Multi-token rotation |
| proxy_manager.py | 🌐 Proxies | ⭐⭐⭐ | Scraping & rotation |
| notifier.py | 📢 Alerts | ⭐⭐⭐⭐ | Discord & Slack |
| logger.py | 📝 Logs | ⭐⭐⭐⭐⭐ | File & console |
✅ Python 3.8 or higher
✅ Git 2.0 or higher
✅ GitHub CLI (gh)
✅ Active GitHub account
✅ Write access to target repository📥 Download the Code
# Clone via HTTPS
git clone https://github.com/itxashancode/Pull-Shark-Automation.git
# Or clone via SSH
git clone git@github.com:itxashancode/Pull-Shark-Automation.git
# Navigate to directory
cd Pull-Shark-Automation🐍 Python Packages
# Install all required packages
pip install -r requirements.txt
# Or use pip3 on some systems
pip3 install -r requirements.txt📦 What Gets Installed:
| Package | Purpose | Version |
|---|---|---|
requests |
HTTP/API calls | ≥2.28.0 |
aiohttp |
Async HTTP client | ≥3.8.5 |
aiofiles |
Async file operations | ≥23.1.0 |
gitpython |
Git automation | ≥3.1.31 |
beautifulsoup4 |
HTML parsing | ≥4.12.0 |
colorama |
Terminal colors | ≥0.4.6 |
schedule |
Task scheduling | ≥1.2.0 |
🍎 macOS Installation
# Using Homebrew
brew install gh
# Verify installation
gh --version🐧 Linux Installation
# Debian/Ubuntu
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | \
sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | \
sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh -y
# Fedora/RHEL/CentOS
sudo dnf install gh -y
# Arch Linux
sudo pacman -S github-cli
# Verify installation
gh --version🪟 Windows Installation
# Using winget
winget install --id GitHub.cli
# Or using Chocolatey
choco install gh
# Or using Scoop
scoop install gh
# Verify installation
gh --version🔐 Login to GitHub
# Start authentication
gh auth login
# Follow the interactive prompts:
# 1. Choose: GitHub.com
# 2. Protocol: HTTPS
# 3. Authenticate Git: Yes
# 4. Method: Login with a web browser
# Verify authentication
gh auth statusExpected Output:
✓ Logged in to github.com as YourUsername
✓ Git operations for github.com configured to use https protocol.
✓ Token: *******************
{
"repo_path": ".",
"base_branch": "main",
"readme_file": "README.md",
"pr_count": 2000,
"delay_seconds": 30,
"auto_merge": true,
"dry_run": false,
"max_retries": 3,
"use_free_proxies": true,
"max_concurrent": 10,
"discord_webhook": "https://discord.com/api/webhooks/YOUR_WEBHOOK_HERE",
"slack_webhook": "https://hooks.slack.com/services/YOUR_WEBHOOK_HERE"
}📖 Configuration Reference
| Parameter | Type | Default | Description |
|---|---|---|---|
repo_path |
string | "." |
Path to your Git repository |
base_branch |
string | "main" |
Target branch for PRs |
readme_file |
string | "README.md" |
File to modify in each commit |
pr_count |
integer | 2000 |
Total PRs to create |
delay_seconds |
integer | 30 |
Wait time between PRs (sequential) |
auto_merge |
boolean | true |
Automatically merge created PRs |
dry_run |
boolean | false |
Test mode (no actual changes) |
max_retries |
integer | 3 |
Retry attempts on failure |
use_free_proxies |
boolean | true |
Enable proxy rotation |
max_concurrent |
integer | 10 |
Parallel workers (parallel mode) |
discord_webhook |
string | "" |
Discord notification URL |
slack_webhook |
string | "" |
Slack notification URL |
{
"tokens": [
{
"name": "Primary Token",
"token": "github_pat_11XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"name": "Secondary Token",
"token": "github_pat_11XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"name": "Backup Token",
"token": "github_pat_11XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
]
}🔐 How to Generate GitHub Tokens
Step-by-Step Guide:
-
Navigate to GitHub Settings
- Click your profile → Settings
- Developer settings → Personal access tokens → Tokens (classic)
-
Generate New Token
- Click "Generate new token (classic)"
- Name:
Pull Shark Automation - Expiration:
90 days(recommended)
-
Select Required Scopes ✅
- ☑️
repo- Full control of private repositories - ☑️
workflow- Update GitHub Action workflows - ☑️
write:packages- Upload packages
- ☑️
-
Generate & Copy Token
- Click "Generate token"
⚠️ Copy immediately (shown only once!)- Add to
github_tokens.json
📊 Rate Limits:
- Single token: 5,000 requests/hour
- Multiple tokens: Rotates automatically for 15,000+/hour
🔒 Security Tips:
- Never commit tokens to Git
- Rotate every 30-90 days
- Use fine-grained tokens when possible
- Enable 2FA on your account
# Free HTTPS proxies (ip:port format)
8.219.97.248:9090
47.91.34.69:3128
161.35.70.249:8080
165.227.196.37:3128
64.225.4.5:9999
# Authenticated proxies (protocol://user:pass@ip:port)
http://username:password@proxy.example.com:8080
socks5://admin:secret@10.0.0.1:1080
🔍 Finding & Testing Proxies
🌐 Free Proxy Sources:
- free-proxy-list.net - Updated hourly
- proxyscrape.com - API available
- spys.one - Global proxies
🧪 Test Proxies:
# Test single proxy
curl -x http://8.219.97.248:9090 https://api.github.com/
# Test with timeout
curl -x http://proxy:port --max-time 5 https://api.github.com/| Type | Reliability | Speed | Cost |
|---|---|---|---|
| Free | ⭐⭐ Low | Slow | $0 |
| Paid | ⭐⭐⭐⭐⭐ High | Fast | $10-50/mo |
| Premium | ⭐⭐⭐⭐⭐ Very High | Very Fast | $50-200/mo |
💰 Recommended Paid Services:
- Bright Data - Enterprise grade
- Smartproxy - Good balance
- Oxylabs - Large pool
- Proxy-Cheap - Budget friendly
💬 Discord Webhook
Setup Steps:
- Open Discord server
- Server Settings → Integrations → Webhooks
- Click "New Webhook"
- Set name:
GitHub Botor similar - Choose target channel
- Click "Copy Webhook URL"
- Paste into
config.json
Webhook Format:
https://discord.com/api/webhooks/1234567890/ABCDEFGHIJKLMNOPQRSTUVWXYZ
Test Webhook:
curl -X POST "YOUR_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"content": "Test message from Pull Shark!"}'💼 Slack Webhook
Setup Steps:
- Go to api.slack.com/apps
- Create New App → From scratch
- App Name:
GitHub Automation - Select workspace
- Incoming Webhooks → Activate
- Add New Webhook to Workspace
- Select channel
- Copy webhook URL
- Paste into
config.json
Webhook Format:
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXX
Test Webhook:
curl -X POST "YOUR_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"text": "Test from Pull Shark!"}'# 1️⃣ Basic sequential run
python main.py
# 2️⃣ Fast parallel mode (recommended)
python parallel_automation.py --count 100 --concurrent 10
# 3️⃣ Test without creating PRs
python main.py --dry-run
# 4️⃣ Custom PR count
python main.py --count 500
# 5️⃣ Resume after interruption
python main.py # Auto-resumes from state.json| Option | Description | Example |
|---|---|---|
--count N |
Override PR count | python main.py --count 200 |
--delay N |
Seconds between PRs | python main.py --delay 60 |
--dry-run |
Test mode (no commits) | python main.py --dry-run |
--no-merge |
Disable auto-merge | python main.py --no-merge |
--reset |
Start from PR #1 | python main.py --reset |
--use-proxies |
Enable proxy rotation | python main.py --use-proxies |
📊 Example Output:
🚀 Starting from PR #1
⏱️ Delay: 30 seconds
🔹 Processing PR #1
├─ 🌿 Created branch: automation-1-a1b2c3d4
├─ 💾 Committed changes
├─ 📤 Pushed to remote
└─ ✅ PR #12345 created successfully
✅ PR #12345 merged successfully
⏱️ Waiting 30 seconds...
🔹 Processing PR #2
...
| Option | Description | Example |
|---|---|---|
--count N |
Number of PRs | --count 1000 |
--concurrent N |
Parallel workers | --concurrent 20 |
--start N |
Starting PR number | --start 100 |
--no-proxy |
Disable proxies | --no-proxy |
--dry-run |
Test mode | --dry-run |
📊 Example Output:
🚀 Initializing parallel automation...
📋 Loaded 3 GitHub tokens
🔍 Fetching proxies...
📦 Total unique proxies collected: 342
✅ Working proxies: 87
🚀 Starting parallel automation
📈 Progress: 134/200 PRs
✓ Success: 130
✗ Failed: 4
⚡ Speed: 45.2 PRs/min
🎉 Automation Complete!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total: 200 PRs
✅ Success: 196 (98%)
❌ Failed: 4 (2%)
⚡ Speed: 43.8 PRs/min
⏱️ Time: 4 minutes 34 seconds
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Example 1: First-Time Setup (Bronze Badge)
Goal: Earn Bronze Pull Shark Badge (16 PRs)
# Test with dry run first
python main.py --count 20 --dry-run
# Run actual automation
python main.py --count 20 --delay 15
# Expected time: ~5 minutesOutput:
🚀 Starting from PR #1
⏱️ Delay: 15 seconds
✅ PR #1-20 created successfully
🎉 Bronze Pull Shark Badge unlocked!
Example 2: Silver Badge (Parallel Mode)
Goal: Earn Silver Pull Shark Badge (128 PRs)
# High-speed parallel mode
python parallel_automation.py --count 150 --concurrent 15
# Expected time: ~3-5 minutesOutput:
🚀 Starting parallel automation
📈 150/150 ✓ 147 ✗ 3 ⚡ 42.5 PRs/min
🎉 Silver Pull Shark Badge unlocked!
⏱️ Completed in 3 minutes 32 seconds
Example 3: Gold Badge (Maximum Speed)
Goal: Earn Gold Pull Shark Badge (1024 PRs)
# Ultra-fast mode with 20 workers
python parallel_automation.py \
--count 1024 \
--concurrent 20
# Expected time: ~16-20 minutes with 3 tokensOutput:
🚀 Initializing parallel automation...
📋 Loaded 3 tokens
🌐 Working proxies: 87
📈 1024/1024 ✓ 982 ✗ 42 ⚡ 62.5 PRs/min
🎉🎉🎉 GOLD PULL SHARK UNLOCKED! 🎉🎉🎉
⏱️ Completed in 16 minutes 23 seconds
Example 4: Resume After Interruption
Scenario: Process interrupted at PR #350
# Check current state
cat state.json
# Output: {"last_completed_pr": 350}
# Resume from PR #351
python main.py --count 500
# Automatically continues from #351Output:
🔄 Resuming from PR #351 (found state.json)
⏱️ Remaining: 150 PRs
🔹 Processing PR #351
...
Example 5: Dry Run Testing
Goal: Test configuration without creating PRs
python main.py --count 5 --dry-runOutput:
🔍 DRY RUN MODE - No actual commits
🔹 PR #1 Simulation
📝 Would create branch: automation-1-abc123
📝 Would modify: README.md
📝 Would commit: "Automated update #1"
📝 Would push to: origin/automation-1-abc123
📝 Would create PR with title: "Automated PR #1"
✅ Simulation successful
🔹 PR #2 Simulation
...
✅ All 5 PRs simulated successfully
| 🎯 Tip 1 | Start with --dry-run to test your configuration |
| ⚡ Tip 2 | Use parallel mode with multiple tokens for maximum speed |
| 🔄 Tip 3 | State files allow resuming - don't worry about interruptions |
| 📊 Tip 4 | Monitor rate limits: gh api rate_limit |
| 🌐 Tip 5 | Enable proxies for extra speed and reliability |
🎯 Purpose: Handle all Git operations with retry logic and internet connectivity checks
🔑 Key Methods:
class GitManager:
def __init__(self, base_branch: str, max_retries: int, logger)
def wait_for_internet(self, timeout: int = 10) -> bool:
"""Wait for stable internet connection"""
def run(self, command: List[str]) -> subprocess.CompletedProcess:
"""Execute git command with exponential backoff retry"""
def sync_base(self) -> bool:
"""Sync base branch with remote"""
def create_branch(self, name: str) -> bool:
"""Create and checkout new branch"""
def commit(self, file: str, message: str) -> bool:
"""Stage and commit changes"""
def push(self, branch: str) -> bool:
"""Push branch to remote"""✨ Features:
| ⏱️ Exponential Backoff | Retry delays: 5s → 10s → 20s |
| 🌐 Internet Check | Validates connection before operations |
| 🔁 Auto-Retry | Configurable attempts (default: 3) |
| ⏲️ Timeout Protection | 30-second command timeout |
🎯 Purpose: Wrap GitHub CLI with rate limit management and PR operations
🔑 Key Methods:
class GitHubTool:
def check_rate_limit(self) -> Dict:
"""Query GitHub API rate limit status"""
def create_pr(self, title: str, body: str, head: str) -> Optional[str]:
"""Create pull request via GitHub CLI"""
def merge_pr(self, branch: str) -> bool:
"""Auto-merge pull request"""📊 Rate Limit Flow:
%%{init: {'theme':'dark'}}%%
graph LR
A[Check Rate Limit] --> B{Remaining > 100?}
B -->|Yes| C[Proceed]
B -->|No| D[Calculate Wait Time]
D --> E[Sleep Until Reset]
E --> A
style A fill:#3498db
style C fill:#2ecc71
style D fill:#f39c12
🎯 Purpose: Manage multiple GitHub tokens with automatic rotation
🔄 Rotation Algorithm:
def get_best_token():
"""
1. Filter active tokens ✅
2. Sort by remaining requests (descending) ⬇️
3. Return token with highest limit ⭐
4. Update last_used timestamp 🕐
5. Decrement remaining count ➖
"""📊 Token Statistics Example:
📋 Token Status Dashboard
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Token 1 (Primary): 4,850 / 5,000 ⚡
Token 2 (Secondary): 5,000 / 5,000 ✅
Token 3 (Backup): 4,920 / 5,000 ⚡
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total Available: 14,770 requests
Next Reset: 42 minutes
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 Purpose: Rotate proxies to distribute requests
🔄 Rotation Strategy:
# Round-robin with queue
proxy1 → proxy2 → proxy3 → proxy1 → ...
# Get proxy (auto-rotates)
proxy = proxy_queue.get() # Returns proxy1
proxy_queue.put(proxy) # Re-add to end
# Next: proxy2, then proxy3, then proxy1...📊 Supported Formats:
# Simple proxies
"8.219.97.248:9090"
"http://47.91.34.69:3128"
# Authenticated proxies
"http://user:pass@proxy.example.com:8080"
"socks5://admin:secret@10.0.0.1:1080"🎯 Purpose: Send real-time notifications
🎨 Notification Types:
| Level | Color | Discord | Use Case |
|---|---|---|---|
info |
🔵 Blue | 5814783 | Progress updates |
success |
🟢 Green | 3066993 | PR created/merged |
warning |
🟡 Yellow | 16776960 | Non-critical errors |
error |
🔴 Red | 15548997 | Critical failures |
📨 Example Notifications:
# Success
notifier.send(
"✅ PR #123 created successfully\n"
"Branch: automation-123-abc\n"
"PR Number: #456",
"success"
)
# Progress
notifier.send(
"📊 Progress: 50/100 PRs\n"
"Speed: 12.5 PRs/min",
"info"
)
# Error
notifier.send(
"❌ PR #75 failed\n"
"Error: Network timeout",
"error"
)🎯 Purpose: Dual-output logging system
📝 Log Levels:
logger.info("✅ PR #123 created") # General info
logger.warning("⚠️ Rate limit low") # Warnings
logger.error("❌ Failed to push") # Errors
logger.debug("🔍 Token: abc...") # Debug info📄 Sample Log Output:
2026-02-15 10:22:11 - INFO - Starting automation from PR #1
2026-02-15 10:22:15 - INFO - Created branch automation-1-abc123
2026-02-15 10:22:18 - INFO - Committed changes to README.md
2026-02-15 10:22:22 - INFO - Pushed branch automation-1-abc123
2026-02-15 10:22:25 - INFO - Created PR #12345
2026-02-15 10:22:28 - INFO - Merged PR #12345
2026-02-15 10:22:28 - WARNING - Rate limit: 4850 remaining
The high_performance package provides async-first implementations for maximum throughput and parallel processing. Fully Windows-compatible with proper event loop policies.
high_performance/
├── __init__.py # 📦 Package exports
├── git_manager.py # 🔧 Async Git operations
├── github_tool.py # 🐙 Async GitHub API
├── token_manager.py # 🔑 Async token rotation
├── proxy_manager.py # 🌐 Async proxy scraping
└── proxy_refresher.py # 🔄 Background maintenance
| Metric | Standard | High-Performance | Improvement |
|---|---|---|---|
| PR Speed | 1-2 PRs/min | 30-50 PRs/min | ⬆️ 25x faster |
| Concurrency | Single-thread | 10-50 workers | ⬆️ 50x |
| Token Rotation | Manual | Automatic | ✨ Smart |
| Proxy Support | Static list | Auto-fetch + test | ✨ Dynamic |
| Rate Limit | Cached | Live API checks | ✨ Real-time |
| Memory Usage | ~50 MB | ~300-500 MB | ⬆️ 6-10x |
Test: 1000 PRs with High-Performance Modules
python parallel_automation.py --count 1000 --concurrent 20Results:
⏱️ Time: 16 minutes (vs 8+ hours sequential)
✅ Success Rate: 94%
📈 Speed: 62.5 PRs/min
🔄 Token Rotation: 3 tokens cycled automatically
🌐 Proxies Used: 87 working proxies
💾 Memory: ~720 MB peak
🎯 Key Features:
# Windows-compatible async Git operations
async def sync_base(self) -> bool:
"""Fast sync with depth=1 optimization"""
async def create_branch(self, name: str) -> bool:
"""Async branch creation"""
async def commit(self, file: str, message: str, content: str) -> bool:
"""Single-operation async commit"""
async def push(self, branch: str) -> bool:
"""Non-blocking push"""🪟 Windows Optimization:
# Thread pool prevents blocking
self.executor = ThreadPoolExecutor(max_workers=10)
# Run git ops in executor
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(
self.executor,
lambda: git_operation()
)🎯 Key Features:
- Semaphore Control: Limit concurrent API calls
- Smart Token Selection: Auto-switch on rate limits
- Proxy Integration: Built-in proxy support
# Concurrency control
self.semaphore = asyncio.Semaphore(50) # Max 50 concurrent
async with self.semaphore:
process = await asyncio.create_subprocess_exec(...)🎯 Key Features:
- Real-Time Rate Limits: Live API checks every 5 minutes
- Fair Distribution: Shuffle tokens for balanced usage
- Auto-Refresh: Update stale token status
# Live rate limit check
async def check_token_rate_limit_async(self, token):
headers = {'Authorization': f"token {token['token']}"}
async with session.get('https://api.github.com/rate_limit', headers=headers):
# Get real-time remaining count
return remaining, reset_time🎯 Proxy Sources:
sources = [
# HTML Table Sources
'https://free-proxy-list.net/',
'https://www.sslproxies.org/',
# API/Raw Sources (More Reliable)
'https://api.proxyscrape.com/v2/',
'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt',
'https://raw.githubusercontent.com/clarketm/proxy-list/master/proxy-list-raw.txt'
]🧪 Concurrent Testing:
# Test 50 proxies simultaneously
semaphore = asyncio.Semaphore(50)
async def limited_test(proxy):
async with semaphore:
return await self.test_proxy(proxy)
# Parallel execution
results = await asyncio.gather(*[limited_test(p) for p in proxies])⚡ Latency-Based Sorting:
# Sort by speed (fastest first)
working_proxies.sort(key=lambda x: x.get("latency", 999))🎯 Background Service
# Run in separate terminal
python -m high_performance.proxy_refresherOutput:
🔄 Proxy Refresher Started
⏰ Will refresh proxies every 30 minutes
[10:00:00] Refreshing proxies...
🔎 Fetching from free-proxy-list...
🔎 Fetching from proxyscrape...
📦 Collected: 342 unique proxies
📦 Testing: 342 proxies...
✅ Working: 87 proxies
[10:30:00] Refreshing proxies...
...
| ✅ | Never commit tokens to Git | Add to .gitignore |
| ✅ | Use environment variables | export GITHUB_TOKEN="ghp_xxx" |
| ✅ | Rotate tokens regularly | Every 30-90 days |
| ✅ | Use fine-grained tokens | Limit scope to specific repos |
| ✅ | Enable 2FA | Extra security layer |
| ✅ | Monitor token usage | gh api rate_limit |
GitHub Limits:
| Authentication | Requests/Hour | Notes |
|---|---|---|
| Unauthenticated | 60 | Very limited |
| OAuth Token | 5,000 | Per token |
| GitHub App | 15,000 | Enterprise |
| Multiple Tokens | 15,000+ | Rotation |
📊 Rate Limit Strategies:
# 1️⃣ Token Rotation
token = token_manager.get_best_token()
# 2️⃣ Monitor Limits
rate_info = gh.check_rate_limit()
if rate_info["remaining"] < 100:
time.sleep(wait_time)
# 3️⃣ Exponential Backoff
for attempt in range(max_retries):
try:
result = api_call()
break
except RateLimitError:
time.sleep(2 ** attempt)🆓 Free vs 💰 Paid Proxies
| Feature | Free | Paid |
|---|---|---|
| Reliability | ⭐⭐ (20-30%) | ⭐⭐⭐⭐⭐ (99%+) |
| Speed | Slow | Fast |
| Security | ✅ Verified | |
| Support | None | 24/7 |
| Cost | $0 | $10-200/mo |
| Best For | Testing | Production |
💰 Recommended Paid Services:
- Bright Data - Enterprise ($500+/mo)
- Smartproxy - Balanced ($75/mo)
- Oxylabs - Premium ($300/mo)
- Proxy-Cheap - Budget ($10/mo)
📋 Problem Description
GitHub CLI is not installed or not in PATH.
✅ Solution
# macOS
brew install gh
# Linux (Debian/Ubuntu)
sudo apt update && sudo apt install gh -y
# Windows
winget install --id GitHub.cli
# Verify
gh --version📋 Problem Description
GitHub CLI not authenticated or token expired.
✅ Solution
# Re-authenticate
gh auth login
# Or use token directly
echo "YOUR_TOKEN" | gh auth login --with-token
# Verify authentication
gh auth status📋 Problem Description
Too many API requests in short time.
✅ Solutions
Option 1: Add More Tokens
{
"tokens": [
{"name": "Token 1", "token": "ghp_xxx1"},
{"name": "Token 2", "token": "ghp_xxx2"},
{"name": "Token 3", "token": "ghp_xxx3"}
]
}Option 2: Check Rate Limit
gh api rate_limit
# Output shows:
# - Remaining requests
# - Reset timeOption 3: Increase Delay
{
"delay_seconds": 60
}📋 Problem Description
Git push fails due to network or permissions.
✅ Solutions
Check 1: Internet Connection
ping github.comCheck 2: Repository Permissions
gh repo view --web
# Verify you have write accessCheck 3: Branch Protection
gh api repos/OWNER/REPO/branches/main/protectionCheck 4: Re-authenticate
gh auth refresh📋 Problem Description
File already contains identical content.
✅ Solutions
Solution 1: Reset State
python main.py --resetSolution 2: Change Target File
{
"readme_file": "CONTRIBUTING.md"
}Solution 3: Force Content Change Add timestamps or unique IDs to each commit.
# Set environment variable
export LOG_LEVEL=DEBUG
# Run with debug logging
python main.py
# Or edit logger.py
logger.setLevel(logging.DEBUG)Debug Output Example:
DEBUG - Token selected: primary (4850 remaining)
DEBUG - Proxy selected: http://8.219.97.248:9090
DEBUG - Executing: git push origin automation-1-abc123
DEBUG - Command output: [SUCCESS]
DEBUG - API response: {"pr_number": 12345}
| Strategy | Impact | Difficulty | Implementation |
|---|---|---|---|
| Use Parallel Mode | ⭐⭐⭐⭐⭐ | 🟢 Easy | python parallel_automation.py --concurrent 20 |
| Multiple Tokens | ⭐⭐⭐⭐⭐ | 🟢 Easy | Add 2-3 tokens to github_tokens.json |
| Enable Proxies | ⭐⭐⭐⭐ | 🟡 Medium | Set "use_free_proxies": true |
| Reduce Delay | ⭐⭐⭐ | 🟢 Easy | --delay 10 (sequential mode) |
| Skip Auto-Merge | ⭐⭐ | 🟢 Easy | --no-merge |
| Use SSD Storage | ⭐⭐ | 🔴 Hard | Run on SSD drive |
Optimal Settings by Hardware:
| System Specs | Workers | Memory | PRs/Hour | Recommended |
|---|---|---|---|---|
| 2 CPU, 4GB RAM | 5 | ~150 MB | ~900 | 🟢 Basic |
| 4 CPU, 8GB RAM | 10 | ~300 MB | ~1,800 | 🟢 Good |
| 8 CPU, 16GB RAM | 20 | ~600 MB | ~3,600 | 🟡 Great |
| 16 CPU, 32GB RAM | 40 | ~1.2 GB | ~7,200 | 🔴 Overkill |
📊 Monitor Resources:
# CPU & Memory Usage
top -p $(pgrep -f parallel_automation)
# Disk I/O
iotop -p $(pgrep -f parallel_automation)
# Network Stats
nethogsTest 1: Sequential Mode (100 PRs)
Configuration:
{
"pr_count": 100,
"delay_seconds": 30,
"auto_merge": true
}Results:
⏱️ Time: 52 minutes
✅ Success: 98 PRs (98%)
❌ Failed: 2 PRs (2%)
🔁 Retries: 3 operations
💾 Memory: ~50 MB
📈 Speed: 1.9 PRs/min
Test 2: Parallel Mode (1000 PRs, 10 workers)
Configuration:
python parallel_automation.py --count 1000 --concurrent 10Results:
⏱️ Time: 28 minutes
✅ Success: 960 PRs (96%)
❌ Failed: 40 PRs (4%)
🔁 Retries: 42 operations
💾 Memory: ~380 MB
📈 Speed: 35.7 PRs/min
Test 3: Maximum Speed (1000 PRs, 20 workers, 3 tokens)
Configuration:
python parallel_automation.py --count 1000 --concurrent 20Results:
⏱️ Time: 16 minutes
✅ Success: 940 PRs (94%)
❌ Failed: 60 PRs (6%)
🔁 Retries: 68 operations
💾 Memory: ~720 MB
📈 Speed: 62.5 PRs/min
🔄 Tokens: 3 rotated
🌐 Proxies: 87 used
# 1️⃣ Fork the repository
gh repo fork itxashancode/Pull-Shark-Automation
# 2️⃣ Clone your fork
git clone https://github.com/YOUR_USERNAME/Pull-Shark-Automation.git
cd Pull-Shark-Automation
# 3️⃣ Create feature branch
git checkout -b feature/amazing-feature
# 4️⃣ Make your changes
# ... edit files ...
# 5️⃣ Commit with conventional commits
git commit -m "feat: add amazing feature"
# 6️⃣ Push to your fork
git push origin feature/amazing-feature
# 7️⃣ Create Pull Request
gh pr create --title "Add amazing feature" --body "Description..."# ✅ Good - Clear, documented, typed
def create_pull_request(title: str, body: str, head: str) -> Optional[str]:
"""
Create a pull request via GitHub CLI.
Args:
title: PR title
body: PR description
head: Source branch name
Returns:
PR number as string, or None if failed
"""
try:
result = gh_tool.create_pr(title, body, head)
return result
except Exception as e:
logger.error(f"Failed to create PR: {e}")
return None
# ❌ Bad - Unclear, no types, no docs
def createPR(t,b,h):
result=gh_tool.create_pr(t,b,h)
return result🎨 Formatting Tools:
# Auto-format with black
black *.py
# Check style with flake8
flake8 *.py
# Type checking with mypy
mypy *.pyFound a bug? Help us fix it!
Steps:
- Check existing issues
- Create new issue with template
- Include:
- OS & Python version
- Full error message
- Steps to reproduce
- Expected vs actual behavior
Have an idea? We'd love to hear it!
Steps:
- Check existing discussions
- Open feature request
- Describe:
- Use case
- Proposed solution
- Alternatives considered
MIT License
Copyright (c) 2026 Pull Shark Automation
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.
- GitHub - For excellent CLI and API
- Python Community - For amazing async libraries
- Contributors - Everyone who improved this project
- You - For using Pull Shark Automation!
|
|
|
|
|
|






