目錄
- 天天基金API
- 新增專案依賴項
- 請求 API 資料
- 獲取所有基金程式碼
- 獲取基金淨值資訊
- 功能測試
- 參考連結
天天基金API
常見的 API 如下:
- 所有基金程式碼:http://fund.eastmoney.com/js/fundcode_search.js
- 基金詳細資訊:http://fund.eastmoney.com/pingzhongdata/001186.js
- 基金實時資訊:http://fundgz.1234567.com.cn/js/001186.js
- 所有基金公司:http://fund.eastmoney.com/js/jjjz_gs.js
本文用到的API主要是前面兩個,其中001186是要查詢的基金程式碼,介面返回的資料是一個js檔案。
常規方法解析js檔案裡面的資料會比較繁瑣,所以本文使用 Jint 庫來解析資料,應該算全網首創的方法了。
新增專案依賴項
使用 NuGet 安裝 RestSharp、Jint 庫,用途如下
- RestSharp:用於傳送HTTP請求
- Jint:用於解析js檔案
請求 API 資料
使用 RestSharp 庫請求API,方法如下
using RestSharp;
public static string GetFundAPIData(string url)
{
var client = new RestClient();
var request = new RestRequest(url, Method.Get);
var response = client.Execute(request);
if (response.IsSuccessful)
{
return response.Content?? string.Empty;
}
else
{
throw new Exception($"Failed to fetch data from the API: {response.ErrorMessage}");
}
}
獲取所有基金程式碼
介面返回的資料比較長,大致結構如下:
var r = [["000001","HXCZHH","華夏成長混合","混合型-靈活","HUAXIACHENGZHANGHUNHE"],["000002","HXCZHH","華夏成長混合(後端)","混合型-靈活","HUAXIACHENGZHANGHUNHE"]];
定義一個 FundInfo 類來儲存基金資訊:
public class FundInfo
{
public string Code { get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
呼叫上面的請求API方法獲取介面資料,並呼叫下面的方法解析資料:
public static List<FundInfo> ParseFundList(string js)
{
var fundList =new List<FundInfo>();
// 初始化 Jint 引擎
Engine engine = new Engine();
// 執行 JavaScript 程式碼
var result = engine.Execute(js).GetValue("r");
// 確保結果是 JavaScript 陣列
if (result.IsArray())
{
var jsArray = result.AsArray();
// 將 JavaScript 陣列轉換為 C# List<List<string>> 型別
var clrList = new List<List<string>>();
foreach (var item in jsArray)
{
var sublist = new List<string>();
foreach (var subitem in item.AsArray())
{
sublist.Add(subitem.ToString());
}
clrList.Add(sublist);
}
fundList = clrList.Select(x => new FundInfo { Code = x[0], Name = x[2], Type = x[3] }).ToList();
return fundList;
}
else
{
throw new InvalidOperationException("Expected an array but got something else.");
}
}
呼叫上面的方法獲取結果:
// 獲取所有基金程式碼
var js=GetFundAPIData("http://fund.eastmoney.com/js/fundcode_search.js");
var list = ParseFundList(js);
獲取基金淨值資訊
介面返回的資料比較長,分析的時候可以使用Javascript格式化線上工具處理一下,我們需要解析的資料如下:
var Data_netWorthTrend = [{
"x": 1430841600000,
"y": 1.0,
"equityReturn": 0,
"unitMoney": ""
}, {
"x": 1431014400000,
"y": 1.004,
"equityReturn": 0,
"unitMoney": ""
}];
定義一個 NetWorthTrendItem 類存放基金淨值資訊:
public class NetWorthTrendItem
{
public DateTime Time { get; set; } // 時間戳
public decimal Value { get; set; } // 淨值
public decimal EquityReturn { get; set; } // 漲跌幅
public string UnitMoney { get; set; } // 每份派送金
}
直接從 Jint 獲取 JavaScript 陣列,並將其轉換為 C# 物件:
public static List<NetWorthTrendItem> GetFundValues(string js)
{
var engine = new Engine();
// 定義 JavaScript 變數
engine.Execute(js);
// 獲取 JavaScript 陣列
var jsArray = engine.GetValue("Data_netWorthTrend");
// 將 JavaScript 陣列轉換為 C# 列表
var netWorthTrendItems = ConvertJsArrayToCSharpList(jsArray);
return netWorthTrendItems;
}
private static List<NetWorthTrendItem> ConvertJsArrayToCSharpList(JsValue jsArray)
{
var array = jsArray.AsArray();
var list = new List<NetWorthTrendItem>();
for (int i = 0; i < array.Length; i++)
{
var item = array.Get(i);
var newItem = new NetWorthTrendItem
{
Time = DateTimeOffset.FromUnixTimeMilliseconds((long)item.Get("x").AsNumber()).UtcDateTime.ToLocalTime(),
Value = (decimal)item.Get("y").AsNumber(),
EquityReturn = (decimal)item.Get("equityReturn").AsNumber(),
UnitMoney = item.Get("unitMoney").AsString()
};
list.Add(newItem);
}
return list;
}
功能測試
測試程式碼如下:
static void Main()
{
var js1=GetFundAPIData("http://fund.eastmoney.com/js/fundcode_search.js");
var list1 = ParseFundList(js1);
Console.WriteLine(JsonSerializer.Serialize(list1.Last(), new JsonSerializerOptions()
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
}));
var js2=GetFundAPIData("http://fund.eastmoney.com/pingzhongdata/001186.js");
var list2 = GetFundValues(js2);
Console.WriteLine(JsonSerializer.Serialize(list2.Last()));
Console.ReadLine();
}
測試結果如下:
{"Code":"970214","Name":"中信建投悅享6個月持有期債券C","Type":"債券型-混合一級"}
{"Time":"2024-10-15T00:00:00+08:00","Value":2.269,"EquityReturn":-1.6,"UnitMoney":""}
實際使用時可以把基金淨值介面地址裡面基金程式碼單獨提取出來,這裡只是為了演示方法就不做太多封裝。
參考連結
- 天天基金網資料介面