Skip to content
Commits on Source (2)
......@@ -24,7 +24,6 @@ dist-ssr
*.sw?
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
......
// 环境配置
export const environment = {
// API基础地址
API_BASE_URL: 'http://114.132.244.63/token-tushare',
// Tushare服务地址
TUSHARE_API_URL: 'http://114.132.244.63/api-tushare'
}
export default environment;
\ No newline at end of file
......@@ -69,6 +69,7 @@
</span>
<div class="table-cell cell-actions">
<button v-if="token.status === 'locked'" class="unlock-btn" @click="unlockToken(token)">解锁</button>
<button class="issue-btn" @click="issueToken(token)">下发</button>
</div>
</div>
</div>
......@@ -157,6 +158,8 @@ import { useRouter } from 'vue-router'
import { useRoute } from 'vue-router'
import TopNavbar from '../components/TopNavbar.vue'
import SidebarMenu from '../components/SidebarMenu.vue'
import { environment } from '../config/environment'
const route = useRoute()
const isTokenMenuActive = computed(() => route.path === '/')
const isUserMenuActive = computed(() => route.path === '/user-admin')
......@@ -219,7 +222,7 @@ async function addToken() {
else if (newToken.period === '6m') validity_period = 6
else if (newToken.period === '1y') validity_period = 12
try {
const response = await fetch(`${API_BASE_URL}/api/token/create`, {
const response = await fetch(`${environment.API_BASE_URL}/api/token/create`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
......@@ -247,7 +250,20 @@ async function addToken() {
}
async function unlockToken(token) {
try {
const response = await fetch(`${API_BASE_URL}/api/token/unlock`, {
// 1. 先调用tushare服务的解锁接口
const tushareResponse = await fetch(`${environment.TUSHARE_API_URL}/tushare/unlock_token`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: token.value })
})
const tushareRes = await tushareResponse.json()
if (!tushareRes.success) {
alert('tushare服务解锁失败: ' + (tushareRes.msg || '未知错误'))
return
}
// 2. 再调用本地后端解锁接口
const response = await fetch(`${environment.API_BASE_URL}/api/token/unlock`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
......@@ -257,7 +273,24 @@ async function unlockToken(token) {
if (res.success) {
fetchTokens()
} else {
alert(res.message || '解锁失败')
alert(res.message || '本地服务解锁失败')
}
} catch (e) {
alert('网络错误或服务器无响应')
}
}
async function issueToken(token) {
try {
const response = await fetch(`${environment.TUSHARE_API_URL}/tushare/add_token`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: token.value })
})
const res = await response.json()
if (res.success) {
alert('下发成功')
} else {
alert(res.msg || '下发失败')
}
} catch (e) {
alert('网络错误或服务器无响应')
......@@ -370,7 +403,7 @@ async function fetchTokens() {
if (statusFilter.value[0] === 'locked') params.append('is_locked', 'true')
if (statusFilter.value[0] === 'normal') params.append('is_locked', 'false')
}
const response = await fetch(`${API_BASE_URL}/api/token/list?${params.toString()}`, {
const response = await fetch(`${environment.API_BASE_URL}/api/token/list?${params.toString()}`, {
credentials: 'include'
})
const res = await response.json()
......@@ -391,7 +424,6 @@ async function fetchTokens() {
}
}
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL
const loading = ref(false)
onMounted(() => {
......@@ -614,6 +646,20 @@ onBeforeUnmount(() => {
background: #16a34a;
}
.delete-btn { color: #ef4444; }
.issue-btn {
background: #3b82f6;
color: #fff;
border: none;
border-radius: 4px;
padding: 4px 16px;
font-size: 14px;
cursor: pointer;
transition: background 0.2s;
margin-left: 8px;
}
.issue-btn:hover {
background: #2563eb;
}
.table-footer {
display: flex;
......
......@@ -4,6 +4,7 @@ import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
base: '/tushare-web/', // 部署到子路径时必须加上
plugins: [vue()],
resolve: {
alias: {
......
......@@ -3,9 +3,12 @@ from app.service import tushare_funet
from app.services import TokenService
import inspect
from datetime import datetime, timedelta
from app.utils.logger import get_logger
router = APIRouter(prefix="/tushare", tags=["tushare"])
logger = get_logger("tushare_entry")
ALL_TOKENS = {} # key: token_value, value: token_info(完整字典)
TOKEN_IP_MAP = {} # token_value -> {'ip': ip, 'locked_at': datetime or None}
LOCKED_TOKENS = set() # 被锁定的token
......@@ -113,25 +116,39 @@ router.add_api_route("/pro_bar", pro_bar_view, methods=["POST"])
@router.post("")
async def tushare_entry(request: Request):
import time
start_time = time.time()
client_ip = request.client.host
t1 = time.time()
body = await request.json()
t2 = time.time()
token = body.get("token")
ok, msg = check_token(token, client_ip)
t3 = time.time()
if not ok:
logger.info(f"[tushare_entry] token check failed, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s")
return Response(content=msg, status_code=401)
api_name = body.get("api_name")
t4 = time.time()
if not api_name:
logger.info(f"[tushare_entry] api_name missing, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s, api_name: {t4-t3:.4f}s")
return {"success": False, "msg": "api_name 不能为空"}
# 动态分发
if not hasattr(pro, api_name):
logger.info(f"[tushare_entry] api_name not supported, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s, api_name: {t4-t3:.4f}s")
return {"success": False, "msg": f"不支持的api_name: {api_name}"}
method = getattr(pro, api_name)
t5 = time.time()
try:
resp = method(**body)
t6 = time.time()
if hasattr(resp, "status_code") and hasattr(resp, "content"):
logger.info(f"[tushare_entry] finished, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s, api_name: {t4-t3:.4f}s, get_method: {t5-t4:.4f}s, method_call: {t6-t5:.4f}s, response: {time.time()-t6:.4f}s")
return Response(content=resp.content, status_code=resp.status_code, headers=dict(resp.headers), media_type=resp.headers.get("content-type", None))
logger.info(f"[tushare_entry] finished, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s, api_name: {t4-t3:.4f}s, get_method: {t5-t4:.4f}s, method_call: {t6-t5:.4f}s, response: {time.time()-t6:.4f}s")
return resp
except Exception as e:
logger.error(f"[tushare_entry] exception, total: {time.time() - start_time:.4f}s, body: {t2-t1:.4f}s, check_token: {t3-t2:.4f}s, api_name: {t4-t3:.4f}s, get_method: {t5-t4:.4f}s, exception: {str(e)}")
return Response(content=str(e), status_code=500)
@router.post("/unlock_token")
......
fastapi
uvicorn
uvicorn[standard]
pydantic
sqlalchemy
pymysql
requests
pandas
python-dateutil
python-dotenv
\ No newline at end of file
import os
import requests
import pytest
import tushare as ts
import tushare_data as ts1
import pandas as pd
TUSHARE_TOKEN = os.getenv('TS_TOKEN', 'le2937d38d26f5322ae6096286072faf933')
MY_TOKEN = os.getenv('MY_TOKEN', '1ab08efbf57546eab5a62499848c542a')
# tushare官方接口列表(可根据需要补充)
TUSHARE_APIS = [
('stock_basic', {'exchange': '', 'list_status': 'L', 'fields': 'ts_code,symbol,name,area,industry,list_date'}),
# ('daily', {...}),
# ... 其他接口及参数
]
pro = ts.pro_api(TUSHARE_TOKEN)
pro1 = ts1.pro_api(MY_TOKEN)
def compare_result(my_result, tushare_result):
"""
严格对比两个DataFrame的字段、行数、所有单元格的值。
"""
# 字段名对比
assert list(my_result.columns) == list(tushare_result.columns), f"字段不一致: {list(my_result.columns)} vs {list(tushare_result.columns)}"
# 行数对比
assert len(my_result) == len(tushare_result), f"行数不一致: {len(my_result)} vs {len(tushare_result)}"
# 所有值对比(忽略索引和数据类型差异)
pd.testing.assert_frame_equal(
my_result.reset_index(drop=True),
tushare_result.reset_index(drop=True),
check_dtype=False,
check_like=True,
check_exact=False # 允许浮点误差
)
def test_stock_basic():
tushare_result = ts.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
my_result = ts1.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
compare_result(my_result, tushare_result)
\ No newline at end of file
import requests
import pandas as pd
import time
class pro_api:
# def __init__(self, token):
# self.token = token # 实例变量 name
# set_token(token)
def __init__(self, token=None):
if token is not None:
self.token = token # 实例变量,用于内部使用或调试
set_token(token)
else:
self.token = get_token()
if self.token is None:
raise ValueError("请设置token")
else:
pass
def query(self,api_name, fields='', **kwargs):
"""
Fetch stock data from a given URL with specified parameters.
Parameters:
ts_code (str): The stock code to fetch data for.
start_date (str): The start date for fetching data (in 'YYYY-MM-DD HH:MM:SS' format).
end_date (str): The end date for fetching data (in 'YYYY-MM-DD HH:MM:SS' format).
freq (str): The frequency of the data (e.g., '1min', '5min''15min', '30min''60min').
token (str): The access token for the data source. Default is provided.
offset (str, 可选): 数据偏移量,用于分页获取数据,默认为'0'。当需要获取更多数据时,可以增大此值。
freq (str, 可选): 数据频率,指定返回数据的时间间隔,例如'1min'(1分钟)、'5min'(5分钟)、'15min'(15分钟)、
'30min'(30分钟)、'60min'(60分钟,即1小时)等。默认为'60min'
Returns:
pd.DataFrame: A DataFrame containing the fetched stock data.
"""
# url="http://127.0.0.1:9002/tq"
url = "http://114.132.244.63/api-tushare/tushare"
params = {
'token': get_token(),
'api_name': api_name,
'params': kwargs,
'fields': fields,
}
start_time = time.time() # 增加耗时统计开始
response = requests.post(url, json=params)
elapsed = time.time() - start_time # 统计耗时
print(f"[tushare_data.py] query接口耗时: {elapsed:.3f}")
if response.status_code == 200:
try:
data = response.json()
# print('DEBUG tushare_data.py 返回数据:', data) # 新增调试打印
# print(data)
if data == 'token无效或已超期,请重新购买':
return data
else:
df = pd.DataFrame(data)
return df
except ValueError as e:
raise ValueError("数据获取错误",e)
else:
# print(f"Failed to fetch data. Status code: {response.status_code}")
# print(response.text)
raise ValueError("数据获取错误",response.status_code,response.text)
def fund_basic(self, api_name='fund_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stock_basic(self, api_name='stock_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def trade_cal(self, api_name='trade_cal', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def daily(self, api_name='daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def adj_factor(self, api_name='adj_factor', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def daily_basic(self, api_name='daily_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def income(self, api_name='income', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def income_vip(self, api_name='income_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def balancesheet(self, api_name='balancesheet', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def balancesheet_vip(self, api_name='balancesheet_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cashflow(self, api_name='cashflow', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cashflow_vip(self, api_name='cashflow_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def forecast(self, api_name='forecast', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def forecast_vip(self, api_name='forecast_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def express(self, api_name='express', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def express_vip(self, api_name='express_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow_hsgt(self, api_name='moneyflow_hsgt', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hsgt_top10(self, api_name='hsgt_top10', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ggt_top10(self, api_name='ggt_top10', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coinpair(self, api_name='coinpair', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coinlist(self, api_name='coinlist', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coincap(self, api_name='coincap', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def margin(self, api_name='margin', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def margin_detail(self, api_name='margin_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def top10_holders(self, api_name='top10_holders', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def top10_floatholders(self, api_name='top10_floatholders', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coinfees(self, api_name='coinfees', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coinexchanges(self, api_name='coinexchanges', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def jinse(self, api_name='jinse', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def btc8(self, api_name='btc8', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bishijie(self, api_name='bishijie', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def exchange_ann(self, api_name='exchange_ann', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def btc_marketcap(self, api_name='btc_marketcap', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def btc_pricevol(self, api_name='btc_pricevol', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fina_indicator(self, api_name='fina_indicator', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fina_indicator_vip(self, api_name='fina_indicator_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fina_audit(self, api_name='fina_audit', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fina_mainbz(self, api_name='fina_mainbz', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fina_mainbz_vip(self, api_name='fina_mainbz_vip', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def tmt_twincomedetail(self, api_name='tmt_twincomedetail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def tmt_twincome(self, api_name='tmt_twincome', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def exchange_twitter(self, api_name='exchange_twitter', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_basic(self, api_name='index_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_daily(self, api_name='index_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_weight(self, api_name='index_weight', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def namechange(self, api_name='namechange', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def dividend(self, api_name='dividend', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hs_const(self, api_name='hs_const', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def twitter_kol(self, api_name='twitter_kol', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def top_list(self, api_name='top_list', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def top_inst(self, api_name='top_inst', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def pledge_stat(self, api_name='pledge_stat', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def pledge_detail(self, api_name='pledge_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stock_company(self, api_name='stock_company', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bo_monthly(self, api_name='bo_monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bo_weekly(self, api_name='bo_weekly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bo_daily(self, api_name='bo_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bo_cinema(self, api_name='bo_cinema', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_company(self, api_name='fund_company', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_nav(self, api_name='fund_nav', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_div(self, api_name='fund_div', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_portfolio(self, api_name='fund_portfolio', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def new_share(self, api_name='new_share', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def repurchase(self, api_name='repurchase', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def concept(self, api_name='concept', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def concept_detail(self, api_name='concept_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_daily(self, api_name='fund_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_dailybasic(self, api_name='index_dailybasic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_basic(self, api_name='fut_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def trade_cal(self, api_name='trade_cal', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_daily(self, api_name='fut_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_holding(self, api_name='fut_holding', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_wsr(self, api_name='fut_wsr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_settle(self, api_name='fut_settle', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def news(self, api_name='news', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def weekly(self, api_name='weekly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def monthly(self, api_name='monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def shibor(self, api_name='shibor', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def shibor_quote(self, api_name='shibor_quote', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def shibor_lpr(self, api_name='shibor_lpr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def libor(self, api_name='libor', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hibor(self, api_name='hibor', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cctv_news(self, api_name='cctv_news', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def index_daily(self, api_name='index_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def film_record(self, api_name='film_record', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def opt_basic(self, api_name='opt_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def opt_daily(self, api_name='opt_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def share_float(self, api_name='share_float', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def block_trade(self, api_name='block_trade', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def disclosure_date(self, api_name='disclosure_date', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_account(self, api_name='stk_account', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_account_old(self, api_name='stk_account_old', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_holdernumber(self, api_name='stk_holdernumber', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow(self, api_name='moneyflow', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_weekly(self, api_name='index_weekly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_monthly(self, api_name='index_monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def wz_index(self, api_name='wz_index', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def gz_index(self, api_name='gz_index', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_holdertrade(self, api_name='stk_holdertrade', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def anns_d(self, api_name='anns_d', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fx_obasic(self, api_name='fx_obasic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fx_daily(self, api_name='fx_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def teleplay_record(self, api_name='teleplay_record', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_classify(self, api_name='index_classify', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_limit(self, api_name='stk_limit', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_basic(self, api_name='cb_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_issue(self, api_name='cb_issue', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_daily(self, api_name='cb_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hk_hold(self, api_name='hk_hold', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_mapping(self, api_name='fut_mapping', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hk_basic(self, api_name='hk_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hk_daily(self, api_name='hk_daily', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def stk_managers(self, api_name='stk_managers', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_rewards(self, api_name='stk_rewards', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def major_news(self, api_name='major_news', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def ggt_daily(self, api_name='ggt_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ggt_monthly(self, api_name='ggt_monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_adj(self, api_name='fund_adj', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def yc_cb(self, api_name='yc_cb', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ncov_num(self, api_name='ncov_num', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_share(self, api_name='fund_share', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_manager(self, api_name='fund_manager', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_global(self, api_name='index_global', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def idx_factor_pro(self, api_name='idx_factor_pro', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_factor_pro(self, api_name='fund_factor_pro', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ncov_global(self, api_name='ncov_global', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def suspend_d(self, api_name='suspend_d', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def daily_info(self, api_name='daily_info', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_weekly_detail(self, api_name='fut_weekly_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_tycr(self, api_name='us_tycr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_trycr(self, api_name='us_trycr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_tbr(self, api_name='us_tbr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_tltr(self, api_name='us_tltr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_trltr(self, api_name='us_trltr', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cn_gdp(self, api_name='cn_gdp', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cn_cpi(self, api_name='cn_cpi', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def eco_cal(self, api_name='eco_cal', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coin_bar(self, api_name='coin_bar', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cn_m(self, api_name='cn_m', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cn_ppi(self, api_name='cn_ppi', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_price_chg(self, api_name='cb_price_chg', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_share(self, api_name='cb_share', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hk_tradecal(self, api_name='hk_tradecal', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_basic(self, api_name='us_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_tradecal(self, api_name='us_tradecal', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_daily(self, api_name='us_daily', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def bak_daily(self, api_name='bak_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def repo_daily(self, api_name='repo_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def coin_pair(self, api_name='coin_pair', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ths_index(self, api_name='ths_index', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ths_daily(self, api_name='ths_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def dc_index(self, api_name='dc_index', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def dc_member(self, api_name='dc_member', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ths_member(self, api_name='ths_member', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bak_basic(self, api_name='bak_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_sales_ratio(self, api_name='fund_sales_ratio', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fund_sales_vol(self, api_name='fund_sales_vol', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def broker_recommend(self, api_name='broker_recommend', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def sz_daily_info(self, api_name='sz_daily_info', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cb_call(self, api_name='cb_call', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bond_blk(self, api_name='bond_blk', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bond_blk_detail(self, api_name='bond_blk_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ccass_hold_detail(self, api_name='ccass_hold_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_surv(self, api_name='stk_surv', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def sge_basic(self, api_name='sge_basic', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def sge_daily(self, api_name='sge_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def report_rc(self, api_name='report_rc', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cyq_perf(self, api_name='cyq_perf', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cyq_chips(self, api_name='cyq_chips', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ccass_hold(self, api_name='ccass_hold', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_factor(self, api_name='stk_factor', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def limit_list_d(self, api_name='limit_list_d', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stock_mx(self, api_name='stock_mx', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stock_vx(self, api_name='stock_vx', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hk_mins(self, api_name='hk_mins', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def cb_rate(self, api_name='cb_rate', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ci_daily(self, api_name='ci_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def sf_month(self, api_name='sf_month', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hm_list(self, api_name='hm_list', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def hm_detail(self, api_name='hm_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ft_mins(self, api_name='ft_mins', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def realtime_quote(self, api_name='realtime_quote', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def realtime_tick(self, api_name='realtime_tick', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def realtime_list(self, api_name='realtime_list', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ths_hot(self, api_name='ths_hot', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def dc_hot(self, api_name='dc_hot', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bc_otcqt(self, api_name='bc_otcqt', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def bc_bestotcqt(self, api_name='bc_bestotcqt', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def cn_pmi(self, api_name='cn_pmi', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def margin_secs(self, api_name='margin_secs', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def sw_daily(self, api_name='sw_daily', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_factor_pro(self, api_name='stk_factor_pro', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_premarket(self, api_name='stk_premarket', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def slb_len(self, api_name='slb_len', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def slb_sec(self, api_name='slb_sec', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def slb_sec_detail(self, api_name='slb_sec_detail', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def slb_len_mm(self, api_name='slb_len_mm', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def index_member_all(self, api_name='index_member_all', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_weekly_monthly(self, api_name='stk_weekly_monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def fut_weekly_monthly(self, api_name='fut_weekly_monthly', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def us_daily_adj(self, api_name='us_daily_adj', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def hk_daily_adj(self, api_name='hk_daily_adj', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def rt_fut_min(self, api_name='rt_fut_min', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def opt_mins(self, api_name='opt_mins', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def moneyflow_ind_ths(self, api_name='moneyflow_ind_ths', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow_ind_dc(self, api_name='moneyflow_ind_dc', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow_mkt_dc(self, api_name='moneyflow_mkt_dc', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def kpl_list(self, api_name='kpl_list', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow_ths(self, api_name='moneyflow_ths', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def moneyflow_dc(self, api_name='moneyflow_dc', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def kpl_concept(self, api_name='kpl_concept', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def kpl_concept_cons(self, api_name='kpl_concept_cons', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_auction_o(self, api_name='stk_auction_o', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def stk_auction_c(self, api_name='stk_auction_c', **kwargs):
return '此接口为单独权限,和积分没有关系,需要单独购买'
def stk_auction(self, api_name='stk_auction', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def ft_limit(self, api_name='ft_limit', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def irm_qa_sh(self, api_name='irm_qa_sh', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def irm_qa_sz(self, api_name='irm_qa_sz', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def stk_week_month_adj(self, api_name='stk_week_month_adj', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def limit_list_ths(self, api_name='limit_list_ths', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def limit_step(self, api_name='limit_step', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
def limit_cpt_list(self, api_name='limit_cpt_list', **kwargs):
return self.query(token=self.token, api_name=api_name, **kwargs)
import pandas as pd
import os
BK = 'bk'
def set_token(token):
df = pd.DataFrame([token], columns=['token'])
user_home = os.path.expanduser('~')
fp = os.path.join(user_home, 'c_t.csv')
df.to_csv(fp, index=False)
def get_token():
user_home = os.path.expanduser('~')
fp = os.path.join(user_home, 'c_t.csv')
if os.path.exists(fp):
df = pd.read_csv(fp)
return str(df.loc[0]['token'])
else:
print("请设置token")
return None
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)#消除告警
import requests
#
#
def pro_bar(ts_code='', api=None, start_date='', end_date='', freq='D', asset='E',
exchange='',
adj = None,
ma = [],
factors = None,
adjfactor = False,
offset = None,
limit = None,
fields = '',
contract_type = ''):
"""
"""
# url = "http://127.0.0.1:9002/tp"
url = "http://120.53.122.167:9002/tp"
params = {
'token':get_token(),
'ts_code':ts_code,
'api':api,
'start_date':start_date,
'end_date':end_date,
'freq':freq,
'asset':asset,
'exchange':exchange,
'adj' :adj,
'ma' :ma,
"factors" : factors,
"adjfactor" : adjfactor,
"offset" : offset,
"limit" :limit,
"fields" : fields,
"contract_type" : contract_type
}
if 'min' in freq :
return '此接口为单独权限,和积分没有关系,需要单独购买'
else:
response = requests.post(url, json=params,)
if response.status_code == 200:
try:
data = response.json()
# print(data)
if data == 'token无效或已超期,请重新购买':
return data
else:
df = pd.DataFrame(data)
return df
except ValueError as e:
# print("Error parsing JSON response:", e)
# return None
raise ValueError(e)
else:
raise ValueError("数据获取错误",response.status_code,response.text)
\ No newline at end of file