xueqiu WebMCP
Browser tool configuration for xueqiu
Tools (7)
xueqiu_earnings_date()
获取股票预计财报发布日期(公司大事)
Parameters
JavaScript Handler
(params) => {
const args = Object.assign({"next": false, "limit": 10}, params || {});
let data = null;
let __wbContextUrl = globalThis.location?.href || '';
let __wbContextDocument = globalThis.document || null;
const __wbDefault = (value, fallback) => (value === undefined || value === null || value === '' ? fallback : value);
const __wbJoin = (value, separator) => Array.isArray(value) ? value.join(separator) : (value ?? '');
const __wbGet = (value, path) => {
if (!path) return value;
return String(path).split('.').reduce((acc, part) => (acc == null ? undefined : acc[part]), value);
};
const __wbBaseUrl = () => (__wbContextUrl || globalThis.location?.href || 'https://example.com/');
const __wbResolve = (target, base) => {
if (target == null) return '';
const text = String(target);
try {
return /^https?:/i.test(text) ? text : new URL(text, base || __wbBaseUrl()).toString();
} catch (_error) {
return text;
}
};
const __wbFetch = async (target, options) => {
const url = __wbResolve(target, __wbBaseUrl());
const resp = await globalThis.fetch(url, Object.assign({ credentials: 'include' }, options || {}));
if (!resp.ok) {
throw new Error(`HTTP ${resp.status} for ${url}`);
}
const text = await resp.text();
try {
return { url, text, data: JSON.parse(text) };
} catch (_error) {
return { url, text, data: text };
}
};
return (async () => {
{
const __wbResp = await __wbFetch("https://xueqiu.com");
__wbContextUrl = __wbResp.url;
__wbContextDocument = new DOMParser().parseFromString(__wbResp.text, 'text/html');
data = __wbContextDocument;
}
{
const document = __wbContextDocument || globalThis.document;
const location = new URL(__wbBaseUrl());
const window = { document, location };
const fetch = (target, options) => globalThis.fetch(__wbResolve(target, __wbBaseUrl()), Object.assign({ credentials: 'include' }, options || {}));
data = await (((async () => {
const symbol = (((args.symbol)) || '').toUpperCase();
const onlyNext = (args.next);
if (!symbol) throw new Error('Missing argument: symbol');
const resp = await fetch(
`https://stock.xueqiu.com/v5/stock/screener/event/list.json?symbol=${encodeURIComponent(symbol)}&page=1&size=100`,
{ credentials: 'include' }
);
if (!resp.ok) throw new Error('HTTP ' + resp.status + ' Hint: Not logged in?');
const d = await resp.json();
if (!d.data || !d.data.items) throw new Error('获取失败: ' + JSON.stringify(d));
// subtype 2 = 预计财报发布
let items = d.data.items.filter(item => item.subtype === 2);
const now = Date.now();
let results = items.map(item => {
const ts = item.timestamp;
const dateStr = ts ? new Date(ts).toISOString().split('T')[0] : null;
const isFuture = ts && ts > now;
return {
date: dateStr,
report: item.message,
status: isFuture ? '⏳ 未发布' : '✅ 已发布',
_ts: ts,
_future: isFuture
};
});
if (onlyNext) {
const future = results.filter(r => r._future).sort((a, b) => a._ts - b._ts);
results = future.length ? [future[0]] : [];
}
return results;
})())());
}
{
const source = Array.isArray(data) ? data : (data == null ? [] : [data]);
data = source.map((item, index) => ({
"date": item.date,
"report": item.report,
"status": item.status,
}));
}
if (Array.isArray(data)) data = data.slice(0, Number(args.limit) || 0);
return data;
})();
}
xueqiu_feed()
获取雪球首页时间线(关注用户的动态)
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
var page = parseInt(args.page) || 1;
var count = Math.min(parseInt(args.count) || 20, 50);
var resp = await fetch('https://xueqiu.com/v4/statuses/home_timeline.json?page=' + page + '&count=' + count, {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
var strip = function(html) {
return (html || '').replace(/<[^>]+>/g, '').replace(/ /g, ' ').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').trim();
};
var list = d.home_timeline || d.list || [];
var items = list.slice(0, count).map(function(item) {
var user = item.user || {};
return {
id: item.id,
text: strip(item.description).substring(0, 200),
url: 'https://xueqiu.com/' + user.id + '/' + item.id,
author: user.screen_name,
author_id: user.id,
verified: user.verified_description || null,
likes: item.fav_count,
retweets: item.retweet_count,
replies: item.reply_count,
created_at: item.created_at ? new Date(item.created_at).toISOString() : null
};
});
return {page: page, count: items.length, items: items};
};
return run(params || {});
}
xueqiu_hot()
获取雪球热门动态
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
var count = Math.min(parseInt(args.count) || 20, 50);
var resp = await fetch('https://xueqiu.com/statuses/hot/listV3.json?source=hot&page=1', {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
var list = (d.list || []).slice(0, count);
var strip = function(html) {
return (html || '').replace(/<[^>]+>/g, '').replace(/ /g, ' ').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').trim();
};
var items = list.map(function(item, i) {
var user = item.user || {};
return {
rank: i + 1,
id: item.id,
text: strip(item.description).substring(0, 200),
url: 'https://xueqiu.com/' + user.id + '/' + item.id,
author: user.screen_name,
author_id: user.id,
likes: item.fav_count,
retweets: item.retweet_count,
replies: item.reply_count,
created_at: item.created_at ? new Date(item.created_at).toISOString() : null
};
});
return {count: items.length, items: items};
};
return run(params || {});
}
xueqiu_hot_stock()
获取雪球热门股票榜
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
var count = Math.min(parseInt(args.count) || 20, 50);
var type = args.type || '10';
var resp = await fetch('https://stock.xueqiu.com/v5/stock/hot_stock/list.json?size=' + count + '&type=' + type, {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
if (!d.data || !d.data.items) return {error: '获取失败', raw: d};
var items = d.data.items.map(function(s, i) {
return {
rank: i + 1,
symbol: s.symbol,
name: s.name,
price: s.current,
changePercent: s.percent != null ? s.percent.toFixed(2) + '%' : null,
heat: s.value,
rank_change: s.rank_change,
url: 'https://xueqiu.com/S/' + s.symbol
};
});
return {type: type === '12' ? '关注榜' : '人气榜', count: items.length, items: items};
};
return run(params || {});
}
xueqiu_search()
搜索雪球股票(代码或名称)
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
if (!args.query) return {error: 'Missing argument: query'};
var count = Math.min(parseInt(args.count) || 10, 20);
var resp = await fetch('https://xueqiu.com/stock/search.json?code=' + encodeURIComponent(args.query) + '&size=' + count, {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
var stocks = (d.stocks || []).map(function(s) {
var symbol = '';
if (s.exchange === 'SH' || s.exchange === 'SZ' || s.exchange === 'BJ') {
symbol = s.code.startsWith(s.exchange) ? s.code : s.exchange + s.code;
} else {
symbol = s.code;
}
return {
symbol: symbol,
name: s.name,
exchange: s.exchange,
price: s.current,
changePercent: s.percentage != null ? s.percentage.toFixed(2) + '%' : null,
url: 'https://xueqiu.com/S/' + symbol
};
});
return {keyword: args.query, count: stocks.length, results: stocks};
};
return run(params || {});
}
xueqiu_stock()
获取雪球股票实时行情
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
if (!args.symbol) return {error: 'Missing argument: symbol', hint: '请输入股票代码,如 SH600519'};
var symbol = args.symbol.toUpperCase();
var resp = await fetch('https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=' + encodeURIComponent(symbol), {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
if (!d.data || !d.data.items || d.data.items.length === 0) return {error: '未找到股票: ' + symbol};
function fmtAmount(v) {
if (v == null) return null;
if (Math.abs(v) >= 1e12) return (v / 1e12).toFixed(2) + '万亿';
if (Math.abs(v) >= 1e8) return (v / 1e8).toFixed(2) + '亿';
if (Math.abs(v) >= 1e4) return (v / 1e4).toFixed(2) + '万';
return v.toString();
}
var item = d.data.items[0];
var q = item.quote || {};
var m = item.market || {};
return {
name: q.name,
symbol: q.symbol,
exchange: q.exchange,
currency: q.currency,
price: q.current,
change: q.chg,
changePercent: q.percent != null ? q.percent.toFixed(2) + '%' : null,
open: q.open,
high: q.high,
low: q.low,
prevClose: q.last_close,
amplitude: q.amplitude != null ? q.amplitude.toFixed(2) + '%' : null,
volume: q.volume,
amount: fmtAmount(q.amount),
turnover_rate: q.turnover_rate != null ? q.turnover_rate.toFixed(2) + '%' : null,
marketCap: fmtAmount(q.market_capital),
floatMarketCap: fmtAmount(q.float_market_capital),
ytdPercent: q.current_year_percent != null ? q.current_year_percent.toFixed(2) + '%' : null,
market_status: m.status || null,
time: q.timestamp ? new Date(q.timestamp).toISOString() : null,
url: 'https://xueqiu.com/S/' + q.symbol
};
};
return run(params || {});
}
xueqiu_watchlist()
获取雪球自选股列表
Parameters
JavaScript Handler
(params) => {
const run = async function(args) {
var category = parseInt(args.category) || 1;
var resp = await fetch('https://stock.xueqiu.com/v5/stock/portfolio/stock/list.json?size=100&category=' + category + '&pid=-1', {credentials: 'include'});
if (!resp.ok) return {error: 'HTTP ' + resp.status, hint: 'Not logged in?'};
var d = await resp.json();
if (!d.data || !d.data.stocks) return {error: '获取失败,可能未登录', raw: d};
var items = d.data.stocks.map(function(s) {
return {
symbol: s.symbol,
name: s.name,
price: s.current,
change: s.chg,
changePercent: s.percent != null ? s.percent.toFixed(2) + '%' : null,
volume: s.volume,
url: 'https://xueqiu.com/S/' + s.symbol
};
});
var labels = {1: '自选股', 2: '持仓', 3: '关注'};
return {category: labels[category] || category, count: items.length, items: items};
};
return run(params || {});
}
🔌 Chrome MCP Server Extension
Use these tools with Claude, ChatGPT, and other AI assistants.
How to Use WebMCP
WebMCP tools are designed for browser extensions or automation frameworks. The browser extension matches the current URL against the pattern and executes the JavaScript handler when the tool is invoked.
API Endpoint:
GET /api/webmcp/match?url=https://www.xueqiu.com/...