insta 0.2.9 → 0.3.0

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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/Rakefile +30 -3
  4. data/exe/insta +6 -0
  5. data/lib/insta/ansi.rb +30 -0
  6. data/lib/insta/ci.rb +21 -0
  7. data/lib/insta/cli.rb +714 -0
  8. data/lib/insta/config_manifest.rb +56 -0
  9. data/lib/insta/configuration.rb +86 -2
  10. data/lib/insta/diff.rb +134 -0
  11. data/lib/insta/inline/call_finder.rb +37 -0
  12. data/lib/insta/inline/edit.rb +21 -0
  13. data/lib/insta/inline/file_patcher.rb +269 -0
  14. data/lib/insta/inline/pending_registry.rb +57 -0
  15. data/lib/insta/inline/pending_store.rb +145 -0
  16. data/lib/insta/minitest/assertions.rb +254 -0
  17. data/lib/insta/minitest/lifecycle.rb +12 -0
  18. data/lib/insta/minitest.rb +8 -0
  19. data/lib/insta/pending_locations.rb +64 -0
  20. data/lib/insta/pending_reporter.rb +47 -0
  21. data/lib/insta/redaction/applicator.rb +89 -0
  22. data/lib/insta/redaction/selector.rb +193 -0
  23. data/lib/insta/rspec/hooks.rb +18 -0
  24. data/lib/insta/rspec/matchers.rb +248 -0
  25. data/lib/insta/rspec.rb +7 -0
  26. data/lib/insta/serializers/base.rb +31 -0
  27. data/lib/insta/serializers/inspect.rb +14 -0
  28. data/lib/insta/serializers/json.rb +16 -0
  29. data/lib/insta/serializers/string.rb +14 -0
  30. data/lib/insta/serializers/yaml.rb +16 -0
  31. data/lib/insta/snapshot.rb +74 -0
  32. data/lib/insta/snapshot_content.rb +44 -0
  33. data/lib/insta/snapshot_file.rb +64 -0
  34. data/lib/insta/snapshot_mismatch_handler.rb +34 -0
  35. data/lib/insta/snapshot_name.rb +51 -0
  36. data/lib/insta/syntax_highlight.rb +20 -0
  37. data/lib/insta/update_coordinator.rb +22 -0
  38. data/lib/insta/version.rb +3 -1
  39. data/lib/insta.rb +42 -8
  40. data/lib/minitest/insta_plugin.rb +17 -0
  41. data/sig/insta/ansi.rbs +28 -0
  42. data/sig/insta/ci.rbs +10 -0
  43. data/sig/insta/cli.rbs +150 -0
  44. data/sig/insta/config_manifest.rbs +27 -0
  45. data/sig/insta/configuration.rbs +48 -0
  46. data/sig/insta/diff.rbs +38 -0
  47. data/sig/insta/inline/call_finder.rbs +22 -0
  48. data/sig/insta/inline/edit.rbs +18 -0
  49. data/sig/insta/inline/file_patcher.rbs +55 -0
  50. data/sig/insta/inline/pending_registry.rbs +22 -0
  51. data/sig/insta/inline/pending_store.rbs +41 -0
  52. data/sig/insta/minitest/assertions.rbs +52 -0
  53. data/sig/insta/minitest/lifecycle.rbs +10 -0
  54. data/sig/insta/minitest.rbs +2 -0
  55. data/sig/insta/pending_locations.rbs +22 -0
  56. data/sig/insta/pending_reporter.rbs +14 -0
  57. data/sig/insta/redaction/applicator.rbs +22 -0
  58. data/sig/insta/redaction/selector.rbs +58 -0
  59. data/sig/insta/rspec/hooks.rbs +10 -0
  60. data/sig/insta/rspec/matchers.rbs +71 -0
  61. data/sig/insta/rspec.rbs +2 -0
  62. data/sig/insta/serializers/base.rbs +21 -0
  63. data/sig/insta/serializers/inspect.rbs +10 -0
  64. data/sig/insta/serializers/json.rbs +10 -0
  65. data/sig/insta/serializers/string.rbs +10 -0
  66. data/sig/insta/serializers/yaml.rbs +10 -0
  67. data/sig/insta/snapshot.rbs +37 -0
  68. data/sig/insta/snapshot_content.rbs +14 -0
  69. data/sig/insta/snapshot_file.rbs +27 -0
  70. data/sig/insta/snapshot_mismatch_handler.rbs +12 -0
  71. data/sig/insta/snapshot_name.rbs +17 -0
  72. data/sig/insta/syntax_highlight.rbs +8 -0
  73. data/sig/insta/update_coordinator.rbs +11 -0
  74. data/sig/insta/version.rbs +5 -0
  75. data/sig/insta.rbs +12 -0
  76. data/sig/minitest/insta_plugin.rbs +6 -0
  77. data/sig/vendor/difftastic.rbs +19 -0
  78. data/sig/vendor/irb.rbs +5 -0
  79. data/sig/vendor/psych.rbs +7 -0
  80. data/sig/vendor/rspec.rbs +9 -0
  81. data/sig/vendor/rubygems.rbs +3 -0
  82. metadata +109 -54
  83. data/.DS_Store +0 -0
  84. data/.gitignore +0 -11
  85. data/.rspec +0 -3
  86. data/.travis.yml +0 -5
  87. data/CODE_OF_CONDUCT.md +0 -74
  88. data/Gemfile +0 -6
  89. data/Gemfile.lock +0 -35
  90. data/README.md +0 -41
  91. data/bin/console +0 -14
  92. data/bin/setup +0 -8
  93. data/insta.gemspec +0 -36
  94. data/lib/.DS_Store +0 -0
  95. data/lib/insta/account.rb +0 -127
  96. data/lib/insta/api.rb +0 -88
  97. data/lib/insta/constants.rb +0 -21
  98. data/lib/insta/device.rb +0 -11852
  99. data/lib/insta/feed.rb +0 -89
  100. data/lib/insta/location.rb +0 -18
  101. data/lib/insta/proxy_manager.rb +0 -23
  102. data/lib/insta/tag.rb +0 -18
  103. data/lib/insta/user.rb +0 -103
