Class: HatenaDiary::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/hatenadiary.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(username, password, agent = self.class.mechanizer.new) ⇒ Client

Allocates Client object.

username

Hatena ID

password

Password for username



84
85
86
87
88
89
# File 'lib/hatenadiary.rb', line 84

def initialize(username, password, agent = self.class.mechanizer.new)
  @agent = agent
  @username = username
  @password = password
  @current_account = nil
end

Class Method Details

.login(username, password, proxy = nil, &block) ⇒ Object

Allocates Client object.

If block given, login and execute a received block, and then logout ensurely.

username

Hatena ID

password

Password for username

proxy

Proxy configuration; [proxy_url, port_no] | nil



73
74
75
76
77
78
# File 'lib/hatenadiary.rb', line 73

def self.(username, password, proxy = nil, &block)
  client = new(username, password)
  client.set_proxy(*proxy) if proxy
  return client unless block_given?
  client.transaction(&block)
end

.mechanizerObject



57
58
59
# File 'lib/hatenadiary.rb', line 57

def self.mechanizer
  @mechanizer ||= Mechanize
end

.mechanizer=(klass) ⇒ Object



61
62
63
# File 'lib/hatenadiary.rb', line 61

def self.mechanizer=(klass)
  @mechanizer = klass
end

Instance Method Details

#delete(yyyy, mm, dd, options = {}) ⇒ Object

Deletes an entry from Hatena diary service.

Raises HatenaDiary::LoginError unless logined.

options

:group

assign hatena-group name. edit group diary.

Invalid options were ignored.



172
173
174
# File 'lib/hatenadiary.rb', line 172

def delete(yyyy, mm, dd, options = {})
  get_form(yyyy, mm, dd, options[:group]){|r| r.forms.last }.submit
end

#login(username = nil, password = nil) ⇒ Object

Does login.

If username or password are invalid, raises HatenaDiary::LoginError .



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/hatenadiary.rb', line 117

def (username = nil, password = nil)
  username ||= @username
  password ||= @password
  form = @agent.get("https://www.hatena.ne.jp/login").forms.first
  form["name"]       = username
  form["password"]   = password
  form["persistent"] = "true"
  response = form.submit
  @current_account = [username, password]
  case response.title
  when "Hatena" then response
  when "Login - Hatena" then raise LoginError.new("login failure").(username, password)
  else raise Exception, '[BUG] must not happen (maybe cannot follow hatena spec)'
  end
end

#login?Boolean

Returns a client itself was logined or not.

-> true | false

Returns:

  • (Boolean)


110
111
112
# File 'lib/hatenadiary.rb', line 110

def login?
  @current_account ? true : false
end

#logoutObject

Does logout if already logined.



134
135
136
137
138
139
140
# File 'lib/hatenadiary.rb', line 134

def logout
  return unless login?
  @agent.get("https://www.hatena.ne.jp/logout")
   = @current_account
  @current_account = nil
  
end

#post(yyyy, mm, dd, title, body, options = {}) ⇒ Object

Posts an entry to Hatena diary service.

Raises HatenaDiary::LoginError unless logined.

options

:trivial

check a checkbox of trivial updating.

:group

assign hatena-group name. edit group diary.

Invalid options were ignored.



151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/hatenadiary.rb', line 151

def post(yyyy, mm, dd, title, body, options = {})
  title = Util.encode_to_utf8(title)
  body  = Util.encode_to_utf8(body)
  form = get_form(yyyy, mm, dd, options[:group]){|r| r.form_with(:name => 'edit') }
  form["year"]    = "%04d" % yyyy
  form["month"]   = "%02d" % mm
  form["day"]     = "%02d" % dd
  form["title"]   = title
  form["body"]    = body
  form["trivial"] = "true" if options[:trivial]
  @agent.submit form, form.button_with(:name => 'edit')
end

#set_proxy(url, port) ⇒ Object

Configure proxy.



92
93
94
# File 'lib/hatenadiary.rb', line 92

def set_proxy(url, port)
  @agent.set_proxy(url, port)
end

#transaction(username = nil, password = nil) ⇒ Object

Login and execute a received block, and then logout ensurely.

Raises:

  • (LocalJumpError)


97
98
99
100
101
102
103
104
105
# File 'lib/hatenadiary.rb', line 97

def transaction(username = nil, password = nil)
  raise LocalJumpError, "no block given" unless block_given?
  (username, password)
  begin
    yield(self)
  ensure
    logout
  end
end