mirror of
				https://github.com/shufflewzc/faker3.git
				synced 2025-11-01 01:42:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			285 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var axios = require('axios');
 | |
| var qs = require('qs');
 | |
| 
 | |
| function TDEncrypt(l) {
 | |
|   l = JSON.stringify(l);
 | |
|   l = encodeURIComponent(l);
 | |
|   var k = '',
 | |
|     f = 0;
 | |
|   do {
 | |
|     var h = l.charCodeAt(f++);
 | |
|     var d = l.charCodeAt(f++);
 | |
|     var a = l.charCodeAt(f++);
 | |
|     var b = h >> 2;
 | |
|     h = ((h & 3) << 4) | (d >> 4);
 | |
|     var e = ((d & 15) << 2) | (a >> 6);
 | |
|     var c = a & 63;
 | |
|     isNaN(d) ? (e = c = 64) : isNaN(a) && (c = 64);
 | |
|     k =
 | |
|       k +
 | |
|       '23IL<N01c7KvwZO56RSTAfghiFyzWJqVabGH4PQdopUrsCuX*xeBjkltDEmn89.-'.charAt(b) +
 | |
|       '23IL<N01c7KvwZO56RSTAfghiFyzWJqVabGH4PQdopUrsCuX*xeBjkltDEmn89.-'.charAt(h) +
 | |
|       '23IL<N01c7KvwZO56RSTAfghiFyzWJqVabGH4PQdopUrsCuX*xeBjkltDEmn89.-'.charAt(e) +
 | |
|       '23IL<N01c7KvwZO56RSTAfghiFyzWJqVabGH4PQdopUrsCuX*xeBjkltDEmn89.-'.charAt(c);
 | |
|   } while (f < l.length);
 | |
|   return k + '/';
 | |
| }
 | |
| 
 | |
| function getAppVersionFromUserAgent(userAgent) {
 | |
|   const mozillaIndex = userAgent.indexOf('Mozilla/');
 | |
|   if (mozillaIndex !== -1) {
 | |
|     return userAgent.substring(mozillaIndex + 8);
 | |
|   }
 | |
|   return userAgent;
 | |
| }
 | |
| 
 | |
| function getCurrentPageUrl(inputUrl) {
 | |
|   let l = inputUrl.startsWith('https:') ? 'https://' : 'http://';
 | |
|   let d = '';
 | |
| 
 | |
|   try {
 | |
|     const queryIndex = inputUrl.indexOf('?');
 | |
|     if (queryIndex > 0) {
 | |
|       inputUrl = inputUrl.substring(0, queryIndex);
 | |
|     }
 | |
| 
 | |
|     d = inputUrl.substring(l.length);
 | |
|   } catch (error) {
 | |
|     console.error('Error parsing URL:', error);
 | |
|   }
 | |
| 
 | |
|   return d;
 | |
| }
 | |
| 
 | |
