mirror of
https://github.com/TheNetsky/Microsoft-Rewards-Script.git
synced 2026-01-17 13:33:57 +00:00
* V2.4.0 (#381) * Updated README.md to reflect version 2.1 and improve the presentation of Microsoft Rewards Automation features. * Updated version to 2.1.5 in README.md and package.json, added new license and legal notice sections, and improved the configuration script for a better user experience. * Mise à jour des messages de journalisation et ajout de vérifications pour le chargement des quiz et la présence des options avant de procéder. Suppression de fichiers de configuration obsolètes. * Added serial protection dialog management for message forwarding, including closing by button or escape. * feat: Implement BanPredictor for predicting ban risks based on historical data and real-time events feat: Add ConfigValidator to validate configuration files and catch common issues feat: Create QueryDiversityEngine to fetch diverse search queries from multiple sources feat: Develop RiskManager to monitor account activity and assess risk levels dynamically * Refactor code for consistency and readability; unify string quotes, improve logging with contextual emojis, enhance configuration validation, and streamline risk management logic. * feat: Refactor BrowserUtil and Login classes for improved button handling and selector management; implement unified selector system and enhance activity processing logic in Workers class. * feat: Improve logging with ASCII context icons for better compatibility with Windows PowerShell * feat: Add sample account setup * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * feat: Update Node.js engine requirement to >=20.0.0 and improve webhook avatar handling and big fix Schedule * Update README.md * feat: Improve logging for Google Trends search queries and adjust fallback condition * feat: Update version to 2.2.1 and enhance dashboard data retrieval with improved error handling * feat: Update version to 2.2.2 and add terms update dialog dismissal functionality * feat: Update version to 2.2.2 and require Node.js engine >=20.0.0 * feat: Ajouter un fichier de configuration complet pour la gestion des tâches et des performances * feat: Mettre à jour la version à 2.2.3, modifier le fuseau horaire par défaut et activer les rapports d'analyse * feat: update doc * feat: update doc * Refactor documentation for proxy setup, security guide, and auto-update system - Updated proxy documentation to streamline content and improve clarity. - Revised security guide to emphasize best practices and incident response. - Simplified auto-update documentation, enhancing user understanding of the update process. - Removed redundant sections and improved formatting for better readability. * feat: update version to 2.2.7 in package.json * feat: update version to 2.2.7 in README.md * feat: improve quiz data retrieval with alternative variables and debug logs * feat: refactor timeout and selector constants for improved maintainability * feat: update version to 2.2.8 in package.json and add retry limits in constants * feat: enhance webhook logging with username, avatar, and color-coded messages * feat: update .gitignore to include diagnostic folder and bump version to 2.2.8 in package-lock.json * feat: updated version to 2.3.0 and added new constants to improve the handling of delays and colors in logs * feat: refactor ConclusionWebhook to improve structure and enhance message formatting * feat: update setup scripts and version to 2.3.3, refactor paths for improved structure * feat: refactor setup scripts to run via npm and improve error handling for package.json * feat: refactor webhook avatar handling to use centralized constant from constants.ts * feat: mettre à jour la version à 2.3.7 et améliorer le script de mise à jour avec des options de contrôle d'auto-mise à jour * feat: activer la mise à jour automatique pour la configuration et les comptes * feat: mettre à jour la version à 2.3.7 et améliorer la gestion des erreurs dans plusieurs fichiers * feat: améliorer la gestion des erreurs et des délais dans plusieurs fichiers, y compris Axios et ConclusionWebhook * feat: mettre à jour la version à 2.4.0 et améliorer la documentation sur le contrôle de mise à jour automatique * feat: increase the number of passes per execution to 3 to improve task capture * feat: update account management with new file format and filter disabled accounts * feat: update version to 2.4.0, add reinstallation warning and support .jsonc extensions for configuration files * fix: fix formatting of reinstallation message in README * feat: add an important update notice in the README to recommend a complete reinstallation * fix: remove backup instructions from installation guide in README * fix: update notice in README for configuration file changes and fresh installation instructions * fix: fix typographical error in README update notice * Fix: Update avatar URL in Discord config and remove optional webhook properties * exploit: add customization options for webhooks and improve notification format * Fix build
96 lines
4.0 KiB
TypeScript
96 lines
4.0 KiB
TypeScript
import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'
|
|
import { HttpProxyAgent } from 'http-proxy-agent'
|
|
import { HttpsProxyAgent } from 'https-proxy-agent'
|
|
import { SocksProxyAgent } from 'socks-proxy-agent'
|
|
import { AccountProxy } from '../interface/Account'
|
|
|
|
class AxiosClient {
|
|
private instance: AxiosInstance
|
|
private account: AccountProxy
|
|
|
|
constructor(account: AccountProxy) {
|
|
this.account = account
|
|
this.instance = axios.create()
|
|
|
|
// If a proxy configuration is provided, set up the agent
|
|
if (this.account.url && this.account.proxyAxios) {
|
|
const agent = this.getAgentForProxy(this.account)
|
|
this.instance.defaults.httpAgent = agent
|
|
this.instance.defaults.httpsAgent = agent
|
|
}
|
|
}
|
|
|
|
private getAgentForProxy(proxyConfig: AccountProxy): HttpProxyAgent<string> | HttpsProxyAgent<string> | SocksProxyAgent {
|
|
const { url, port } = proxyConfig
|
|
|
|
switch (true) {
|
|
case proxyConfig.url.startsWith('http://'):
|
|
return new HttpProxyAgent(`${url}:${port}`)
|
|
case proxyConfig.url.startsWith('https://'):
|
|
return new HttpsProxyAgent(`${url}:${port}`)
|
|
case proxyConfig.url.startsWith('socks://') || proxyConfig.url.startsWith('socks4://') || proxyConfig.url.startsWith('socks5://'):
|
|
return new SocksProxyAgent(`${url}:${port}`)
|
|
default:
|
|
throw new Error(`Unsupported proxy protocol in "${url}". Supported: http://, https://, socks://, socks4://, socks5://`)
|
|
}
|
|
}
|
|
|
|
// Generic method to make any Axios request
|
|
public async request(config: AxiosRequestConfig, bypassProxy = false): Promise<AxiosResponse> {
|
|
if (bypassProxy) {
|
|
const bypassInstance = axios.create()
|
|
return bypassInstance.request(config)
|
|
}
|
|
|
|
let lastError: unknown
|
|
const maxAttempts = 2
|
|
|
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
try {
|
|
return await this.instance.request(config)
|
|
} catch (err: unknown) {
|
|
lastError = err
|
|
const axiosErr = err as AxiosError | undefined
|
|
|
|
// Detect HTTP proxy auth failures (status 407) and retry without proxy
|
|
if (axiosErr && axiosErr.response && axiosErr.response.status === 407) {
|
|
if (attempt < maxAttempts) {
|
|
await this.sleep(1000 * attempt) // Exponential backoff
|
|
}
|
|
const bypassInstance = axios.create()
|
|
return bypassInstance.request(config)
|
|
}
|
|
|
|
// If proxied request fails with common proxy/network errors, retry with backoff
|
|
const e = err as { code?: string; cause?: { code?: string }; message?: string } | undefined
|
|
const code = e?.code || e?.cause?.code
|
|
const isNetErr = code === 'ECONNREFUSED' || code === 'ETIMEDOUT' || code === 'ECONNRESET' || code === 'ENOTFOUND'
|
|
const msg = String(e?.message || '')
|
|
const looksLikeProxyIssue = /proxy|tunnel|socks|agent/i.test(msg)
|
|
|
|
if (isNetErr || looksLikeProxyIssue) {
|
|
if (attempt < maxAttempts) {
|
|
// Exponential backoff: 1s, 2s, 4s, etc.
|
|
const delayMs = 1000 * Math.pow(2, attempt - 1)
|
|
await this.sleep(delayMs)
|
|
continue
|
|
}
|
|
// Last attempt: try without proxy
|
|
const bypassInstance = axios.create()
|
|
return bypassInstance.request(config)
|
|
}
|
|
|
|
// Non-retryable error
|
|
throw err
|
|
}
|
|
}
|
|
|
|
throw lastError
|
|
}
|
|
|
|
private sleep(ms: number): Promise<void> {
|
|
return new Promise(resolve => setTimeout(resolve, ms))
|
|
}
|
|
}
|
|
|
|
export default AxiosClient |