instabot 0.1.52 → 0.1.60
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/instabot/actions.rb +5 -5
- data/lib/instabot/banner.rb +2 -2
- data/lib/instabot/config.rb +39 -38
- data/lib/instabot/core.rb +92 -82
- data/lib/instabot/create_protocol.rb +3 -3
- data/lib/instabot/grabber.rb +7 -4
- data/lib/instabot/logger.rb +1 -1
- data/lib/instabot/modes.rb +31 -29
- data/lib/instabot/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e65c19805d01e7d5cf548a2e0ddbddb22c140d23
|
4
|
+
data.tar.gz: fdfd65e986e357492c3fca461d8f88cb01a5b9e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ef72eecc7d4e9dbea93ee788be2ba6f8195afeae5dd1592fc9ce390b88b66162e836ab3164c9fc30be01d84a68c6a3ede9a7f0eea9c297cc4202502c213ca07
|
7
|
+
data.tar.gz: 0ca74a86ac3ca1a7c2cb94bc589e035a6ab05bb03907ab682b97428a3c0edd77bf06edaed3e2b1953dfd9a6cea79ce74cd9653eae0d56e0c3c82734871cd3e37
|
data/lib/instabot/actions.rb
CHANGED
@@ -5,7 +5,7 @@ module Actions
|
|
5
5
|
url = "https://www.instagram.com/web/friendships/#{user_id}/follow/"
|
6
6
|
set_mechanic_data
|
7
7
|
response = @agent.post(url, @params, @headers)
|
8
|
-
|
8
|
+
save_action_log user_id, :follow
|
9
9
|
@local_stroage[:followed_users] << user_id
|
10
10
|
{ user_id: user_id, response_code: response.code }
|
11
11
|
end
|
@@ -16,7 +16,7 @@ module Actions
|
|
16
16
|
url = "https://www.instagram.com/web/friendships/#{user_id}/unfollow/"
|
17
17
|
set_mechanic_data
|
18
18
|
response = @agent.post(url, @params, @headers)
|
19
|
-
|
19
|
+
save_action_log user_id, :unfollow
|
20
20
|
@local_stroage[:unfollowed_users] << user_id
|
21
21
|
{ user_id: user_id, response_code: response.code }
|
22
22
|
end
|
@@ -27,7 +27,7 @@ module Actions
|
|
27
27
|
url = "https://www.instagram.com/web/likes/#{media_id}/like/"
|
28
28
|
set_mechanic_data
|
29
29
|
response = @agent.post(url, @params, @headers)
|
30
|
-
|
30
|
+
save_action_log media_id, :like
|
31
31
|
@local_stroage[:liked_medias] << media_id
|
32
32
|
{ media_id: media_id, response_code: response.code }
|
33
33
|
end
|
@@ -38,7 +38,7 @@ module Actions
|
|
38
38
|
url = "https://www.instagram.com/web/likes/#{media_id}/unlike/"
|
39
39
|
set_mechanic_data
|
40
40
|
response = @agent.post(url, @params, @headers)
|
41
|
-
|
41
|
+
save_action_log media_id, :unlike
|
42
42
|
@local_stroage[:unliked_medias] << media_id
|
43
43
|
{ media_id: media_id, response_code: response.code }
|
44
44
|
end
|
@@ -49,7 +49,7 @@ module Actions
|
|
49
49
|
url = "https://www.instagram.com/web/comments/#{media_id}/add/"
|
50
50
|
set_mechanic_data(comment_text: text.to_s)
|
51
51
|
response = @agent.post(url, @params, @headers)
|
52
|
-
|
52
|
+
save_action_log media_id, :comment
|
53
53
|
@local_stroage[:commented_medias] << media_id
|
54
54
|
{ media_id: media_id, response_code: response.code }
|
55
55
|
end
|
data/lib/instabot/banner.rb
CHANGED
@@ -9,8 +9,8 @@ module Banner
|
|
9
9
|
██║██║ ╚████║███████║ ██║ ██║ ██║██████╔╝╚██████╔╝ ██║
|
10
10
|
╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝
|
11
11
|
|
12
|
-
|
13
|
-
puts 'An instagram bot works without instagram api '.white.bold + 'github.com/'.cyan + 'eVanilla'.cyan.bold.italic
|
12
|
+
BANNER
|
13
|
+
puts 'An instagram bot works without instagram api '.white.bold + 'github.com/'.cyan + 'eVanilla/instabot.rb'.cyan.bold.italic
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/instabot/config.rb
CHANGED
@@ -1,43 +1,44 @@
|
|
1
1
|
module Config
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
class << self
|
4
|
+
attr_accessor :options
|
5
|
+
end
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def self.setup
|
8
|
+
self.options ||= Configuration.new
|
9
|
+
yield(options)
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
12
|
+
class Configuration
|
13
|
+
attr_accessor :username, :password, :tags, :use_proxy, :proxy, :comments,
|
14
|
+
:print_banner, :pre_load, :wait_per_action, :infinite_tags,
|
15
|
+
:max_like_per_day, :max_follow_per_day, :max_unfollow_per_day,
|
16
|
+
:max_comment_per_day, :unwanted_list, :white_list_users
|
17
|
+
def initialize
|
18
|
+
@infinite_tags = true
|
19
|
+
@max_comment_per_day = 50
|
20
|
+
@max_follow_per_day = 50
|
21
|
+
@max_like_per_day = 50
|
22
|
+
@max_unfollow_per_day = 50
|
23
|
+
@username = nil
|
24
|
+
@password = nil
|
25
|
+
@pre_load = true
|
26
|
+
@print_banner = true
|
27
|
+
@proxy = nil
|
28
|
+
@tags = %w[test hello hello_world birthday food]
|
29
|
+
@unwanted_list = nil
|
30
|
+
@use_proxy = false
|
31
|
+
@username = nil
|
32
|
+
@wait_per_action = 1 * 60
|
33
|
+
@white_list_users = nil
|
34
|
+
@comments = [
|
35
|
+
%w[this the your],
|
36
|
+
%w[photo picture pic shot snapshot],
|
37
|
+
%w[is looks feels is really],
|
38
|
+
%w[great super good very good good wow WOW cool GREAT magnificent magical very cool stylish beautiful so beautiful so stylish so professional lovely so lovely very lovely glorious so glorious very glorious adorable excellent amazing],
|
39
|
+
%w[. .. ... ! !! !!!]
|
40
|
+
]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
43
44
|
end
|
data/lib/instabot/core.rb
CHANGED
@@ -1,93 +1,103 @@
|
|
1
|
+
#
|
2
|
+
# @descriptions An instagram bot works without instagram api and only needs your username & password
|
3
|
+
# @Authors eVanilla + https://github.com/eVanilla/instabot.rb/graphs/contributors
|
4
|
+
#
|
5
|
+
|
1
6
|
%w[colorize mechanize io/console hashie json logger pp active_support/core_ext/numeric/time rbconfig].each { |gem| require gem }
|
2
7
|
|
8
|
+
# main core class
|
3
9
|
class Instabot
|
4
|
-
include Version
|
5
|
-
include Modes
|
6
|
-
include Actions
|
7
|
-
include Banner
|
8
|
-
include Config
|
9
|
-
include Grabber
|
10
|
-
include Login
|
11
|
-
include Log
|
12
|
-
include Protocol
|
13
10
|
|
14
|
-
|
11
|
+
# including helpers
|
12
|
+
include Version
|
13
|
+
include Modes
|
14
|
+
include Actions
|
15
|
+
include Banner
|
16
|
+
include Config
|
17
|
+
include Grabber
|
18
|
+
include Login
|
19
|
+
include Log
|
20
|
+
include Protocol
|
21
|
+
|
22
|
+
attr_accessor :users, :medias, :informations
|
15
23
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
def initialize(mode = :default)
|
25
|
+
@login_mode = mode
|
26
|
+
@users = []
|
27
|
+
@medias = []
|
28
|
+
@log_counter = 0
|
29
|
+
@login_counter = 1
|
30
|
+
@login_status = false
|
31
|
+
@lib_dir = "#{Dir.pwd}/lib"
|
32
|
+
@root_dir = Dir.pwd.to_s
|
33
|
+
@logs_dir = "#@root_dir/logs"
|
34
|
+
@global_time = Time.new.strftime('%H-%M-%S--%y-%m-%d')
|
35
|
+
Configuration.new if @login_mode == :manual
|
28
36
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
37
|
+
@local_stroage = {
|
38
|
+
followed_users: [],
|
39
|
+
unfollowed_users: [],
|
40
|
+
liked_medias: [],
|
41
|
+
unliked_medias: [],
|
42
|
+
commented_medias: []
|
43
|
+
}
|
36
44
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
@maximums = {
|
46
|
+
follows_in_day: 0,
|
47
|
+
unfollows_in_day: 0,
|
48
|
+
likes_in_day: 0,
|
49
|
+
comments_in_day: 0,
|
50
|
+
max_follows_per_day: options[:max_follow_per_day],
|
51
|
+
max_unfollows_per_day: options[:max_unfollow_per_day],
|
52
|
+
max_likes_per_day: options[:max_like_per_day],
|
53
|
+
max_comments_per_day: options[:max_comment_per_day]
|
54
|
+
}
|
47
55
|
|
48
|
-
|
49
|
-
|
56
|
+
intro(mode)
|
57
|
+
end
|
50
58
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
59
|
+
# will return Config.options...
|
60
|
+
def options
|
61
|
+
if @login_mode == :default
|
62
|
+
{
|
63
|
+
comments: Config.options.comments,
|
64
|
+
max_comment_per_day: Config.options.max_comment_per_day,
|
65
|
+
max_follow_per_day: Config.options.max_follow_per_day,
|
66
|
+
max_like_per_day: Config.options.max_like_per_day,
|
67
|
+
max_unfollow_per_day: Config.options.max_unfollow_per_day,
|
68
|
+
username: Config.options.username,
|
69
|
+
password: Config.options.password,
|
70
|
+
pre_load: Config.options.pre_load,
|
71
|
+
print_banner: Config.options.print_banner,
|
72
|
+
proxy: Config.options.proxy,
|
73
|
+
tags: Config.options.tags,
|
74
|
+
unwanted_list: Config.options.unwanted_list,
|
75
|
+
use_proxy: Config.options.use_proxy,
|
76
|
+
wait_per_action: Config.options.wait_per_action,
|
77
|
+
white_list_users: Config.options.white_list_users
|
78
|
+
}
|
79
|
+
else
|
80
|
+
{
|
81
|
+
max_comment_per_day: :infinite,
|
82
|
+
max_follow_per_day: :infinite,
|
83
|
+
max_like_per_day: :infinite,
|
84
|
+
max_unfollow_per_day: :infinite
|
85
|
+
}
|
86
|
+
end
|
87
|
+
end
|
79
88
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
89
|
+
# bot starter
|
90
|
+
def intro(mode)
|
91
|
+
trap('INT') { exit! }
|
92
|
+
print_banner
|
93
|
+
check_log_files
|
94
|
+
log('log files are checked', 'CORE')
|
95
|
+
log('Machine started', 'CORE')
|
96
|
+
create_mechanic
|
97
|
+
puts '[+] '.cyan + 'Processing successfully completed'
|
98
|
+
log('Processing successfully completed', 'CORE')
|
99
|
+
unless mode != :default
|
100
|
+
login
|
101
|
+
end
|
102
|
+
end
|
93
103
|
end
|
@@ -22,9 +22,9 @@ module Protocol
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def set_mechanic_data(params = {})
|
25
|
-
@cookies
|
26
|
-
@params
|
27
|
-
@headers
|
25
|
+
@cookies = Hash[@agent.cookies.map { |key, _value| [key.name, key.value] }]
|
26
|
+
@params = params
|
27
|
+
@headers = {
|
28
28
|
'Cookie' => "mid=#{@cookies['mid']}; csrftoken=#{@cookies['csrftoken']}; sessionid=#{@cookies['sessionid']}; ds_user_id=#{@cookies['ds_user_id']}; rur=#{@cookies['rur']}; s_network=#{@cookies['s_network']}; ig_pr= 1; ig_vw=1920",
|
29
29
|
'X-CSRFToken' => (@cookies['csrftoken']).to_s,
|
30
30
|
'X-Requested-With' => 'XMLHttpRequest',
|
data/lib/instabot/grabber.rb
CHANGED
@@ -15,6 +15,7 @@ module Grabber
|
|
15
15
|
is_private: data.deep_find('is_private'),
|
16
16
|
is_verified: data.deep_find('is_verified'),
|
17
17
|
username: data.deep_find('username'),
|
18
|
+
posts: data.deep_find('media')['count'],
|
18
19
|
full_name: data.deep_find('full_name'),
|
19
20
|
id: data.deep_find('id')
|
20
21
|
}
|
@@ -28,20 +29,22 @@ module Grabber
|
|
28
29
|
|
29
30
|
@informations = {
|
30
31
|
id: data.deep_find('id'),
|
32
|
+
full_name: data.deep_find('full_name'),
|
33
|
+
owner: data.deep_find('owner')['username'],
|
31
34
|
is_video: data.deep_find('is_video'),
|
32
35
|
comments_disabled: data.deep_find('comments_disabled'),
|
33
36
|
viewer_has_liked: data.deep_find('viewer_has_liked'),
|
34
37
|
has_blocked_viewer: data.deep_find('has_blocked_viewer'),
|
35
38
|
followed_by_viewer: data.deep_find('followed_by_viewer'),
|
36
|
-
full_name: data.deep_find('full_name'),
|
37
39
|
is_private: data.deep_find('is_private'),
|
38
40
|
is_verified: data.deep_find('is_verified'),
|
39
41
|
requested_by_viewer: data.deep_find('requested_by_viewer'),
|
40
|
-
text: data.deep_find('text')
|
42
|
+
text: data.deep_find('text')
|
41
43
|
}
|
44
|
+
|
42
45
|
unless @infinite_tags == true
|
43
46
|
tags = @informations[:text].encode('UTF-8', invalid: :replace, undef: :replace, replace: '?').split(/\W+/)
|
44
|
-
id
|
47
|
+
id = 0
|
45
48
|
tags.each do |tag|
|
46
49
|
if tag == '_' || tag == '' || tag.nil?
|
47
50
|
tags.delete(tag)
|
@@ -58,7 +61,7 @@ module Grabber
|
|
58
61
|
tags.each do |tag|
|
59
62
|
puts '[+] '.cyan + "Searching in hashtag [##{tag}]"
|
60
63
|
log("Searching in hashtags [##{tag}]", 'GRABBER')
|
61
|
-
url
|
64
|
+
url = "https://www.instagram.com/explore/tags/#{tag}/?__a=1"
|
62
65
|
response = @agent.get(url)
|
63
66
|
data = parse_response(response.body)
|
64
67
|
owners = data.deep_find_all('owner')
|
data/lib/instabot/logger.rb
CHANGED
data/lib/instabot/modes.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
|
2
|
+
# automatic module and helpers
|
1
3
|
module Modes
|
4
|
+
# main def and mode selector
|
2
5
|
def mode(mode = :default)
|
3
6
|
case mode
|
4
7
|
when :infinite
|
@@ -58,8 +61,8 @@ module Modes
|
|
58
61
|
end
|
59
62
|
|
60
63
|
def auto_follow
|
61
|
-
all_users
|
62
|
-
id
|
64
|
+
all_users = users
|
65
|
+
id = 0
|
63
66
|
puts '[+] '.cyan + "#{all_users.size} user is ready to follow".upcase
|
64
67
|
while @maximums[:follows_in_day] < @maximums[:max_follows_per_day]
|
65
68
|
begin
|
@@ -72,7 +75,7 @@ module Modes
|
|
72
75
|
id += 1
|
73
76
|
fall_in_asleep
|
74
77
|
rescue Exception => e
|
75
|
-
puts "
|
78
|
+
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
76
79
|
id += 1
|
77
80
|
retry
|
78
81
|
end
|
@@ -93,7 +96,7 @@ module Modes
|
|
93
96
|
id += 1
|
94
97
|
fall_in_asleep
|
95
98
|
rescue Exception => e
|
96
|
-
puts "
|
99
|
+
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
97
100
|
id += 1
|
98
101
|
retry
|
99
102
|
end
|
@@ -105,9 +108,9 @@ module Modes
|
|
105
108
|
end
|
106
109
|
|
107
110
|
def auto_like
|
108
|
-
all_medias
|
111
|
+
all_medias = medias
|
109
112
|
puts '[+] '.cyan + "#{all_medias.size} Media is ready to like".upcase
|
110
|
-
id
|
113
|
+
id = 0
|
111
114
|
while @maximums[:likes_in_day] < @maximums[:max_likes_per_day]
|
112
115
|
begin
|
113
116
|
get_media_informations(all_medias[id])
|
@@ -118,7 +121,7 @@ module Modes
|
|
118
121
|
id += 1
|
119
122
|
fall_in_asleep
|
120
123
|
rescue Exception => e
|
121
|
-
puts "
|
124
|
+
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
122
125
|
id += 1
|
123
126
|
retry
|
124
127
|
end
|
@@ -126,39 +129,40 @@ module Modes
|
|
126
129
|
end
|
127
130
|
|
128
131
|
def auto_comment
|
129
|
-
all_medias
|
130
|
-
puts '[+] '.cyan + "#{all_medias.size} Media is ready
|
131
|
-
id
|
132
|
+
all_medias = medias
|
133
|
+
# puts '[+] '.cyan + "#{all_medias.size} Media is ready".upcase
|
134
|
+
id = 0
|
132
135
|
while @maximums[:comments_in_day] < @maximums[:max_comments_per_day]
|
133
136
|
begin
|
134
137
|
get_media_informations(all_medias[id])
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
138
|
+
if @informations[:comments_disabled]
|
139
|
+
puts '[-]'.red + 'comments are disable' + "\t[IGNORING]".yellow
|
140
|
+
id += 1
|
141
|
+
next
|
142
|
+
end
|
143
|
+
generated_comment = generate_a_comment
|
144
|
+
puts '[+] '.cyan + "Trying to send a comment[#{generated_comment}] to media[#{all_medias[id]}]"
|
145
|
+
comment(@informations[:id], generated_comment)
|
146
|
+
puts '[+] '.cyan + 'comment has been sent'.upcase.green.bold
|
139
147
|
@maximums[:comments_in_day] += 1
|
140
148
|
id += 1
|
141
149
|
fall_in_asleep
|
142
150
|
rescue Exception => e
|
143
|
-
puts "
|
151
|
+
puts "An error occured ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\n[ignored]"
|
144
152
|
id += 1
|
145
153
|
retry
|
146
154
|
end
|
147
155
|
end
|
148
156
|
end
|
149
|
-
|
157
|
+
# genrating random comment
|
150
158
|
def generate_a_comment
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
third = comments[2].sample
|
155
|
-
fourth = comments[3].sample
|
156
|
-
fifth = comments[4].sample
|
157
|
-
"#{first} #{second} #{third} #{fourth}#{fifth}"
|
159
|
+
comment = ""
|
160
|
+
options[:comments].each { |c| comment << " #{c.sample}" }
|
161
|
+
comment
|
158
162
|
end
|
159
163
|
|
160
164
|
def check_date
|
161
|
-
time = (@tomorrow - Time.new).to_i # =>
|
165
|
+
time = (@tomorrow - Time.new).to_i # => remained time ...
|
162
166
|
if time.zero?
|
163
167
|
puts '[+] '.cyan + "It's a new day"
|
164
168
|
@local_stroage[:followed_users] = []
|
@@ -172,11 +176,9 @@ module Modes
|
|
172
176
|
@tomorrow = Time.new + 1.days
|
173
177
|
search(options[:tags]) unless @infinite_tags == true
|
174
178
|
else
|
175
|
-
|
176
|
-
|
177
|
-
print "\r[+] ".cyan + "#{time} seconds remained".upcase
|
179
|
+
time = Time.at(time).utc.strftime("%H:%M:%S")
|
180
|
+
print "\r[+] ".cyan + "#{time} remained".upcase + ' '*10 # the empty space
|
178
181
|
$stdout.flush
|
179
|
-
print ' ' * empty_space
|
180
182
|
end
|
181
183
|
end
|
182
184
|
|
@@ -206,4 +208,4 @@ module Modes
|
|
206
208
|
likes_in_day_are_full? && follows_in_day_are_full? &&
|
207
209
|
unfollows_in_day_are_full? && comments_in_day_are_full?
|
208
210
|
end
|
209
|
-
end
|
211
|
+
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.60
|
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-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,7 +129,7 @@ dependencies:
|
|
129
129
|
description: An instagram bot works without instagram api, only needs your username
|
130
130
|
and password
|
131
131
|
email:
|
132
|
-
-
|
132
|
+
- evoke.lektrique@gmail.com
|
133
133
|
executables: []
|
134
134
|
extensions: []
|
135
135
|
extra_rdoc_files: []
|