add twitch api
This commit is contained in:
parent
fc007136db
commit
f70d11517c
@ -12,3 +12,9 @@ type TwitchChannel struct {
|
|||||||
Ctime time.Time `db:"ctime" cc:"ctime"`
|
Ctime time.Time `db:"ctime" cc:"ctime"`
|
||||||
Mtime time.Time `db:"mtime" cc:"ctime"`
|
Mtime time.Time `db:"mtime" cc:"ctime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAllChannel -
|
||||||
|
func GetAllChannel() (channels []*TwitchChannel, err error) {
|
||||||
|
err = x.Select(&channels, `select * from "public"."twitch_channel"`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@ -5,16 +5,18 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// RequestObj -
|
||||||
type RequestObj struct {
|
type RequestObj struct {
|
||||||
Method string
|
Method string
|
||||||
Url string
|
URL string
|
||||||
Body io.Reader
|
Body io.Reader
|
||||||
Headers map[string]string
|
Headers map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRequest -
|
||||||
func GetRequest(r RequestObj) (req *http.Request, err error) {
|
func GetRequest(r RequestObj) (req *http.Request, err error) {
|
||||||
|
|
||||||
req, err = http.NewRequest(r.Method, r.Url, r.Body)
|
req, err = http.NewRequest(r.Method, r.URL, r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ func PushMessage(target string, message interface{}) {
|
|||||||
|
|
||||||
reqObj := apis.RequestObj{
|
reqObj := apis.RequestObj{
|
||||||
Method: "POST",
|
Method: "POST",
|
||||||
Url: apiURL,
|
URL: apiURL,
|
||||||
Headers: getHeaders(),
|
Headers: getHeaders(),
|
||||||
Body: byteReader,
|
Body: byteReader,
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ func ReplyMessage(replyToken string, message interface{}) {
|
|||||||
|
|
||||||
reqObj := apis.RequestObj{
|
reqObj := apis.RequestObj{
|
||||||
Method: "POST",
|
Method: "POST",
|
||||||
Url: apiURL,
|
URL: apiURL,
|
||||||
Headers: getHeaders(),
|
Headers: getHeaders(),
|
||||||
Body: byteReader,
|
Body: byteReader,
|
||||||
}
|
}
|
||||||
|
@ -1,13 +1,34 @@
|
|||||||
package twitch
|
package twitch
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/apis"
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// UserInfo - twitch user info data
|
||||||
|
type UserInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Login string `json:"login"`
|
||||||
|
DisplayName string `json:"display_name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
BroadcasterType string `json:"broadcaster_type"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
ProfileImageURL string `json:"profile_image_url"`
|
||||||
|
OfflineImageURL string `json:"offline_image_url"`
|
||||||
|
ViewCount int `json:"view_count"`
|
||||||
|
Email string `json:"email"`
|
||||||
|
}
|
||||||
|
|
||||||
var baseURL = "https://api.twitch.tv"
|
var baseURL = "https://api.twitch.tv"
|
||||||
|
|
||||||
func getURL(p string) (string, bool) {
|
func getURL(p string, querystring ...interface{}) (string, bool) {
|
||||||
u, err := url.Parse(baseURL)
|
u, err := url.Parse(baseURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", false
|
return "", false
|
||||||
@ -16,20 +37,200 @@ func getURL(p string) (string, bool) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(querystring) > 0 {
|
||||||
|
switch querystring[0].(type) {
|
||||||
|
case string:
|
||||||
|
ref, err = ref.Parse(fmt.Sprintf("?%s", (querystring[0].(string))))
|
||||||
|
if err != nil {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
str := ref.String()
|
str := ref.String()
|
||||||
return str, true
|
return str, true
|
||||||
}
|
}
|
||||||
|
|
||||||
func getHeaders(token string) map[string]string {
|
func getHeaders(token ...interface{}) map[string]string {
|
||||||
m := make(map[string]string)
|
m := make(map[string]string)
|
||||||
|
conf := config.GetConf()
|
||||||
m["Content-Type"] = "application/json"
|
m["Content-Type"] = "application/json"
|
||||||
m["Authorization"] = fmt.Sprintf("Bearer %s", token)
|
if len(token) > 0 {
|
||||||
|
switch token[0].(type) {
|
||||||
|
case string:
|
||||||
|
m["Authorization"] = fmt.Sprintf("Bearer %s", (token[0].(string)))
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m["Client-ID"] = conf.Twitch.ClientID
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserData(token string) {
|
// GetUserDataByToken - get token own user data
|
||||||
|
func GetUserDataByToken(token string) (userInfo *UserInfo) {
|
||||||
|
if len(token) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
url, ok := getURL("/helix/users")
|
url, ok := getURL("/helix/users")
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reqObj := apis.RequestObj{}
|
||||||
|
reqObj.Headers = getHeaders(token)
|
||||||
|
reqObj.Method = "GET"
|
||||||
|
reqObj.URL = url
|
||||||
|
req, err := apis.GetRequest(reqObj)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if !strings.HasPrefix(resp.Header.Get("Content-Type"), "application/json") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
apiData := struct {
|
||||||
|
Data []*UserInfo `json:"data"`
|
||||||
|
}{}
|
||||||
|
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(bodyBytes, &apiData)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(apiData.Data) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return apiData.Data[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserDataByName -
|
||||||
|
func GetUserDataByName(login string) (userInfo *UserInfo) {
|
||||||
|
if len(login) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
qsValue := url.Values{}
|
||||||
|
qsValue.Add("login", login)
|
||||||
|
url, ok := getURL("/helix/users", qsValue.Encode())
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
reqObj := apis.RequestObj{}
|
||||||
|
reqObj.Headers = getHeaders()
|
||||||
|
reqObj.Method = "GET"
|
||||||
|
reqObj.URL = url
|
||||||
|
req, err := apis.GetRequest(reqObj)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if !strings.HasPrefix(resp.Header.Get("Content-Type"), "application/json") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
apiData := struct {
|
||||||
|
Data []*UserInfo `json:"data"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(bodyBytes, &apiData)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(apiData.Data) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return apiData.Data[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamInfo -
|
||||||
|
type StreamInfo struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
UserID string `json:"user_id"`
|
||||||
|
GameID string `json:"game_id"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
ViewerCount int `json:"viewer_count"`
|
||||||
|
StartedAt string `json:"started_at"`
|
||||||
|
Language string `json:"language"`
|
||||||
|
ThumbnailURL string `json:"thumbnail_url"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserStreamStatus -
|
||||||
|
func GetUserStreamStatus(ids []string) (info []*StreamInfo) {
|
||||||
|
if len(ids) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
apiData := struct {
|
||||||
|
Data []*StreamInfo `json:"data"`
|
||||||
|
}{}
|
||||||
|
|
||||||
|
qsValue := url.Values{}
|
||||||
|
for _, v := range ids {
|
||||||
|
qsValue.Add("user_id", v)
|
||||||
|
}
|
||||||
|
url, ok := getURL("/helix/streams", qsValue.Encode())
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
reqObj := apis.RequestObj{}
|
||||||
|
reqObj.Headers = getHeaders()
|
||||||
|
reqObj.Method = "GET"
|
||||||
|
reqObj.URL = url
|
||||||
|
req, err := apis.GetRequest(reqObj)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.DefaultClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if !strings.HasPrefix(resp.Header.Get("Content-Type"), "application/json") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
bodyBytes, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(bodyBytes, &apiData)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return apiData.Data
|
||||||
}
|
}
|
||||||
|
@ -10,5 +10,6 @@ var c *cron.Cron
|
|||||||
func SetBackground() {
|
func SetBackground() {
|
||||||
c = cron.New()
|
c = cron.New()
|
||||||
c.AddFunc("0 * * * * *", readFacebookPage)
|
c.AddFunc("0 * * * * *", readFacebookPage)
|
||||||
|
c.AddFunc("*/20 * * * * *", getStreamStatus)
|
||||||
c.Start()
|
c.Start()
|
||||||
}
|
}
|
||||||
|
32
module/background/twitch.go
Normal file
32
module/background/twitch.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package background
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/utils"
|
||||||
|
|
||||||
|
"git.trj.tw/golang/mtfosbot/model"
|
||||||
|
"git.trj.tw/golang/mtfosbot/module/apis/twitch"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getStreamStatus() {
|
||||||
|
fmt.Println("run twitch check")
|
||||||
|
channels, err := model.GetAllChannel()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var ids []string
|
||||||
|
for _, v := range channels {
|
||||||
|
ids = append(ids, v.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
info := twitch.GetUserStreamStatus(ids)
|
||||||
|
fmt.Printf("info len: %d\n", len(info))
|
||||||
|
for _, v := range info {
|
||||||
|
fmt.Println(utils.ToMap(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkStream(ch *model.TwitchChannel) {
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user