rsocial 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f0466589b828be6e2d447db318ef7acf5d46d63
4
- data.tar.gz: ff521364755db6cac833afa9708a68a3ee5598bb
3
+ metadata.gz: 1773257ff57bf2425e956b8e968fd25c89775f33
4
+ data.tar.gz: e8d9ad93e62f0733eef3bf61ee45144b155248f5
5
5
  SHA512:
6
- metadata.gz: 05a269d0a0a067de34b26c9cbe891cf3d9f36cc3b53e9ddec5daabee0d845bb3efd3fae4289f7e5607f4edcdfec2a5575d5f6e113a73ddfcb0458fdecc59592b
7
- data.tar.gz: f395c23b11c01ee7fb7946799f5863854e06186d400972de86e550176213d01f32e849ed530e70c9973a60c4db8680e0beb1c3e2cc72b481a4519fc58c9c4c68
6
+ metadata.gz: d8fa79d5275ddd3f0070c5ddc07fa8ef9cc447a7c83d34fd43e0fadc151a8ead2516034496870ab453e45c511c4859de954c9308c15f3be4b451b76f6ab59fbf
7
+ data.tar.gz: 4b649e8ae2eb7a4f2e8081bfee8c584e17111faebbe0ccf3e9c8664b9459dcda11dbb4a93146a25ae1840b6e5386bd86cbc310150d29bfc72648698f4241c568
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  Gemfile.lock
2
+ *.gem
data/README.md CHANGED
@@ -35,7 +35,7 @@ require 'rsocial'
35
35
 
36
36
  client = RSocial::Facebook.client(:requesting_handle => "my_handle")
37
37
 
