From 12406d4f45293c6d272e957b32dd049613966098 Mon Sep 17 00:00:00 2001 From: Peter Stenger Date: Tue, 16 Jan 2018 16:29:06 -0500 Subject: [PATCH 1/3] save --- coinmarketcap.go | 42 ++++++++++++++++++++++++++++++++++++++++++ types.go | 11 +++++++++++ 2 files changed, 53 insertions(+) mode change 100755 => 100644 coinmarketcap.go mode change 100755 => 100644 types.go diff --git a/coinmarketcap.go b/coinmarketcap.go old mode 100755 new mode 100644 index 88fdf13..047b641 --- a/coinmarketcap.go +++ b/coinmarketcap.go @@ -4,8 +4,11 @@ package coinmarketcap import ( "encoding/json" "fmt" + "github.com/anaskhan96/soup" "io/ioutil" "net/http" + "strconv" + "strings" ) var ( @@ -117,3 +120,42 @@ func makeReq(url string) ([]byte, error) { return resp, err } + +// Helper Function for CoinMarkets +func toInt(raw_int string) int { + parsed, _ := strconv.Atoi(strings.Replace(strings.Replace(raw_int, "$", "", -1), ",", "", -1)) + return parsed +} + +// Helper Function for CoinMarkets +func toFloat(raw_float string) float64 { + parsed, _ := strconv.ParseFloat(strings.Replace(strings.Replace(strings.Replace(raw_float, "$", "", -1), ",", "", -1), "%", "", -1), 64) + return parsed +} + +// Get market data for a coin name. +func CoinMarkets(coin string) ([]Market, error) { + url := fmt.Sprintf("https://coinmarketcap.com/currencies/%s/#markets", coin) + var markets []Market + response, err := soup.Get(url) + if err != nil { + return nil, err + } + rows := soup.HTMLParse(response).Find("table", "id", "markets-table").Find("tbody").FindAll("tr") + for _, row := range rows { + var data []string + for colNum, column := range row.FindAll("td") { + for _, link := range column.FindAll("a") { + data = append(data, strings.TrimSpace(link.Text())) + } + if colNum == 0 || colNum == 5 || colNum == 6 { + data = append(data, column.Text()) + } + for _, span := range column.FindAll("span") { + data = append(data, strings.TrimSpace(span.Text())) + } + } + markets = append(markets, Market{Rank: toInt(data[0]), Exchange: data[1], Pair: data[2], Volume: toInt(data[3]), Price: toFloat(data[4]), PercentVolume: toFloat(data[5]), Updated: (data[6] == "Recently")}) + } + return markets, nil +} diff --git a/types.go b/types.go old mode 100755 new mode 100644 index 91b5508..fda381b --- a/types.go +++ b/types.go @@ -35,3 +35,14 @@ type CoinGraph struct { PriceUsd [][]float64 `json:"price_usd"` VolumeUsd [][]float64 `json:"volume_usd"` } + +//CoinMarkets struct +type Market struct { + Rank int + Exchange string + Pair string + Volume int + Price float64 + PercentVolume float64 + Updated bool +} From 5b2924877177d40194702153a6a218252d9ef66c Mon Sep 17 00:00:00 2001 From: Peter Stenger Date: Tue, 16 Jan 2018 16:34:36 -0500 Subject: [PATCH 2/3] Update README.md --- README.md | 61 ++++++------------------------------------------------- 1 file changed, 6 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 1dc3a28..09079f1 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # go-coinmarketcap # coinmarketcap --- - import "github.com/miguelmota/go-coinmarketcap" -Coin Market Cap API in golang + import "github.com/reteps/go-coinmarketcap" + +Coin Market Cap API + Scraper in golang ## Usage @@ -86,61 +86,12 @@ GlobalMarketData struct func GetMarketData() (GlobalMarketData, error) ``` -# Examples +#### func CoinMarkets ```go -package main - -import ( - "fmt" - "log" - "time" - - coinApi "github.com/miguelmota/go-coinmarketcap" -) - -func main() { - // Get global market data - marketInfo, err := coinApi.GetMarketData() - if err != nil { - log.Println(err) - } else { - fmt.Println(marketInfo) - } - - // Get info about coin - coinInfo, err := coinApi.GetCoinData("ethereum") - if err != nil { - log.Println(err) - } else { - fmt.Println(coinInfo) - - } - // Get top 10 coins - top10, err := coinApi.GetAllCoinData(10) - if err != nil { - log.Println(err) - } else { - fmt.Println(top10) - } - - var threeMonths int64 = (60 * 60 * 24 * 90) - now := time.Now() - secs := now.Unix() - start := secs - threeMonths - end := secs - - // Get graph data for coin - coinGraphData, err := coinApi.GetCoinGraphData("ethereum", start, end) - if err != nil { - log.Println(err) - } else { - fmt.Println(coinGraphData) - } - -} +func CoinMarkets(coin string) ([]Markets, error) ``` # License -MIT \ No newline at end of file +MIT From 4d1cb0f2f2eff0d2641bee9d77a612e0df0f90de Mon Sep 17 00:00:00 2001 From: Miguel Mota Date: Wed, 17 Jan 2018 17:29:10 -0800 Subject: [PATCH 3/3] coin markets --- README.md | 94 +++++-------------------------------------- coinmarketcap.go | 71 ++++++++++++++++---------------- coinmarketcap_test.go | 39 ++++++++++++++++++ 3 files changed, 85 insertions(+), 119 deletions(-) create mode 100644 coinmarketcap_test.go diff --git a/README.md b/README.md index 09079f1..a994027 100755 --- a/README.md +++ b/README.md @@ -1,97 +1,23 @@ # go-coinmarketcap -# coinmarketcap +> [CoinMarketCap](https://coinmarketcap.com/) client for Golang. - import "github.com/reteps/go-coinmarketcap" +[![License](http://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/miguelmota/go-coinmarketcap/master/LICENSE.md) [![Go Report Card](https://goreportcard.com/badge/github.com/miguelmota/go-coinmarketcap?)](https://goreportcard.com/report/github.com/miguelmota/go-coinmarketcap) [![GoDoc](https://godoc.org/github.com/miguelmota/go-coinmarketcap?status.svg)](https://godoc.org/github.com/miguelmota/go-coinmarketcap) -Coin Market Cap API + Scraper in golang +## Documentation -## Usage +[https://godoc.org/github.com/miguelmota/go-coinmarketcap](https://godoc.org/github.com/miguelmota/go-coinmarketcap) -#### func GetAllCoinData +## Install -```go -func GetAllCoinData(limit int) (map[string]Coin, error) +```bash +go get -u github.com/miguelmota/go-coinmarketcap ``` -Get information about all coins listed in Coin Market Cap. -#### type Coin +## Examples -```go -type Coin struct { - ID string `json:"id"` - Name string `json:"name"` - Symbol string `json:"symbol"` - Rank int `json:"rank,string"` - PriceUsd float64 `json:"price_usd,string"` - PriceBtc float64 `json:"price_btc,string"` - Usd24hVolume float64 `json:"24h_volume_usd,string"` - MarketCapUsd float64 `json:"market_cap_usd,string"` - AvailableSupply float64 `json:"available_supply,string"` - TotalSupply float64 `json:"total_supply,string"` - PercentChange1h float64 `json:"percent_change_1h,string"` - PercentChange24h float64 `json:"percent_change_24h,string"` - PercentChange7d float64 `json:"percent_change_7d,string"` - LastUpdated string `json:"last_updated"` -} -``` - -Coin struct - -#### func GetCoinData - -```go -func GetCoinData(coin string) (Coin, error) -``` -Get information about a crypto currency. - -#### type CoinGraph - -```go -type CoinGraph struct { - MarketCapByAvailableAupply [][]float64 `json:"market_cap_by_available_supply"` - PriceBtc [][]float64 `json:"price_btc"` - PriceUsd [][]float64 `json:"price_usd"` - VolumeUsd [][]float64 `json:"volume_usd"` -} -``` - -CoinGraph struct - -#### func GetCoinGraphData - -```go -func GetCoinGraphData(coin string, start int64, end int64) (CoinGraph, error) -``` -Get graph data points for a crypto currency. - -#### type GlobalMarketData - -```go -type GlobalMarketData struct { - TotalMarketCapUsd float64 `json:"total_market_cap_usd"` - Total24hVolumeUsd float64 `json:"total_24h_volume_usd"` - BitcoinPercentageOfMarketCap float64 `json:"bitcoin_percentage_of_market_cap"` - ActiveCurrencies int `json:"active_currencies"` - ActiveAssets int `json:"active_assets"` - ActiveMarkets int `json:"active_markets"` -} -``` - -GlobalMarketData struct - -#### func GetMarketData - -```go -func GetMarketData() (GlobalMarketData, error) -``` - -#### func CoinMarkets - -```go -func CoinMarkets(coin string) ([]Markets, error) -``` +Check out the [`./example`](./example) folder. -# License +## License MIT diff --git a/coinmarketcap.go b/coinmarketcap.go index 8563413..b54dd93 100644 --- a/coinmarketcap.go +++ b/coinmarketcap.go @@ -1,14 +1,15 @@ -// Coin Market Cap API in golang +// Coin Market Cap API fo golang package coinmarketcap import ( "encoding/json" "fmt" - "github.com/anaskhan96/soup" "io/ioutil" "net/http" "strconv" "strings" + + "github.com/anaskhan96/soup" ) var ( @@ -17,7 +18,7 @@ var ( url string ) -// Get information about the global market data of the cryptocurrencies. +// GetMarketData get information about the global market data of the cryptocurrencies func GetMarketData() (GlobalMarketData, error) { url = fmt.Sprintf(baseUrl + "/global/") @@ -32,7 +33,7 @@ func GetMarketData() (GlobalMarketData, error) { return data, nil } -// Get information about a crypto currency. +// GetCoinData get information about a crypto currency func GetCoinData(coin string) (Coin, error) { url = fmt.Sprintf("%s/ticker/%s", baseUrl, coin) resp, err := makeReq(url) @@ -48,7 +49,7 @@ func GetCoinData(coin string) (Coin, error) { return data[0], nil } -// Get information about all coins listed in Coin Market Cap. +// GetAllCoinData get information about all coins listed in Coin Market Cap func GetAllCoinData(limit int) (map[string]Coin, error) { var l string if limit >= 0 { @@ -72,7 +73,7 @@ func GetAllCoinData(limit int) (map[string]Coin, error) { return allCoins, nil } -// Get graph data points for a crypto currency. +// GetCoinGraphData get graph data points for a crypto currency func GetCoinGraphData(coin string, start int64, end int64) (CoinGraph, error) { url = fmt.Sprintf("%s/%s/%d/%d", graphUrl, coin, start*1000, end*1000) resp, err := makeReq(url) @@ -88,6 +89,33 @@ func GetCoinGraphData(coin string, start int64, end int64) (CoinGraph, error) { return data, nil } +// CoinMarkets get market data for a coin name. +func CoinMarkets(coin string) ([]Market, error) { + url := fmt.Sprintf("https://coinmarketcap.com/currencies/%s/#markets", coin) + var markets []Market + response, err := soup.Get(url) + if err != nil { + return nil, err + } + rows := soup.HTMLParse(response).Find("table", "id", "markets-table").Find("tbody").FindAll("tr") + for _, row := range rows { + var data []string + for colNum, column := range row.FindAll("td") { + for _, link := range column.FindAll("a") { + data = append(data, strings.TrimSpace(link.Text())) + } + if colNum == 0 || colNum == 5 || colNum == 6 { + data = append(data, column.Text()) + } + for _, span := range column.FindAll("span") { + data = append(data, strings.TrimSpace(span.Text())) + } + } + markets = append(markets, Market{Rank: toInt(data[0]), Exchange: data[1], Pair: data[2], Volume: toInt(data[3]), Price: toFloat(data[4]), PercentVolume: toFloat(data[5]), Updated: (data[6] == "Recently")}) + } + return markets, nil +} + // HTTP Client func doReq(req *http.Request) ([]byte, error) { client := &http.Client{} @@ -121,41 +149,14 @@ func makeReq(url string) ([]byte, error) { return resp, err } -// Helper Function for CoinMarkets +// helper Function for CoinMarkets func toInt(raw_int string) int { parsed, _ := strconv.Atoi(strings.Replace(strings.Replace(raw_int, "$", "", -1), ",", "", -1)) return parsed } -// Helper Function for CoinMarkets +// helper Function for CoinMarkets func toFloat(raw_float string) float64 { parsed, _ := strconv.ParseFloat(strings.Replace(strings.Replace(strings.Replace(raw_float, "$", "", -1), ",", "", -1), "%", "", -1), 64) return parsed } - -// Get market data for a coin name. -func CoinMarkets(coin string) ([]Market, error) { - url := fmt.Sprintf("https://coinmarketcap.com/currencies/%s/#markets", coin) - var markets []Market - response, err := soup.Get(url) - if err != nil { - return nil, err - } - rows := soup.HTMLParse(response).Find("table", "id", "markets-table").Find("tbody").FindAll("tr") - for _, row := range rows { - var data []string - for colNum, column := range row.FindAll("td") { - for _, link := range column.FindAll("a") { - data = append(data, strings.TrimSpace(link.Text())) - } - if colNum == 0 || colNum == 5 || colNum == 6 { - data = append(data, column.Text()) - } - for _, span := range column.FindAll("span") { - data = append(data, strings.TrimSpace(span.Text())) - } - } - markets = append(markets, Market{Rank: toInt(data[0]), Exchange: data[1], Pair: data[2], Volume: toInt(data[3]), Price: toFloat(data[4]), PercentVolume: toFloat(data[5]), Updated: (data[6] == "Recently")}) - } - return markets, nil -} diff --git a/coinmarketcap_test.go b/coinmarketcap_test.go new file mode 100644 index 0000000..df31fd9 --- /dev/null +++ b/coinmarketcap_test.go @@ -0,0 +1,39 @@ +package coinmarketcap + +import "testing" + +func TestGetMarketData(t *testing.T) { + +} + +func TestGetCoinData(t *testing.T) { + +} + +func TestGetAllCoinData(t *testing.T) { + +} + +func TestGetCoinGraphData(t *testing.T) { + +} + +func TestCoinMarkets(t *testing.T) { + +} + +func TestDoReq(t *testing.T) { + +} + +func TestMakeReq(t *testing.T) { + +} + +func TestToInt(t *testing.T) { + +} + +func TestToFloat(t *testing.T) { + +}