| async function getJsToken(
 | |
|   userAgent = 'jdapp;android;11.2.8;;;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36',
 | |
|   url = 'https://plus.m.jd.com/',
 | |
|   bizId = 'JD-PLUS',
 | |
| ) {
 | |
|   const d = TDEncrypt({
 | |
|     ts: { deviceTime: Date.now(), deviceEndTime: Date.now() + 10 },
 | |
|     ca: {
 | |
|       tdHash: '5b7096a993d442aef38ceb90cce4b485',
 | |
|       contextName: 'webgl,experimental-webgl',
 | |
|       webglversion: 'WebGL 1.0 (OpenGL ES 2.0 Chromium)',
 | |
|       shadingLV: 'WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)',
 | |
|       vendor: 'WebKit',
 | |
|       renderer: 'WebKit WebGL',
 | |
|       extensions: [
 | |
|         'ANGLE_instanced_arrays',
 | |
|         'EXT_blend_minmax',
 | |
|         'EXT_clip_control',
 | |
|         'EXT_color_buffer_half_float',
 | |
|         'EXT_depth_clamp',
 | |
|         'EXT_disjoint_timer_query',
 | |
|         'EXT_float_blend',
 | |
|         'EXT_frag_depth',
 | |
|         'EXT_polygon_offset_clamp',
 | |
|         'EXT_shader_texture_lod',
 | |
|         'EXT_texture_compression_bptc',
 | |
|         'EXT_texture_compression_rgtc',
 | |
|         'EXT_texture_filter_anisotropic',
 | |
|         'EXT_texture_mirror_clamp_to_edge',
 | |
|         'EXT_sRGB',
 | |
|         'KHR_parallel_shader_compile',
 | |
|         'OES_element_index_uint',
 | |
|         'OES_fbo_render_mipmap',
 | |
|         'OES_standard_derivatives',
 | |
|         'OES_texture_float',
 | |
|         'OES_texture_float_linear',
 | |
|         'OES_texture_half_float',
 | |
|         'OES_texture_half_float_linear',
 | |
|         'OES_vertex_array_object',
 | |
|         'WEBGL_blend_func_extended',
 | |
|         'WEBGL_color_buffer_float',
 | |
|         'WEBGL_compressed_texture_s3tc',
 | |
|         'WEBGL_compressed_texture_s3tc_srgb',
 | |
|         'WEBGL_debug_renderer_info',
 | |
|         'WEBGL_debug_shaders',
 | |
|         'WEBGL_depth_texture',
 | |
|         'WEBGL_draw_buffers',
 | |
|         'WEBGL_lose_context',
 | |
|         'WEBGL_multi_draw',
 | |
|         'WEBGL_polygon_mode',
 | |
|       ],
 | |
|       wuv: 'Google Inc. (Intel)',
 | |
|       wur: 'ANGLE (Intel, Intel(R) UHD Graphics 730 (0x00004C8B) Direct3D11 vs_5_0 ps_5_0, D3D11)',
 | |
|     },
 | |
|     m: { compatMode: 'CSS1Compat' },
 | |
|     n: {
 | |
|       vendorSub: '',
 | |
|       productSub: '20030107',
 | |
|       vendor: 'Google Inc.',
 | |
|       maxTouchPoints: 1,
 | |
|       pdfViewerEnabled: false,
 | |
|       hardwareConcurrency: 12,
 | |
|       cookieEnabled: true,
 | |
|       appCodeName: 'Mozilla',
 | |
|       appName: 'Netscape',
 | |
|       appVersion: getAppVersionFromUserAgent(userAgent),
 | |
|       platform: 'Win32',
 | |
|       product: 'Gecko',
 | |
|       userAgent: userAgent,
 | |
|       language: 'zh-CN',
 | |
|       onLine: true,
 | |
|       webdriver: false,
 | |
|       javaEnabled: false,
 | |
|       deprecatedRunAdAuctionEnforcesKAnonymity: true,
 | |
|       deviceMemory: 8,
 | |
|       enumerationOrder: [
 | |
|         'vendorSub',
 | |
|         'productSub',
 | |
|         'vendor',
 | |
|         'maxTouchPoints',
 | |
|         'scheduling',
 | |
|         'userActivation',
 | |
|         'doNotTrack',
 | |
|         'geolocation',
 | |
|         'connection',
 | |
|         'plugins',
 | |
|         'mimeTypes',
 | |
|         'pdfViewerEnabled',
 | |
|         'webkitTemporaryStorage',
 | |
|         'webkitPersistentStorage',
 | |
|         'windowControlsOverlay',
 | |
|         'hardwareConcurrency',
 | |
|         'cookieEnabled',
 | |
|         'appCodeName',
 | |
|         'appName',
 | |
|         'appVersion',
 | |
|         'platform',
 | |
|         'product',
 | |
|         'userAgent',
 | |
|         'language',
 | |
|         'languages',
 | |
|         'onLine',
 | |
|         'webdriver',
 | |
|         'getGamepads',
 | |
|         'javaEnabled',
 | |
|         'sendBeacon',
 | |
|         'vibrate',
 | |
|         'deprecatedRunAdAuctionEnforcesKAnonymity',
 | |
|         'protectedAudience',
 | |
|         'bluetooth',
 | |
|         'storageBuckets',
 | |
|         'clipboard',
 | |
|         'credentials',
 | |
|         'keyboard',
 | |
|         'managed',
 | |
|         'mediaDevices',
 | |
|         'storage',
 | |
|         'serviceWorker',
 | |
|         'virtualKeyboard',
 | |
|         'wakeLock',
 | |
|         'deviceMemory',
 | |
|         'userAgentData',
 | |
|         'login',
 | |
|         'ink',
 | |
|         'mediaCapabilities',
 | |
|         'hid',
 | |
|         'locks',
 | |
|         'gpu',
 | |
|         'mediaSession',
 | |
|         'permissions',
 | |
|         'presentation',
 | |
|         'usb',
 | |
|         'xr',
 | |
|         'serial',
 | |
|         'adAuctionComponents',
 | |
|         'runAdAuction',
 | |
|         'canLoadAdAuctionFencedFrame',
 | |
|         'canShare',
 | |
|         'share',
 | |
|         'clearAppBadge',
 | |
|         'getBattery',
 | |
|         'getUserMedia',
 | |
|         'requestMIDIAccess',
 | |
|         'requestMediaKeySystemAccess',
 | |
|         'setAppBadge',
 | |
|         'webkitGetUserMedia',
 | |
|         'clearOriginJoinedAdInterestGroups',
 | |
|         'createAuctionNonce',
 | |
|         'joinAdInterestGroup',
 | |
|         'leaveAdInterestGroup',
 | |
|         'updateAdInterestGroups',
 | |
|         'deprecatedReplaceInURN',
 | |
|         'deprecatedURNToURL',
 | |
|         'getInstalledRelatedApps',
 | |
|         'registerProtocolHandler',
 | |
|         'unregisterProtocolHandler',
 | |
|       ],
 | |
|     },
 | |
|     p: [],
 | |
|     w: { devicePixelRatio: 4, screenTop: 0, screenLeft: 0 },
 | |
|     s: { availHeight: 740, availWidth: 360, colorDepth: 24, height: 740, width: 360, pixelDepth: 24 },
 | |
|     sc: {
 | |
|       ActiveBorder: 'rgb(0, 0, 0)',
 | |
|       ActiveCaption: 'rgb(0, 0, 0)',
 | |
|       AppWorkspace: 'rgb(255, 255, 255)',
 | |
|       Background: 'rgb(255, 255, 255)',
 | |
|       ButtonFace: 'rgb(240, 240, 240)',
 | |
|       ButtonHighlight: 'rgb(240, 240, 240)',
 | |
|       ButtonShadow: 'rgb(240, 240, 240)',
 | |
|       ButtonText: 'rgb(0, 0, 0)',
 | |
|       CaptionText: 'rgb(0, 0, 0)',
 | |
|       GrayText: 'rgb(109, 109, 109)',
 | |
|       Highlight: 'rgba(0, 86, 205, 0.8)',
 | |
|       HighlightText: 'rgb(255, 255, 255)',
 | |
|       InactiveBorder: 'rgb(0, 0, 0)',
 | |
|       InactiveCaption: 'rgb(255, 255, 255)',
 | |
|       InactiveCaptionText: 'rgb(128, 128, 128)',
 | |
|       InfoBackground: 'rgb(255, 255, 255)',
 | |
|       InfoText: 'rgb(0, 0, 0)',
 | |
|       Menu: 'rgb(255, 255, 255)',
 | |
|       MenuText: 'rgb(0, 0, 0)',
 | |
|       Scrollbar: 'rgb(255, 255, 255)',
 | |
|       ThreeDDarkShadow: 'rgb(0, 0, 0)',
 | |
|       ThreeDFace: 'rgb(240, 240, 240)',
 | |
|       ThreeDHighlight: 'rgb(0, 0, 0)',
 | |
|       ThreeDLightShadow: 'rgb(0, 0, 0)',
 | |
|       ThreeDShadow: 'rgb(0, 0, 0)',
 | |
|       Window: 'rgb(255, 255, 255)',
 | |
|       WindowFrame: 'rgb(0, 0, 0)',
 | |
|       WindowText: 'rgb(0, 0, 0)',
 | |
|     },
 | |
|     ss: { cookie: true, localStorage: true, sessionStorage: true, globalStorage: false, indexedDB: true },
 | |
|     tz: -480,
 | |
|     lil: '',
 | |
|     wil: '',
 | |
|   });
 | |
| 
 | |
|   const a = TDEncrypt({
 | |
|     pin: '',
 | |
|     oid: '',
 | |
|     bizId: bizId,
 | |
|     fc: '',
 | |
|     mode: 'strict',
 | |
|     p: 's',
 | |
|     fp: 'b772d9635edebaa1a47c5a1fd086186a',
 | |
|     ctype: 1,
 | |
|     v: '3.2.1.0',
 | |
|     f: '3',
 | |
|     o: getCurrentPageUrl(url),
 | |
|     qs: '',
 | |
|     qi: '',
 | |
|   });
 | |
| 
 | |
|   let { status, data } = await axios({
 | |
|     method: 'POST',
 | |
|     url: `https://jra.jd.com/jsTk.do?a=${encodeURIComponent(a)}`,
 | |
|     headers: {
 | |
|       'User-Agent': userAgent,
 | |
|       'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
 | |
|     },
 | |
|     data: qs.stringify({
 | |
|       d: d,
 | |
|     }),
 | |
|   });
 | |
|   if (status === 200 && data.data) {
 | |
|     return data.data;
 | |
|   } else return null;
 | |
| }
 | |
| 
 | |
| module.exports.getJsToken = getJsToken;
 | |
| 
 |