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 +4 -4
- data/.gitignore +1 -0
- data/README.md +1 -1
- data/lib/rsocial.rb +2 -1
- data/lib/rsocial/driver.rb +6 -41
- data/lib/rsocial/facebook/client.rb +1 -1
- data/lib/rsocial/facebook/client/pages.rb +18 -5
- data/lib/rsocial/instagram/client.rb +1 -1
- data/lib/rsocial/instagram/client/users.rb +7 -7
- data/lib/rsocial/runner.rb +46 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1773257ff57bf2425e956b8e968fd25c89775f33
|
4
|
+
data.tar.gz: e8d9ad93e62f0733eef3bf61ee45144b155248f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8fa79d5275ddd3f0070c5ddc07fa8ef9cc447a7c83d34fd43e0fadc151a8ead2516034496870ab453e45c511c4859de954c9308c15f3be4b451b76f6ab59fbf
|
7
|
+
data.tar.gz: 4b649e8ae2eb7a4f2e8081bfee8c584e17111faebbe0ccf3e9c8664b9459dcda11dbb4a93146a25ae1840b6e5386bd86cbc310150d29bfc72648698f4241c568
|
data/.gitignore
CHANGED
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.
|
38
|
+
client.page("TransWorldSkate") #=> {:handle => "TransWorldSkate", :followers => "1,667,861 likes"}
|
39
39
|
```
|
40
40
|
|
41
41
|
## Contributing
|
data/lib/rsocial.rb
CHANGED
data/lib/rsocial/driver.rb
CHANGED
@@ -1,49 +1,14 @@
|
|
1
|
-
require '
|
1
|
+
require 'singleton'
|
2
2
|
require 'selenium-webdriver'
|
3
3
|
|
4
4
|
module RSocial
|
5
5
|
class Driver
|
6
|
-
|
7
|
-
|
8
|
-
@
|
6
|
+
include Singleton
|
7
|
+
def firefox
|
8
|
+
@firefox ||= Selenium::WebDriver.for :firefox
|
9
9
|
end
|
10
|
-
|
11
|
-
|
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
|
@@ -5,16 +5,29 @@ module RSocial
|
|
5
5
|
def page(handle)
|
6
6
|
run(
|
7
7
|
"https://www.facebook.com/#{handle}/",
|
8
|
-
|
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
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
@@ -5,18 +5,18 @@ module RSocial
|
|
5
5
|
def user(handle)
|
6
6
|
run(
|
7
7
|
"https://www.instagram.com/#{handle}/",
|
8
|
-
|
8
|
+
user_injections
|
9
9
|
).merge(:handle => handle)
|
10
10
|
end
|
11
11
|
|
12
12
|
private
|
13
13
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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.
|
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:
|