Advertisement
ccocot

botlike.go

Jan 22nd, 2018
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.97 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "flag"
  6.     "github.com/ahmdrz/goinsta"
  7.     "github.com/ahmdrz/goinsta/response"
  8.     _ "github.com/lib/pq"
  9.     "log"
  10.     "os"
  11.     "regexp"
  12.     "strings"
  13.     "sync"
  14.     "time"
  15. )
  16.  
  17. var (
  18.     username string
  19.     password string
  20.     email    string
  21.     sleep    int64
  22.     add      bool
  23.     show     bool
  24.     remove   bool
  25.     connStr  string = "user=postgres dbname=db_instagram sslmode=disable password=ccocot123"
  26. )
  27.  
  28. func panicOnError(err error) {
  29.     if err != nil {
  30.         log.Panic(err)
  31.     }
  32. }
  33.  
  34. func addAccount(db *sql.DB) {
  35.     isUsernameEmpty := !(len(username) > 0)
  36.     isPasswordEmpty := !(len(password) > 0)
  37.     isEmailEmpty := !(len(email) > 0)
  38.     if isUsernameEmpty || isPasswordEmpty || isEmailEmpty {
  39.         log.Panic("Username, Password or Email Empty\n")
  40.     }
  41.     insta := goinsta.New(username, password)
  42.     log.Print("Login Instagram ...\n")
  43.     err := insta.Login()
  44.     defer insta.Logout()
  45.     panicOnError(err)
  46.     _, err = db.Exec(`INSERT INTO account_info VALUES($1, $2, $3)`, username, password, email)
  47.     panicOnError(err)
  48.     log.Printf("User Added ! \n")
  49. }
  50.  
  51. func showAccount(db *sql.DB) {
  52.     rows, err := db.Query(`SELECT username,password FROM account_info`)
  53.     panicOnError(err)
  54.     index := 0
  55.     for rows.Next() {
  56.         index++
  57.         var usernameTmp string
  58.         var passwordTmp string
  59.         err := rows.Scan(&usernameTmp, &passwordTmp)
  60.         panicOnError(err)
  61.         log.Printf("%d. Username: %s Password: %s \n", index, usernameTmp, passwordTmp)
  62.     }
  63. }
  64.  
  65. func deleteAccount(db *sql.DB) {
  66.     isUsernameEmpty := !(len(username) > 0)
  67.     if isUsernameEmpty {
  68.         log.Panic("Username to delete Empty\n")
  69.     }
  70.     _, err := db.Exec(`DELETE FROM account_info WHERE username = $1`, username)
  71.     panicOnError(err)
  72.     log.Printf("User Deleted !\n")
  73. }
  74.  
  75. func init() {
  76.     // flag
  77.     flag.StringVar(&username, "username", "", "instagram account username")
  78.     flag.StringVar(&password, "password", "", "instagram account password")
  79.     flag.StringVar(&email, "email", "", "instagram account email")
  80.     flag.Int64Var(&sleep, "sleep", 2, "sleep in minute")
  81.     flag.BoolVar(&add, "add", false, "add account instagram")
  82.     flag.BoolVar(&show, "show", false, "to show instagram account list")
  83.     flag.BoolVar(&remove, "remove", false, "remove instagram account")
  84.     flag.Parse()
  85.  
  86.     //db connection
  87.     db, err := sql.Open("postgres", connStr)
  88.     panicOnError(err)
  89.     defer db.Close()
  90.  
  91.     switch {
  92.     case add: //if flag add true
  93.         addAccount(db)
  94.         os.Exit(0)
  95.     case show: // if flag show true
  96.         showAccount(db)
  97.         os.Exit(0)
  98.     case remove: //if flag remove true
  99.         deleteAccount(db)
  100.         os.Exit(0)
  101.     }
  102. }
  103.  
  104. func main() {
  105.  
  106.     //db connection
  107.     db, err := sql.Open("postgres", connStr)
  108.     panicOnError(err)
  109.     defer db.Close()
  110.  
  111.     // get account
  112.     rows, err := db.Query(`SELECT username, password FROM account_info`)
  113.     panicOnError(err)
  114.     accounts := [][]string{}
  115.     for rows.Next() {
  116.         var usernameTmp string
  117.         var passwordTmp string
  118.         rows.Scan(&usernameTmp, &passwordTmp)
  119.         itemToAppend := [][]string{{usernameTmp, passwordTmp}}
  120.         accounts = append(accounts, itemToAppend...)
  121.     }
  122.  
  123.     log.Printf("Get All Worker [Total: %d account] \n", len(accounts))
  124.     // setup channel and waitgroup and worker login
  125.     var wg sync.WaitGroup
  126.     ch := make(chan *goinsta.Instagram, len(accounts))
  127.     for _, account := range accounts {
  128.         wg.Add(1)
  129.         go login(&wg, account, ch)
  130.     }
  131.     wg.Wait()
  132.     close(ch)
  133.     log.Printf("All worker Logged In, close channel and start to Work !!!\n")
  134.  
  135.     //getTimeLine
  136.     for account := range ch {
  137.         wg.Add(1)
  138.         go getTimeLine(&wg, account, db)
  139.     }
  140.  
  141.     wg.Wait()
  142.     log.Printf("All done")
  143. }
  144.  
  145. func login(wg *sync.WaitGroup, account []string, ch chan *goinsta.Instagram) {
  146.     defer wg.Done()
  147.     log.Printf("worker %s try Login ... \n", account[0])
  148.     insta := goinsta.New(account[0], account[1])
  149.     err := insta.Login()
  150.     panicOnError(err)
  151.     log.Printf("worker %s Login Success ... \n", account[0])
  152.     ch <- insta
  153. }
  154.  
  155. func getTimeLine(wg *sync.WaitGroup, account *goinsta.Instagram, db *sql.DB) {
  156.     defer wg.Done()
  157.     accountInfo, err := account.GetProfileData()
  158.     worker := accountInfo.User.Username
  159.     panicOnError(err)
  160.     maxID := ""
  161.     for {
  162.         feed, err := account.Timeline(maxID)
  163.         feed.AutoLoadMore = true
  164.         panicOnError(err)
  165.         for index, item := range feed.Items {
  166.             if mod := index % 3; index > 0 && mod == 0 {
  167.                 time.Sleep(time.Duration(sleep) * time.Minute)
  168.             }
  169.             re := regexp.MustCompile(`(\#[a-zA-Z]+\b)`)
  170.             match := re.FindAllString(item.Caption.Text, -1)
  171.             result := doLike(account, &item, worker)
  172.             _, err := db.Exec(`INSERT INTO event VALUES(NOW(), $1, $2, $3, $4, $5);`,
  173.                 worker,
  174.                 result,
  175.                 strings.Join(match, " "),
  176.                 item.User.Username,
  177.                 item.ID)
  178.             panicOnError(err)
  179.         }
  180.         if feed.MoreAvailable {
  181.             maxID = feed.NextMaxID
  182.         } else {
  183.             break
  184.         }
  185.     }
  186. }
  187.  
  188. func doLike(insta *goinsta.Instagram, item *response.MediaItemResponse, worker string) bool {
  189.     liked := true
  190.     if !item.HasLiked {
  191.         _, err := insta.Like(item.ID)
  192.         if err != nil {
  193.             liked = false
  194.         }
  195.     }
  196.  
  197.     log.Printf("[%s] %s => %s [%t]", worker, item.User.Username, item.ID, liked)
  198.     return liked
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement