package bot import ( "bordrobot/lib/company" "bordrobot/lib/helper" "bordrobot/lib/model" "bordrobot/lib/ocr" "errors" "fmt" "io/ioutil" "log" "strconv" "strings" "time" "github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" "github.com/go-rod/rod/lib/proto" ) var pageErrors []string type Luca struct { Page *rod.Page Browser *rod.Browser } type errorInfo struct { Error string Index int } func VerifyCaptcha(page *rod.Page) error { captcha := "#captcha" picturePreparation := []string{ `document.getElementsByTagName("body")[0].style.backgroundImage = "none"`, `document.getElementsByClassName("baslik1")[0].style.display = "none"`, `document.getElementsByClassName("baslik2")[0].style.display = "none"`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = "none"`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = "none"`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = "none"`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = "none"`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = "none"`, } for i := 0; i < len(picturePreparation); i++ { wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil) wait() _, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`)) if err != nil { return err } fmt.Print(err) } datas, err := page.Screenshot(true, &proto.PageCaptureScreenshot{}) if err != nil { panic(err) } err = helper.CreateFolder("./processFolder") err = ioutil.WriteFile("./processFolder/screenshot.png", datas, 0644) if err != nil { panic(err) } captchaMessage, err := ReceiveDOMMessages(page, captcha, "src") picturePreparation = []string{ `document.getElementsByTagName("body")[0].style.backgroundImage = ""`, `document.getElementsByClassName("baslik1")[0].style.display = ""`, `document.getElementsByClassName("baslik2")[0].style.display = ""`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[1].style.display = ""`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[2].style.display = ""`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[3].style.display = ""`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[4].style.display = ""`, `document.getElementsByClassName("baslik3")[0].getElementsByClassName("inp")[5].style.display = ""`, } for i := 0; i < len(picturePreparation); i++ { wait := page.WaitRequestIdle(600*time.Millisecond, nil, nil, nil) wait() _, err := page.Evaluate(rod.Eval(`()=>{` + picturePreparation[i] + `}`)) if err != nil { return err } fmt.Print(err) } var captchaMsg []string captchaMsg, err = ocr.VisionApi("./processFolder/screenshot.png") fmt.Print(captchaMessage) trimmedMsg := strings.ReplaceAll(captchaMsg[0], " ", "") page.MustElement("#captcha-input").MustInput(strings.ToLower(trimmedMsg)) _, err = page.Evaluate(rod.Eval(`document.getElementById(document.forms[0].submit())`)) if err != nil { } err = WaitLoad(page) if err != nil { return err } getUrl := page.MustInfo().URL splitUrl := strings.Split(getUrl, "/") uri := strings.Split(splitUrl[len(splitUrl)-1], ";")[0] if uri != "main.erp" { _, err = page.Evaluate(rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`)) //rod.Eval(`document.querySelector("body > div.swal2-container.swal2-fade.swal2-in > div > button.swal2-confirm.swal2-styled").click()`) VerifyCaptcha(page) fmt.Println("captcha tekrar deneme fonksiyonuna sok") //captcha tekrar denenecek } return nil } func NewLucaBot() *Luca { l := launcher.New(). Headless(false). Devtools(true) //defer l.Cleanup() url := l.MustLaunch() browser := rod.New(). ControlURL(url). Trace(true). //SlowMotion(1 * time.Second). MustConnect() page := browser.MustPage("https://agiris.luca.com.tr/LUCASSO/giris.erp") fmt.Println(page) return &Luca{Page: page, Browser: browser} } func (l *Luca) Login(company company.Company) error { page := l.Page err := WaitLoad(page) if err != nil { return err } err = FillInput(page, "#musteriNo", company.MemberNumber) if err != nil { return err } page.Timeout(500) err = FillInput(page, "#kullaniciAdi", company.Username) if err != nil { return err } page.Timeout(500) err = FillInput(page, "#parola", company.Password) if err != nil { return err } page.Timeout(500) result, err := page.Evaluate(rod.Eval(`()=>{girisbtn()}`)) if err != nil { return err } page.Timeout(500) loginDialog := "body > div.swal2-container.swal2-fade.swal2-in > div > div.swal2-content" loginDialogMessage, err := ReceiveDOMMessages(page, loginDialog, "innerText") if err != nil { errString := err.Error() if !strings.Contains(errString, "Sellector Bulunamadı") { return err } } if loginDialogMessage == "Müşteri No, Kullanıcı Adı veya Parola hatalıdır." { return errors.New("Şifre hatalı") } getUrl := page.MustInfo().URL splitUrl := strings.Split(getUrl, "/") splitUrlPage := strings.Split(splitUrl[len(splitUrl)-1], ";")[0] if splitUrlPage != "main.erp" { VerifyCaptcha(page) } fmt.Println(result) wait := page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil) wait() _, err = page.Evaluate(rod.Eval(`()=>{gonder('formTarget');}`)) if err != nil { return err } wait = page.WaitRequestIdle(500*time.Millisecond, nil, nil, nil) wait() return err } func (l *Luca) BordroYaz(data []*model.Bordro, month float64, year float64) error { page := l.Page allPages, err := page.Browser().Pages() if err != nil { return err } newPage, err := allPages.FindByURL("https://auygs.luca.com.tr/Luca/luca.do") if err != nil { return err } fs2, err := newPage.Element("#frm2") if err != nil { return err } frame, err := fs2.Frame() fs3, err := newPage.Element("#frm3") if err != nil { return err } frame3, err := fs3.Frame() err = newPage.WaitLoad() if err != nil { return err } err = ClickItem(frame, "#apy1000m0i1ITD", 1) if err != nil { return err } fmt.Println(err) err = ClickItem(frame3, "#apy1000m33i4ITX", 1) if err != nil { return err } err = newPage.WaitLoad() if err != nil { return err } Wait(newPage, 1500) for i := 0; i < len(data); i++ { if i != 0 { err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(3)", 1) if err != nil { return err } } err = WaitLoad(frame3) if err != nil { return err } isyeriId := "" bolumId := "" bordroCompanySelectBox, err := frame3.Elements("#isyeriId > option") for j := 0; j < len(bordroCompanySelectBox); j++ { text, err := bordroCompanySelectBox[j].Text() value, err := bordroCompanySelectBox[j].Property("value") if err != nil { return err } if strings.Trim(text, " ") == data[i].Sube.Value { isyeriId = value.String() break } fmt.Print(text, value) } element, err := frame3.Element("#isyeriId") if err != nil { return err } selectInput := Select{Element: element, Selector: "#isyeriId"} err = selectInput.SelectItem(isyeriId) if err != nil { return err } err = WaitLoad(frame3) if err != nil { return err } bordroDepartmentSelectBox, err := frame3.Elements("#bolumId > option") if err != nil { return err } for j := 0; j < len(bordroDepartmentSelectBox); j++ { text, err := bordroDepartmentSelectBox[j].Text() value, err := bordroDepartmentSelectBox[j].Property("value") if err != nil { return err } if strings.Trim(text, " ") == data[i].Bolum.Value { bolumId = value.String() break } fmt.Print(text, value) } element, err = frame3.Element("#bolumId") if err != nil { return err } selectInput = Select{Element: element, Selector: "#bolumId"} err = selectInput.SelectItem(bolumId) if err != nil { return err } err = WaitLoad(frame3) if err != nil { return err } aktarimDonem := strconv.FormatFloat(month, 'f', -1, 64) err = ClickItem(frame3, "#tr"+aktarimDonem+" > td:nth-child(1)", 2) if err != nil { log.Fatal(err) } personel := data[i].TCKimlikNo //"54853109724" fmt.Println(personel) err = WaitLoad(frame3) if err != nil { return err } var isEmpty bool = false //var targetID string elems, err := frame3.Elements("#scroll > table > tbody > tr > td[id^='tcKimlikNo']") if err != nil { return err } elemsProcess, err := frame3.Elements("#scroll > table > tbody > tr > td > a") if err != nil { return err } trs, err := frame3.Elements("#scroll > table > tbody > tr") if err != nil { return err } var foundIndex int = -1 if len(elems) == 0 { isEmptyError := errorInfo{ Error: "Böyle Bir Kullanıcı Bulunamadı", Index: i, } pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) continue } for j := 0; j < len(elems); j++ { tex, err := elems[j].Text() if err != nil { return err } process, err := elemsProcess[j].Text() if err != nil { return err } if tex == data[i].TCKimlikNo.Value { foundIndex = j if process == "Bordro Sil" { isEmpty = true } break } fmt.Print(elems, tex) } if isEmpty == true { isEmptyError := errorInfo{ Error: "Yazılı Bordro Var Lütfen Siliniz", Index: i, } pageErrors = append(pageErrors, isEmptyError.Error+", Index: "+strconv.Itoa(isEmptyError.Index)) continue } if foundIndex != -1 { trs[foundIndex].Click(proto.InputMouseButtonLeft, 2) } err = WaitLoad(frame3) if err != nil { return err } data[i].FillBordroForm(frame3) //err yoksa hesapla ba err = ClickItem(frame3, "body > form > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td.right > button", 1) if err != nil { log.Fatal(err) } err = WaitLoad(frame3) if err != nil { return err } newBordroPage, err := frame3.Element("body > table > tbody > tr.altBar.alt-button-bar > th > table > tbody > tr > td:nth-child(1) > button:nth-child(4)") if err != nil { return err } newBordroPage.Click(proto.InputMouseButtonLeft, 1) err = WaitLoad(frame3) if err != nil { return err } } CloseBrowser(l.Browser) return err } // func (l *Luca)pageInsert(data, b* model.PageStruct){ // } //type Luca struct { //} // //func NewLucaBot() *Luca { // return &Luca{} //} //func (l *Luca) Login() error { // return nil //} //func (l *Luca) NavigateBordroGiris() error { // return nil //} // //func (l *Luca) BordroYaz(b *model.Bordro) { // //}