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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c3419018fec180edea94e624c0522ed13d6e78ca
4
- data.tar.gz: 76ce7c414cae58d3dd256bd6f36e54128f01baac
3
+ metadata.gz: e65c19805d01e7d5cf548a2e0ddbddb22c140d23
4
+ data.tar.gz: fdfd65e986e357492c3fca461d8f88cb01a5b9e6
5
5
  SHA512:
6
- metadata.gz: 0aded35f0e651a7dea6d3e5978b9fcb3989333e6575a9dbd6fe687b0c7a0fbc68af57c0e00bd2c0c627e67658e86a2ebdea972ce4cd66d623546b2b649ab0240
7
- data.tar.gz: a884f333a577c19cd6d166650d08be3c7433083cbd44f86eb5bfcd47b4281dc09da2fb8432f0588655496cf29b0712572e27783ebd0ed79aa58cff1668179ee4
6
+ metadata.gz: 2ef72eecc7d4e9dbea93ee788be2ba6f8195afeae5dd1592fc9ce390b88b66162e836ab3164c9fc30be01d84a68c6a3ede9a7f0eea9c297cc4202502c213ca07
7
+ data.tar.gz: 0ca74a86ac3ca1a7c2cb94bc589e035a6ab05bb03907ab682b97428a3c0edd77bf06edaed3e2b1953dfd9a6cea79ce74cd9653eae0d56e0c3c82734871cd3e37
@@ -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
- save_action_data user_id, :follow
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
- save_action_data user_id, :unfollow
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
- save_action_data media_id, :like
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
- save_action_data media_id, :unlike
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
- save_action_data media_id, :comment
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
@@ -9,8 +9,8 @@ module Banner
9
9
  ██║██║ ╚████║███████║ ██║ ██║ ██║██████╔╝╚██████╔╝ ██║
10
10
  ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚═╝
11
11
 
12
- BANNER
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
@@ -1,43 +1,44 @@
1
1
  module Config
2
2
 
3
- class << self
4
- attr_accessor :options
5
- end
3
+ class << self
4
+ attr_accessor :options
5
+ end
6
6
 
7
- def self.setup
8
- self.options ||= Configuration.new
9
- yield(options)
10
- end
7
+ def self.setup
8
+ self.options ||= Configuration.new
9
+ yield(options)
10
+ end
11
11
 
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
- @password = nil
24
- @pre_load = true
25
- @print_banner = true
26
- @proxy = []
27
- @tags = %w[test hello hello_world birthday food]
28
- @unwanted_list = nil
29
- @use_proxy = false
30
- @username = nil
31
- @wait_per_action = 1 * 60
32
- @white_list_users = nil
33
- @comments = [
34
- %w[this the your],
35
- %w[photo picture pic shot snapshot],
36
- ['is', 'looks', 'feels', 'is really'],
37
- ['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'],
38
- ['.', '..', '...', '!', '!!', '!!!']
39
- ]
40
- end
41
- end
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
@@ -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
- attr_accessor :users, :medias
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
- def initialize(mode = :default)
17
- @login_mode = mode
18
- @users = []
19
- @medias = []
20
- @log_counter = 0
21
- @login_counter = 1
22
- @login_status = false
23
- @lib_dir = "#{Dir.pwd}/lib"
24
- @root_dir = Dir.pwd.to_s
25
- @logs_dir = "#@root_dir/logs"
26
- @global_time = Time.new.strftime('%H-%M-%S--%y-%m-%d')
27
- Configuration.new if @login_mode == :manual
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
- @local_stroage = {
30
- followed_users: [],
31
- unfollowed_users: [],
32
- liked_medias: [],
33
- unliked_medias: [],
34
- commented_medias: []
35
- }
37
+ @local_stroage = {
38
+ followed_users: [],
39
+ unfollowed_users: [],
40
+ liked_medias: [],
41
+ unliked_medias: [],
42
+ commented_medias: []
43
+ }
36
44
 
