instagram_user 0.1.1 → 0.1.2

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
  SHA256:
3
- metadata.gz: 41adfc12d263c381d879a09e16bb1b3df9fe76c8a6807d4ad2ab662582a44a52
4
- data.tar.gz: 3deeefda2274bab222d58db52e6f09bb5ff6066a3d740edbd4ae5c14e5490551
3
+ metadata.gz: 395fc13b93a50fa026b63b06ebef8ec4a0ea6aa1807bf5fb65b4e25c7db34f4d
4
+ data.tar.gz: 8511e7ee0deca25b3b4a9f1d1562c17755bbe77de87af62ac517d46153f8ba8b
5
5
  SHA512:
6
- metadata.gz: aa049502a33dced88eb7cf08d440f5d1ac20d2f87b49458df213aa6e533ee90a848faa77b80d508994c9e2e5d6eb995c9cec9ee404d425f80c3dae4e67328b85
7
- data.tar.gz: 84e400614938325cbbd584de48a89608ccff6d379d383ea3e3b4d2e7c1b9f66a96741e8ec489f949118559e26a1d433df656bd15bfd3bc4ea124fd35fd11c7cc
6
+ metadata.gz: 6026802ae89b4fc471f6710747aa00a6f0ada1ec7b7dd15e86d52b351b761fba573f08da07a0759b2e69f56eb3d83e841afe76c45c61e8e32ae29305d4d0549c
7
+ data.tar.gz: 34e00dc9fc9663a714cb099ee8e89fdbc73944da2774ef0c14e752210935d4272d3232cacc6e31a009dfad3af99f67e7f673f21e313e8cafb9c0a6bf83df8f46
@@ -6,5 +6,5 @@ rvm:
6
6
  - 2.2.0
7
7
  - 2.3.0
8
8
  - 2.4.0
9
- - 2.4.2
9
+ - 2.5.0
10
10
  before_install: gem install bundler -v 1.15.4
