instabot 0.1.75 → 0.1.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/instabot/banner.rb +1 -1
- data/lib/instabot/config.rb +5 -1
- data/lib/instabot/core.rb +15 -13
- data/lib/instabot/grabber.rb +7 -5
- data/lib/instabot/logger.rb +1 -1
- data/lib/instabot/modes.rb +97 -68
- data/lib/instabot/version.rb +1 -1
- metadata +36 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f89e0b51f16a304b7fe67ed1cc3da8a3bae7d038
|
4
|
+
data.tar.gz: e6e624baa761e5cf465df6092c3e1e20407c185c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb26bfbe42fa69f2b3ec8f86d1b0e52490a9e6328bb517d56c16cc2e90b217f053f48a5db2a8aca1008ed120a169bc21635648e6eeff872e4aa6b3bea242fa29
|
7
|
+
data.tar.gz: 16fc4a486a600f58d5ad3baef4467b3dd860b2b9bf8d0038bf9b5403b8529304abb292c9201ce25c3293ab8f2b55668d20773cbafeeba6f6a8a5c92f7054fb02
|
data/lib/instabot/banner.rb
CHANGED
@@ -10,7 +10,7 @@ module Banner
|
|
10
10
|
╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝
|
11
11
|
|
12
12
|
BANNER
|
13
|
-
puts 'An instagram bot works without instagram api '.white.bold + 'github.com/'.cyan +
|
13
|
+
puts 'An instagram bot works without instagram api '.white.bold + 'github.com/'.cyan + "eVanilla/instabot.rb\n".cyan.bold.italic
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/instabot/config.rb
CHANGED
@@ -14,7 +14,9 @@ module Config
|
|
14
14
|
:print_banner, :pre_load, :wait_per_action, :infinite_tags,
|
15
15
|
:max_like_per_day, :max_follow_per_day, :max_unfollow_per_day,
|
16
16
|
:max_comment_per_day, :unwanted_list, :white_list_users,
|
17
|
-
:log_status, :use_tor
|
17
|
+
:log_status, :use_tor, :add_tag_per_post, :unwanted_list,
|
18
|
+
:white_list_users
|
19
|
+
|
18
20
|
def initialize
|
19
21
|
@wait_per_action = 1 * 60
|
20
22
|
@max_comment_per_day = 50
|
@@ -31,9 +33,11 @@ module Config
|
|
31
33
|
@log_status = true
|
32
34
|
@use_proxy = false
|
33
35
|
@use_tor = false
|
36
|
+
@add_tag_per_post = 1
|
34
37
|
@tags = []
|
35
38
|
@unwanted_list = []
|
36
39
|
@white_list_users = []
|
40
|
+
|
37
41
|
@comments = [
|
38
42
|
%w[this the your],
|
39
43
|
%w[photo picture pic shot snapshot],
|
data/lib/instabot/core.rb
CHANGED
@@ -23,16 +23,18 @@ class Instabot
|
|
23
23
|
attr_accessor :users, :medias, :media_information, :user_information
|
24
24
|
|
25
25
|
def initialize(mode = :default)
|
26
|
-
@login_mode
|
27
|
-
@users
|
28
|
-
@medias
|
29
|
-
@log_counter
|
30
|
-
@login_counter
|
31
|
-
@login_status
|
32
|
-
@lib_dir
|
33
|
-
@root_dir
|
34
|
-
@logs_dir
|
35
|
-
@
|
26
|
+
@login_mode = mode
|
27
|
+
@users = []
|
28
|
+
@medias = []
|
29
|
+
@log_counter = 0
|
30
|
+
@login_counter = 1
|
31
|
+
@login_status = false
|
32
|
+
@lib_dir = "#{Dir.pwd}/lib"
|
33
|
+
@root_dir = Dir.pwd.to_s
|
34
|
+
@logs_dir = "#@root_dir/logs"
|
35
|
+
@started_time = Time.new.strftime('%H-%M-%S--%y-%m-%d')
|
36
|
+
@errors_iteration = 0
|
37
|
+
|
36
38
|
Configuration.new if @login_mode == :manual
|
37
39
|
|
38
40
|
@local_stroage = {
|
@@ -72,12 +74,13 @@ class Instabot
|
|
72
74
|
print_banner: Config.options.print_banner,
|
73
75
|
proxy: Config.options.proxy,
|
74
76
|
tags: Config.options.tags,
|
75
|
-
unwanted_list: Config.options.unwanted_list,
|
76
77
|
use_proxy: Config.options.use_proxy,
|
77
78
|
use_tor: Config.options.use_tor,
|
78
79
|
wait_per_action: Config.options.wait_per_action,
|
80
|
+
log_status: Config.options.log_status,
|
81
|
+
add_tag_per_post: Config.options.add_tag_per_post,
|
82
|
+
unwanted_list: Config.options.unwanted_list,
|
79
83
|
white_list_users: Config.options.white_list_users,
|
80
|
-
log_status: Config.options.log_status
|
81
84
|
}
|
82
85
|
else
|
83
86
|
{
|
@@ -89,7 +92,6 @@ class Instabot
|
|
89
92
|
end
|
90
93
|
end
|
91
94
|
|
92
|
-
# bot starter
|
93
95
|
def intro(mode)
|
94
96
|
trap('INT') { exit! }
|
95
97
|
print_banner
|
data/lib/instabot/grabber.rb
CHANGED
@@ -35,11 +35,13 @@ module Grabber
|
|
35
35
|
tags = @media_information[:text].encode('UTF-8', invalid: :replace, undef: :replace, replace: '?').split(/\W+/)
|
36
36
|
id = 0
|
37
37
|
tags.each do |tag|
|
38
|
-
if
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
if id < options[:add_tag_per_post]
|
39
|
+
if tag == '_' || tag == '' || tag.nil? || tag.include?('?')
|
40
|
+
tags.delete(tag)
|
41
|
+
else
|
42
|
+
id += 1
|
43
|
+
Config.options.tags << tag
|
44
|
+
end
|
43
45
|
end
|
44
46
|
end
|
45
47
|
puts '[+] '.cyan + '[' + id.to_s.yellow + '] New tags added'
|
data/lib/instabot/logger.rb
CHANGED
@@ -30,7 +30,7 @@ module Log
|
|
30
30
|
if logs_status
|
31
31
|
time = Time.new.strftime('%H:%M:%S %y-%m-%d')
|
32
32
|
if File.exists?(@logs_dir)
|
33
|
-
File.open("#{@logs_dir}/logs-#{@
|
33
|
+
File.open("#{@logs_dir}/logs-#{@started_time}.log", 'a+') do |log_file|
|
34
34
|
log_file.puts "[#{@log_counter}] [#{time}] [#{from}] -- : #{text}"
|
35
35
|
end
|
36
36
|
else
|
data/lib/instabot/modes.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# modes module and helpers
|
2
2
|
module Modes
|
3
3
|
# main def and mode selector
|
4
4
|
def mode(mode = :default)
|
@@ -8,38 +8,27 @@ module Modes
|
|
8
8
|
log('[Auto] mode is turned on', 'MODES')
|
9
9
|
search(options[:tags])
|
10
10
|
@tomorrow = Time.new + 1.days
|
11
|
+
actions = %w[follow unfollow like comment]
|
11
12
|
loop do
|
12
13
|
if !maximums_are_full?
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
auto_like
|
32
|
-
else
|
33
|
-
puts '[+] '.cyan + 'Maximum likes per day'.upcase
|
34
|
-
log('Maximum likes per day', 'MODES')
|
35
|
-
end
|
36
|
-
|
37
|
-
if !comments_in_day_are_full?
|
38
|
-
@maximums[:comments_in_day] += 1
|
39
|
-
auto_comment
|
40
|
-
else
|
41
|
-
puts '[+] '.cyan + 'Maximum comments per day'.upcase
|
42
|
-
log('Maximum comments per day', 'MODES')
|
14
|
+
action = actions.sample
|
15
|
+
case action
|
16
|
+
when 'follow'
|
17
|
+
if !follows_in_day_are_full?
|
18
|
+
auto_follow
|
19
|
+
end
|
20
|
+
when 'unfollow'
|
21
|
+
if !unfollows_in_day_are_full?
|
22
|
+
auto_unfollow
|
23
|
+
end
|
24
|
+
when 'like'
|
25
|
+
if !likes_in_day_are_full?
|
26
|
+
auto_like
|
27
|
+
end
|
28
|
+
when 'comment'
|
29
|
+
if !comments_in_day_are_full?
|
30
|
+
auto_comment
|
31
|
+
end
|
43
32
|
end
|
44
33
|
else
|
45
34
|
check_date
|
@@ -51,6 +40,7 @@ module Modes
|
|
51
40
|
log('[Clean up] mode is turned on', 'MODES')
|
52
41
|
@local_stroage[:followed_users].each do |user|
|
53
42
|
unfollow(user)
|
43
|
+
fall_in_asleep
|
54
44
|
end
|
55
45
|
when :default
|
56
46
|
puts '[-] '.cyan + 'Please choose a mode'.upcase.red
|
@@ -60,22 +50,33 @@ module Modes
|
|
60
50
|
end
|
61
51
|
|
62
52
|
def auto_follow
|
63
|
-
all_users = users
|
64
|
-
id
|
65
|
-
puts '[+] '.cyan + "#{all_users.size} user is ready
|
53
|
+
all_users = @users
|
54
|
+
id = 0
|
55
|
+
puts '[+] '.cyan + "[follow] ".upcase.yellow.bold + "#{all_users.size} user is ready".upcase
|
66
56
|
while @maximums[:follows_in_day] < @maximums[:max_follows_per_day]
|
67
57
|
begin
|
68
58
|
id += 1 if all_users[id].nil? || all_users[id] == []
|
69
59
|
handle_user_information_data_by_user_id(all_users[id])
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
60
|
+
if !is_user_valid?(@user_information[:full_name])
|
61
|
+
puts '[+] '.cyan + "Trying to follow user [#{all_users[id]}]"
|
62
|
+
follow(@user_information[:id])
|
63
|
+
@users -= [all_users[id]]
|
64
|
+
puts '[+] '.cyan + 'User followed'.upcase.green.bold
|
65
|
+
@maximums[:follows_in_day] += 1
|
66
|
+
id += 1
|
67
|
+
fall_in_asleep
|
68
|
+
else
|
69
|
+
puts "unwanted user(#{@user_information[:full_name]}) [ignored]".yellow
|
70
|
+
id += 1
|
71
|
+
end
|
72
|
+
break
|
76
73
|
rescue Exception => e
|
77
74
|
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
78
|
-
|
75
|
+
# exit! if @errors_iteration > 3
|
76
|
+
# id += 1
|
77
|
+
# @errors_iteration += 1
|
78
|
+
# retry
|
79
|
+
break
|
79
80
|
retry
|
80
81
|
end
|
81
82
|
end
|
@@ -83,76 +84,96 @@ module Modes
|
|
83
84
|
|
84
85
|
def auto_unfollow
|
85
86
|
followed_users = @local_stroage[:followed_users]
|
86
|
-
puts '[+] '.cyan + "#{followed_users.size} user is ready
|
87
|
+
puts '[+] '.cyan + "[unfollow] ".upcase.yellow.bold + "#{followed_users.size} user is ready".upcase
|
87
88
|
id = 0
|
88
89
|
while @maximums[:unfollows_in_day] < @maximums[:max_unfollows_per_day]
|
89
90
|
if @local_stroage[:followed_users].size < @maximums[:max_unfollows_per_day]
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
91
|
+
if !followed_users.empty?
|
92
|
+
begin
|
93
|
+
puts '[+] '.cyan + "Trying to unfollow user [#{followed_users[id]}]"
|
94
|
+
unfollow(followed_users[id])
|
95
|
+
@local_stroage[:followed_users] -= [followed_users[id]]
|
96
|
+
puts '[+] '.cyan + 'User unfollowed'.upcase.bold.green
|
97
|
+
@maximums[:unfollows_in_day] += 1
|
98
|
+
id += 1
|
99
|
+
fall_in_asleep
|
100
|
+
break
|
101
|
+
rescue Exception => e
|
102
|
+
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
103
|
+
# exit! if @errors_iteration > 3
|
104
|
+
# id += 1
|
105
|
+
# @errors_iteration += 1
|
106
|
+
# retry
|
107
|
+
break
|
108
|
+
end
|
109
|
+
else
|
110
|
+
break
|
101
111
|
end
|
102
112
|
else
|
103
|
-
puts '[
|
104
|
-
exit
|
113
|
+
puts '[-] '.red + '[unfollow per day] is much bigger than [follow per day]'.upcase.red.bold
|
114
|
+
exit!
|
105
115
|
end
|
106
116
|
end
|
107
117
|
end
|
108
118
|
|
109
119
|
def auto_like
|
110
|
-
all_medias = medias
|
111
|
-
puts '[+] '.cyan + "#{all_medias.size} Media is ready
|
120
|
+
all_medias = @medias
|
121
|
+
puts '[+] '.cyan + "[like] ".upcase.yellow.bold + "#{all_medias.size} Media is ready".upcase
|
112
122
|
id = 0
|
113
123
|
while @maximums[:likes_in_day] < @maximums[:max_likes_per_day]
|
114
124
|
begin
|
115
125
|
handle_media_information_data(all_medias[id])
|
116
126
|
puts '[+] '.cyan + "Trying to like media [#{all_medias[id]}]"
|
117
127
|
like(@media_information[:id])
|
128
|
+
@medias -= [all_medias[id]]
|
118
129
|
puts '[+] '.cyan + 'Media liked'.upcase.green.bold
|
119
130
|
@maximums[:likes_in_day] += 1
|
120
131
|
id += 1
|
121
132
|
fall_in_asleep
|
133
|
+
break
|
122
134
|
rescue Exception => e
|
123
135
|
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
124
|
-
|
125
|
-
|
136
|
+
# exit! if @errors_iteration > 3
|
137
|
+
# id += 1
|
138
|
+
# @errors_iteration += 1
|
139
|
+
# retry
|
140
|
+
break
|
126
141
|
end
|
127
142
|
end
|
128
143
|
end
|
129
144
|
|
130
145
|
def auto_comment
|
131
|
-
all_medias = medias
|
132
|
-
|
146
|
+
all_medias = @medias
|
147
|
+
puts '[+] '.cyan + "[comment] ".upcase.yellow.bold + "#{all_medias.size} Media is ready".upcase
|
133
148
|
id = 0
|
134
149
|
while @maximums[:comments_in_day] < @maximums[:max_comments_per_day]
|
135
150
|
begin
|
136
151
|
handle_media_information_data(all_medias[id])
|
137
152
|
if @media_information[:comments_disabled]
|
138
|
-
puts '[-]'.
|
153
|
+
puts '[-]'.cyan + 'comments are disable' + "\t[ignored]".yellow
|
139
154
|
id += 1
|
140
|
-
next
|
155
|
+
# next
|
141
156
|
end
|
142
157
|
generated_comment = generate_a_comment
|
143
158
|
puts '[+] '.cyan + "Trying to send a comment[#{generated_comment}] to media[#{all_medias[id]}]"
|
144
159
|
comment(@media_information[:id], generated_comment)
|
160
|
+
@medias -= [all_medias[id]]
|
145
161
|
puts '[+] '.cyan + 'comment has been sent'.upcase.green.bold
|
146
162
|
@maximums[:comments_in_day] += 1
|
147
163
|
id += 1
|
148
164
|
fall_in_asleep
|
165
|
+
break
|
149
166
|
rescue Exception => e
|
150
167
|
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
151
|
-
|
152
|
-
|
168
|
+
# exit! if @errors_iteration > 3
|
169
|
+
# id += 1
|
170
|
+
# @errors_iteration += 1
|
171
|
+
# retry
|
172
|
+
break
|
153
173
|
end
|
154
174
|
end
|
155
175
|
end
|
176
|
+
|
156
177
|
# genrating random comment
|
157
178
|
def generate_a_comment
|
158
179
|
comment = ""
|
@@ -160,10 +181,19 @@ module Modes
|
|
160
181
|
comment
|
161
182
|
end
|
162
183
|
|
184
|
+
def is_user_valid?(user)
|
185
|
+
if options[:white_list_users].include?(user)
|
186
|
+
options[:unwanted_list].find { |unwanted| unwanted =~ /#{user}/ } != nil
|
187
|
+
else
|
188
|
+
return false
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
|
163
193
|
def check_date
|
164
194
|
time = (@tomorrow - Time.new).to_i # => remained time ...
|
165
195
|
if time.zero?
|
166
|
-
puts '[+] '.cyan + "
|
196
|
+
puts '[+] '.cyan + "[new day]".upcase
|
167
197
|
@local_stroage[:followed_users] = []
|
168
198
|
@local_stroage[:unfollowed_users] = []
|
169
199
|
@local_stroage[:liked_medias] = []
|
@@ -181,8 +211,7 @@ module Modes
|
|
181
211
|
end
|
182
212
|
end
|
183
213
|
|
184
|
-
def fall_in_asleep
|
185
|
-
time = options[:wait_per_action]
|
214
|
+
def fall_in_asleep(time=options[:wait_per_action])
|
186
215
|
puts '[+] '.cyan + "Waiting for #{time} seconds".upcase
|
187
216
|
sleep time
|
188
217
|
end
|
data/lib/instabot/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instabot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.80
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- eVanilla
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -126,6 +126,40 @@ dependencies:
|
|
126
126
|
- - ">="
|
127
127
|
- !ruby/object:Gem::Version
|
128
128
|
version: 2.7.5
|
129
|
+
- !ruby/object:Gem::Dependency
|
130
|
+
name: socksify
|
131
|
+
requirement: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - "~>"
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '1.7'
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.7.1
|
139
|
+
type: :runtime
|
140
|
+
prerelease: false
|
141
|
+
version_requirements: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.7'
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: 1.7.1
|
149
|
+
- !ruby/object:Gem::Dependency
|
150
|
+
name: net-telnet
|
151
|
+
requirement: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - "~>"
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 0.1.1
|
156
|
+
type: :runtime
|
157
|
+
prerelease: false
|
158
|
+
version_requirements: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - "~>"
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: 0.1.1
|
129
163
|
description: An instagram bot works without instagram api, only needs your username
|
130
164
|
and password
|
131
165
|
email:
|