开始搞基系列 - golang获取基金数据

通过接口获取基金列表,基金公司列表,基金净值等数据

接口返回的数据为JavaScript变量,通过上一篇文章的 golang调用javascript来解析数据

基金公司列表:

序号   公司编码      公司名称
1    80163340  安信基金          
2    81052915  安信证券资产        
3    80084302  安信证券          
4    80000226  博时基金          
5    80538609  渤海汇金          
6    80560392  博道基金          
7    80365985  北信瑞丰          
8    80000236  宝盈基金          
9    80560400  博远基金          
10   81102344  百嘉基金管理        

基金列表:

序号   基金代码    拼音缩写             基金名称              基金类型     拼音全称                                            
1    000001  HXCZHH           华夏成长混合            混合型-偏股   HUAXIACHENGZHANGHUNHE                           
2    000002  HXCZHH           华夏成长混合(后端)        混合型-偏股   HUAXIACHENGZHANGHUNHE
3    000003  ZHKZZZQA         中海可转债债券A          债券型-可转债  ZHONGHAIKEZHUANZHAIZHAIQUANA
4    000004  ZHKZZZQC         中海可转债债券C          债券型-可转债  ZHONGHAIKEZHUANZHAIZHAIQUANC
5    000005  JSZQXYDQZQ       嘉实增强信用定期债券        债券型-长债   JIASHIZENGQIANGXINYONGDINGQIZHAIQUAN
6    000006  XBLDLHCZHHA      西部利得量化成长混合A       混合型-偏股   XIBULIDELIANGHUACHENGZHANGHUNHEA
7    000008  JSZZ500ETFLJA    嘉实中证500ETF联接A     指数型-股票   JIASHIZHONGZHENG500ETFLIANJIEA
8    000009  YFDTTLCHBA       易方达天天理财货币A        货币型      YIFANGDATIANTIANLICAIHUOBIA
9    000010  YFDTTLCHBB       易方达天天理财货币B        货币型      YIFANGDATIANTIANLICAIHUOBIB
10   000011  HXDPJXHHA        华夏大盘精选混合A         混合型-偏股   HUAXIADAPANJINGXUANHUNHEA

代码如下:


package main

import (
    "fmt"
    "github.com/fatih/color"
    "github.com/robertkrimen/otto"
    "github.com/rodaine/table"
    "io/ioutil"
    "net/http"
)

func getJsVariable(vm *otto.Otto, name string) interface{} {
    v, err := vm.Get(name)
    if err != nil {
        fmt.Println(err)
        return nil
    }

    obj, _ := v.Export()
    return obj
}

/**
基金列表
*/
func fundList() {
    url := "https://fund.eastmoney.com/js/fundcode_search.js"
    method := "GET"

    client := &http.Client{}
    req, err := http.NewRequest(method, url, nil)

    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    vm := otto.New()
    //js格式,只有一个变量r
    //var r = [["000001","HXCZHH","华夏成长混合","混合型-偏股","HUAXIACHENGZHANGHUNHE"]]
    vm.Run(string(body))

    dataList := getJsVariable(vm, "r")
    fundList := dataList.([][]string)

    headerFmt := color.New(color.FgGreen, color.Underline).SprintfFunc()
    columnFmt := color.New(color.FgYellow, color.CrossedOut).SprintfFunc()

    tbl := table.New("序号", "基金代码", "拼音缩写", "基金名称", "基金类型", "拼音全称")
    tbl.WithHeaderFormatter(headerFmt).WithFirstColumnFormatter(columnFmt)

    for i, fundItem := range fundList {
        if i < 100 {
            tbl.AddRow(i+1, fundItem[0], fundItem[1], fundItem[2], fundItem[3], fundItem[4])
        }
    }

    tbl.Print()
}

/**
基金公司列表
*/
func fundCompanyList() {
    url := "https://fund.eastmoney.com/js/jjjz_gs.js"
    method := "GET"

    client := &http.Client{}
    req, err := http.NewRequest(method, url, nil)

    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    vm := otto.New()
    vm.Run(string(body))
    gs := getJsVariable(vm, "gs")

    gsmap := gs.(map[string]interface{})
    op := gsmap["op"].([][]string)

    headerFmt := color.New(color.FgGreen, color.Underline).SprintfFunc()
    columnFmt := color.New(color.FgYellow, color.CrossedOut).SprintfFunc()

    tbl := table.New("序号", "公司编码", "公司名称")
    tbl.WithHeaderFormatter(headerFmt).WithFirstColumnFormatter(columnFmt)

    for i, companyItem := range op {
        tbl.AddRow(i+1, companyItem[0], companyItem[1])
    }

    tbl.Print()
}

/**
基金净值
*/
func fundWorth(code string) {
    url := fmt.Sprintf("https://fundgz.1234567.com.cn/js/%s.js", code)
    method := "GET"

    client := &http.Client{}
    req, err := http.NewRequest(method, url, nil)

    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    vm := otto.New()
    //jsonpgz({"dwjz":"1.2350","fundcode":"000001","gsz":"1.2333","gszzl":"-0.14","gztime":"2021-11-05 15:00","jzrq":"2021-11-04","name":"华夏成长混合"});
    vm.Set("jsonpgz", func(call otto.FunctionCall) otto.Value {
        return call.Argument(0)
    })

    result, _ := vm.Run(string(body))
    resultExp, _ := result.Export()
    fundSummary := resultExp.(map[string]interface{})
    //map[dwjz:1.2350 fundcode:000001 gsz:1.2333 gszzl:-0.14 gztime:2021-11-05 15:00 jzrq:2021-11-04 name:华夏成长混合]
    fmt.Printf("名称:%v\n", fundSummary["name"])
    fmt.Printf("单位净值:%v\n", fundSummary["dwjz"])
    fmt.Printf("估算值:%v\n", fundSummary["gsz"])
}

/**
基金详情
*/
func fundDetail(code string) {
    url := fmt.Sprintf("https://fund.eastmoney.com/pingzhongdata/%s.js", code)
    method := "GET"

    client := &http.Client{}
    req, err := http.NewRequest(method, url, nil)

    if err != nil {
        fmt.Println(err)
        return
    }
    res, err := client.Do(req)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer res.Body.Close()

    body, err := ioutil.ReadAll(res.Body)
    if err != nil {
        fmt.Println(err)
        return
    }

    vm := otto.New()

    vm.Run(string(body))
    //收益率
    syl_1n := getJsVariable(vm, "syl_1n")
    syl_6y := getJsVariable(vm, "syl_6y")
    syl_3y := getJsVariable(vm, "syl_3y")
    syl_1y := getJsVariable(vm, "syl_1y")
    fmt.Printf("近一年收益率: %v\n", syl_1n)
    fmt.Printf("近6月收益率: %v\n", syl_6y)
    fmt.Printf("近三月收益率: %v\n", syl_3y)
    fmt.Printf("近一月收益率: %v\n", syl_1y)
}

func main() {
    fundCompanyList()
    fundList()
    fundWorth("000001")
    fundDetail("000001")
}


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容