Files
hw-fbbot/main.go

199 lines
4.6 KiB
Go

package main
import (
"bytes"
"context"
"fmt"
"log"
"net/http"
"os"
"path/filepath"
"time"
"github.com/chromedp/chromedp"
"github.com/fsnotify/fsnotify"
"github.com/lunny/html2md"
"github.com/robfig/cron/v3"
"github.com/spf13/viper"
)
func init() {
viper.SetDefault("development_mode", true)
viper.SetDefault("cronjob_interval", "@every 5m")
viper.SetConfigType("yaml")
viper.SetConfigName("config") // name of config file (without extension)
viper.AddConfigPath("/etc/fbBot/") // path to look for the config file in
viper.AddConfigPath("$HOME/.fbBot") // call multiple times to add many search paths
viper.AddConfigPath(".") // optionally look for config in the working directory
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// any approach to require this configuration into your program.
var yamlExample = []byte(`
development_mode: true
cronjob_interval: "@every 5m"
no_run_on_start: false
http_useragent: "Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"
webhooks:
live:
- https://discordapp.com/api/webhooks/...
- https://discordapp.com/api/webhooks/...
devel:
- https://discordapp.com/api/webhooks/...
comment_on_posts:
- TY
- ty!
- danke!
- I could use it!
- thx!
- Thank you!
- Merci
- Yeah!
- Vielen Dank!
login:
email: example@example.com
passwd: thefbpassword
`)
viper.ReadConfig(bytes.NewBuffer(yamlExample))
viper.WriteConfig()
} else {
// Config file was found but another error was produced
}
}
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
html2md.AddRule("span", &html2md.Rule{
Patterns: []string{"span"},
Tp: html2md.Void,
Replacement: func(innerHTML string, attrs []string) string {
return innerHTML
},
})
}
func main() {
os.MkdirAll("/opt/tmp", os.ModeDir)
SetupCloseHandler()
if !viper.GetBool("no_run_on_start") {
go cronTask()
}
cronJob = cron.New()
cronJob.AddFunc(viper.GetString("cronjob_interval"), func() {
cronTask()
})
cronJob.Start()
for {
time.Sleep(30 * time.Second)
}
}
func postRequest(content *Webhook) {
webhooks := viper.GetStringSlice("webhooks.live")
if viper.GetBool("development_mode") {
webhooks = viper.GetStringSlice("webhooks.devel")
}
jsonStrBytes, err := content.Marshal()
if err != nil {
log.Println("postRequest error:", err.Error())
return
}
for _, webhook := range webhooks {
//fmt.Println("URL:>", webhook)
req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStrBytes))
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
log.Println("ERROR: " + err.Error())
}
defer resp.Body.Close()
log.Println("response Status:", resp.Status)
//fmt.Println("response Headers:", resp.Header)
}
}
func cronTask() error {
dir := filepath.Join("/etc", "fbBot", "content")
os.MkdirAll(dir, os.ModePerm)
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.DisableGPU,
chromedp.UserAgent(viper.GetString("http_useragent")),
chromedp.UserDataDir(dir),
)
allocCtx, cancelAll := chromedp.NewExecAllocator(context.Background(), opts...)
defer cancelAll()
// also set up a custom logger
taskCtx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf), chromedp.WithErrorf(log.Printf))
defer cancel()
chromedp.Run(taskCtx)
page1(taskCtx)
page2(taskCtx)
page3(taskCtx)
page4(taskCtx)
page5(taskCtx)
page6(taskCtx)
page7(taskCtx)
postID := ""
var fbPost *FBPostData
var fbPostErr error
postID, fbPost, fbPostErr = page8(taskCtx)
fmt.Printf("Error: %#v\n", fbPostErr)
if fbPost != nil && fbPost.TimeStamp != lastUpdatePosted {
page9(taskCtx, postID)
}
time.Sleep(2 * time.Second)
if fbPost != nil && fbPost.TimeStamp != lastUpdatePosted {
timeStamp := fbPost.TimeStamp
pTime, err := time.Parse(time.RFC3339, fbPost.TimeStamp)
if err == nil {
timeStamp = pTime.UTC().Format("2006-01-02 15:04:05 UTC")
}
embeded := []*Embed{}
embeded = append(embeded, &Embed{
Title: fbPost.Title,
Description: fbPost.Content + `
Date of Post: ` + timeStamp + `
Post URL: ` + fbPost.PostURL,
Image: Image{
URL: fbPost.ImageURL,
},
URL: fbPost.GiftURL,
})
dcontent := &Webhook{
Content: fbPost.Title,
Embeds: embeded,
}
if fbPostErr == nil {
postRequest(dcontent)
}
lastUpdatePosted = fbPost.TimeStamp
viper.Set("lastPostTimestamp", fbPost.TimeStamp)
viper.WriteConfig()
}
return nil
}