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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/Rakefile +30 -3
- data/exe/insta +6 -0
- data/lib/insta/ansi.rb +30 -0
- data/lib/insta/ci.rb +21 -0
- data/lib/insta/cli.rb +714 -0
- data/lib/insta/config_manifest.rb +56 -0
- data/lib/insta/configuration.rb +86 -2
- data/lib/insta/diff.rb +134 -0
- data/lib/insta/inline/call_finder.rb +37 -0
- data/lib/insta/inline/edit.rb +21 -0
- data/lib/insta/inline/file_patcher.rb +269 -0
- data/lib/insta/inline/pending_registry.rb +57 -0
- data/lib/insta/inline/pending_store.rb +145 -0
- data/lib/insta/minitest/assertions.rb +254 -0
- data/lib/insta/minitest/lifecycle.rb +12 -0
- data/lib/insta/minitest.rb +8 -0
- data/lib/insta/pending_locations.rb +64 -0
- data/lib/insta/pending_reporter.rb +47 -0
- data/lib/insta/redaction/applicator.rb +89 -0
- data/lib/insta/redaction/selector.rb +193 -0
- data/lib/insta/rspec/hooks.rb +18 -0
- data/lib/insta/rspec/matchers.rb +248 -0
- data/lib/insta/rspec.rb +7 -0
- data/lib/insta/serializers/base.rb +31 -0
- data/lib/insta/serializers/inspect.rb +14 -0
- data/lib/insta/serializers/json.rb +16 -0
- data/lib/insta/serializers/string.rb +14 -0
- data/lib/insta/serializers/yaml.rb +16 -0
- data/lib/insta/snapshot.rb +74 -0
- data/lib/insta/snapshot_content.rb +44 -0
- data/lib/insta/snapshot_file.rb +64 -0
- data/lib/insta/snapshot_mismatch_handler.rb +34 -0
- data/lib/insta/snapshot_name.rb +51 -0
- data/lib/insta/syntax_highlight.rb +20 -0
- data/lib/insta/update_coordinator.rb +22 -0
- data/lib/insta/version.rb +3 -1
- data/lib/insta.rb +42 -8
- data/lib/minitest/insta_plugin.rb +17 -0
- data/sig/insta/ansi.rbs +28 -0
- data/sig/insta/ci.rbs +10 -0
- data/sig/insta/cli.rbs +150 -0
- data/sig/insta/config_manifest.rbs +27 -0
- data/sig/insta/configuration.rbs +48 -0
- data/sig/insta/diff.rbs +38 -0
- data/sig/insta/inline/call_finder.rbs +22 -0
- data/sig/insta/inline/edit.rbs +18 -0
- data/sig/insta/inline/file_patcher.rbs +55 -0
- data/sig/insta/inline/pending_registry.rbs +22 -0
- data/sig/insta/inline/pending_store.rbs +41 -0
- data/sig/insta/minitest/assertions.rbs +52 -0
- data/sig/insta/minitest/lifecycle.rbs +10 -0
- data/sig/insta/minitest.rbs +2 -0
- data/sig/insta/pending_locations.rbs +22 -0
- data/sig/insta/pending_reporter.rbs +14 -0
- data/sig/insta/redaction/applicator.rbs +22 -0
- data/sig/insta/redaction/selector.rbs +58 -0
- data/sig/insta/rspec/hooks.rbs +10 -0
- data/sig/insta/rspec/matchers.rbs +71 -0
- data/sig/insta/rspec.rbs +2 -0
- data/sig/insta/serializers/base.rbs +21 -0
- data/sig/insta/serializers/inspect.rbs +10 -0
- data/sig/insta/serializers/json.rbs +10 -0
- data/sig/insta/serializers/string.rbs +10 -0
- data/sig/insta/serializers/yaml.rbs +10 -0
- data/sig/insta/snapshot.rbs +37 -0
- data/sig/insta/snapshot_content.rbs +14 -0
- data/sig/insta/snapshot_file.rbs +27 -0
- data/sig/insta/snapshot_mismatch_handler.rbs +12 -0
- data/sig/insta/snapshot_name.rbs +17 -0
- data/sig/insta/syntax_highlight.rbs +8 -0
- data/sig/insta/update_coordinator.rbs +11 -0
- data/sig/insta/version.rbs +5 -0
- data/sig/insta.rbs +12 -0
- data/sig/minitest/insta_plugin.rbs +6 -0
- data/sig/vendor/difftastic.rbs +19 -0
- data/sig/vendor/irb.rbs +5 -0
- data/sig/vendor/psych.rbs +7 -0
- data/sig/vendor/rspec.rbs +9 -0
- data/sig/vendor/rubygems.rbs +3 -0
- metadata +109 -54
- data/.DS_Store +0 -0
- data/.gitignore +0 -11
- data/.rspec +0 -3
- data/.travis.yml +0 -5
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -35
- data/README.md +0 -41
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/insta.gemspec +0 -36
- data/lib/.DS_Store +0 -0
- data/lib/insta/account.rb +0 -127
- data/lib/insta/api.rb +0 -88
- data/lib/insta/constants.rb +0 -21
- data/lib/insta/device.rb +0 -11852
- data/lib/insta/feed.rb +0 -89
- data/lib/insta/location.rb +0 -18
- data/lib/insta/proxy_manager.rb +0 -23
- data/lib/insta/tag.rb +0 -18
- 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
|
data/lib/insta/location.rb
DELETED
|
@@ -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
|
data/lib/insta/proxy_manager.rb
DELETED
|
@@ -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
|