37
- @maximums = {
38
- follows_in_day: 0,
39
- unfollows_in_day: 0,
40
- likes_in_day: 0,
41
- comments_in_day: 0,
42
- max_follows_per_day: options[:max_follow_per_day],
43
- max_unfollows_per_day: options[:max_unfollow_per_day],
44
- max_likes_per_day: options[:max_like_per_day],
45
- max_comments_per_day: options[:max_comment_per_day]
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
- intro(mode)
49
- end
56
+ intro(mode)
57
+ end
50
58
 
51
- def options
52
- if @login_mode == :default
53
- {
54
- comments: Config.options.comments,
55
- max_comment_per_day: Config.options.max_comment_per_day,
56
- max_follow_per_day: Config.options.max_follow_per_day,
57
- max_like_per_day: Config.options.max_like_per_day,
58
- max_unfollow_per_day: Config.options.max_unfollow_per_day,
59
- password: Config.options.password,
60
- pre_load: Config.options.pre_load,
61
- print_banner: Config.options.print_banner,
62
- proxy: Config.options.proxy,
63
- tags: Config.options.tags,
64
- unwanted_list: Config.options.unwanted_list,
65
- use_proxy: Config.options.use_proxy,
66
- username: Config.options.username,
67
- wait_per_action: Config.options.wait_per_action,
68
- white_list_users: Config.options.white_list_users
69
- }
70
- else
71
- {
72
- max_comment_per_day: :infinite,
73
- max_follow_per_day: :infinite,
74
- max_like_per_day: :infinite,
75
- max_unfollow_per_day: :infinite
76
- }
77
- end
78
- end
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
- def intro(mode)
81
- trap('INT') { exit! }
82
- print_banner
83
- check_log_files
84
- log('log files are checked', 'CORE')
85
- log('Machine started', 'CORE')
86
- create_mechanic
87
- puts '[+] '.cyan + 'Processing successfully completed'
88
- log('Processing successfully completed', 'CORE')
89
- unless mode != :default
90
- login
91
- end
92
- end
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 = Hash[@agent.cookies.map { |key, _value| [key.name, key.value] }]
26
- @params = 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',
@@ -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 = 0
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 = "https://www.instagram.com/explore/tags/#{tag}/?__a=1"
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')
@@ -37,7 +37,7 @@ module Log
37
37
  @log_counter += 1
38
38
  end
39
39
 
40
- def save_action_data(id = 0, type = :default)
40
+ def save_action_log(id = 0, type = :default)
41
41
  case type
42
42
  when :follow
43
43
  write_file('followed_users.txt', id)
@@ -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 = users
62
- id = 0
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 "an error detected ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\nignored"
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 "an error detected ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\nignored"
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 = medias
111
+ all_medias = medias
109
112
  puts '[+] '.cyan + "#{all_medias.size} Media is ready to like".upcase
110
- id = 0
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 "an error detected ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\nignored"
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 = medias
130
- puts '[+] '.cyan + "#{all_medias.size} Media is ready to send a comment".upcase
131
- id = 0
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
- id += 1 if @informations[:comments_disabled]
136
- puts '[+] '.cyan + "Trying to send a comment to media [#{all_medias[id]}]"
137
- comment(@informations[:id], generate_a_comment)
138
- puts '[+] '.cyan + 'comment successfully has been sent'.upcase.green.bold
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 "an error detected ... #{e.class} #{e.message}\n#{e.backtrace.inspect}\nignored"
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
- comments = options[:comments]
152
- first = comments[0].sample
153
- second = comments[1].sample
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 # => seconds elapsed ...
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
- empty_space = IO.console.winsize[1] - text.size
176
- empty_space = 0 if empty_space < 0
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
@@ -1,5 +1,5 @@
1
1
  module Version
2
- VERSION = '0.1.52'.freeze
2
+ VERSION = '0.1.60'.freeze
3
3
  SUMMARY = 'Ruby instagram bot'.freeze
4
4
  DESCRIPTION = 'An instagram bot works without instagram api, only needs your username and password'.freeze
5
5
  end
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.52
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-04 00:00:00.000000000 Z
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: []