nguyenvanduocit
4/17/2016 - 9:56 AM

golang.go

package gohoro

import (
	"strings"
	"fmt"
	"net/http"
	"io/ioutil"
	"regexp"
)

var endpoint string = "http://www.horoscope.com/us/horoscopes/general/horoscope-general-daily-today.aspx";

var SignMap = map[string]int{
	"ARIES":1,
	"TAURUS":2,
	"GEMINI":3,
	"CANCER":4,
	"LEO":5,
	"VIRGO":6,
	"LIBRA":7,
	"SCORPIO":8,
	"SAGITTARIUS":9,
	"CAPRICORN":10,
	"AQUARIUS":11,
	"PISCES":12,
}

func GetSignNameById(signId int) string{
	for name,id := range SignMap{
		if(id == signId){
			return name
		}
	}
	return ""
}

func GetHoroscope(signName string) (string, error) {
	signName = strings.ToUpper(signName)
	signId, ok := SignMap[signName];
	if !ok {
		return "", fmt.Errorf("I don't know anything about this sign.")
	}
	url := fmt.Sprintf("%s?sign=%d", endpoint, signId)
	resp, err := http.Get(url);
	if err != nil {
		return "", fmt.Errorf("Can not get data");
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", fmt.Errorf("Can not read body")
	}
	content := string(body)
	r := regexp.MustCompile("(?s)<div class=\"block-horoscope-text[^>]*\">([^/]*)</div>")
	loginResultSubmatch := r.FindStringSubmatch(content)
	if loginResultSubmatch == nil {
		return "", fmt.Errorf("Can not read data.")
	}
	return strings.TrimSpace(loginResultSubmatch[1]), nil
}