package main

import (
	"errors"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"regexp"
	"strconv"
	"strings"
	"time"
)

const (
	pagerduty_cookie=`pd_referrer=_none_; pd_last_referrer=_none_; pd_first_page=https%3A%2F%2Fwww.pagerduty.com%2Fintegrations%2F; ft_utm_campaign=_none_; ft_utm_content=_none_; ft_utm_medium=_none_; ft_utm_source=_none_; ft_utm_term=_none_; lt_utm_term=_none_; pd_first_visit=1673947001; lt_utm_campaign=_none_; lt_utm_content=_none_; lt_utm_medium=_none_; lt_utm_source=_none_; _mkto_trk=id:093-VPJ-807&token:_mch-pagerduty.com-1673947002159-55613; _ce.s=v~e15638601e253524d8da8e46662736fbd0e5fa79~vpv~0~v11.rlc~1673947011523; pd_last_page=https%3A%2F%2Fwww.pagerduty.com%2Fintegrations%2Faws%2F; pd_last_visit=1673947092; _uetvid=06071f60a9a411ecb25d5368e3da8a84; _ga=GA1.2.1783383838.1671771431; _ga_3YMQ5CE37B=GS1.1.1674097498.2.0.1674097498.60.0.0; ajs_anonymous_id=be818852-356c-4c20-9921-8284d275fced; frontendMigration=incident-detail; fs_uid=#PGK2A#5276985186045952:6726775999574016:::#cb189fdc#/1716360652; _gid=GA1.2.1220348156.1687843867; _gcl_au=1.1.316734999.1687844480; ajs_user_id=PS42YB9; ajs_group_id=POWZ9WN; remember_user_token=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaGJDRnNHYVFPWEFMQkpJaGxLZVhsNVlYQlVWWGwzWVVKNWVHbzBXVVpyUVFZNkJrVkdTU0lYTVRZNE56a3hPVGd5TUM0eE1ESTFNRFExQmpzQVJnPT0iLCJleHAiOiIyMDIzLTA5LTI2VDAyOjM3OjAwWiIsInB1ciI6bnVsbH19--ba1edd11599b974fe016b3484fc39b6b4648580b; pd_subdomains=eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaGJCa2tpREhCcGJtZGpZWEFHT2daRlZBPT0iLCJleHAiOiIyMDQzLTA2LTI4VDAyOjM3OjAwWiIsInB1ciI6bnVsbH19--c12e79337af2cf37e5a86fab4502435bf3d11592; _gat=1; OptanonAlertBoxClosed=2023-06-28T13:44:35.894Z; OptanonConsent=isGpcEnabled=0&datestamp=Wed+Jun+28+2023+21%3A44%3A35+GMT%2B0800+(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)&version=202305.1.0&isIABGlobal=false&hosts=&consentId=35f653d5-8a86-4cd4-8d27-b633eae493ea&interactionCount=1&landingPath=NotLandingPage&groups=C0001%3A1%2CC0002%3A1%2CC0003%3A1%2CC0004%3A1&AwaitingReconsent=false&browserGpcFlag=0; _pd_authentication=eyJraWQiOiJlMDNhMDBmYiIsImFsZyI6IkhTNTEyIn0.eyJ1c2VyX2lkIjoiUFM0MllCOSIsImFjY291bnRfaWQiOiJQT1daOVdOIiwicmVnaW9uIjoiVW5pdGVkU3RhdGVzIiwic3ViZG9tYWluIjoicGluZ2NhcCIsImV4cCI6MTY4Nzk2MzUwMiwiYXV0aF90eXBlIjoic2lsZW50X2F1dGgifQ.9xnE1-LRGsvVtkHKhzX9IFWfD1x9meVCpiWRNO7XgFWs4yVldhA_U87vVy8z9wJHGR19cKhcpv85-eK9XNYC0Q; _pagerduty_session=d2eR26kKmulJljey4A%2FD9dQ6OLOftw0MEi6AYAXMs%2FhMwEQ%2Bl%2FtmvoePWTdryGvxrzNXDZ9lRXDyuNVfXJaGyQXJMSbupzU8fvpTGVIoDYoLk5W7gsatjj7G8D4KU0XQnYmlNV9TLDu5WNcT18rT75lDgQOtaXH98RuWXUJI9p9LWSnVGyplmsIuiih1sE6izpTvrr2X0Jj6laTJETiXvm4eLf0QWJQRd35q6HwwbWCDQY1oAnj7qmOMmdSovJqezXylVy5x2gzlIxDcx1kDVO20loe9zAtE7C86hrXYffY2cK1rqYcKiI4jIxzd%2FY%2BDM1YuNI77ciiaFv%2Fxzn7bVTgwBk2f--SmaC%2Fp11r4pvBf4a--oI09MhF8ZofqGQh1JObBnA%3D%3D; _dd_s=rum=1&id=dbd678b7-235a-458b-8ff1-4dc2083c936e&created=1687959869225&expire=1687960825986`
)


func main(){
	Http_cycle(20)
}