data/lib/insta/feed.rb DELETED
@@ -1,89 +0,0 @@
1
- module Insta
2
- module Feed
3
- def self.user_media(user, data)
4
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
5
- rank_token = Insta::API.generate_rank_token user.session.scan(/ds_user_id=([\d]+);/)[0][0]
6
- endpoint = "https://i.instagram.com/api/v1/feed/user/#{user_id}/"
7
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
8
- param = "?rank_token=#{rank_token}" +
9
- (!data[:max_id].nil? ? '&max_id=' + data[:max_id] : '')
10
- result = Insta::API.http(
11
- url: endpoint + param,
12
- method: 'GET',
13
- user: user,
14
- proxy: proxies&.next
15
- )
16
-
17
- JSON.parse result.body
18
- end
19
-
20
- def self.user_media_graphql(user, data)
21
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
22
- endpoint = "https://www.instagram.com/graphql/query/?query_id=17880160963012870&id=#{user_id}&first=80&after="
23
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
24
- result = Insta::API.http(
25
- url: endpoint,
26
- method: 'GET',
27
- user: user,
28
- proxy: proxies&.next,
29
- desktop: true
30
- )
31
-
32
- JSON.parse result.body
33
- end
34
-
35
- def self.user_followers(user, data, limit)
36
- has_next_page = true
37
- followers = []
38
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
39
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
40
- data[:rank_token] = Insta::API.generate_rank_token user.session.scan(/ds_user_id=([\d]+);/)[0][0]
41
- while has_next_page && limit > followers.size
42
- response = user_followers_next_page(user, user_id, data, proxies)
43
- has_next_page = !response['next_max_id'].nil?
44
- data[:max_id] = response['next_max_id']
45
- followers += response['users']
46
- end
47
- limit.infinite? ? followers : followers[0...limit]
48
- end
49
-
50
- def self.user_followers_graphql(user, data, limit)
51
- has_next_page = true
52
- followers = []
53
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
54
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
55
- while has_next_page && limit > followers.size
56
- response = user_followers_graphql_next_page(user, user_id, data, proxies)
57
- has_next_page = response['data']['user']['edge_followed_by']['page_info']['has_next_page']
58
- data[:end_cursor] = response['data']['user']['edge_followed_by']['page_info']['end_cursor']
59
- followers += response['data']['user']['edge_followed_by']['edges']
60
- end
61
- limit.infinite? ? followers : followers[0...limit]
62
- end
63
-
64
- def self.user_followers_graphql_next_page(user, user_id, data, proxies)
65
- endpoint = "https://www.instagram.com/graphql/query/?query_id=17851374694183129&id=#{user_id}&first=5000"
66
- param = (!data[:end_cursor].nil? ? "&after=#{data[:end_cursor]}" : '')
67
- result = Insta::API.http(
68
- url: endpoint + param,
69
- method: 'GET',
70
- user: user,
71
- proxy: proxies&.next
72
- )
73
- JSON.parse result.body
74
- end
75
-
76
- def self.user_followers_next_page(user, user_id, data, proxies)
77
- endpoint = "https://i.instagram.com/api/v1/friendships/#{user_id}/followers/"
78
- param = "?rank_token=#{data[:rank_token]}" +
79
- (!data[:max_id].nil? ? '&max_id=' + data[:max_id] : '')
80
- result = Insta::API.http(
81
- url: endpoint + param,
82
- method: 'GET',
83
- user: user,
84
- proxy: proxies&.next
85
- )
86
- JSON.parse result.body
87
- end
88
- end
89
- end
@@ -1,18 +0,0 @@
1
- module Insta
2
- module Location
3
- def self.by_id(user, location_id, data)
4
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
5
- rank_token = Insta::API.generate_rank_token user.session.scan(/ds_user_id=([\d]+);/)[0][0]
6
- endpoint = %Q[https://www.instagram.com/graphql/query/?query_id=17865274345132052&variables={"id":"#{location_id}","first":42,"after":"#{data.dig(:end_cursor)}"}]
7
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
8
- result = Insta::API.http(
9
- url: endpoint,
10
- method: 'GET',
11
- user: user,
12
- proxy: proxies&.next
13
- )
14
-
15
- JSON.parse result.body
16
- end
17
- end
18
- end
@@ -1,23 +0,0 @@
1
- require 'securerandom'
2
-
3
- module Insta
4
- class ProxyManager
5
- attr_reader :proxies
6
- attr_writer :proxies
7
-
8
- def initialize(proxies = [])
9
- proxies.each do |proxy|
10
- proxy[:id] = SecureRandom.uuid
11
- proxy[:last_use] = Time.now
12
- end
13
- @proxies = proxies
14
- end
15
-
16
- def next
17
- return nil if @proxies.nil? || @proxies.empty?
18
- next_proxy = @proxies.sort_by { |proxy| proxy[:last_use] }.first
19
- next_proxy[:last_use] = Time.now
20
- next_proxy
21
- end
22
- end
23
- end
data/lib/insta/tag.rb DELETED
@@ -1,18 +0,0 @@
1
- module Insta
2
- module Tag
3
- def self.find(user, tag, data)
4
- user_id = (!data[:id].nil? ? data[:id] : user.data[:id])
5
- rank_token = Insta::API.generate_rank_token user.session.scan(/ds_user_id=([\d]+);/)[0][0]
6
- endpoint = %Q[https://www.instagram.com/graphql/query/?query_id=17875800862117404&variables={"tag_name":"#{tag}","first":42,"after":"#{data.dig(:end_cursor)}"}]
7
- proxies = Insta::ProxyManager.new data[:proxies] unless data[:proxies].nil?
8
- result = Insta::API.http(
9
- url: endpoint,
10
- method: 'GET',
11
- user: user,
12
- proxy: proxies&.next
13
- )
14
-
15
- JSON.parse result.body
16
- end
17
- end
18
- end
data/lib/insta/user.rb DELETED
@@ -1,103 +0,0 @@
1
- require 'digest/md5'
2
- require 'insta/device'
3
- require 'insta/constants'
4
-
5
- module Insta
6
- class User
7
- attr_reader :username
8
- attr_reader :password
9
- attr_reader :language
10
- attr_reader :data
11
- attr_writer :data
12
- attr_reader :session
13
- attr_writer :session
14
- attr_reader :config
15
- attr_writer :config
16
-
17
- def initialize(username, password, session = nil, data = nil, config = nil)
18
- @username = username
19
- @password = password
20
- @language = 'en_US'
21
- @session = session
22
- @data = data
23
- @config = config
24
- end
25
-
26
- def search_for_user (username, data = {})
27
- Insta::Account.search_for_user(self, username, data)
28
- end
29
-
30
- def search_for_user_graphql (username, data = {})
31
- Insta::Account.search_for_user_graphql(self, username, data)
32
- end
33
-
34
- def user_media(data = {})
35
- Insta::Feed.user_media(self, data)
36
- end
37
-
38
- def user_media_graphql(data = {})
39
- Insta::Feed.user_media_graphql(self, data)
40
- end
41
-
42
- def user_followers(limit = Float::INFINITY, data = {})
43
- Insta::Feed.user_followers(self, data, limit)
44
- end
45
-
46
- def user_followers_graphql(limit = Float::INFINITY, data = {})
47
- Insta::Feed.user_followers_graphql(self, data, limit)
48
- end
49
-
50
- def md5
51
- Digest::MD5.hexdigest @username
52
- end
53
-
54
- def md5int
55
- (md5.to_i(32) / 10e32).round
56
- end
57
-
58
- def api
59
- (18 + (md5int % 5)).to_s
60
- end
61
-
62
- # @return [string]
63
- def release
64
- %w[4.0.4 4.3.1 4.4.4 5.1.1 6.0.1][md5int % 5]
65
- end
66
-
67
- def dpi
68
- %w[801 577 576 538 515 424 401 373][md5int % 8]
69
- end
70
-
71
- def resolution
72
- %w[3840x2160 1440x2560 2560x1440 1440x2560
73
- 2560x1440 1080x1920 1080x1920 1080x1920][md5int % 8]
74
- end
75
-
76
- def info
77
- line = Device.devices[md5int % Device.devices.count]
78
- {
79
- manufacturer: line[0],
80
- device: line[1],
81
- model: line[2]
82
- }
83
- end
84
-
85
- def useragent_hash
86
- agent = [api + '/' + release, dpi + 'dpi',
87
- resolution, info[:manufacturer], info[:model], info[:device], @language]
88
-
89
- {
90
- agent: agent.join('; '),
91
- version: CONSTANTS::PRIVATE_KEY[:APP_VERSION]
92
- }
93
- end
94
-
95
- def useragent
96
- format('Instagram %s Android(%s)', useragent_hash[:version], useragent_hash[:agent].rstrip)
97
- end
98
-
99
- def device_id
100
- 'android-' + md5[0..15]
101
- end
102
- end
103
- end