103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
package runner
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
//go:embed js/facebook_data.js
|
|
var facebook_data string
|
|
|
|
const (
|
|
facebook_login_url = "https://m.facebook.com/login/?ref=dbl&fl"
|
|
)
|
|
|
|
type FacebookRes struct {
|
|
Followers int `json:"followers"`
|
|
Posts []FacebookPost `json:"posts"`
|
|
}
|
|
|
|
type FacebookPost struct {
|
|
Engagement int `json:"engagement"`
|
|
Body string `json:"body"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
func (r *Runner) CheckFacebook() {
|
|
r.page.MustNavigate(facebook_login_url)
|
|
r.page.WaitLoad()
|
|
time.Sleep(time.Millisecond * 113)
|
|
location := r.page.MustEval("window.location.href").Str()
|
|
if location == facebook_login_url {
|
|
r.page.MustElement(`input[name="email"]`).Input(r.FacebookEmail)
|
|
time.Sleep(time.Millisecond * 113)
|
|
r.page.MustElement(`input[name="pass"]`).Input(r.FacebookPass)
|
|
time.Sleep(time.Millisecond * 72)
|
|
r.page.MustElement(`button[name="login"]`).MustClick()
|
|
time.Sleep(time.Millisecond * 5000)
|
|
}
|
|
}
|
|
|
|
func (r *Runner) GetFacebookData() []Result {
|
|
var results []Result
|
|
for i := range r.Targets {
|
|
fmt.Println("Processing " + r.Targets[i].Name + "'s Facebook")
|
|
results = append(results, r.GetFacebookDataByIndex(i))
|
|
}
|
|
return results
|
|
}
|
|
|
|
//Navigate with random stops
|
|
func (r *Runner) FacebookPageNavigate(index int) {
|
|
r.page.MustNavigate(r.Targets[index].Facebook)
|
|
r.page.MustWaitLoad()
|
|
r.Scroll(30, longTimeOut)
|
|
}
|
|
|
|
func (r *Runner) FacebookPagePullData() FacebookRes {
|
|
data := r.page.MustEval(facebook_data).JSON("", "")
|
|
var res FacebookRes
|
|
err := json.Unmarshal([]byte(data), &res)
|
|
checkErr(err)
|
|
return res
|
|
}
|
|
|
|
func (r *Runner) calcFacebookPostData(posts []FacebookPost) (int, int) {
|
|
total_engagement := 0
|
|
total_posts := 0
|
|
for _, elm := range posts {
|
|
if elm.Timestamp.After(r.weekago) && elm.Timestamp.Before(r.currentTime) {
|
|
total_engagement += elm.Engagement
|
|
total_posts += 1
|
|
}
|
|
}
|
|
|
|
return total_engagement, total_posts
|
|
}
|
|
|
|
func (r *Runner) GetFacebookDataByIndex(index int) Result {
|
|
|
|
r.FacebookPageNavigate(index)
|
|
|
|
data := r.FacebookPagePullData()
|
|
|
|
total_engagement, total_posts := r.calcFacebookPostData(data.Posts)
|
|
|
|
r.logger.LogFacebookRes(data, r.Targets[index].Name)
|
|
|
|
result := Result{
|
|
r.Targets[index].Name,
|
|
"Facebook",
|
|
data.Followers,
|
|
total_engagement,
|
|
total_posts,
|
|
}
|
|
|
|
r.logger.LogResult(result, "Facebook")
|
|
|
|
return result
|
|
}
|