inbound_api 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/helper/fetch_followers.rb +33 -0
- data/lib/helper/fetch_following.rb +33 -0
- data/lib/helper/fetch_user_data.rb +136 -0
- data/lib/helper/follow_user.rb +12 -0
- data/lib/helper/login.rb +24 -0
- data/lib/helper/search_users.rb +53 -0
- data/lib/helper/unfollow_user.rb +12 -0
- data/lib/inbound_api.rb +96 -0
- metadata +94 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 69510628f49862bdc8b1e3421ef97bcd331aeec7
|
4
|
+
data.tar.gz: 782e9ae0da4fd3e20120bcfcfc959f8c54110416
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d59354f19840e714e3d4713b8d068e836a50421d7ce0ece8d5494e0ca5abc36f5e72377f78dc733a042c3d5c63417455d2f33b1a87244a7e1ca082de70553bd8
|
7
|
+
data.tar.gz: 152b751fc4320ffe65fc5041051e667c42b1d697af7c3e373f70f1effb8909764361693e2cf9738a4bee2399fad31dc9e97cf84d820c3d47b6a3c94f1148c0d3
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class FetchFollowers < InboundAPI
|
2
|
+
|
3
|
+
def fetch_followers username
|
4
|
+
|
5
|
+
url = "#{@member_root_url}#{username}#{@followers_url}"
|
6
|
+
begin
|
7
|
+
page = @scraper.get(url)
|
8
|
+
|
9
|
+
begin
|
10
|
+
followers = []
|
11
|
+
elements = page.search(".user-details a")
|
12
|
+
elements.each do |element|
|
13
|
+
followers.push(element["href"].gsub(@member_root_url,""))
|
14
|
+
end
|
15
|
+
rescue
|
16
|
+
followers = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
return {
|
21
|
+
"response" => "Success",
|
22
|
+
"followers" => followers
|
23
|
+
}
|
24
|
+
rescue
|
25
|
+
return {
|
26
|
+
"response" => "Failure"
|
27
|
+
}
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'mechanize'
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class FetchFollowing < InboundAPI
|
2
|
+
|
3
|
+
def fetch_following username
|
4
|
+
|
5
|
+
url = "#{@member_root_url}#{username}#{@following_url}"
|
6
|
+
begin
|
7
|
+
page = @scraper.get(url)
|
8
|
+
|
9
|
+
begin
|
10
|
+
following = []
|
11
|
+
elements = page.search(".user-details a")
|
12
|
+
elements.each do |element|
|
13
|
+
following.push(element["href"].gsub(@member_root_url,""))
|
14
|
+
end
|
15
|
+
rescue
|
16
|
+
following = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
return {
|
21
|
+
"response" => "Success",
|
22
|
+
"following" => following
|
23
|
+
}
|
24
|
+
rescue
|
25
|
+
return {
|
26
|
+
"response" => "Failure"
|
27
|
+
}
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'mechanize'
|
@@ -0,0 +1,136 @@
|
|
1
|
+
class FetchUserData < InboundAPI
|
2
|
+
|
3
|
+
def fetch_user_data username
|
4
|
+
|
5
|
+
url = "#{@member_root_url}#{username}"
|
6
|
+
begin
|
7
|
+
page = @scraper.get(url)
|
8
|
+
|
9
|
+
userid = page.search(".toggle-follow-user")[0]["data-user-id"]
|
10
|
+
|
11
|
+
begin
|
12
|
+
fullname = page.search('.member-details h1')[0].children.text.to_s
|
13
|
+
rescue
|
14
|
+
fullname = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
begin
|
18
|
+
karma = page.search('.user-stats .number')[0].text.to_i
|
19
|
+
rescue
|
20
|
+
karma = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
begin
|
24
|
+
followers = page.search('.user-stats .number')[1].text.to_i
|
25
|
+
rescue
|
26
|
+
followers = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
begin
|
30
|
+
following = page.search('.user-stats .number')[2].text.to_i
|
31
|
+
rescue
|
32
|
+
following = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
company = page.search("div.member-banner-details p:nth-of-type(1) a")[0].parent.text.strip.chomp.gsub("\n"," ").gsub("\t"," ")
|
37
|
+
rescue
|
38
|
+
company = nil
|
39
|
+
end
|
40
|
+
|
41
|
+
begin
|
42
|
+
company_link = page.search("div.member-banner-details p:nth-of-type(1) a")[0]["href"]
|
43
|
+
rescue
|
44
|
+
company_link = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
begin
|
48
|
+
image = page.search(".member-banner .avatar img")[0]["src"]
|
49
|
+
rescue
|
50
|
+
image = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
begin
|
54
|
+
location = page.search("div.member-banner-details p:nth-of-type(2)")[0].text.strip
|
55
|
+
rescue
|
56
|
+
location = nil
|
57
|
+
end
|
58
|
+
|
59
|
+
begin
|
60
|
+
tw_link = page.search(".member .twitter")[0]["href"]
|
61
|
+
rescue
|
62
|
+
tw_link = nil
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
in_link = page.search(".member .linkedin")[0]["href"]
|
67
|
+
rescue
|
68
|
+
in_link = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
begin
|
72
|
+
fb_link = page.search(".member .facebook")[0]["href"]
|
73
|
+
rescue
|
74
|
+
fb_link = nil
|
75
|
+
end
|
76
|
+
|
77
|
+
begin
|
78
|
+
gplus_link = page.search(".member .google-plus")[0]["href"]
|
79
|
+
rescue
|
80
|
+
gplus_link = nil
|
81
|
+
end
|
82
|
+
|
83
|
+
begin
|
84
|
+
web_link = page.search('.fa-link')[0].parent["href"]
|
85
|
+
rescue
|
86
|
+
web_link = nil
|
87
|
+
end
|
88
|
+
|
89
|
+
begin
|
90
|
+
badge_wrapper , badges = page.search('.badges li') , []
|
91
|
+
badge_wrapper.each do |badge|
|
92
|
+
badges.push(badge.search('.karma_title').text.strip)
|
93
|
+
end
|
94
|
+
number_badges = (badges.count == 0) ? nil : badges.count
|
95
|
+
badges = number_badges.nil? ? nil : badges
|
96
|
+
|
97
|
+
rescue
|
98
|
+
badges = nil
|
99
|
+
number_badges = nil
|
100
|
+
end
|
101
|
+
begin
|
102
|
+
recent_activity = page.search('.activity-list-submitted').first.text[2..-1]
|
103
|
+
rescue
|
104
|
+
recent_activity = nil
|
105
|
+
end
|
106
|
+
|
107
|
+
return {
|
108
|
+
"response" => "Success",
|
109
|
+
"userid" => userid,
|
110
|
+
"name" => fullname,
|
111
|
+
"image_url" => image,
|
112
|
+
"location" => location,
|
113
|
+
"karma" => karma,
|
114
|
+
"number_followers" => followers,
|
115
|
+
"number_following" => following,
|
116
|
+
"work" => company,
|
117
|
+
"company_link" => company_link,
|
118
|
+
"twitter_link" => tw_link,
|
119
|
+
"facebook_link" => fb_link,
|
120
|
+
"linkedin_link" => in_link,
|
121
|
+
"googleplus_link" => gplus_link,
|
122
|
+
"my_link" => web_link,
|
123
|
+
"number_badges" => number_badges,
|
124
|
+
"badges" => badges,
|
125
|
+
"recent_activity" => recent_activity
|
126
|
+
}
|
127
|
+
rescue
|
128
|
+
return {
|
129
|
+
"response" => "Failure"
|
130
|
+
}
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
require 'mechanize'
|
data/lib/helper/login.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Login < InboundAPI
|
2
|
+
|
3
|
+
def login credentials={}
|
4
|
+
|
5
|
+
begin
|
6
|
+
@scraper.post(@login_post_url, {
|
7
|
+
email: credentials["email"],
|
8
|
+
password: credentials["password"]
|
9
|
+
})
|
10
|
+
@scraper.get("https://inbound.org/")
|
11
|
+
if @scraper.get(@login_url).search(".modal-content .form-login").count == 0
|
12
|
+
return {"response" => "Success" , "agent" => @scraper}
|
13
|
+
else
|
14
|
+
return {"response" => "Failure"}
|
15
|
+
end
|
16
|
+
rescue
|
17
|
+
return {"response" => "Failure"}
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'json'
|
24
|
+
require 'mechanize'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
class SearchUsers < InboundAPI
|
2
|
+
|
3
|
+
def get_url_from_string string , query_url
|
4
|
+
if string != ""
|
5
|
+
string=string.split(" ").join("+")
|
6
|
+
query_url = query_url + "query=" + string + "&"
|
7
|
+
end
|
8
|
+
return query_url
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_url_from_list source_list , search_list , query_url
|
12
|
+
source_list.each do |s|
|
13
|
+
search_list.each do |l|
|
14
|
+
if s["name"] == l || s["slug"] == l
|
15
|
+
query_url = query_url + "skills%5B%5D=" + s["id"] + "&"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
return query_url
|
20
|
+
end
|
21
|
+
|
22
|
+
def search_users_page scraper , query_url
|
23
|
+
page = scraper.get(query_url)
|
24
|
+
object = JSON.parse(page.body)
|
25
|
+
usernames = object["data"].map {|o| o["username"]}
|
26
|
+
usernames.keep_if {|u| !u.nil? }
|
27
|
+
return usernames
|
28
|
+
end
|
29
|
+
|
30
|
+
def search_users scraper , query_url , pages = 1
|
31
|
+
begin
|
32
|
+
list = []
|
33
|
+
n_pages = JSON.parse(scraper.get(query_url).body)["meta"]["pagination"]["total_pages"]
|
34
|
+
if pages < 1 || pages > n_pages
|
35
|
+
pages = n_pages
|
36
|
+
end
|
37
|
+
for i in (1..pages)
|
38
|
+
list = list + search_users_page(scraper,"#{query_url}page=#{i.to_s}")
|
39
|
+
end
|
40
|
+
return {
|
41
|
+
"response" => "Success",
|
42
|
+
"usernames" => list
|
43
|
+
}
|
44
|
+
rescue Exception => e
|
45
|
+
return {
|
46
|
+
"response" => "Error #{e}"
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require 'mechanize'
|
53
|
+
require 'json'
|
data/lib/inbound_api.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
class InboundAPI
|
2
|
+
def initialize
|
3
|
+
@scraper = Mechanize.new do |a|
|
4
|
+
a.follow_meta_refresh = true
|
5
|
+
a.user_agent_alias = "Mac Safari 4"
|
6
|
+
a.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
7
|
+
end
|
8
|
+
@root_url = "https://inbound.org/"
|
9
|
+
@search_members_api_url = "https://api.inbound.org/users?order=trending&"
|
10
|
+
@member_root_url = "https://inbound.org/in/"
|
11
|
+
@search_posts_url = ""
|
12
|
+
@followers_url = "/followers/"
|
13
|
+
@following_url = "/following/"
|
14
|
+
@login_post_url = "https://inbound.org/authenticate/check"
|
15
|
+
@login_url = "https://inbound.org/login"
|
16
|
+
@follow_user_url = "https://inbound.org/members/follow?follow=1&user_id="
|
17
|
+
@unfollow_user_url = "https://inbound.org/members/follow?follow=0&user_id="
|
18
|
+
@badges = JSON.parse(@scraper.get("https://api.inbound.org/badges").body)["data"]
|
19
|
+
@skills = JSON.parse(@scraper.get("https://api.inbound.org/skills").body)["data"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def login email , password
|
23
|
+
client = Login.new()
|
24
|
+
output = client.login({"email" => email, "password" => password})
|
25
|
+
@scraper = (output["response"] == "Success") ? output["agent"] : @scraper
|
26
|
+
sleep 3
|
27
|
+
return {"response" => output["response"]}
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_all_badges
|
31
|
+
return @badges
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_all_skills
|
35
|
+
return @skills
|
36
|
+
end
|
37
|
+
|
38
|
+
def fetch_user_data username=""
|
39
|
+
client = FetchUserData.new()
|
40
|
+
data = client.fetch_user_data(username)
|
41
|
+
sleep 3
|
42
|
+
return data
|
43
|
+
end
|
44
|
+
|
45
|
+
def fetch_followers username=""
|
46
|
+
client = FetchFollowers.new()
|
47
|
+
data = client.fetch_followers(username)
|
48
|
+
sleep 3
|
49
|
+
return data
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch_following username=""
|
53
|
+
client = FetchFollowing.new()
|
54
|
+
data = client.fetch_following(username)
|
55
|
+
sleep 3
|
56
|
+
return data
|
57
|
+
end
|
58
|
+
|
59
|
+
def search_users query="" , location="" , badges=[] , skills=[] , pages = 1
|
60
|
+
client = SearchUsers.new()
|
61
|
+
query_url = @search_members_api_url
|
62
|
+
query_url = client.get_url_from_string(query,query_url)
|
63
|
+
query_url = client.get_url_from_string(location,query_url)
|
64
|
+
query_url = client.get_url_from_list(@badges,badges,query_url)
|
65
|
+
query_url = client.get_url_from_list(@skills,skills,query_url)
|
66
|
+
data = client.search_users(@scraper,query_url,pages)
|
67
|
+
sleep 3
|
68
|
+
return data
|
69
|
+
end
|
70
|
+
|
71
|
+
def follow_user username=""
|
72
|
+
client = FollowUser.new()
|
73
|
+
userid = fetch_user_data(username)[:userid]
|
74
|
+
sleep 3
|
75
|
+
return client.follow_user(userid,@scraper)
|
76
|
+
end
|
77
|
+
|
78
|
+
def unfollow_user username=""
|
79
|
+
client = UnfollowUser.new()
|
80
|
+
userid = fetch_user_data(username)[:userid]
|
81
|
+
sleep 3
|
82
|
+
return client.unfollow_user(userid,@scraper)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
# Require other helper files too, and also add them to .gemspec file
|
88
|
+
require_relative 'helper/login'
|
89
|
+
require_relative 'helper/fetch_user_data'
|
90
|
+
require_relative 'helper/fetch_followers'
|
91
|
+
require_relative 'helper/fetch_following'
|
92
|
+
require_relative 'helper/search_users'
|
93
|
+
require_relative 'helper/follow_user'
|
94
|
+
require_relative 'helper/unfollow_user'
|
95
|
+
require 'mechanize'
|
96
|
+
require 'json'
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: inbound_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Athitya Kumar
|
8
|
+
- ''
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2017-01-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mechanize
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.7.5
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.7.4
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: 2.7.5
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.7.4
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: json
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.0.3
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.0.1
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 2.0.3
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 2.0.1
|
54
|
+
description: A Ruby Gem API for Inbound.org platform implemented with custom web scraping.
|
55
|
+
Have a look at the documentation, to get started.
|
56
|
+
email:
|
57
|
+
- athityakumar@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- lib/helper/fetch_followers.rb
|
63
|
+
- lib/helper/fetch_following.rb
|
64
|
+
- lib/helper/fetch_user_data.rb
|
65
|
+
- lib/helper/follow_user.rb
|
66
|
+
- lib/helper/login.rb
|
67
|
+
- lib/helper/search_users.rb
|
68
|
+
- lib/helper/unfollow_user.rb
|
69
|
+
- lib/inbound_api.rb
|
70
|
+
homepage: http://rubygems.org/gems/inbound_api
|
71
|
+
licenses:
|
72
|
+
- MIT
|
73
|
+
metadata: {}
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
requirements: []
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 2.6.4
|
91
|
+
signing_key:
|
92
|
+
specification_version: 4
|
93
|
+
summary: A Ruby Gem API for Inbound.org platform implemented with custom web scraping.
|
94
|
+
test_files: []
|