reddit_bot 1.6.5 → 1.6.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: afe3593cb266098860316251a4126efdccced3c0
4
- data.tar.gz: bcf920ee2ccf254f5f84aeef64c5a5471400165d
3
+ metadata.gz: fb0c92530c0139f3abcf98680613b118ab21eeb8
4
+ data.tar.gz: 68ff542161f8ea0e73bbeb0ca3ecd2a3fef6d618
5
5
  SHA512:
6
- metadata.gz: 00c876b7cde3299b2ec06ac5c8f7a34e2299a651ac91c7815d168e547c220c3c4a6317a4eab544c2e81656263ce9d2cf7687dcec062f90952a20d8092e2a6185
7
- data.tar.gz: c74d1fac23dafb7ed17165875b164ceec1f2cde7f21f1defc590661f2f6de86c1ec4b446e69320d2dce72491b42a4081cda2b0e5d8d5e979537697de7d8cf6f0
6
+ metadata.gz: 6f162ba96a47e7ea121f26dc2a1e4a79a23c5448355fdf931b6c518216881758aa527880957e608f8b356a1340dd00999154440678105517b44540d893e4e134
7
+ data.tar.gz: 9143a8d2ba251a0871097ab726eab1fdae48449a678363ae1c58c73a98baa204cb7f12d5b325bdc4d87a561f7bbf8e2c100540b96dee32681f8ed82b7034148b
data/README.md CHANGED
@@ -74,6 +74,7 @@ You obviously can't run these examples as is, because they use some dependencies
74
74
  :client_secret: Fqo.....................AFI
75
75
  :password: mybotpassword
76
76
  :login: MyBotUsername
77
+ # :user_agent: optional_custom_useragent_to_bypass_reddit_spam_protection
77
78
 
78
79
  To update the gem version in Gemfile.lock when using Gemfile like this: `gem "reddit_bot", "~>1.1.0"`, do the:
79
80
 
@@ -1,3 +1,3 @@
1
1
  module RedditBot
2
- VERSION = "1.6.5" # :nodoc:
2
+ VERSION = "1.6.6" # :nodoc:
3
3
  end
data/lib/reddit_bot.rb CHANGED
@@ -17,8 +17,7 @@ module RedditBot
17
17
  # [secrets] +Hash+ with keys :client_id, :client_secret, :password: and :login
18
18
  # [kwargs] keyword params may include :subreddit for clever methods
19
19
  def initialize secrets, **kwargs
20
- @secrets = secrets.values_at *%i{ client_id client_secret password login }
21
- @name = secrets[:login]
20
+ @name, @secret_password, @user_agent, *@secret_auth = secrets.values_at *%i{ login password user_agent client_id client_secret }
22
21
  # @ignore_captcha = true
23
22
  # @ignore_captcha = kwargs[:ignore_captcha] if kwargs.has_key?(:ignore_captcha)
24
23
  @subreddit = kwargs[:subreddit]
@@ -30,11 +29,12 @@ module RedditBot
30
29
  def json mtd, path, _form = []
31
30
  form = Hash[_form]
32
31
  response = JSON.parse resp_with_token mtd, path, form.merge({api_type: "json"})
33
- if response.is_a?(Hash) && response["json"] # for example, flairlist.json and {"error": 403} do not have it
34
- puts "ERROR OCCURED on #{[mtd, path]}" unless response["json"]["errors"].empty?
35
- # pp response["json"]
36
- response["json"]["errors"].each do |error, description|
37
- puts "error: #{[error, description]}"
32
+ if response.is_a?(Hash) && response["json"] && # for example, flairlist.json and {"error": 403} do not have it
33
+ !response["json"]["errors"].empty?
34
+ puts "ERROR OCCURED on #{[mtd, path]}"
35
+ fail "unknown how to handle multiple errors" if 1 < response["json"]["errors"].size
36
+ puts "error: #{response["json"]["errors"]}"
37
+ error, description = response["json"]["errors"].first
38
38
  case error
39
39
  when "ALREADY_SUB" ; puts "was rejected by moderator if you didn't see in dups"
40
40
  # when "BAD_CAPTCHA" ; update_captcha
