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 }