douban-rails2.3 0.6.4 → 0.6.5
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.
- data/VERSION +1 -1
- data/douban-rails2.3-0.6.4.gem +0 -0
- data/douban-rails2.3.gemspec +5 -3
- data/generators/douban/douban_generator.rb +0 -1
- data/generators/douban/templates/douban_controller.rb +3 -3
- data/lib/douban.rb +112 -109
- data/lib/models/book.rb +13 -0
- data/lib/parser.rb +44 -0
- metadata +6 -4
- data/generators/douban/templates/douban_init.rb +0 -7
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.6.
|
1
|
+
0.6.6
|
Binary file
|
data/douban-rails2.3.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{douban-rails2.3}
|
8
|
-
s.version = "0.6.
|
8
|
+
s.version = "0.6.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Yuanyi Zhang chengdh"]
|
@@ -25,13 +25,15 @@ Gem::Specification.new do |s|
|
|
25
25
|
"douban-rails2.3-0.6.1.gem",
|
26
26
|
"douban-rails2.3-0.6.2.gem",
|
27
27
|
"douban-rails2.3-0.6.3.gem",
|
28
|
+
"douban-rails2.3-0.6.4.gem",
|
28
29
|
"douban-rails2.3.gemspec",
|
29
30
|
"generators/douban/douban_generator.rb",
|
30
31
|
"generators/douban/templates/douban.yml",
|
31
32
|
"generators/douban/templates/douban_controller.rb",
|
32
33
|
"generators/douban/templates/douban_helper.rb",
|
33
|
-
"
|
34
|
-
"lib/
|
34
|
+
"lib/douban.rb",
|
35
|
+
"lib/models/book.rb",
|
36
|
+
"lib/parser.rb"
|
35
37
|
]
|
36
38
|
s.homepage = %q{http://github.com/yzhang/douban}
|
37
39
|
s.rdoc_options = ["--charset=UTF-8"]
|
@@ -4,7 +4,6 @@ class DoubanGenerator < Rails::Generator::Base
|
|
4
4
|
m.file 'douban_controller.rb', 'app/controllers/douban_controller.rb'
|
5
5
|
m.file "douban_helper.rb", 'app/helpers/douban_helper.rb'
|
6
6
|
m.file "douban.yml", 'config/douban.yml'
|
7
|
-
m.file "douban_init.rb", 'config/initializers/douban_init.rb'
|
8
7
|
m.route :name => :douban_login,:controller => :douban,:action => :new
|
9
8
|
m.route :name => :douban_callback,:controller => :douban,:action => :callback
|
10
9
|
m.route :name => :douban_logout,:controller => :douban,:action => :destroy
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class DoubanController < ApplicationController
|
2
2
|
def new
|
3
|
-
douban = Douban.new
|
3
|
+
douban = Douban::Douban.new
|
4
4
|
douban.callback = douban_callback_url
|
5
5
|
authorize_url = douban.authorize_url
|
6
6
|
|
@@ -13,7 +13,7 @@ class DoubanController < ApplicationController
|
|
13
13
|
|
14
14
|
def callback
|
15
15
|
if session[:douban]
|
16
|
-
douban = Douban.load(session[:douban])
|
16
|
+
douban = Douban::Douban.load(session[:douban])
|
17
17
|
douban.authorize
|
18
18
|
session[:douban] = douban.dump
|
19
19
|
end
|
@@ -28,4 +28,4 @@ class DoubanController < ApplicationController
|
|
28
28
|
douban.destroy
|
29
29
|
redirect_to '/'
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
data/lib/douban.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
require 'oauth'
|
2
|
+
require 'parser'
|
3
|
+
require 'models/book'
|
4
|
+
module Douban
|
5
|
+
class Douban
|
6
|
+
attr_accessor :callback, :request_token, :access_token
|
2
7
|
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
douban.access_token = OAuth::AccessToken.new(api_consumer, access_token, access_token_secret) if access_token
|
13
|
-
douban
|
14
|
-
end
|
8
|
+
class << self
|
9
|
+
def load(data)
|
10
|
+
access_token = data[:access_token]
|
11
|
+
access_token_secret = data[:access_token_secret]
|
12
|
+
|
13
|
+
douban = Douban.new(data[:request_token], data[:request_token_secret])
|
14
|
+
douban.access_token = OAuth::AccessToken.new(api_consumer, access_token, access_token_secret) if access_token
|
15
|
+
douban
|
16
|
+
end
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
+
def auth_consumer
|
19
|
+
@@auth_consumer ||= OAuth::Consumer.new(key, secret, {
|
18
20
|
:signature_method => "HMAC-SHA1",
|
19
21
|
:site => "http://www.douban.com",
|
20
22
|
:scheme => :header,
|
@@ -22,109 +24,110 @@ class Douban
|
|
22
24
|
:access_token_path => '/service/auth/access_token',
|
23
25
|
:authorize_path => '/service/auth/authorize',
|
24
26
|
:realm => url
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
27
|
+
})
|
28
|
+
end
|
29
|
+
|
30
|
+
def api_consumer
|
31
|
+
@@api_consumer ||= OAuth::Consumer.new(key, secret,
|
32
|
+
{
|
31
33
|
:site => "http://api.douban.com",
|
32
34
|
:scheme => :header,
|
33
35
|
:signature_method => "HMAC-SHA1",
|
34
36
|
:realm => url
|
35
37
|
})
|
38
|
+
end
|
39
|
+
|
40
|
+
def key; config['key']; end
|
41
|
+
def secret; config['secret']; end
|
42
|
+
def url; config['url']; end
|
43
|
+
|
44
|
+
def config
|
45
|
+
@@config ||= lambda do
|
46
|
+
require 'yaml'
|
47
|
+
filename = "#{Rails.root}/config/douban.yml"
|
48
|
+
file = File.open(filename)
|
49
|
+
yaml = YAML.load(file)
|
50
|
+
return yaml[Rails.env]
|
51
|
+
end.call
|
52
|
+
end
|
36
53
|
end
|
37
|
-
|
38
|
-
def
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
require 'yaml'
|
45
|
-
filename = "#{Rails.root}/config/douban.yml"
|
46
|
-
file = File.open(filename)
|
47
|
-
yaml = YAML.load(file)
|
48
|
-
return yaml[Rails.env]
|
49
|
-
end.call
|
54
|
+
|
55
|
+
def initialize(request_token = nil, request_token_secret = nil)
|
56
|
+
if request_token && request_token_secret
|
57
|
+
self.request_token = OAuth::RequestToken.new(self.class.auth_consumer, request_token, request_token_secret)
|
58
|
+
else
|
59
|
+
self.request_token = self.class.auth_consumer.get_request_token()
|
60
|
+
end
|
50
61
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
if request_token && request_token_secret
|
55
|
-
self.request_token = OAuth::RequestToken.new(self.class.auth_consumer, request_token, request_token_secret)
|
56
|
-
else
|
57
|
-
self.request_token = self.class.auth_consumer.get_request_token()
|
62
|
+
|
63
|
+
def authorize_url
|
64
|
+
@authorize_url ||= request_token.authorize_url(:oauth_callback => self.callback)
|
58
65
|
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def authorize_url
|
62
|
-
@authorize_url ||= request_token.authorize_url(:oauth_callback => self.callback)
|
63
|
-
end
|
64
|
-
|
65
|
-
def authorize
|
66
|
-
return unless self.access_token.nil?
|
67
|
-
|
68
|
-
access_token = self.request_token.get_access_token
|
69
|
-
self.access_token ||= OAuth::AccessToken.new(self.class.api_consumer, access_token.token, access_token.secret)
|
70
|
-
end
|
71
|
-
|
72
|
-
def authorized?
|
73
|
-
return false if access_token.nil?
|
74
|
-
response = self.get("/access_token/#{access_token.token}")
|
75
|
-
response.code == '200'
|
76
|
-
end
|
77
|
-
|
78
|
-
def destroy
|
79
|
-
destroy_access_key if !access_token.nil?
|
80
|
-
request_token = access_token = nil
|
81
|
-
end
|
82
66
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
67
|
+
def authorize
|
68
|
+
return unless self.access_token.nil?
|
69
|
+
|
70
|
+
access_token = self.request_token.get_access_token
|
71
|
+
self.access_token ||= OAuth::AccessToken.new(self.class.api_consumer, access_token.token, access_token.secret)
|
72
|
+
end
|
73
|
+
|
74
|
+
def authorized?
|
75
|
+
return false if access_token.nil?
|
76
|
+
response = self.get("/access_token/#{access_token.token}")
|
77
|
+
response.code == '200'
|
78
|
+
end
|
79
|
+
|
80
|
+
def destroy
|
81
|
+
destroy_access_key if !access_token.nil?
|
82
|
+
request_token = access_token = nil
|
83
|
+
end
|
84
|
+
|
85
|
+
def dump
|
86
|
+
{
|
87
|
+
:request_token => request_token.token,
|
88
|
+
:request_token_secret => request_token.secret,
|
89
|
+
:access_token => access_token.nil? ? nil : access_token.token,
|
90
|
+
:access_token_secret => access_token.nil? ? nil : access_token.secret
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
def request(http_method, path, headers = {})
|
95
|
+
access_token.request(http_method, path, headers)
|
96
|
+
end
|
97
|
+
|
98
|
+
def get(path, headers = {})
|
99
|
+
request(:get, path, headers)
|
100
|
+
end
|
101
|
+
|
102
|
+
def post(path, headers = {})
|
103
|
+
request(:post, path, headers)
|
104
|
+
end
|
105
|
+
|
106
|
+
def delete(path, headers = {})
|
107
|
+
request(:delete, path, headers)
|
108
|
+
end
|
109
|
+
|
110
|
+
def put(path, headers = {})
|
111
|
+
request(:put, path, headers)
|
112
|
+
end
|
113
|
+
#使用isbn获取单本书籍信息
|
114
|
+
def get_book(isbn)
|
115
|
+
url = ENV['DOUBAN_BOOK_URL'] + isbn + "?apikey=#{ENV['DOUBAN_APP_KEY']}"
|
116
|
+
rsp = Net::HTTP.get_response(URI.parse(url))
|
117
|
+
Parser.parse_book(rsp.body)
|
118
|
+
end
|
119
|
+
#使用模糊查询获取单本书籍
|
120
|
+
def get_books(params = {})
|
121
|
+
params['apikey'] = ENV['DOUBAN_APP_KEY']
|
122
|
+
q_str = params.to_query
|
123
|
+
url = ENV['DOUBAN_BOOKS_URL'] + q_str
|
124
|
+
rsp = Net::HTTP.get_response(URI.parse(url))
|
125
|
+
Parser.parse_books(rsp.body)
|
126
|
+
end
|
127
|
+
protected
|
128
|
+
def destroy_access_key
|
129
|
+
response = delete("/access_token/#{access_token.token}")
|
130
|
+
response.code == '200'
|
131
|
+
end
|
129
132
|
end
|
130
133
|
end
|
data/lib/models/book.rb
ADDED
data/lib/parser.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
module Douban
|
3
|
+
class Parser
|
4
|
+
#解析单本书籍信息
|
5
|
+
def self.parse_book(book_xml)
|
6
|
+
xml_doc = Nokogiri::XML(book_xml)
|
7
|
+
book_node = xml_doc.css('entry').first
|
8
|
+
parse_single_book(book_node)
|
9
|
+
end
|
10
|
+
#解析多本书籍信息
|
11
|
+
def self.parse_books(book_xml)
|
12
|
+
xml_doc = Nokogiri::XML(book_xml)
|
13
|
+
books = Array.new
|
14
|
+
books_node = xml_doc.css('entry')
|
15
|
+
books_node.each do |book_node|
|
16
|
+
books.push parse_single_book(book_node)
|
17
|
+
end
|
18
|
+
books
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def self.parse_single_book(book_node)
|
23
|
+
book = Book.new
|
24
|
+
els = book_node.css("db|attribute")
|
25
|
+
#给book赋值
|
26
|
+
els.each do |el|
|
27
|
+
if el['name'] == 'author-intro'
|
28
|
+
book.author_intro = el.content
|
29
|
+
else
|
30
|
+
book.send("#{el['name']}=",el.content)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
title = book_node.css('title').first.content
|
34
|
+
content_nodes = book_node.css('content')
|
35
|
+
content = content_nodes.first.content if !content_nodes.blank?
|
36
|
+
imgs = book_node.css('link[rel=image]')
|
37
|
+
img = imgs.first['href'] if !imgs.blank?
|
38
|
+
book.title = title
|
39
|
+
book.content = content
|
40
|
+
book.image = img
|
41
|
+
book
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: douban-rails2.3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 5
|
10
|
+
version: 0.6.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Yuanyi Zhang chengdh
|
@@ -50,13 +50,15 @@ files:
|
|
50
50
|
- douban-rails2.3-0.6.1.gem
|
51
51
|
- douban-rails2.3-0.6.2.gem
|
52
52
|
- douban-rails2.3-0.6.3.gem
|
53
|
+
- douban-rails2.3-0.6.4.gem
|
53
54
|
- douban-rails2.3.gemspec
|
54
55
|
- generators/douban/douban_generator.rb
|
55
56
|
- generators/douban/templates/douban.yml
|
56
57
|
- generators/douban/templates/douban_controller.rb
|
57
58
|
- generators/douban/templates/douban_helper.rb
|
58
|
-
- generators/douban/templates/douban_init.rb
|
59
59
|
- lib/douban.rb
|
60
|
+
- lib/models/book.rb
|
61
|
+
- lib/parser.rb
|
60
62
|
has_rdoc: true
|
61
63
|
homepage: http://github.com/yzhang/douban
|
62
64
|
licenses: []
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# Include hook code here
|
2
|
-
douban_configs = YAML.load_file(File.join(RAILS_ROOT, 'config/douban.yml'))
|
3
|
-
|
4
|
-
ENV['DOUBAN_APP_KEY'] = douban_configs[RAILS_ENV]['key'].to_s
|
5
|
-
ENV['DOUBAN_APP_SECRET'] = douban_configs[RAILS_ENV]['secret']
|
6
|
-
ENV['DOUBAN_BOOK_URL'] = douban_configs[RAILS_ENV]['book_url']
|
7
|
-
ENV['DOUBAN_BOOKS_URL'] = douban_configs[RAILS_ENV]['books_url']
|