@@ -42,9 +42,13 @@ module RedditBot
42
42
  # iden: @iden_and_captcha[0],
43
43
  # captcha: @iden_and_captcha[1],
44
44
  # } ) unless @ignore_captcha
45
+ when "RATELIMIT"
46
+ fail error unless description[/\Ayou are doing that too much\. try again in (\d) minutes\.\z/]
47
+ puts "retrying in #{$1.to_i + 1} minutes"
48
+ sleep ($1.to_i + 1) * 60
49
+ return json mtd, path, _form
45
50
  else ; fail error
46
51
  end
47
- end
48
52
  end
49
53
  response
50
54
  end
@@ -163,16 +167,17 @@ module RedditBot
163
167
 
164
168
  def token
165
169
  return @token_cached if @token_cached
170
+ # TODO handle with nive error message if we get 403 -- it's probably because of bad user agent
166
171
  response = JSON.parse reddit_resp :post,
167
172
  "https://www.reddit.com/api/v1/access_token", {
168
173
  grant_type: "password",
169
- username: @username = @secrets[3],
170
- password: @secrets[2],
174
+ username: @name,
175
+ password: @secret_password,
171
176
  }, {
172
- "User-Agent" => "bot/#{@username}/#{RedditBot::VERSION} by /u/nakilon",
173
- }, [@secrets[0], @secrets[1]]
177
+ "User-Agent" => "bot/#{@user_agent || @name}/#{RedditBot::VERSION} by /u/nakilon",
178
+ }, @secret_auth
174
179
  unless @token_cached = response["access_token"]
175
- fail "bot #{@username} isn't a 'developer' of app at https://www.reddit.com/prefs/apps/" if response == {"error"=>"invalid_grant"}
180
+ fail "bot #{@name} isn't a 'developer' of app at https://www.reddit.com/prefs/apps/" if response == {"error"=>"invalid_grant"}
176
181
  fail response.inspect
177
182
  end
178
183
  puts "new token is: #{@token_cached}"
@@ -195,10 +200,10 @@ module RedditBot
195
200
  begin
196
201
  reddit_resp mtd, "https://oauth.reddit.com" + path, form, {
197
202
  "Authorization" => "bearer #{token}",
198
- "User-Agent" => "bot/#{@username}/#{RedditBot::VERSION} by /u/nakilon",
203
+ "User-Agent" => "bot/#{@user_agent || @name}/#{RedditBot::VERSION} by /u/nakilon",
199
204
  }
200
205
  rescue NetHTTPUtils::Error => e
201
- # sleep 5
206
+ sleep 5
202
207
  raise unless e.code == 401
203
208
  @token_cached = nil
204
209
  retry
@@ -206,9 +211,9 @@ module RedditBot
206
211
  end
207
212
 
208
213
  def reddit_resp *args
209
- mtd, url, form, headers, base_auth = *args
214
+ mtd, url, form, headers, basic_auth = *args
210
215
  begin
211
- NetHTTPUtils.request_data(url, mtd, form: form, header: headers, auth: base_auth) do |response|
216
+ NetHTTPUtils.request_data(url, mtd, form: form, header: headers, auth: basic_auth) do |response|
212
217
  next unless remaining = response.to_hash["x-ratelimit-remaining"]
213
218
  if Gem::Platform.local.os == "darwin"
214
219
  puts %w{
data/reddit_bot.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |spec|
15
15
  # spec.require_paths = ["lib"]
16
16
 
17
17
  spec.add_runtime_dependency "json"
18
+ spec.add_runtime_dependency "nethttputils", "~> 0.2.4.1"
18
19
  # spec.add_development_dependency "bundler", "~> 1.11"
19
20
  # spec.add_development_dependency "rake", "~> 10.0"
20
21
  # spec.add_development_dependency "rspec", "~> 3.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reddit_bot
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.5
4
+ version: 1.6.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor Maslov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-13 00:00:00.000000000 Z
11
+ date: 2018-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nethttputils
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.4.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.4.1
27
41
  description: better than PRAW
28
42
  email:
29
43
  - nakilon@gmail.com