Files
datahop/runner/runner.go
2021-11-01 18:38:58 -05:00

153 lines
3.0 KiB
Go

package runner
import (
"os"
"os/signal"
"path"
"path/filepath"
"time"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/devices"
"github.com/go-rod/rod/lib/launcher"
"github.com/xuri/excelize/v2"
)
const (
longTimeOut int = 2000
)
type Runner struct {
page *rod.Page
logger *Logger
Targets []Target
FacebookEmail string
FacebookPass string
InstaUser string
InstaPass string
work_dir string
weekago time.Time
currentTime time.Time
}
type Target struct {
Name string `json:"name"`
Facebook string `json:"facebook"`
Instagram string `json:"instagram"`
}
func getExecutablePath() string {
exe_path, err := os.Executable()
checkErr(err)
work_dir := filepath.Dir(exe_path)
return work_dir
}
func parseConfig(r *Runner) {
f, err := excelize.OpenFile(path.Join(r.work_dir, "config.xlsx"))
checkErr(err)
//Facebook
cell, err := f.GetCellValue("Sheet1", "E1")
checkErr(err)
r.FacebookEmail = cell
cell, err = f.GetCellValue("Sheet1", "E2")
checkErr(err)
r.FacebookPass = cell
//Insta
cell, err = f.GetCellValue("Sheet1", "E3")
checkErr(err)
r.InstaUser = cell
cell, err = f.GetCellValue("Sheet1", "E4")
checkErr(err)
r.InstaPass = cell
rows, err := f.GetRows("Sheet1")
checkErr(err)
var targets []Target
for i, row := range rows {
var target Target
if i != 0 {
for j, colCell := range row {
switch j {
case 0:
target.Name = colCell
case 1:
target.Facebook = colCell
case 2:
target.Instagram = colCell
}
}
}
if len(target.Name) > 0 {
targets = append(targets, target)
}
}
r.Targets = targets
}
func configRod(r *Runner) {
u := launcher.New().
Set("user-data-dir", path.Join(r.work_dir, "browser")).
Headless(false).
MustLaunch()
r.page = rod.New().ControlURL(u).MustConnect().MustPage()
r.page.MustEmulate(devices.IPhone6or7or8Plus)
}
func setTime(r *Runner) {
//Establish the date
weekago := time.Now().AddDate(0, 0, -7)
hours := weekago.Hour()
weekago = weekago.Add(time.Duration(-hours) * time.Hour)
r.weekago = weekago
currentTime := time.Now()
hours = currentTime.Hour()
r.currentTime = currentTime.Add(time.Duration(-hours) * time.Hour)
}
func NewRunner() *Runner {
work_dir := getExecutablePath()
var runner = new(Runner)
runner.work_dir = work_dir
parseConfig(runner)
configRod(runner)
setTime(runner)
runner.logger = NewLogger(work_dir, runner.weekago, runner.currentTime)
return runner
}
func (r *Runner) RunAll() []Result {
r.CheckInstaGram()
idata := r.GetInstaData()
r.CheckFacebook()
fdata := r.GetFacebookData()
return append(idata, fdata...)
}
func (r *Runner) RunInsta() []Result {
r.CheckInstaGram()
idata := r.GetInstaData()
return idata
}
func (r *Runner) RunFacebook() []Result {
r.CheckFacebook()
fdata := r.GetFacebookData()
return fdata
}
func (r *Runner) Close() {
r.logger.Close()
}
func (r *Runner) JustOpen() {
signal_channel := make(chan os.Signal, 1)
signal.Notify(signal_channel, os.Interrupt)
<-signal_channel
}