mirror of
https://github.com/LightZirconite/Microsoft-Rewards-Bot.git
synced 2026-01-10 17:26:17 +00:00
fix: Update version to 2.60.0 and enhance documentation with new commands and troubleshooting tips
This commit is contained in:
189
README.md
189
README.md
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
[](https://discord.gg/k5uHkx9mne)
|
[](https://discord.gg/k5uHkx9mne)
|
||||||
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot)
|
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot)
|
||||||
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/releases)
|
[](https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot/releases)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -61,6 +61,126 @@ npm run setup
|
|||||||
|
|
||||||
**That's it!** The wizard will guide you through account setup and start earning points.
|
**That's it!** The wizard will guide you through account setup and start earning points.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎮 Essential Commands
|
||||||
|
|
||||||
|
Here are the most useful commands for daily usage:
|
||||||
|
|
||||||
|
### **🚀 Main Commands**
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `npm run go` | **⭐ Ultimate command** — Installs browser if needed, builds, and starts the bot |
|
||||||
|
| `npm start` | **Quick start** — Runs the bot (builds automatically if needed) |
|
||||||
|
| `npm run setup` | **Interactive wizard** — Guides you through initial setup |
|
||||||
|
| `npm run dev` | **Development mode** — Watch mode with auto-reload |
|
||||||
|
|
||||||
|
### **🔧 Build & Maintenance**
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `npm run build` | Compile TypeScript to JavaScript (`dist/` folder) |
|
||||||
|
| `npm run typecheck` | Check TypeScript errors without building |
|
||||||
|
| `npm run clean` | Remove build artifacts (`dist/` folder) |
|
||||||
|
| `npm run install:browser` | Install Playwright Chromium (smart: only installs once) |
|
||||||
|
|
||||||
|
### **🎯 Specialized Tools**
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `npm run dashboard` | Start web dashboard on `http://localhost:3000` |
|
||||||
|
| `npm run creator` | Launch account creation wizard |
|
||||||
|
| `npm run test` | Run test suite |
|
||||||
|
|
||||||
|
### **💡 Quick Recipes**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# First time setup
|
||||||
|
npm run go
|
||||||
|
|
||||||
|
# Daily usage (after first setup)
|
||||||
|
npm start
|
||||||
|
|
||||||
|
# Create new accounts
|
||||||
|
npm run creator -- -y backup@gmail.com https://rewards.bing.com/welcome?rh=CODE
|
||||||
|
|
||||||
|
# Monitor with dashboard
|
||||||
|
npm run dashboard
|
||||||
|
# Then open http://localhost:3000 in your browser
|
||||||
|
|
||||||
|
# Fix issues / rebuild
|
||||||
|
npm run clean ; npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
**📖 [Complete Commands Reference →](docs/commands.md)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Typical Workflows
|
||||||
|
|
||||||
|
### **First-Time Setup** (New User)
|
||||||
|
```bash
|
||||||
|
# 1. Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# 2. Run the ultimate setup command
|
||||||
|
npm run go
|
||||||
|
# This will guide you through account setup, install browser, build, and start!
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Daily Usage** (Regular User)
|
||||||
|
```bash
|
||||||
|
# Just start the bot - it builds automatically if needed
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use the ultimate command if you want to be extra safe:
|
||||||
|
```bash
|
||||||
|
npm run go
|
||||||
|
```
|
||||||
|
|
||||||
|
### **After Git Pull** (Updating the Bot)
|
||||||
|
```bash
|
||||||
|
# Quick method (recommended)
|
||||||
|
npm run go
|
||||||
|
|
||||||
|
# Or manual method
|
||||||
|
npm install # Update dependencies (if package.json changed)
|
||||||
|
npm run build # Rebuild if code changed
|
||||||
|
npm start # Run
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Creating New Accounts**
|
||||||
|
```bash
|
||||||
|
# Interactive mode (asks everything)
|
||||||
|
npm run creator
|
||||||
|
|
||||||
|
# Quick mode with recovery email + referral
|
||||||
|
npm run creator -- -y backup@gmail.com https://rewards.bing.com/welcome?rh=CODE
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Troubleshooting** (When Things Break)
|
||||||
|
```bash
|
||||||
|
# Clean rebuild
|
||||||
|
npm run clean
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Or full reset
|
||||||
|
rm -rf node_modules dist
|
||||||
|
npm install
|
||||||
|
npm run go
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Monitoring** (Check Status)
|
||||||
|
```bash
|
||||||
|
# Start web dashboard
|
||||||
|
npm run dashboard
|
||||||
|
# Then open http://localhost:3000
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### 📖 Need Help?
|
### 📖 Need Help?
|
||||||
|
|
||||||
**First time using the bot?** → [📘 Getting Started Guide](docs/getting-started.md)
|
**First time using the bot?** → [📘 Getting Started Guide](docs/getting-started.md)
|
||||||
@@ -314,6 +434,73 @@ All while maintaining **natural behavior patterns** to minimize detection risk.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 🔧 Common Issues & Quick Fixes
|
||||||
|
|
||||||
|
### **"Error: Cannot find module"**
|
||||||
|
```bash
|
||||||
|
# Solution: Rebuild the project
|
||||||
|
npm run clean
|
||||||
|
npm run build
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"Browser executable not found"**
|
||||||
|
```bash
|
||||||
|
# Solution: Install Chromium browser
|
||||||
|
npm run install:browser
|
||||||
|
# Or use the ultimate command
|
||||||
|
npm run go
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"Account credentials invalid"**
|
||||||
|
- ✅ Check `src/accounts.jsonc` has correct email/password
|
||||||
|
- ✅ If 2FA enabled, verify `totp` field has correct secret
|
||||||
|
- ✅ Test manual login at https://login.live.com/
|
||||||
|
|
||||||
|
### **"Bot hangs or freezes"**
|
||||||
|
```bash
|
||||||
|
# Windows: Kill stuck Chrome processes
|
||||||
|
npm run kill-chrome-win
|
||||||
|
|
||||||
|
# Then restart
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"TypeScript compilation errors"**
|
||||||
|
```bash
|
||||||
|
# Check errors without building
|
||||||
|
npm run typecheck
|
||||||
|
|
||||||
|
# Full rebuild
|
||||||
|
npm run clean
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"Chromium keeps reinstalling on every build"**
|
||||||
|
This is now fixed in v2.60.0! The bot creates a `.playwright-chromium-installed` marker file to prevent unnecessary reinstallations.
|
||||||
|
|
||||||
|
If it still happens:
|
||||||
|
```bash
|
||||||
|
# Manually create the marker file
|
||||||
|
touch .playwright-chromium-installed # Mac/Linux
|
||||||
|
New-Item -Path .playwright-chromium-installed -ItemType File # Windows PowerShell
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"Update system not working"**
|
||||||
|
```bash
|
||||||
|
# Manually check for updates
|
||||||
|
npm run build
|
||||||
|
# Watch the output for any TypeScript errors
|
||||||
|
```
|
||||||
|
|
||||||
|
### **"Scheduler not running immediately"**
|
||||||
|
This is fixed in v2.60.0! The bot now runs tasks immediately on startup before activating the schedule.
|
||||||
|
|
||||||
|
**[📖 Complete Troubleshooting Guide →](docs/troubleshooting.md)**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🆘 Need Help?
|
## 🆘 Need Help?
|
||||||
|
|
||||||
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support & updates
|
- 💬 **[Discord Community](https://discord.gg/k5uHkx9mne)** — Get support & updates
|
||||||
|
|||||||
@@ -2,6 +2,29 @@
|
|||||||
|
|
||||||
This guide explains all available npm commands and when to use them.
|
This guide explains all available npm commands and when to use them.
|
||||||
|
|
||||||
|
## ⚡ **NEW - Ultimate Command** (v2.60.0)
|
||||||
|
|
||||||
|
### `npm run go` ⭐
|
||||||
|
**THE simplest way to run the bot** - Does EVERYTHING automatically!
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install # Install dependencies (first time only)
|
||||||
|
npm run go # Does EVERYTHING else!
|
||||||
|
```
|
||||||
|
|
||||||
|
**What it does:**
|
||||||
|
1. ✅ Checks if Chromium browser is installed → Installs if missing
|
||||||
|
2. ✅ Checks if project is built (`dist/`) → Builds if missing
|
||||||
|
3. ✅ Starts the bot immediately
|
||||||
|
|
||||||
|
**When to use:**
|
||||||
|
- **First time setup** (after `npm install`)
|
||||||
|
- **After git pull** (ensures browser + build are ready)
|
||||||
|
- **Daily use** (simplest command)
|
||||||
|
- **When unsure** (it checks everything!)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 🚀 Essential Commands
|
## 🚀 Essential Commands
|
||||||
|
|
||||||
### `npm start`
|
### `npm start`
|
||||||
|
|||||||
5
package-lock.json
generated
5
package-lock.json
generated
@@ -1,13 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "microsoft-rewards-bot",
|
"name": "microsoft-rewards-bot",
|
||||||
"version": "2.56.15",
|
"version": "2.60.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "microsoft-rewards-bot",
|
"name": "microsoft-rewards-bot",
|
||||||
"version": "2.56.15",
|
"version": "2.60.0",
|
||||||
"hasInstallScript": true,
|
|
||||||
"license": "CC-BY-NC-SA-4.0",
|
"license": "CC-BY-NC-SA-4.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.8.4",
|
"axios": "^1.8.4",
|
||||||
|
|||||||
24
package.json
24
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "microsoft-rewards-bot",
|
"name": "microsoft-rewards-bot",
|
||||||
"version": "2.56.15",
|
"version": "2.60.0",
|
||||||
"description": "Automate Microsoft Rewards points collection",
|
"description": "Automate Microsoft Rewards points collection",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
@@ -16,24 +16,30 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot#readme",
|
"homepage": "https://github.com/Obsidian-wtf/Microsoft-Rewards-Bot#readme",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"go": "node -e \"const fs = require('fs'); const cp = require('child_process'); console.log('🚀 Running complete setup and start...'); if (!fs.existsSync('.playwright-chromium-installed')) { console.log('📦 Installing Chromium...'); cp.execSync('npx playwright install chromium --with-deps', {stdio: 'inherit'}); fs.writeFileSync('.playwright-chromium-installed', new Date().toISOString()); } if (!fs.existsSync('dist/index.js')) { console.log('🔨 Building project...'); cp.execSync('npm run build', {stdio: 'inherit'}); } console.log('✅ Setup complete! Starting bot...'); cp.execSync('npm start', {stdio: 'inherit'});\"",
|
||||||
"clean": "rimraf dist",
|
"clean": "rimraf dist",
|
||||||
"typecheck": "tsc --noEmit",
|
"typecheck": "tsc --noEmit",
|
||||||
|
"install:browser": "node -e \"const fs = require('fs'); if (!fs.existsSync('.playwright-chromium-installed')) { console.log('📦 Installing Chromium browser...'); require('child_process').execSync('npx playwright install chromium --with-deps', {stdio: 'inherit'}); fs.writeFileSync('.playwright-chromium-installed', new Date().toISOString()); } else { console.log('✓ Chromium already installed (use npm run install:browser:force to reinstall)'); }\"",
|
||||||
|
"install:browser:force": "npx playwright install chromium --with-deps",
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"postbuild": "node -e \"console.log('\\n Build complete! Run \\\"npm start\\\" to launch the bot.\\n')\"",
|
"build:clean": "npm run clean && npm run build",
|
||||||
"postinstall": "npm run build",
|
"prestart": "node -e \"const fs = require('fs'); if (!fs.existsSync('dist/index.js')) { console.log('⚠️ Compiled files not found, building...'); require('child_process').execSync('npm run build', {stdio: 'inherit'}); }\"",
|
||||||
"prebuild": "node -e \"const fs = require('fs'); if (!fs.existsSync('node_modules/@playwright/browser-chromium') && process.env.SKIP_BROWSER_INSTALL !== '1') { console.log('📦 Installing Chromium browser...'); require('child_process').execSync('npx playwright install chromium --with-deps', {stdio: 'inherit'}); }\"",
|
|
||||||
"test": "node --test --loader ts-node/esm tests/**/*.test.ts",
|
|
||||||
"start": "node --enable-source-maps ./dist/index.js",
|
"start": "node --enable-source-maps ./dist/index.js",
|
||||||
"dev": "ts-node ./src/index.ts -dev",
|
"dev": "ts-node ./src/index.ts -dev",
|
||||||
|
"test": "node --test --loader ts-node/esm tests/**/*.test.ts",
|
||||||
"creator": "ts-node ./src/account-creation/cli.ts",
|
"creator": "ts-node ./src/account-creation/cli.ts",
|
||||||
"dashboard": "node --enable-source-maps ./dist/index.js -dashboard",
|
"dashboard": "node --enable-source-maps ./dist/index.js -dashboard",
|
||||||
"dashboard-dev": "ts-node ./src/index.ts -dashboard",
|
"dashboard:dev": "ts-node ./src/index.ts -dashboard",
|
||||||
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
||||||
"setup": "node ./scripts/installer/setup.mjs",
|
"setup": "node ./scripts/installer/setup.mjs",
|
||||||
"kill-chrome": "node -e \"const { execSync } = require('child_process'); const isWin = process.platform === 'win32'; try { execSync(isWin ? 'taskkill /F /IM chrome.exe 2>nul || exit 0' : 'pkill -f chrome || true', {stdio: 'inherit'}); } catch(e) {}\"",
|
"update": "node ./scripts/installer/update.mjs",
|
||||||
|
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
||||||
|
"lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix",
|
||||||
"docker:build": "docker build -f docker/Dockerfile -t microsoft-rewards-bot .",
|
"docker:build": "docker build -f docker/Dockerfile -t microsoft-rewards-bot .",
|
||||||
"docker:run": "docker run -d --name ms-rewards microsoft-rewards-bot",
|
"docker:run": "docker run -d --name ms-rewards microsoft-rewards-bot",
|
||||||
"docker:compose": "docker compose -f docker/compose.yaml up -d"
|
"docker:compose": "docker compose -f docker/compose.yaml up -d",
|
||||||
|
"docker:logs": "docker logs -f ms-rewards",
|
||||||
|
"docker:stop": "docker stop ms-rewards && docker rm ms-rewards",
|
||||||
|
"kill:chrome": "node -e \"const { execSync } = require('child_process'); const isWin = process.platform === 'win32'; try { execSync(isWin ? 'taskkill /F /IM chrome.exe 2>nul || exit 0' : 'pkill -f chrome || true', {stdio: 'inherit'}); } catch(e) {}\""
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Bing Rewards",
|
"Bing Rewards",
|
||||||
|
|||||||
@@ -571,8 +571,9 @@ async function performUpdate() {
|
|||||||
}
|
}
|
||||||
process.stdout.write(' ✓\n')
|
process.stdout.write(' ✓\n')
|
||||||
|
|
||||||
process.stdout.write('🔨 Building project...')
|
// FIXED: Show build output to detect TypeScript errors and verify compilation
|
||||||
const buildCode = await run('npm', ['run', 'build'], { stdio: 'ignore' })
|
process.stdout.write('🔨 Building project...\n')
|
||||||
|
const buildCode = await run('npm', ['run', 'build'], { stdio: 'inherit' })
|
||||||
|
|
||||||
if (buildCode !== 0) {
|
if (buildCode !== 0) {
|
||||||
// Build failed - rollback
|
// Build failed - rollback
|
||||||
@@ -603,7 +604,7 @@ async function performUpdate() {
|
|||||||
|
|
||||||
process.stdout.write(' ✓\n')
|
process.stdout.write(' ✓\n')
|
||||||
|
|
||||||
// Step 11: Verify integrity (check if critical files exist)
|
// Step 11: Verify integrity (check if critical files exist AND were recently updated)
|
||||||
process.stdout.write('🔍 Verifying integrity...')
|
process.stdout.write('🔍 Verifying integrity...')
|
||||||
const criticalPaths = [
|
const criticalPaths = [
|
||||||
'dist/index.js',
|
'dist/index.js',
|
||||||
@@ -612,11 +613,31 @@ async function performUpdate() {
|
|||||||
]
|
]
|
||||||
|
|
||||||
let integrityOk = true
|
let integrityOk = true
|
||||||
|
const buildTime = Date.now()
|
||||||
|
|
||||||
for (const path of criticalPaths) {
|
for (const path of criticalPaths) {
|
||||||
if (!existsSync(join(process.cwd(), path))) {
|
const fullPath = join(process.cwd(), path)
|
||||||
|
if (!existsSync(fullPath)) {
|
||||||
|
console.log(`\n ❌ Missing: ${path}`)
|
||||||
integrityOk = false
|
integrityOk = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IMPROVED: For compiled files, verify they were recently updated (within last 2 minutes)
|
||||||
|
if (path.startsWith('dist/')) {
|
||||||
|
try {
|
||||||
|
const stats = statSync(fullPath)
|
||||||
|
const fileAge = buildTime - stats.mtimeMs
|
||||||
|
if (fileAge > 120000) { // 2 minutes
|
||||||
|
console.log(`\n ⚠️ ${path} not recently updated (${Math.round(fileAge / 1000)}s old)`)
|
||||||
|
integrityOk = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
integrityOk = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!integrityOk) {
|
if (!integrityOk) {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ interface ErrorReportPayload {
|
|||||||
arch: string
|
arch: string
|
||||||
nodeVersion: string
|
nodeVersion: string
|
||||||
timestamp: string
|
timestamp: string
|
||||||
|
botMode?: string // DESKTOP, MOBILE, or MAIN
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +174,9 @@ export async function sendErrorReport(
|
|||||||
platform: process.platform,
|
platform: process.platform,
|
||||||
arch: process.arch,
|
arch: process.arch,
|
||||||
nodeVersion: process.version,
|
nodeVersion: process.version,
|
||||||
timestamp: new Date().toISOString()
|
timestamp: new Date().toISOString(),
|
||||||
|
// IMPROVED: Extract bot mode from additionalContext before sanitization
|
||||||
|
botMode: (additionalContext?.platform as string) || 'UNKNOWN'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,6 +193,27 @@ export async function sendErrorReport(
|
|||||||
Object.assign(payload.context, sanitizedContext)
|
Object.assign(payload.context, sanitizedContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Detect Docker environment
|
||||||
|
const isDockerEnv = (() => {
|
||||||
|
try {
|
||||||
|
return fs.existsSync('/.dockerenv') ||
|
||||||
|
(fs.existsSync('/proc/1/cgroup') && fs.readFileSync('/proc/1/cgroup', 'utf8').includes('docker'))
|
||||||
|
} catch {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
|
||||||
|
// Format OS platform display
|
||||||
|
const osPlatform = (() => {
|
||||||
|
if (isDockerEnv) return '🐳 Docker'
|
||||||
|
switch (payload.context.platform) {
|
||||||
|
case 'win32': return '🪟 Windows'
|
||||||
|
case 'darwin': return '🍎 macOS'
|
||||||
|
case 'linux': return '🐧 Linux'
|
||||||
|
default: return payload.context.platform
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
|
||||||
// Build Discord embed with improved formatting
|
// Build Discord embed with improved formatting
|
||||||
const embed = {
|
const embed = {
|
||||||
title: '🐛 Automatic Error Report',
|
title: '🐛 Automatic Error Report',
|
||||||
@@ -202,8 +226,13 @@ export async function sendErrorReport(
|
|||||||
inline: true
|
inline: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: '💻 Platform',
|
name: '🤖 Bot Mode',
|
||||||
value: `${payload.context.platform} ${payload.context.arch}`,
|
value: payload.context.botMode || 'UNKNOWN',
|
||||||
|
inline: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '💻 OS Platform',
|
||||||
|
value: `${osPlatform} ${payload.context.arch}`,
|
||||||
inline: true
|
inline: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user