From 57b174bb3c03cb3eae54ed9fb2d17989268bd4e3 Mon Sep 17 00:00:00 2001 From: MOHAN Date: Sat, 1 Aug 2026 19:00:07 +0530 Subject: [PATCH] fix(bikegear): support sticky Webshare residential sessions --- scripts/testBikegearProxy.js | 20 ++++++++++++++++- .../sources/bikegear/scraper.js | 22 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/scripts/testBikegearProxy.js b/scripts/testBikegearProxy.js index 630afab..ae7785c 100644 --- a/scripts/testBikegearProxy.js +++ b/scripts/testBikegearProxy.js @@ -42,7 +42,7 @@ function getProxyUrl() { } const protocol = String(process.env.BIKEGEAR_PROXY_PROTOCOL || "http").replace(/:$/, ""); - const username = process.env.BIKEGEAR_PROXY_USERNAME || ""; + const username = buildWebshareUsername(process.env.BIKEGEAR_PROXY_USERNAME || ""); const password = process.env.BIKEGEAR_PROXY_PASSWORD || ""; const auth = username ? `${encodeURIComponent(username)}:${encodeURIComponent(password)}@` @@ -51,6 +51,24 @@ function getProxyUrl() { return `${protocol}://${auth}${host}:${port}`; } +function buildWebshareUsername(baseUsername) { + const username = String(baseUsername || "").trim(); + if (!username) return ""; + + const country = String(process.env.BIKEGEAR_PROXY_COUNTRY || "").trim().toLowerCase(); + const sessionId = String(process.env.BIKEGEAR_PROXY_SESSION_ID || "").trim(); + if (!country && !sessionId) return username; + + const countryPart = country && !new RegExp(`-${country}(?:-|$)`, "i").test(username) + ? `-${country}` + : ""; + const sessionPart = sessionId && !new RegExp(`-${sessionId}$`).test(username) + ? `-${sessionId}` + : ""; + + return `${username}${countryPart}${sessionPart}`; +} + function maskProxyUrl(proxyUrl) { if (!proxyUrl) return "none"; try { diff --git a/src/business-logic/import-pipeline/sources/bikegear/scraper.js b/src/business-logic/import-pipeline/sources/bikegear/scraper.js index 48699ec..e4bf81d 100644 --- a/src/business-logic/import-pipeline/sources/bikegear/scraper.js +++ b/src/business-logic/import-pipeline/sources/bikegear/scraper.js @@ -13,6 +13,8 @@ * BIKEGEAR_PROXY_PORT=80 * BIKEGEAR_PROXY_USERNAME=... * BIKEGEAR_PROXY_PASSWORD=... + * BIKEGEAR_PROXY_COUNTRY=gb + * BIKEGEAR_PROXY_SESSION_ID=1001 */ const axios = require("axios"); @@ -49,7 +51,7 @@ function getProxyUrl() { } const protocol = String(process.env.BIKEGEAR_PROXY_PROTOCOL || "http").replace(/:$/, ""); - const username = process.env.BIKEGEAR_PROXY_USERNAME || ""; + const username = buildWebshareUsername(process.env.BIKEGEAR_PROXY_USERNAME || ""); const password = process.env.BIKEGEAR_PROXY_PASSWORD || ""; const auth = username ? `${encodeURIComponent(username)}:${encodeURIComponent(password)}@` @@ -58,6 +60,24 @@ function getProxyUrl() { return `${protocol}://${auth}${host}:${port}`; } +function buildWebshareUsername(baseUsername) { + const username = String(baseUsername || "").trim(); + if (!username) return ""; + + const country = String(process.env.BIKEGEAR_PROXY_COUNTRY || "").trim().toLowerCase(); + const sessionId = String(process.env.BIKEGEAR_PROXY_SESSION_ID || "").trim(); + if (!country && !sessionId) return username; + + const countryPart = country && !new RegExp(`-${country}(?:-|$)`, "i").test(username) + ? `-${country}` + : ""; + const sessionPart = sessionId && !new RegExp(`-${sessionId}$`).test(username) + ? `-${sessionId}` + : ""; + + return `${username}${countryPart}${sessionPart}`; +} + function maskProxyUrl(proxyUrl) { try { const u = new URL(proxyUrl);