social 0.0.11 → 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 +7 -0
- data/README.md +72 -40
- data/lib/social.rb +65 -30
- data/lib/social/balance.rb +1 -14
- data/lib/social/config/ok.rb +16 -18
- data/lib/social/config/vk.rb +15 -17
- data/lib/social/determinant.rb +4 -0
- data/lib/social/determinant/request_param.rb +56 -0
- data/lib/social/determinant/social_prefix.rb +81 -0
- data/lib/social/env.rb +21 -15
- data/lib/social/network.rb +9 -1
- data/lib/social/network/base.rb +60 -9
- data/lib/social/network/graph.rb +1 -40
- data/lib/social/network/graph/ok.rb +1 -5
- data/lib/social/network/graph/ok/base.rb +50 -56
- data/lib/social/network/graph/ok/notification.rb +9 -15
- data/lib/social/network/graph/ok/user.rb +61 -67
- data/lib/social/network/graph/tail.rb +14 -20
- data/lib/social/network/graph/vk.rb +1 -5
- data/lib/social/network/graph/vk/base.rb +27 -33
- data/lib/social/network/graph/vk/notification.rb +11 -17
- data/lib/social/network/graph/vk/user.rb +55 -61
- data/lib/social/network/ok.rb +9 -17
- data/lib/social/network/stub.rb +2 -7
- data/lib/social/network/vk.rb +9 -17
- data/lib/social/version.rb +1 -1
- data/social.gemspec +1 -0
- data/spec/lib/social/ok_api_spec.rb +8 -8
- data/spec/lib/social/vk_api_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -4
- metadata +80 -48
- data/lib/social/auth.rb +0 -4
- data/lib/social/auth/controller.rb +0 -144
- data/lib/social/builder.rb +0 -22
- data/lib/social/cache.rb +0 -26
- data/lib/social/helper.rb +0 -4
- data/lib/social/helper/controller.rb +0 -43
- data/lib/social/helper/model.rb +0 -61
- data/lib/social/network/params.rb +0 -31
- data/lib/social/provider.rb +0 -42
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a3becb7a8ded7114cb92fbe39b3aa334e8f1c058
|
4
|
+
data.tar.gz: b40e98c12f7143e7dd9332b227ffeb09c2a373ea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 038fbcc6d9745a44cfad4750a2933efcc77bc92361ae9df9c2b9dfcb12c2467cdf5baccbaeb90cdbbbaafef5f7905356ab0e3eb8dae64c68a8d44336d7e7bed9
|
7
|
+
data.tar.gz: 861d167d64dac6f76c0f8525c907f9e512dec581c5d019d910c14bbc40bedc567b7a0786ed4b4647d7c4f4d86898b725ba227e9b27fadbf338b2a4a66e8626bf
|
data/README.md
CHANGED
@@ -1,82 +1,114 @@
|
|
1
|
-
Social
|
1
|
+
Social
|
2
2
|
====================
|
3
3
|
|
4
|
-
|
4
|
+
Библиотека для обращения к API социальных сетей со стороны сервера. Содержит методы API и средства определения текущей социальной сети.
|
5
5
|
|
6
|
-
|
6
|
+
Данная библиотека была создана в рамках проекта SocialFrame - Шаблон для IFrame приложений на базе Sinatra (Padrino). Но библиотеку можно также использовать и для Rails-приложений и других.
|
7
7
|
|
8
|
-
|
8
|
+
Библиотека решает следующие задачи:
|
9
|
+
* Определение типа соцсети до создания сессии и авторизации по средствам Rack::Builder
|
10
|
+
* Осуществление общих запросов к API соцсети
|
11
|
+
* Генерирует уникальный пользовательский UID и уникальный SESSION_ID для сессии на основе SID соцсети
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
* vk.com
|
13
|
+
Поддержка социальных сетей:
|
14
|
+
* vk.com
|
13
15
|
* odnoklassniki.ru
|
14
|
-
* mail.ru (plans to support)
|
15
|
-
* facebook.com (plans to support)
|
16
|
-
|
17
|
-
Now supported features:
|
18
16
|
|
19
|
-
|
20
|
-
*
|
21
|
-
*
|
22
|
-
*
|
23
|
-
*
|
24
|
-
* Parameterized wrapper to call the API methods
|
17
|
+
Поддерживаемые методы API:
|
18
|
+
* Получает профиль пользователя
|
19
|
+
* Получить список друзей для пользователя
|
20
|
+
* Получить профили друзей
|
21
|
+
* Работа с балансом пользователя (только для vk.com)
|
25
22
|
|
26
|
-
|
23
|
+
Установка
|
24
|
+
---------------------
|
27
25
|
|
28
26
|
gem install social
|
29
27
|
|
28
|
+
Для Gemfile
|
30
29
|
|
31
|
-
|
30
|
+
gem 'social'
|
31
|
+
|
32
|
+
Использование
|
32
33
|
---------------------
|
33
34
|
|
35
|
+
Получение профиля пользователя (get user profile)
|
36
|
+
|
34
37
|
Social::Network(:ok).user.get_info(uid)
|
35
38
|
|
36
|
-
|
39
|
+
или
|
37
40
|
|
38
41
|
Social::Network::Vk.user.get_info(uid)
|
39
42
|
|
40
|
-
|
43
|
+
или отправка нотификации
|
41
44
|
|
42
|
-
Social::Network(
|
45
|
+
Social::Network(social_type).notification.send(:message => msg, :uids => [ ... ])
|
43
46
|
|
44
|
-
|
47
|
+
Обращение к текущей социальной сети осуществляется после Глобального определения этого типа (см. ниже). При этом возможны следующие вызовы.
|
48
|
+
|
49
|
+
Social::Network.current.user.get_info(uid)
|
50
|
+
|
51
|
+
|
52
|
+
Глобальное определение типа социальной сети
|
45
53
|
---------------------
|
46
54
|
|
47
|
-
|
55
|
+
Social::Env.init(params[:social_types])
|
48
56
|
|
49
|
-
|
57
|
+
Определение соцсети с помощью SocialPrefix
|
58
|
+
---------------------
|
59
|
+
|
60
|
+
SocialPrefix позволяет определять социальную сеть по строке запроса т.е.
|
61
|
+
|
62
|
+
- без использования субдоменов
|
63
|
+
- без определения соц.сети по параметрам запроса (что также поддерживается)
|
64
|
+
- без добавления доп.роутов в приложение
|
65
|
+
|
66
|
+
Также пользоволяет решить проблему с показам аватаров пользователей в Одноклассниках, для которых в REFERRAL должно быть слово "odnoklassniki" или "odkl".
|
67
|
+
|
68
|
+
config.ru
|
69
|
+
|
70
|
+
builder = Social::Builder::produce(Example::Application)
|
50
71
|
run builder
|
51
72
|
|
52
|
-
|
73
|
+
При этом в параметры запроса добавляется ключ social_env
|
74
|
+
со следующим содержанием
|
53
75
|
|
54
|
-
request['social_env'] = {
|
76
|
+
request.params['social_env'] = {
|
55
77
|
'prefix' => <SOCIAL_PREFIX>,
|
56
78
|
'type' => <SOCIAL_TYPE_NAME>,
|
57
79
|
'id' => <SOCIAL_TYPE_ID>
|
58
80
|
}
|
59
81
|
|
60
|
-
|
82
|
+
Например, при запросе /odkl/*
|
61
83
|
|
62
84
|
params[:social_env][:id] # => 1
|
85
|
+
params[:social_env][:prefix] # => 'odkl'
|
86
|
+
params[:social_env][:type] # => :ok
|
87
|
+
|
88
|
+
Для SinglePage приложения:
|
89
|
+
Предпологается, что первый GET запрос приходит на URL из SocialPrefix,
|
90
|
+
а последующие запросы идут уже без без SocialPrefix и тип соцсети
|
91
|
+
берется из сессии и передается в метод Social::Env.init(<SOCIAL_TYPE>).
|
63
92
|
|
64
|
-
|
65
|
-
|
66
|
-
|
93
|
+
Для "Многостраничного" приложения:
|
94
|
+
Предпологается, что все запросы все запросы осуществляются с помощью
|
95
|
+
SocialPrefix
|
96
|
+
|
97
|
+
Определение соцсети с помощью
|
98
|
+
---------------------
|
67
99
|
|
68
|
-
|
100
|
+
Помимо SocialPrefix определение соцсети можно осуществлять
|
101
|
+
с помощью параметров запроса. Например если запрос содержит
|
102
|
+
параметры viewer_id и sid, то можно сказать что это
|
103
|
+
соцсеть ВКонтакт.
|
69
104
|
|
70
|
-
|
71
|
-
Social::Env.type # => :ok
|
72
|
-
Social::Env.prefix # => :odkl
|
105
|
+
Этот способ также предпологает использование Rack::Builder.
|
73
106
|
|
74
107
|
TODO
|
75
108
|
---------------------
|
76
109
|
|
77
|
-
*
|
78
|
-
*
|
79
|
-
*
|
80
|
-
*
|
110
|
+
* Тесты с использованием VCR
|
111
|
+
* Поддержка Mail.ru
|
112
|
+
* Поддержка Facebook
|
113
|
+
* Больше поддерживаемых "общих" методов API
|
81
114
|
|
82
|
-
### Welcome to contributing!
|
data/lib/social.rb
CHANGED
@@ -2,32 +2,27 @@ require 'singleton'
|
|
2
2
|
require 'active_support/all'
|
3
3
|
require 'rack'
|
4
4
|
require 'social/version'
|
5
|
-
require 'social/
|
6
|
-
require 'social/
|
7
|
-
require 'social/
|
5
|
+
require 'social/determinant'
|
6
|
+
require 'social/determinant/social_prefix'
|
7
|
+
require 'social/determinant/request_param'
|
8
|
+
require 'social/config'
|
8
9
|
require 'social/config/vk'
|
9
10
|
require 'social/config/ok'
|
10
|
-
require 'social/config'
|
11
11
|
require 'social/env'
|
12
|
-
require 'social/
|
13
|
-
require 'social/helper/model'
|
14
|
-
require 'social/helper'
|
15
|
-
require 'social/auth/controller'
|
16
|
-
require 'social/auth'
|
17
|
-
require 'social/network/graph/tail'
|
18
|
-
require 'social/network/params'
|
19
|
-
require 'social/network/base'
|
12
|
+
require 'social/network'
|
20
13
|
require 'social/network/graph'
|
14
|
+
require 'social/network/base'
|
21
15
|
require 'social/network/ok'
|
22
16
|
require 'social/network/vk'
|
17
|
+
require 'social/network/graph/tail'
|
18
|
+
require 'social/network/graph/ok'
|
23
19
|
require 'social/network/graph/ok/base'
|
24
20
|
require 'social/network/graph/ok/notification'
|
25
21
|
require 'social/network/graph/ok/user'
|
26
|
-
require 'social/network/graph/
|
22
|
+
require 'social/network/graph/vk'
|
27
23
|
require 'social/network/graph/vk/base'
|
28
24
|
require 'social/network/graph/vk/notification'
|
29
25
|
require 'social/network/graph/vk/user'
|
30
|
-
require 'social/network/graph/vk'
|
31
26
|
require 'social/network/stub'
|
32
27
|
require 'social/network'
|
33
28
|
require 'social/networks'
|
@@ -46,30 +41,71 @@ module Social
|
|
46
41
|
:fb => 'fb'
|
47
42
|
}
|
48
43
|
|
44
|
+
VK_PARAMS = %w(
|
45
|
+
api_url api_id api_settings viewer_id
|
46
|
+
viewer_type sid secret access_token
|
47
|
+
user_id group_id is_app_user auth_key
|
48
|
+
language parent_language ad_info
|
49
|
+
is_secure ads_app_id referrer lc_name hash
|
50
|
+
)
|
51
|
+
|
52
|
+
OK_PARAMS = %w(
|
53
|
+
authorized ip_geo_location api_server
|
54
|
+
new_sig apiconnection first_start
|
55
|
+
clientLog session_secret_key
|
56
|
+
application_key auth_sig web_server
|
57
|
+
session_key logged_user_id sig
|
58
|
+
)
|
59
|
+
|
49
60
|
class << self
|
50
61
|
|
51
|
-
def
|
52
|
-
|
62
|
+
def social_params(params)
|
63
|
+
params.slice(VK_PARAMS + OK_PARAMS)
|
53
64
|
end
|
54
65
|
|
55
|
-
def
|
56
|
-
|
66
|
+
def social_request?(params)
|
67
|
+
request_social_type(params).present?
|
57
68
|
end
|
58
|
-
|
59
|
-
def
|
60
|
-
|
69
|
+
|
70
|
+
def request_social_type(params)
|
71
|
+
if social_env = (params[:social_env])
|
72
|
+
# Если параметр задается с помощью RackBuilder
|
73
|
+
# через SocialPrefix и передается как social_env
|
74
|
+
# через параметры приложения
|
75
|
+
params[:social_env][:type]
|
76
|
+
else
|
77
|
+
params_social_type(params)
|
78
|
+
end
|
61
79
|
end
|
62
80
|
|
63
|
-
|
64
|
-
|
81
|
+
# Определяем тип социальной сети по параметрам
|
82
|
+
# первоначального запроса. Например если передан параметр
|
83
|
+
# viewer_id и sid, то это Вконтакте
|
84
|
+
def params_social_type(params)
|
85
|
+
case
|
86
|
+
when params[:viewer_id].present? && params[:sid].present? then :vk
|
87
|
+
when params[:logged_user_id].present? && params[:session_key].present? then :ok
|
88
|
+
else
|
89
|
+
nil
|
90
|
+
end
|
65
91
|
end
|
66
92
|
|
67
|
-
def
|
68
|
-
|
93
|
+
def request_session_token(params)
|
94
|
+
case request_social_type(params)
|
95
|
+
when :vk then "vk::#{params[:sid]}"
|
96
|
+
when :ok then "ok::#{params[:session_key]}"
|
97
|
+
else
|
98
|
+
raise 'Not defined social type'
|
99
|
+
end
|
69
100
|
end
|
70
101
|
|
71
|
-
def
|
72
|
-
|
102
|
+
def request_uid(params)
|
103
|
+
case request_social_type(params)
|
104
|
+
when :vk then "vk::#{params[:user_id]}"
|
105
|
+
when :ok then "ok::#{params[:logged_user_id]}"
|
106
|
+
else
|
107
|
+
raise 'Not defined social type'
|
108
|
+
end
|
73
109
|
end
|
74
110
|
|
75
111
|
def Network(network, params = nil)
|
@@ -100,9 +136,8 @@ module Social
|
|
100
136
|
id_by_type(type_by_prefix(prefix))
|
101
137
|
end
|
102
138
|
|
103
|
-
def
|
104
|
-
|
105
|
-
return index.to_sym if SOCIAL_TYPES.values.include?(index.to_sym)
|
139
|
+
def prefix_by_type(type)
|
140
|
+
SOCIAL_PREFIX[type]
|
106
141
|
end
|
107
142
|
|
108
143
|
def type_codes
|
data/lib/social/balance.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Social
|
2
2
|
module Balance
|
3
3
|
|
4
|
+
# @deprecated
|
4
5
|
def self.included(base)
|
5
6
|
base.instance_eval do
|
6
7
|
|
@@ -21,20 +22,6 @@ module Social
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
def payments
|
25
|
-
Payment.where(:uid => self.uid, :social_type_id => self.social_type_id)
|
26
|
-
end
|
27
|
-
|
28
|
-
def payments_create(hash)
|
29
|
-
param = {:uid => self.uid, :social_type_id => self.social_type_id, :user_id => nil}.merge(hash)
|
30
|
-
param.delete(:initiatable) if param[:initiatable].is_a? Profile
|
31
|
-
Payment.create(param)
|
32
|
-
end
|
33
|
-
|
34
|
-
def initiated
|
35
|
-
[]
|
36
|
-
end
|
37
|
-
|
38
25
|
end
|
39
26
|
|
40
27
|
end
|
data/lib/social/config/ok.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
module Ok
|
1
|
+
class Social::Config
|
2
|
+
module Ok
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
|
13
|
-
@config
|
4
|
+
def config
|
5
|
+
|
6
|
+
unless @config
|
7
|
+
@env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
|
8
|
+
@config_ins = Social::Config.new(:ok)
|
9
|
+
@config = @config_ins.config[@env]
|
14
10
|
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
12
|
+
@config
|
13
|
+
end
|
14
|
+
|
15
|
+
def safe_config(auth_params = {})
|
16
|
+
auth_params.merge \
|
17
|
+
:api_server => Social::Network(:ok).config[:api_server],
|
18
|
+
:application_key => Social::Network(:ok).config[:application_key],
|
19
|
+
:logged_user_id => auth_params['uid']
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
data/lib/social/config/vk.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
class Social::Config
|
2
|
+
module Vk
|
3
|
+
|
4
|
+
def config
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@config_ins = Social::Config.new(:vk)
|
10
|
-
@config = @config_ins.config[@env]
|
11
|
-
end
|
12
|
-
|
13
|
-
@config
|
6
|
+
unless @config
|
7
|
+
@env = ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development'
|
8
|
+
@config_ins = Social::Config.new(:vk)
|
9
|
+
@config = @config_ins.config[@env]
|
14
10
|
end
|
15
11
|
|
16
|
-
|
17
|
-
|
18
|
-
:app_id => Social::Network(:vk).config['app_id'],
|
19
|
-
:logged_user_id => auth_params['uid']
|
20
|
-
end
|
12
|
+
@config
|
13
|
+
end
|
21
14
|
|
15
|
+
def safe_config(auth_params = {})
|
16
|
+
auth_params.merge \
|
17
|
+
:app_id => Social::Network(:vk).config['app_id'],
|
18
|
+
:logged_user_id => auth_params['uid']
|
22
19
|
end
|
20
|
+
|
23
21
|
end
|
24
22
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'active_support/hash_with_indifferent_access'
|
2
|
+
|
3
|
+
class Social::Determinant
|
4
|
+
class RequestParam < self
|
5
|
+
|
6
|
+
class Provider
|
7
|
+
|
8
|
+
def self.build(social_type)
|
9
|
+
klass = Class.new do
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :social_type
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(app)
|
16
|
+
@app = app
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
request = Rack::Request.new(env)
|
21
|
+
social_type = self.class.social_type
|
22
|
+
prefix = Social.prefix_by_type(social_type)
|
23
|
+
id = Social.id_by_type(social_type)
|
24
|
+
|
25
|
+
request.GET['social_env'] = {
|
26
|
+
'prefix' => prefix, 'type' => social_type, 'id' => id
|
27
|
+
}
|
28
|
+
|
29
|
+
@app.call(request.env)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
klass.social_type = social_type
|
35
|
+
klass
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.produce(app)
|
41
|
+
new do
|
42
|
+
|
43
|
+
map '/' do
|
44
|
+
params = HashWithIndifferentAccess.new(Social.social_params(request.GET))
|
45
|
+
if params.present? && type = Social.params_social_type(params)
|
46
|
+
use Provider.build(type)
|
47
|
+
run app
|
48
|
+
else
|
49
|
+
run app
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|