View difference between Paste ID: BHuXLS2X and Y7GfmiFG
SHOW: | | - or go back to the newest paste.
1
package main
2
3
// CODE BY CCOCOT
4-
	"database/sql"
4+
5
import (
6
	"flag"
7-
	"github.com/ahmdrz/goinsta/response"
7+
8-
	_ "github.com/lib/pq"
8+
9
	"math/rand"
10-
	"os"
10+
	"runtime"
11-
	"regexp"
11+
12-
	"strings"
12+
13
)
14
15
func catch() {
16
	if r := recover(); r != nil {
17-
var (
17+
		log.Fatalf("Error occured: %s", r)
18-
	username string
18+
	} else {
19-
	password string
19+
		log.Printf("Done !")
20-
	email    string
20+
21-
	sleep    int64
21+
22-
	add      bool
22+
23-
	show     bool
23+
func random(min, max int) int {
24-
	remove   bool
24+
	rand.Seed(time.Now().Unix())
25-
	connStr  string = "user=postgres dbname=db_instagram sslmode=disable password=ccocot123"
25+
	return rand.Intn(max-min) + min
26
}
27
28-
func panicOnError(err error) {
28+
29-
	if err != nil {
29+
	runtime.GOMAXPROCS(2)
30-
		log.Panic(err)
30+
31
	defer catch()
32
33
	usernamePtr := flag.String("username", "", "instagram username")
34-
func addAccount(db *sql.DB) {
34+
	passwordPtr := flag.String("password", "", "instagram password")
35-
	isUsernameEmpty := !(len(username) > 0)
35+
	sleepPtr := flag.Int("sleep", 0, "Delay in Minutes (Default Rand Range 1-4 Minutes)")
36-
	isPasswordEmpty := !(len(password) > 0)
36+
	goroutinePtr := flag.Int("goroutine", 0, "set of gouroutine (Default is 1 Page)")
37-
	isEmailEmpty := !(len(email) > 0)
37+
38-
	if isUsernameEmpty || isPasswordEmpty || isEmailEmpty {
38+
39-
		log.Panic("Username, Password or Email Empty\n")
39+
40
	isUsernameEmpty := len(*usernamePtr) == 0
41-
	insta := goinsta.New(username, password)
41+
	isPasswordEmpty := len(*passwordPtr) == 0
42-
	log.Print("Login Instagram ...\n")
42+
	if isUsernameEmpty || isPasswordEmpty {
43-
	err := insta.Login()
43+
		panic("Username / Password Empty | see flag in help -h")
44-
	defer insta.Logout()
44+
45-
	panicOnError(err)
45+
46-
	_, err = db.Exec(`INSERT INTO account_info VALUES($1, $2, $3)`, username, password, email)
46+
	if *sleepPtr != 0 {
47-
	panicOnError(err)
47+
		log.Printf("Flag --sleep detect, set sleep to %vm0s", *sleepPtr)
48-
	log.Printf("User Added ! \n")
48+
49
50
	if *goroutinePtr != 0 {
51-
func showAccount(db *sql.DB) {
51+
		log.Printf("Flag --goroutine detect, set goroutine to %v", *goroutinePtr)
52-
	rows, err := db.Query(`SELECT username,password FROM account_info`)
52+
53-
	panicOnError(err)
53+
54-
	index := 0
54+
	log.Print("Try to login ... ")
55-
	for rows.Next() {
55+
	insta := goinsta.New(*usernamePtr, *passwordPtr)
56-
		index++
56+
	if err := insta.Login(); err != nil {
57-
		var usernameTmp string
57+
		panic(err)
58-
		var passwordTmp string
58+
59-
		err := rows.Scan(&usernameTmp, &passwordTmp)
59+
60-
		panicOnError(err)
60+
	log.Print("Login Success ...")
61-
		log.Printf("%d. Username: %s Password: %s \n", index, usernameTmp, passwordTmp)
61+
62
	tmpNextMaxID := ""
63
	for {
64
65-
func deleteAccount(db *sql.DB) {
65+
		log.Print("Try to get media feed ...")
66-
	isUsernameEmpty := !(len(username) > 0)
66+
		timline, err := insta.Timeline(tmpNextMaxID)
67-
	if isUsernameEmpty {
67+
		timline.AutoLoadMore = true
68-
		log.Panic("Username to delete Empty\n")
68+
69
			panic(err)
70-
	_, err := db.Exec(`DELETE FROM account_info WHERE username = $1`, username)
70+
71-
	panicOnError(err)
71+
		log.Printf("Get Media with length : %d", len(timline.Items))
72-
	log.Printf("User Deleted !\n")
72+
73
		for index, item := range timline.Items {
74
			if !item.HasLiked {
75-
func init() {
75+
				message := "[" + item.ID + "] @" + item.User.Username + ""
76-
	// flag
76+
				log.Printf("[%d] Request Sent To -> %s", index, message)
77-
	flag.StringVar(&username, "username", "", "instagram account username")
77+
				wg.Add(1)
78-
	flag.StringVar(&password, "password", "", "instagram account password")
78+
				go func(wg *sync.WaitGroup, id, username string, index int) {
79-
	flag.StringVar(&email, "email", "", "instagram account email")
79+
					defer wg.Done()
80-
	flag.Int64Var(&sleep, "sleep", 2, "sleep in minute")
80+
					_, err := insta.Like(item.ID)
81-
	flag.BoolVar(&add, "add", false, "add account instagram")
81+
					liked := true
82-
	flag.BoolVar(&show, "show", false, "to show instagram account list")
82+
					if err != nil {
83-
	flag.BoolVar(&remove, "remove", false, "remove instagram account")
83+
						liked = false
84
					}
85
					log.Printf("[%d] Receive Response From <- [%s] @%s (LIKED: %t)", index, id, username, liked)
86-
	//db connection
86+
				}(&wg, item.ID, item.User.Username, index)
87-
	db, err := sql.Open("postgres", connStr)
87+
			} else {
88-
	panicOnError(err)
88+
				log.Printf("[%d] SKIPPED <-> [%s] @%s (HASLIKED: %t)", index, item.ID, item.User.Username, item.HasLiked)
89-
	defer db.Close()
89+
90
			if *goroutinePtr != 0 {
91-
	switch {
91+
				if mod := index % *goroutinePtr; mod == 0 {
92-
	case add: //if flag add true
92+
					wg.Wait()
93-
		addAccount(db)
93+
				}
94-
		os.Exit(0)
94+
95-
	case show: // if flag show true
95+
96-
		showAccount(db)
96+
97-
		os.Exit(0)
97+
		log.Printf("IsMoreAvaible: %t", timline.MoreAvailable)
98-
	case remove: //if flag remove true
98+
		if timline.MoreAvailable {
99-
		deleteAccount(db)
99+
			tmpNextMaxID = timline.NextMaxID
100-
		os.Exit(0)
100+
101
			tmpNextMaxID = ""
102
		}
103
104
		r := *sleepPtr
105
		if *sleepPtr == 0 {
106-
	//db connection
106+
			r = random(1, 4)
107-
	db, err := sql.Open("postgres", connStr)
107+
108-
	panicOnError(err)
108+
		sleep := time.Duration(r) * time.Minute
109-
	defer db.Close()
109+
		log.Printf("Sleep For %v", sleep)
110
		time.Sleep(sleep)
111-
	// get account
111+
112-
	rows, err := db.Query(`SELECT username, password FROM account_info`)
112+