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 | + |