//循环执行,xnum 为循环次数
func Http_cycle(xnum int){
	os.Remove("pagerduty.txt")
	pagerdutystr:=""

	for i:=0;i<xnum;i++{
		url:=`https://pingcap.pagerduty.com/api/v1/incidents?limit=100&offset=` + strconv.Itoa(i*100) + `&user_ids=&statuses[]=resolved&date_range=all&include[]=privileges&include[]=priorities&exclude[]=subscriber_requests&sort_by=created_at:desc&with_suppressed=true`
		resbody,err:=Http_Get_res(url)
		if err!=nil{
			fmt.Println(err)
		}
		//fmt.Println(resbody)

		//1、正则标题
		title_str,terr:=Regexstr(`"title":"[^"]+"`,resbody)
		if terr!=nil{
			fmt.Println(terr)
			return
		}
		if len(title_str)!=100{
			fmt.Println("title is not 100")
			return
		}



		//2、正则紧急程度
		urgency_str,uerr:=Regexstr(`"urgency":"[a-zA-Z]+"`,resbody)
			if uerr!=nil{
			fmt.Println(uerr)
			return
		}
		if len(urgency_str)!=100{
			fmt.Println("urgency is not 100")
			return
		}


		//3、正则状态
		status_str,aterr:=Regexstr(`"status":"[a-zA-Z]+"`,resbody)
		if aterr!=nil{
			fmt.Println(aterr)
			return
		}
		if len(status_str)!=100{
			fmt.Println("status is not 100")
			return
		}


		//4、正则服务类型
		service_str,seerr:=Regexstr(`"service":[\w\{\"\:\,]+"summary":"[^"]+"`,resbody)
		if seerr!=nil{
			fmt.Println(seerr)
			return
		}
		if len(service_str)!=100{
			fmt.Println("service is not 100")
			return
		}


		//5、正则创建时间
		time_str,tierr:=Regexstr(`"created_at":"[\w\:\-]+"`,resbody)
		if tierr!=nil{
			fmt.Println(tierr)
			return
		}
		if len(time_str)!=100{
			fmt.Println("time is not 100")
			return
		}


		//开始正则出具体数据
		for k:=0;k<len(title_str);k++{
			//标题
			title:=strings.ReplaceAll(title_str[k],`"title":"`,"")
			title=strings.ReplaceAll(title,`"`,"")
			title, _ = strconv.Unquote(`"`+title+`"`)

			//紧急程度
			urgency:=strings.ReplaceAll(urgency_str[k],`"urgency":"`,"")
			urgency=strings.ReplaceAll(urgency,`"`,"")

			//状态
			status:=strings.ReplaceAll(status_str[k],`"status":"`,"")
			status=strings.ReplaceAll(status,`"`,"")

			//告警的服务名称
			service_tmp,sterr:=Regexstr(`"summary":"[^"]+"`,service_str[k])
			if sterr!=nil {
				fmt.Println(sterr)
				return
			}
			service:=strings.ReplaceAll(service_tmp[0],`"summary":"`,"")
			service=strings.ReplaceAll(service,`"`,"")

			//告警时间
			time:=strings.ReplaceAll(time_str[k],`"created_at":"`,"")
			time=strings.ReplaceAll(time,`"`,"")
			//fmt.Println(title+"\t"+urgency+"\t"+status+"\t"+service+"\t"+time)
			pagerdutystr=pagerdutystr+title+"\t"+urgency+"\t"+status+"\t"+service+"\t"+time+"\n"
		}
		fmt.Println("打印第 " +strconv.Itoa(i+1)+ " 个 100条数据")
		time.Sleep(3 * time.Second)
	}
	Write_To_File("pagerduty.txt",pagerdutystr)
	fmt.Println("完成，数据保持在当前目录 pagerduty.txt 中")
}

func Regexstr(regex string,datastr string)([]string,error){
	//正则测试,MatchString函数只能判断能不能匹配到，能匹配到返回true，否则返回false
	match, errs := regexp.MatchString(regex, datastr)
	if errs != nil {
		return nil,errs
	}
	if match == false {
		return nil,errors.New("error")
	}

	//把匹配的内容遍历出来
	comstr := regexp.MustCompile(regex)
	matchstr := comstr.FindAllString(datastr, -1)//-1是最大限度的匹配，具体细看函数，返回一个匹配到的数组
	return matchstr,nil
}




func Http_Get_res(url string) (string,error){
	//=================发送get请求====================
	req,err:=http.NewRequest("GET",url,nil)
	//以下为自定义header头包括Cookie头
	req.Header.Set("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0")
	req.Header.Set("Accept","application/vnd.pagerduty+json;version=2")
	req.Header.Set("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2")
	req.Header.Set("Cookie",pagerduty_cookie)
	client := &http.Client{
		Timeout: time.Millisecond * 10000, //设置10秒超时时间
	}
	resp2, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
	}

	if resp2.StatusCode!=200{
		return "",errors.New(resp2.Status)
	}

	body, err := ioutil.ReadAll(resp2.Body)
	if err!=nil{
		return "",err
	}
	//原始读取 string(body,以下语句解决中文乱码
	//Retexecstr:=mahonia.NewDecoder("utf-8").ConvertString(string(body))
	Retexecstr:=string(body)
	return Retexecstr,nil
}

func Write_To_File(FilePathName string,Datastr string){
	f, err := os.OpenFile(FilePathName, os.O_WRONLY|os.O_CREATE|os.O_APPEND,0666)
	if err != nil {
		fmt.Println(err)
	}

	_, err = f.Write([]byte(Datastr))
	if err != nil {
		fmt.Println(err)
	}
	f.Close()
}


