Files
yikart--aitoearn/demo/xhs/signature.js
T
wehub-resource-sync e6402c600b
Build Backend Images / generate-matrix (push) Waiting to run
Build Backend Images / build-and-push (push) Blocked by required conditions
Build Web Image / build (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:01:53 +08:00

71 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import axios from "axios";
import crypto from "crypto-js"
const appKey = "red.gLvsVoksierVz0uF";
const appSecret = "f13a2266d1e2c32a553cb7a42ea63c48";
let cachedAccessToken = null;
let accessTokenExpiresAt = 0; // 记录 access_token 过期时间
// 生成小红书签名
function generateSignature(appKey, nonce, timeStamp, appSecret) {
const params = {
appKey,
nonce,
timeStamp,
};
const sortedParams = Object.keys(params)
.sort()
.map((key) => `${key}=${params[key]}`)
.join("&");
const stringToSign = sortedParams + appSecret;
console.log(stringToSign);
return crypto.SHA256(stringToSign).toString();
}
// 获取小红书access_token
const getAccessToken = async (nonce, timestamp) => {
if (cachedAccessToken && Date.now() < accessTokenExpiresAt) {
// 如果 access_token 未过期,则直接返回缓存的 token
return cachedAccessToken;
}
const signature = generateSignature(appKey, nonce, timestamp, appSecret);
console.log({
app_key: appKey,
nonce: nonce,
timestamp: timestamp,
signature: signature,
});
try {
const response = await axios.post("https://edith.xiaohongshu.com/api/sns/v1/ext/access/token", {
app_key: appKey,
nonce: nonce,
timestamp: timestamp,
signature: signature,
}, {
headers: {
"Content-Type": "application/json",
},
});
console.log(response.data);
const { access_token, expires_in } = response.data.data;
// 缓存 access_token 和计算过期时间
cachedAccessToken = access_token;
accessTokenExpiresAt = expires_in;
return cachedAccessToken;
} catch (error) {
console.error('请求失败:', error);
throw error; // 处理错误
}
};
const nonce = Math.random().toString(36).substring(2);
const timestamp = Date.now();
const accessToken = await getAccessToken(nonce, timestamp);
const signature = generateSignature(appKey, nonce, timestamp, accessToken);
console.log("appKey", appKey);
console.log("nonce", nonce);
console.log("timestamp", timestamp);
console.log("signature", signature);