38
- client.user("TransWorldSkate") #=> {:handle => "TransWorldSkate", :followers => "1,667,861 likes"}
38
+ client.page("TransWorldSkate") #=> {:handle => "TransWorldSkate", :followers => "1,667,861 likes"}
39
39
  ```
40
40
 
41
41
  ## Contributing
@@ -1,9 +1,10 @@
1
1
  require 'rsocial/driver'
2
+ require 'rsocial/runner'
2
3
  require 'rsocial/instagram'
3
4
  require 'rsocial/instagram/client'
4
5
  require 'rsocial/facebook'
5
6
  require 'rsocial/facebook/client'
6
7
 
7
8
  module RSocial
8
- VERSION = '0.1.0'
9
+ VERSION = '0.2.0'
9
10
  end
@@ -1,49 +1,14 @@
1
- require 'headless'
1
+ require 'singleton'
2
2
  require 'selenium-webdriver'
3
3
 
4
4
  module RSocial
5
5
  class Driver
6
- def initialize(options={})
7
- @options = options
8
- @wd = Selenium::WebDriver.for :firefox
6
+ include Singleton
7
+ def firefox
8
+ @firefox ||= Selenium::WebDriver.for :firefox
9
9
  end
10
-
11
- def run(url, executables)
12
- while_headless do
13
- @wd.navigate.to url
14
- execute_each do
15
- executables
16
- end
17
- end
18
- end
19
-
20
- private
21
-
22
- def while_headless
23
- headless = Headless.new
24
- headless.start
25
- yield
26
- ensure
27
- puts "destroy"
28
- headless.destroy
29
- end
30
-
31
- def execute_each(&block)
32
- results = {}
33
- block.call.each do |key, script|
34
- results[key.to_sym] = execute(script)
35
- end
36
- results
37
- end
38
-
39
- def execute(script)
40
- begin
41
- @wd.execute_script(script)
42
- rescue Selenium::WebDriver::Error::JavascriptError
43
- "Javascript Error"
44
- rescue Selenium::WebDriver::Error::UnknownError
45
- "UnknownError"
46
- end
10
+ def chrome
11
+ @chrome ||= Selenium::WebDriver.for :chrome
47
12
  end
48
13
  end
49
14
  end
@@ -1,6 +1,6 @@
1
1
  module RSocial
2
2
  module Facebook
3
- class Client < Driver
3
+ class Client < Runner
4
4
  Dir[File.expand_path('../client/*.rb', __FILE__)].each{|f| require f}
5
5
  include Facebook::Client::Pages
6
6
  end
@@ -5,16 +5,29 @@ module RSocial
5
5
  def page(handle)
6
6
  run(
7
7
  "https://www.facebook.com/#{handle}/",
8
- user_executables
8
+ page_injections
9
+ ).merge(:handle => handle)
10
+ end
11
+
12
+ def posts(handle)
13
+ run(
14
+ "https://www.facebook.com/#{handle}/posts",
15
+ posts_injections
9
16
  ).merge(:handle => handle)
10
17
  end
11
18
 
12
19
  private
13
20
 
14
- def user_executables
15
- executables = {}
16
- executables[:followers] = "return document.getElementById('PagesLikesCountDOMID').childNodes[0].textContent"
17
- executables
21
+ def page_injections
22
+ {
23
+ :followers => "return document.getElementById('PagesLikesCountDOMID').childNodes[0].textContent"
24
+ }
25
+ end
26
+
27
+ def posts_injections
28
+ {
29
+ :last_post_reactions => "return document.getElementsByClassName('_4arz')[0].textContent"
30
+ }
18
31
  end
19
32
  end
20
33
  end
@@ -1,6 +1,6 @@
1
1
  module RSocial
2
2
  module Instagram
3
- class Client < Driver
3
+ class Client < Runner
4
4
  Dir[File.expand_path('../client/*.rb', __FILE__)].each{|f| require f}
5
5
  include Instagram::Client::Users
6
6
  end
@@ -5,18 +5,18 @@ module RSocial
5
5
  def user(handle)
6
6
  run(
7
7
  "https://www.instagram.com/#{handle}/",
8
- user_executables
8
+ user_injections
9
9
  ).merge(:handle => handle)
10
10
  end
11
11
 
12
12
  private
13
13
 
14
- def user_executables
15
- executables = {}
16
- executables[:posts] = "return document.getElementsByClassName('_s53mj')[0].getElementsByClassName('_bkw5z')[0].innerHTML"
17
- executables[:followers] = "return document.getElementsByClassName('_s53mj')[1].getElementsByClassName('_bkw5z')[0].innerHTML"
18
- executables[:following] = "return document.getElementsByClassName('_s53mj')[2].getElementsByClassName('_bkw5z')[0].innerHTML"
19
- executables
14
+ def user_injections
15
+ {
16
+ :posts => "return document.getElementsByClassName('_s53mj')[0].getElementsByClassName('_bkw5z')[0].innerHTML",
17
+ :followers => "return document.getElementsByClassName('_s53mj')[1].getElementsByClassName('_bkw5z')[0].innerHTML",
18
+ :following => "return document.getElementsByClassName('_s53mj')[2].getElementsByClassName('_bkw5z')[0].innerHTML"
19
+ }
20
20
  end
21
21
  end
22
22
  end
@@ -0,0 +1,46 @@
1
+ require 'headless'
2
+
3
+ module RSocial
4
+ class Runner
5
+ def initialize(options={})
6
+ @options = options
7
+ end
8
+
9
+ def run(url, injections)
10
+ while_headless do
11
+ Driver.instance.firefox.navigate.to url
12
+ inject_each do
13
+ injections
14
+ end
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def while_headless
21
+ headless = Headless.new
22
+ headless.start
23
+ yield
24
+ ensure
25
+ headless.destroy
26
+ end
27
+
28
+ def inject_each(&block)
29
+ results = {}
30
+ block.call.each do |key, script|
31
+ results[key.to_sym] = execute(script)
32
+ end
33
+ results
34
+ end
35
+
36
+ def execute(script)
37
+ begin
38
+ Driver.instance.firefox.execute_script(script)
39
+ rescue Selenium::WebDriver::Error::JavascriptError
40
+ "Javascript Error"
41
+ rescue Selenium::WebDriver::Error::UnknownError
42
+ "Unknown Error"
43
+ end
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsocial
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ed Richards
@@ -95,6 +95,7 @@ files:
95
95
  - lib/rsocial/instagram.rb
96
96
  - lib/rsocial/instagram/client.rb
97
97
  - lib/rsocial/instagram/client/users.rb
98
+ - lib/rsocial/runner.rb
98
99
  - rsocial.gemspec
99
100
  homepage: http://www.github.com/advectus/rsocial
100
101
  licenses: