2023-07-18 02:54:53 +00:00
const SYDNEY _ORIGIN = 'https://sydney.bing.com' ;
const KEEP _REQ _HEADERS = [
'accept' ,
'accept-encoding' ,
'accept-language' ,
'connection' ,
'cookie' ,
'upgrade' ,
'user-agent' ,
'sec-websocket-extensions' ,
'sec-websocket-key' ,
'sec-websocket-version' ,
'x-request-id' ,
'content-length' ,
'content-type' ,
'access-control-request-headers' ,
'access-control-request-method' ,
] ;
const IP _RANGE = [
[ '3.2.50.0' , '3.5.31.255' ] , //192,000
[ '3.12.0.0' , '3.23.255.255' ] , //786,432
[ '3.30.0.0' , '3.33.34.255' ] , //205,568
[ '3.40.0.0' , '3.63.255.255' ] , //1,572,864
[ '3.80.0.0' , '3.95.255.255' ] , //1,048,576
[ '3.100.0.0' , '3.103.255.255' ] , //262,144
[ '3.116.0.0' , '3.119.255.255' ] , //262,144
[ '3.128.0.0' , '3.247.255.255' ] , //7,864,320
] ;
/ * *
* 随机整数 [ min , max )
* @ param { number } min
* @ param { number } max
* @ returns
* /
const getRandomInt = ( min , max ) => Math . floor ( Math . random ( ) * ( max - min ) ) + min ;
/ * *
* ip 转 int
* @ param { string } ip
* @ returns
* /
const ipToInt = ( ip ) => {
const ipArr = ip . split ( '.' ) ;
let result = 0 ;
result += + ipArr [ 0 ] << 24 ;
result += + ipArr [ 1 ] << 16 ;
result += + ipArr [ 2 ] << 8 ;
result += + ipArr [ 3 ] ;
return result ;
} ;
/ * *
* int 转 ip
* @ param { number } intIP
* @ returns
* /
const intToIp = ( intIP ) => {
return ` ${ ( intIP >> 24 ) & 255 } . ${ ( intIP >> 16 ) & 255 } . ${ ( intIP >> 8 ) & 255 } . ${ intIP & 255 } ` ;
} ;
const getRandomIP = ( ) => {
const randIndex = getRandomInt ( 0 , IP _RANGE . length ) ;
const startIp = IP _RANGE [ randIndex ] [ 0 ] ;
const endIp = IP _RANGE [ randIndex ] [ 1 ] ;
const startIPInt = ipToInt ( startIp ) ;
const endIPInt = ipToInt ( endIp ) ;
const randomInt = getRandomInt ( startIPInt , endIPInt ) ;
const randomIP = intToIp ( randomInt ) ;
return randomIP ;
} ;
async function goUrl ( request , url ) {
let fp = {
method : request . method
} ;
fp . headers = new Headers ( request . headers ) ;
for ( var i = 2 ; i < arguments . length - 1 ; i = i + 2 ) {
fp . headers [ arguments [ i ] ] = arguments [ i + 1 ] ;
}
return await fetch ( url , fp ) ;
}
export default {
/ * *
* fetch
* @ param { Request } request
* @ param { * } env
* @ param { * } ctx
* @ returns
* /
async fetch ( request , env , ctx ) {
const url = request . url ;
let iSlash = url . indexOf ( '/' , 11 ) ;
let nUrl = url . substring ( iSlash + 1 ) ;
2023-08-20 01:11:48 +00:00
let iColon = nUrl . indexOf ( ':' , 3 ) + 3 ;
if ( ! nUrl . startsWith ( 'syndey.bing.com' , iColon ) &&
! nUrl . startsWith ( 'www.bing.com/turing' , iColon ) )
2023-07-18 02:54:53 +00:00
return await goUrl ( request , nUrl ) ;
const targetUrl = new URL ( nUrl ) ;
const newHeaders = new Headers ( ) ;
request . headers . forEach ( ( value , key ) => {
// console.log(`old : ${key} : ${value}`);
if ( KEEP _REQ _HEADERS . includes ( key ) ) {
newHeaders . set ( key , value ) ;
}
} ) ;
newHeaders . set ( 'host' , targetUrl . host ) ;
newHeaders . set ( 'origin' , targetUrl . origin ) ;
newHeaders . set ( 'referer' , 'https://www.bing.com/search?q=Bing+AI' ) ;
const randIP = getRandomIP ( ) ;
// console.log('randIP : ', randIP);
newHeaders . set ( 'X-Forwarded-For' , randIP ) ;
const oldUA = request . headers . get ( 'user-agent' ) ;
const isMobile = oldUA . includes ( 'Mobile' ) || oldUA . includes ( 'Android' ) ;
if ( isMobile ) {
newHeaders . set (
'user-agent' ,
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.7 Mobile/15E148 Safari/605.1.15 BingSapphire/1.0.410427012'
) ;
} else {
newHeaders . set ( 'user-agent' , 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.35' ) ;
}
// newHeaders.forEach((value, key) => console.log(`${key} : ${value}`));
const newReq = new Request ( targetUrl , {
method : request . method ,
headers : newHeaders ,
body : request . body ,
} ) ;
// console.log('request url : ', newReq.url);
const res = await fetch ( newReq ) ;
return res ;
} ,
} ;