data/README.md CHANGED
@@ -5,13 +5,11 @@
5
5
  [![Coverage Status](https://img.shields.io/coveralls/YuzuruS/instagram_user.svg?style=flat)](https://coveralls.io/r/YuzuruS/instagram_user?branch=master)
6
6
  [![Code Climate](https://img.shields.io/codeclimate/github/YuzuruS/instagram_user.svg?style=flat)](https://codeclimate.com/github/YuzuruS/instagram_user)
7
7
 
8
- Client for the Instagram Web Service for getting list of followers and follows without Instagram API.
9
- It uses scraping and private api for instagram.
10
- It may be unusable in the future because of using private api in the future.
8
+ Client for the Instagram Web Service without Instagram API.
9
+ Implemented in Ruby using the Selenium and Mechanize module.
11
10
 
12
11
  ## Installation
13
12
 
14
- Add this line to your application's Gemfile:
15
13
 
16
14
  ```ruby
17
15
  gem 'instagram_user'
@@ -28,13 +26,23 @@ Or install it yourself as:
28
26
  ## Usage
29
27
 
30
28
  ```ruby
31
- cli = InstagramUser.new(user_name: 'yuzuru_dev', password: 'PASSWORD')
29
+ cli = InstagramUser.new(user_name: 'YOUR_USER_NAME', password: 'YOUR_PASSWORD')
32
30
 
31
+ # Get the follow list for the specified user
33
32
  follows = cli.get_follows('yuzuru_dev')
34
33
  # => ["yudsuzuk", "instagram"]
35
34
 
35
+ # Get the follower list for the specified user
36
36
  followers = cli.get_followers('yuzuru_dev')
37
37
  # => ["yudsuzuk"]
38
+
39
+ # Follow the specified user
40
+ res = cli.create_follow('yuzuru_dev')
41
+ # => true or false
42
+
43
+ # Unfollow the specified user
44
+ res = cli.delete_follow('yuzuru_dev')
45
+ # => true or false
38
46
  ```
39
47
 
40
48
  ## Contributing
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Yuzuru Suzuki"]
9
9
  spec.email = ["navitima@gmail.com"]
10
10
 
11
- spec.summary = %q{Getting following and follower user list on Instagram}
12
- spec.description = %q{You can get following and follower user list on Instagram without Instagram API.}
11
+ spec.summary = "Client for the Instagram using scraping"
12
+ spec.description = "Client for the Instagram Web Service without Instagram API. Implemented in Ruby using the Selenium and Mechanize module."
13
13
  spec.homepage = "https://github.com/YuzuruS/instagram_user"
14
14
  spec.license = "MIT"
15
15
 
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency 'mechanize'
33
+ spec.add_dependency 'selenium-webdriver'
33
34
  spec.add_development_dependency "bundler", "~> 1.15"
34
35
  spec.add_development_dependency "rake"
35
36
  spec.add_development_dependency "guard-rspec"
@@ -1,4 +1,5 @@
1
1
  require 'mechanize'
2
+ require 'selenium-webdriver'
2
3
  require 'json'
3
4
  require 'instagram_user/version'
4
5
 
@@ -32,6 +33,7 @@ module InstagramUser
32
33
  @session = Mechanize.new
33
34
  @user_ids = {}
34
35
  logined_session
36
+ selenium_setting
35
37
  end
36
38
 
37
39
  def get_follows(user_name)
@@ -44,10 +46,72 @@ module InstagramUser
44
46
  fetch_all_user_names(user_id, USER_MAP[:follower])
45
47
  end
46
48
 
49
+ def create_follow(user_name)
50
+ @driver.get "https://www.instagram.com/#{user_name}"
51
+ begin
52
+ @wait.until { !@driver.find_elements(:xpath, '//article//button').empty? }
53
+ rescue => e
54
+ return false
55
+ end
56
+
57
+ color = @driver.find_element(:xpath, '//article//button').css_value("color")
58
+ return false if color != "rgba(255, 255, 255, 1)"
59
+
60
+ @driver.find_element(:xpath, '//article//button').click
61
+ sleep(2)
62
+
63
+ @driver.get "https://www.instagram.com/#{name.user_name}"
64
+ @wait.until { !@driver.find_elements(:xpath, '//article//button').empty? }
65
+ color = @driver.find_element(:xpath, '//article//button').css_value("color")
66
+ (color == "rgba(255, 255, 255, 1)") ? false : true
67
+ end
68
+
69
+ def delete_follow(user_name)
70
+ @driver.get "https://www.instagram.com/#{user_name}"
71
+ begin
72
+ @wait.until { !@driver.find_elements(:xpath, '//article//button').empty? }
73
+ rescue => e
74
+ return false
75
+ end
76
+
77
+ color = @driver.find_element(:xpath, '//article//button').css_value("color")
78
+ return false if color == "rgba(255, 255, 255, 1)"
79
+
80
+ @driver.find_element(:xpath, '//article//button').click
81
+ sleep(2)
82
+
83
+ @driver.get "https://www.instagram.com/#{name.user_name}"
84
+ @wait.until { !@driver.find_elements(:xpath, '//article//button').empty? }
85
+ color = @driver.find_element(:xpath, '//article//button').css_value("color")
86
+ (color != "rgba(255, 255, 255, 1)") ? false : true
87
+ end
88
+
47
89
  private
48
90
 
91
+ def selenium_setting
92
+ options = Selenium::WebDriver::Chrome::Options.new
93
+ options.add_argument("--user-agent=#{@user_agent}")
94
+ #options.add_argument('--headless')
95
+ @driver = Selenium::WebDriver.for :chrome, options: options
96
+ @session.cookie_jar.cookies.each do |c|
97
+ cookie_hash = {
98
+ name: c.name,
99
+ value: c.value,
100
+ path: c.path,
101
+ secure: c.secure,
102
+ expires: c.expires,
103
+ domain: c.domain,
104
+ for_domain: c.for_domain,
105
+ httponly: c.httponly,
106
+ max_age: c.max_age
107
+ }
108
+ @driver.manage.add_cookie(cookie_hash)
109
+ end
110
+ @wait = Selenium::WebDriver::Wait.new(timeout: 60)
111
+ end
112
+
49
113
  def get_user_id(user_name)
50
- url = USER_INFO_URL % [user_name]
114
+ url = format USER_INFO_URL, user_name
51
115
  page = @session.get(url)
52
116
  json = JSON.parse(page.body)
53
117
  @user_ids[user_name] = json["user"]["id"]
@@ -60,15 +124,13 @@ module InstagramUser
60
124
  end
61
125
 
62
126
  def login_http_headers
63
- {
64
- "user-agent" => @user_agent,
65
- "referer" => @referer,
127
+ default_http_headers.update(
66
128
  "x-csrftoken" => "null",
67
129
  "cookie" => "sessionid=null; csrftoken=null"
68
- }
130
+ )
69
131
  end
70
132
 
71
- def username_http_headers
133
+ def default_http_headers
72
134
  {
73
135
  "user-agent" => @user_agent,
74
136
  "referer" => @referer
@@ -101,8 +163,8 @@ module InstagramUser
101
163
  first: @num_users
102
164
  }
103
165
  variables[:after] = after unless after.nil?
104
- url = BASE_URL % [request_params[:query_hash], JSON.generate(variables)]
105
- @session.request_headers = username_http_headers
166
+ url = format BASE_URL, request_params[:query_hash], JSON.generate(variables)
167
+ @session.request_headers = default_http_headers
106
168
  page = @session.get(url)
107
169
  json = JSON.parse(page.body)
108
170
  edge = json["data"]["user"][request_params[:edge]]
@@ -1,3 +1,3 @@
1
1
  module InstagramUser
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.1.2".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instagram_user
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuzuru Suzuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-02-01 00:00:00.000000000 Z
11
+ date: 2018-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mechanize
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: selenium-webdriver
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -136,8 +150,8 @@ dependencies:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
- description: You can get following and follower user list on Instagram without Instagram
140
- API.
153
+ description: Client for the Instagram Web Service without Instagram API. Implemented
154
+ in Ruby using the Selenium and Mechanize module.
141
155
  email:
142
156
  - navitima@gmail.com
143
157
  executables: []
@@ -185,5 +199,5 @@ rubyforge_project:
185
199
  rubygems_version: 2.7.4
186
200
  signing_key:
187
201
  specification_version: 4
188
- summary: Getting following and follower user list on Instagram
202
+ summary: Client for the Instagram using scraping
189
203
  test_files: []