node_modules/@yakult-green-tea/qq-music-api/dist/src/services/auth/qrLogin.js
UNKNOWN
Verdict: BENIGN
Local reference
Suspicious dependency
Inferred
| 6:409 |
…= void 0; |
|
| 7 |
const node_crypto_1 = __importDefault(require("node:crypto")); |
|
| 8 |
const logger_1 = require("../../util/logger"); |
|
| 9 |
const deviceContext_1 = require("./deviceContext"); |
|
| 10 |
const httpClient_1 = __importDefault(require("./httpClient")); |
|
| 11 |
const wechatLogin_1 = require("./wechatLogin"); |
|
| 12 |
const WebSocketRuntime = require('ws'); |
|
| 13 |
const MUSICU_URL = 'https://u.y.qq.com/cgi-bin/musicu.fcg'; |
|
| 14 |
const QIMEI_URL = 'https://api.tencentmusic.com/tme/trpc/proxy'; |
|
| 15 |
// Public Android client protocol constants, not user credentials. |
|
| 16 |
const QIMEI_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
| 17 |
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEIxgwoutfwoJxcGQeedgP7FG9qaIuS0qzfR8gWkrkTZKM2iWHn2ajQpBRZjMSoSf6+KJGvar2ORhBfpDXyVtZCK… |
|
| 242:65 |
… and `ws.stream` answer 403. |
|
| 243 |
*/ |
|
| 244 |
const DEFAULT_STREAM_DOMAIN = 'http://dl.stream.qqmusic.qq.com/'; |
Contains a hardcoded insecure HTTP URL |
| 245 |
const MUSIC_FILE_TYPES = { |
|
| 246 |
m4a: { prefix: 'C400', extension: '.m4a' }, |
|
| 247 |
128: { prefix: 'M500', extension: '.mp3' }, |
|
| 248 |
320: { prefix: 'M800', extension: '.mp3' }, |
|
| 249 |
ape: { … |
|
| 292:10 |
…eturn {}; |
|
| 293 |
try { |
|
| 294 |
return dictionaryOf(JSON.parse(value)); |
|
| 295 |
} |
|
| 296 |
catch { |
|
| 297 |
return {}; |
|
| 298 |
} |
|
| 299 |
}; |
|
| 300 |
const md5 = (...values) => { |
|
| 301 |
const hash = node_crypto_1.default.createHash('md5'); |
|
| 302 |
for (const value of values) |
|
| 303 |
hash.update(value); |
|
| 304 |
return hash.digest('hex'); |
|
| 305 |
}; |
|
| 306 |
const randomHex = (length) => node_crypto_1.default |
|
| 307 |
.randomBytes(Math.ceil(length / 2)) |
|
| 308 |
.toString('hex') |
|
| 309 |
.slice(0, length); |
|
| 310 |
const randomDigits = (length) => { |
|
| 311 |
let… |
|
| 371:68 |
…`, |
|
| 372 |
qimei: '', |
|
| 373 |
qimei36: '', |
|
| 374 |
sdkVersion: '1.2.13.6', |
|
| 375 |
targetSdkVersion: '33', |
|
| 376 |
audit: '', |
|
| 377 |
userId: '{}', |
|
| 378 |
packageId: PACKAGE_ID, |
|
| 379 |
deviceType: 'Phone', |
|
| 380 |
sdkName: '', |
|
| 381 |
reserved: JSON.stringify(reserved), |
|
| 382 |
}; |
|
| 383 |
}; |
|
| 384 |
const buildQimeiRequest = (device, now = new Date()) => { |
|
| 385 |
const cryptKey = randomHex(16); |
|
| 386 |
const no… |
|
| 387:18 |
…mp = Math.floor(now.getTime() / 1000); |
|
| 388 |
const encryptedKey = node_crypto_1.default.publicEncrypt({ key: QIMEI_PUBLIC_KEY, padding: node_crypto_1.default.constants.RSA_PKCS1_PADDING }, Buffer.from(cryptKey)); |
|
| 389 |
const cipher = node_crypto_1.default.createCipheriv('aes-128-cbc', Buffer.from(cryptKey), Buffer.from(cryptKey)); |
|
| 390 |
const encryptedPayload = Buffer.concat([ |
|
| 391 |
cipher.update(Buffer.from(JSON.stringify(buildQimeiPayload(device, now)))), |
Creates Node.js Buffer from JSON serialization |
| 392 |
cipher.final(), |
|
| 393 |
]); |
|
| 394 |
const key = encryptedKey.toString('base64'); |
|
| 395 |
const params = encryptedPayload.toString('base64'); |
|
| 396 |
const extra = `{"appKey":"${QIMEI_APP_KEY}"}`; |
|
| 397 |
return { |
|
| 398 |
… |
|
Objectives
| 715:10 |
…ath = redirectPath(path, reference); |
|
| 716 |
} |
|
| 717 |
throw new Error('MQTT redirect limit exceeded'); |
|
| 718 |
}; |
|
| 719 |
const subscribeToQrEvents = async (socket, queue, qrcodeId, onEvent) => { |
|
| 720 |
socket.send(buildSubscribePacket(qrcodeId)); |
|
| 721 |
while (true) { |
|
| 722 |
const packet = await queue.next(20000); |
|
| 723 |
if (packet[0] >> 4 === 9) { |
|
| 724 |
… |
|
Micro-behaviors
| 802:18 |
… = buildQimeiHeadersAndBody(device); |
|
| 803 |
const response = await http.post(QIMEI_URL, request.body, { headers: request.headers }); |
|
| 804 |
const outer = parseDictionary(response.data); |
|
| 805 |
const inner = parseDictionary(outer.data); |
|
| 806 |
const data… |
|
| 983:156 |
…erver', 'Login', { |
|
| 984 |
openid: stringOf(credential.openid), |
|
| 985 |
refresh_token: stringOf(credential.refresh_token), |
|
| 986 |
str_musicid: stringOf(credential.str_musicid) || String(credential.musicid), |
|
| 987 |
musick… |
|
| 1068:33 |
…00, Math.max(1, Math.floor(limit))); |
|
| 1069 |
const response = await http.request({ |
|
| 1070 |
url: FAVORITE_ASSET_URL, |
|
| 1071 |
method: 'GET', |
|
| 1072 |
params: { |
|
| 1073 |
ct: 20, |
|
| 1074 |
cid: 205360956, |
|
| 1075 |
userid: credentialMusicId(auth.credential), |
|
| 1076 |
… |
|
| 401:57 |
…roxy', |
|
| 402 |
appid: 'qimei_qq_android', |
|
| 403 |
sign: md5('qimei_qq_androidpzAuCmaFAaFaHrdakPjLIEqKrGnSOOvH', String(timestamp)), |
|
| 404 |
'user-agent': 'QQMusic', |
|
| 405 |
timestamp: String(timestamp), |
|
| 406 |
}, |
|
| 407 |
body: { |
|
| 408 |
app: 0, |
|
| 409 |
os: 1, |
|
| 410 |
qimeiP… |
|
| 1068:33 |
…00, Math.max(1, Math.floor(limit))); |
|
| 1069 |
const response = await http.request({ |
|
| 1070 |
url: FAVORITE_ASSET_URL, |
|
| 1071 |
method: 'GET', |
|
| 1072 |
params: { |
|
| 1073 |
ct: 20, |
|
| 1074 |
cid: 205360956, |
|
| 1075 |
userid: credentialMusicId(auth.credential), |
|
| 1076 |
… |
|
| 6:409 |
…= void 0; |
|
| 7 |
const node_crypto_1 = __importDefault(require("node:crypto")); |
|
| 8 |
const logger_1 = require("../../util/logger"); |
|
| 9 |
const deviceContext_1 = require("./deviceContext"); |
|
| 10 |
const httpClient_1 = __importDefault(require("./httpClient")); |
|
| 11 |
const wechatLogin_1 = require("./wechatLogin"); |
|
| 12 |
const WebSocketRuntime = require('ws'); |
|
| 13 |
const MUSICU_URL = 'https://u.y.qq.com/cgi-bin/musicu.fcg'; |
|
| 14 |
const QIMEI_URL = 'https://api.tencentmusic.com/tme/trpc/proxy'; |
|
| 15 |
// Public Android client protocol constants, not user credentials. |
|
| 16 |
const QIMEI_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
| 17 |
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEIxgwoutfwoJxcGQeedgP7FG9qaIuS0qzfR8gWkrkTZKM2iWHn2ajQpBRZjMSoSf6+KJGvar2ORhBfpDXyVtZCK… |
|
| 242:65 |
… and `ws.stream` answer 403. |
|
| 243 |
*/ |
|
| 244 |
const DEFAULT_STREAM_DOMAIN = 'http://dl.stream.qqmusic.qq.com/'; |
|
| 245 |
const MUSIC_FILE_TYPES = { |
|
| 246 |
m4a: { prefix: 'C400', extension: '.m4a' }, |
|
| 247 |
128: { prefix: 'M500', extension: '.mp3' }, |
|
| 248 |
320: { prefix: 'M800', extension: '.mp3' }, |
|
| 249 |
ape: { … |
|
| 1045:33 |
… |
|
| 1046 |
bFinish: true, |
|
| 1047 |
})); |
|
| 1048 |
}; |
|
| 1049 |
const FAVORITE_ASSET_URL = 'https://c.y.qq.com/fav/fcgi-bin/fcg_get_profile_order_asset.fcg'; |
|
| 1050 |
/** `2` selects favourite albums on this CGI; `3` selects favourite playlists. */ |
|
| 1051 |
const FAVOR… |
|
| 1079:17 |
…at: 'json', |
|
| 1080 |
}, |
|
| 1081 |
headers: { |
|
| 1082 |
Referer: 'https://y.qq.com/', |
|
| 1083 |
Cookie: credentialCookieHeader(auth.credential), |
|
| 1084 |
}, |
|
| 1085 |
}); |
|
| 1086 |
const body = dictionaryOf(response.data)… |
|
| 371:68 |
…`, |
|
| 372 |
qimei: '', |
|
| 373 |
qimei36: '', |
|
| 374 |
sdkVersion: '1.2.13.6', |
|
| 375 |
targetSdkVersion: '33', |
|
| 376 |
audit: '', |
|
| 377 |
userId: '{}', |
|
| 378 |
packageId: PACKAGE_ID, |
|
| 379 |
deviceType: 'Phone', |
|
| 380 |
sdkName: '', |
|
| 381 |
reserved: JSON.stringify(reserved), |
|
| 382 |
}; |
|
| 383 |
}; |
|
| 384 |
const buildQimeiRequest = (device, now = new Date()) => { |
|
| 385 |
const cryptKey = randomHex(16); |
|
| 386 |
const no… |
|
| 703:44 |
…path); |
|
| 704 |
const queue = createPacketQueue(socket); |
|
| 705 |
socket.send(buildConnectPacket(`${Date.now()}${randomDigits(4)}`, qrcodeId)); |
|
| 706 |
const connack = parseConnack(await queue.next(20000))… |
|
| 629:48 |
… |
|
| 630 |
waiters.shift()?.reject(terminalError); |
|
| 631 |
}; |
|
| 632 |
socket.on('message', (value) => { |
|
| 633 |
const split = splitPackets(Buffer.concat([buffered, toBuffer(value)])); |
|
| 634 |
buffered = spli… |
|
| 6:409 |
…= void 0; |
|
| 7 |
const node_crypto_1 = __importDefault(require("node:crypto")); |
|
| 8 |
const logger_1 = require("../../util/logger"); |
|
| 9 |
const deviceContext_1 = require("./deviceContext"); |
|
| 10 |
const httpClient_1 = __importDefault(require("./httpClient")); |
|
| 11 |
const wechatLogin_1 = require("./wechatLogin"); |
|
| 12 |
const WebSocketRuntime = require('ws'); |
|
| 13 |
const MUSICU_URL = 'https://u.y.qq.com/cgi-bin/musicu.fcg'; |
|
| 14 |
const QIMEI_URL = 'https://api.tencentmusic.com/tme/trpc/proxy'; |
|
| 15 |
// Public Android client protocol constants, not user credentials. |
|
| 16 |
const QIMEI_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
| 17 |
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEIxgwoutfwoJxcGQeedgP7FG9qaIuS0qzfR8gWkrkTZKM2iWHn2ajQpBRZjMSoSf6+KJGvar2ORhBfpDXyVtZCK… |
|
| 6:409 |
…= void 0; |
|
| 7 |
const node_crypto_1 = __importDefault(require("node:crypto")); |
|
| 8 |
const logger_1 = require("../../util/logger"); |
|
| 9 |
const deviceContext_1 = require("./deviceContext"); |
|
| 10 |
const httpClient_1 = __importDefault(require("./httpClient")); |
|
| 11 |
const wechatLogin_1 = require("./wechatLogin"); |
|
| 12 |
const WebSocketRuntime = require('ws'); |
|
| 13 |
const MUSICU_URL = 'https://u.y.qq.com/cgi-bin/musicu.fcg'; |
|
| 14 |
const QIMEI_URL = 'https://api.tencentmusic.com/tme/trpc/proxy'; |
|
| 15 |
// Public Android client protocol constants, not user credentials. |
|
| 16 |
const QIMEI_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----
|
|
| 17 |
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEIxgwoutfwoJxcGQeedgP7FG9qaIuS0qzfR8gWkrkTZKM2iWHn2ajQpBRZjMSoSf6+KJGvar2ORhBfpDXyVtZCK… |
|
| 401:57 |
…roxy', |
|
| 402 |
appid: 'qimei_qq_android', |
|
| 403 |
sign: md5('qimei_qq_androidpzAuCmaFAaFaHrdakPjLIEqKrGnSOOvH', String(timestamp)), |
|
| 404 |
'user-agent': 'QQMusic', |
|
| 405 |
timestamp: String(timestamp), |
|
| 406 |
}, |
|
| 407 |
body: { |
|
| 408 |
app: 0, |
|
| 409 |
os: 1, |
|
| 410 |
qimeiP… |
|
| 292:10 |
…eturn {}; |
|
| 293 |
try { |
|
| 294 |
return dictionaryOf(JSON.parse(value)); |
|
| 295 |
} |
|
| 296 |
catch { |
|
| 297 |
return {}; |
|
| 298 |
} |
|
| 299 |
}; |
|
| 300 |
const md5 = (...values) => { |
|
| 301 |
const hash = node_crypto_1.default.createHash('md5'); |
|
| 302 |
for (const value of values) |
|
| 303 |
hash.update(value); |
|
| 304 |
return hash.digest('hex'); |
|
| 305 |
}; |
|
| 306 |
const randomHex = (length) => node_crypto_1.default |
|
| 307 |
.randomBytes(Math.ceil(length / 2)) |
|
| 308 |
.toString('hex') |
|
| 309 |
.slice(0, length); |
|
| 310 |
const randomDigits = (length) => { |
|
| 311 |
let… |
|
| 387:18 |
…mp = Math.floor(now.getTime() / 1000); |
|
| 388 |
const encryptedKey = node_crypto_1.default.publicEncrypt({ key: QIMEI_PUBLIC_KEY, padding: node_crypto_1.default.constants.RSA_PKCS1_PADDING }, Buffer.from(cryptKey)); |
|
| 389 |
const cipher = node_crypto_1.default.createCipheriv('aes-128-cbc', Buffer.from(cryptKey), Buffer.from(cryptKey)); |
|
| 390 |
const encryptedPayload = Buffer.concat([ |
|
| 391 |
cipher.update(Buffer.from(JSON.stringify(buildQimeiPayload(device, now)))), |
|
| 392 |
cipher.final(), |
|
| 393 |
]); |
|
| 394 |
const key = encryptedKey.toString('base64'); |
|
| 395 |
const params = encryptedPayload.toString('base64'); |
|
| 396 |
const extra = `{"appKey":"${QIMEI_APP_KEY}"}`; |
|
| 397 |
return { |
|
| 398 |
… |
|
| 387:18 |
…mp = Math.floor(now.getTime() / 1000); |
|
| 388 |
const encryptedKey = node_crypto_1.default.publicEncrypt({ key: QIMEI_PUBLIC_KEY, padding: node_crypto_1.default.constants.RSA_PKCS1_PADDING }, Buffer.from(cryptKey)); |
|
| 389 |
const cipher = node_crypto_1.default.createCipheriv('aes-128-cbc', Buffer.from(cryptKey), Buffer.from(cryptKey)); |
|
| 390 |
const encryptedPayload = Buffer.concat([ |
|
| 391 |
cipher.update(Buffer.from(JSON.stringify(buildQimeiPayload(device, now)))), |
|
| 392 |
cipher.final(), |
|
| 393 |
]); |
|
| 394 |
const key = encryptedKey.toString('base64'); |
|
| 395 |
const params = encryptedPayload.toString('base64'); |
|
| 396 |
const extra = `{"appKey":"${QIMEI_APP_KEY}"}`; |
|
| 397 |
return { |
|
| 398 |
… |
|
| 475:45 |
… integer'); |
|
| 476 |
}; |
|
| 477 |
const encodeUtf8 = (value) => { |
|
| 478 |
const data = Buffer.from(value, 'utf8'); |
|
| 479 |
const size = Buffer.allocUnsafe(2); |
|
| 480 |
size.writeUInt16BE(data.length); |
|
| 481 |
return Buffer.concat([size, data]); |
|
| 482 |
}; |
|
| 483 |
const encodeProperties = (authMethod, properties) => { |
|
| 484 |
const chunks… |
|
| 387:18 |
…mp = Math.floor(now.getTime() / 1000); |
|
| 388 |
const encryptedKey = node_crypto_1.default.publicEncrypt({ key: QIMEI_PUBLIC_KEY, padding: node_crypto_1.default.constants.RSA_PKCS1_PADDING }, Buffer.from(cryptKey)); |
|
| 389 |
const cipher = node_crypto_1.default.createCipheriv('aes-128-cbc', Buffer.from(cryptKey), Buffer.from(cryptKey)); |
|
| 390 |
const encryptedPayload = Buffer.concat([ |
|
| 391 |
cipher.update(Buffer.from(JSON.stringify(buildQimeiPayload(device, now)))), |
|
| 392 |
cipher.final(), |
|
| 393 |
]); |
|
| 394 |
const key = encryptedKey.toString('base64'); |
|
| 395 |
const params = encryptedPayload.toString('base64'); |
|
| 396 |
const extra = `{"appKey":"${QIMEI_APP_KEY}"}`; |
|
| 397 |
return { |
|
| 398 |
… |
|
| 884:35 |
….qrcodeID); |
|
| 885 |
const encoded = stringOf(data.qrcode).split(',').at(-1) ?? ''; |
|
| 886 |
const image = Buffer.from(encoded, 'base64'); |
|
| 887 |
if (!qrcodeId || image.subarray(0, 8).toString('hex') !== '89504e470d0a1a0a') { |
|
| 888 |
throw new Error('CreateQRCode res… |
|
| 314:4 |
… return value; |
|
| 315 |
}; |
|
| 316 |
const randomBeaconId = (now = new Date()) => { |
|
| 317 |
const month = `${now.toISOString().slice(0, 7)}-01`; |
|
| 318 |
const first = randomDigits(6); |
|
| 319 |
const second = randomDigits(9); |
|
| 320 |
const dated = new Set([1, 2, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30, 33, 34, 37, 38]); |
|
| 321 |
const fields = []; |
|
| 322 |
for (let key = 1; key <= 40; key += 1) { |
|
| 323 |
if (dated.has(key)) |
|
| 324 |
fields.push(`k${key}:${month}${first}.${second}`); |
|
| 325 |
else if (key === 3) |
|
| 326 |
fields.push('k3:0000… |
|
| 387:18 |
…mp = Math.floor(now.getTime() / 1000); |
|
| 388 |
const encryptedKey = node_crypto_1.default.publicEncrypt({ key: QIMEI_PUBLIC_KEY, padding: node_crypto_1.default.constants.RSA_PKCS1_PADDING }, Buffer.from(cryptKey)); |
|
| 389 |
const cipher = node_crypto_1.default.createCipheriv('aes-128-cbc', Buffer.from(cryptKey), Buffer.from(cryptKey)); |
|
| 390 |
const encryptedPayload = Buffer.concat([ |
|
| 391 |
cipher.update(Buffer.from(JSON.stringify(buildQimeiPayload(device, now)))), |
|
| 392 |
cipher.final(), |
|
| 393 |
]); |
|
| 394 |
const key = encryptedKey.toString('base64'); |
|
| 395 |
const params = encryptedPayload.toString('base64'); |
|
| 396 |
const extra = `{"appKey":"${QIMEI_APP_KEY}"}`; |
|
| 397 |
return { |
|
| 398 |
… |
|
| 371:68 |
…`, |
|
| 372 |
qimei: '', |
|
| 373 |
qimei36: '', |
|
| 374 |
sdkVersion: '1.2.13.6', |
|
| 375 |
targetSdkVersion: '33', |
|
| 376 |
audit: '', |
|
| 377 |
userId: '{}', |
|
| 378 |
packageId: PACKAGE_ID, |
|
| 379 |
deviceType: 'Phone', |
|
| 380 |
sdkName: '', |
|
| 381 |
reserved: JSON.stringify(reserved), |
|
| 382 |
}; |
|
| 383 |
}; |
|
| 384 |
const buildQimeiRequest = (device, now = new Date()) => { |
|
| 385 |
const cryptKey = randomHex(16); |
|
| 386 |
const no… |
|
Metadata
-
0
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.configureAuthSessionRepository = exports.qrLoginService = exports.createQrLoginService = exports.buildAndroidComm = exports.buil
| 1 |
"use strict"; |
|
| 2 |
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
| 3 |
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
| 4 |
}; |
|
| 5 |
Object.defineProperty(exports, "__esModule", { value: true }); |
|
| 6 |
exports.configureAuthSessionRepository = exports.qrLoginService = exports.createQrLoginService = exports.buildAndroidComm = exports.buil… |
|
| 261:82 |
…y.GetVkey', 'UrlGetVkey', { |
|
| 262 |
// filename ���律是两段识别值:`prefix + songmid + media_mid + extension`。media_mid 缺席时 |
|
| 263 |
// 用 songmid 补�… |
|
| 140:83 |
…entials are not |
|
| 141 |
// repeatedly decrypted and examined on every application launch. |
|
| 142 |
if (rejectedCount > 0 || expiredRemoved) |
|
| 143 |
… |
|
| 1 |
"use strict"; |
|
| 2 |
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
| 3 |
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
| 4 |
}; |
|
| 5 |
Object.defineProperty(exports, "__esModule", { value: true }); |
|
| 6 |
exports.configureAuthSessionRepository = exports.qrLoginService = exports.createQrLoginService = exports.buildAndroidComm = exports.buil… |
|
| 63:28 |
…uthSession; |
|
| 64 |
/** |
|
| 65 |
* Backwards-compatible default for servers that do not opt into persistence. The repository owns |
|
| 66 |
* copies so callers cannot mutate a stored credential through a previously ret… |
|
| 691 |
}); |
|
| 692 |
const redirectPath = (path, reference) => { |
|
| 693 |
const parts = path.replace(/\/$/, '').split('/'); |
|
| 694 |
if (parts.at(-1)?.includes(':')) |
|
| 695 |
par… |
|
| 237:3 |
… |
|
| 238 |
/** |
|
| 239 |
* `music.vkey.GetVkey/UrlGetVkey` answers with `midurlinfo` but an empty `sip`, unlike the legacy |
|
| 240 |
* web `CgiGetVkey`. Without a fallback the … |
|
| 1 |
"use strict"; |
|
| 2 |
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
| 3 |
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
| 4 |
}; |
|
| 5 |
Object.defineProperty(exports, "__esModule", { value: true }); |
|
| 6 |
exports.configureAuthSessionRepository = exports.qrLoginService = exports.createQrLoginService = exports.buildAndroidComm = exports.buil… |
|
20 of 24 traits shown
Identity
| SHA-256 |
f79a94c50b456781b8d29b865bd0cc7fe1a3904d1e685c9ab7fbfac7f57ac70d |
| Filename |
node_modules/@yakult-green-tea/qq-music-api/dist/src/services/auth/qrLogin.js |
Origin
| Source |
x |
| Feed |
aur.archlinux.org |
| Ecosystem |
arch |
Timeline
| First seen |
19 Aug 2026 15:06 UTC |
| First analyzed |
19 Aug 2026 15:08 UTC |
| Last analyzed |
23 Aug 2026 12:59 UTC |
| Last updated |
23 Aug 2026 13:00 UTC |