Class: Line::Bot::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/line/bot/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) {|_self| ... } ⇒ Line::Bot::Client

Initialize a new Bot Client.

Parameters:

  • options (Hash) (defaults to: {})

Yields:

  • (_self)

Yield Parameters:



38
39
40
41
42
43
# File 'lib/line/bot/client.rb', line 38

def initialize(options = {})
  options.each do |key, value|
    instance_variable_set("@#{key}", value)
  end
  yield(self) if block_given?
end

Instance Attribute Details

#channel_secretObject

@return [String]



25
26
27
# File 'lib/line/bot/client.rb', line 25

def channel_secret
  @channel_secret
end

#channel_tokenObject

@return [String]



25
26
27
# File 'lib/line/bot/client.rb', line 25

def channel_token
  @channel_token
end

#endpointObject

@return [String]



25
26
27
# File 'lib/line/bot/client.rb', line 25

def endpoint
  @endpoint
end

#http_optionsHash

Returns:

  • (Hash)


31
32
33
# File 'lib/line/bot/client.rb', line 31

def http_options
  @http_options
end

#httpclientObject

Returns:

  • (Object)


28
29
30
# File 'lib/line/bot/client.rb', line 28

def httpclient
  @httpclient
end

Instance Method Details

#create_rich_menu(rich_menu) ⇒ Net::HTTPResponse

Create a rich menu

Parameters:

  • rich_menu (Hash)

    The rich menu represented as a rich menu object

Returns:

  • (Net::HTTPResponse)


251
252
253
254
255
256
257
258
259
260
261
# File 'lib/line/bot/client.rb', line 251

def create_rich_menu(rich_menu)
  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = '/bot/richmenu'
    config.credentials    = credentials
    config.payload        = rich_menu.to_json
  end

  request.post
end

#create_rich_menu_image(rich_menu_id, file) ⇒ Net::HTTPResponse

Upload and attaches an image to a rich menu

Parameters:

  • rich_menu_id (String)

    The ID of the rich menu to attach the image to

  • file (File)

    Image file to attach rich menu

Returns:

  • (Net::HTTPResponse)


326
327
328
329
330
331
332
333
334
335
336
# File 'lib/line/bot/client.rb', line 326

def create_rich_menu_image(rich_menu_id, file)
  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = "/bot/richmenu/#{rich_menu_id}/content"
    config.credentials = credentials
    config.file = file
  end

  request.post
end

#credentialsHash

Returns:

  • (Hash)


54
55
56
57
58
# File 'lib/line/bot/client.rb', line 54

def credentials
  {
    "Authorization" => "Bearer #{channel_token}",
  }
end

#credentials?Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/line/bot/client.rb', line 60

def credentials?
  credentials.values.all?
end

#delete(endpoint_path) ⇒ Net::HTTPResponse

Delete content of specified URL.

Parameters:

  • endpoint_path (String)

Returns:

  • (Net::HTTPResponse)

Raises:



361
362
363
364
365
366
367
368
369
370
371
372
# File 'lib/line/bot/client.rb', line 361

def delete(endpoint_path)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = endpoint_path
    config.credentials    = credentials
  end

  request.delete
end

#delete_rich_menu(rich_menu_id) ⇒ Net::HTTPResponse

Delete a rich menu

Parameters:

  • rich_menu_id (String)

    ID of an uploaded rich menu

Returns:

  • (Net::HTTPResponse)


268
269
270
271
# File 'lib/line/bot/client.rb', line 268

def delete_rich_menu(rich_menu_id)
  endpoint_path = "/bot/richmenu/#{rich_menu_id}"
  delete(endpoint_path)
end

#get(endpoint_path) ⇒ Net::HTTPResponse

Fetch data, get content of specified URL.

Parameters:

  • endpoint_path (String)

Returns:

  • (Net::HTTPResponse)

Raises:



343
344
345
346
347
348
349
350
351
352
353
354
# File 'lib/line/bot/client.rb', line 343

def get(endpoint_path)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = endpoint_path
    config.credentials    = credentials
  end

  request.get
end

#get_group_member_ids(group_id, continuation_token = nil) ⇒ Net::HTTPResponse

Get user IDs of a group

Parameters:

  • group_id (String)

    Group’s identifier

  • continuation_token (String) (defaults to: nil)

    Identifier to return next page (next property to be included in the response)

Returns:

  • (Net::HTTPResponse)


209
210
211
212
213
# File 'lib/line/bot/client.rb', line 209

def get_group_member_ids(group_id, continuation_token = nil)
  endpoint_path  = "/bot/group/#{group_id}/members/ids"
  endpoint_path += "?start=#{continuation_token}" if continuation_token
  get(endpoint_path)
end

#get_group_member_profile(group_id, user_id) ⇒ Net::HTTPResponse

Get an user’s profile of a group.

Parameters:

  • group_id (String)

    Group’s identifier

  • user_id (String)

    User’s identifier

Returns:

  • (Net::HTTPResponse)


186
187
188
189
# File 'lib/line/bot/client.rb', line 186

def get_group_member_profile(group_id, user_id)
  endpoint_path = "/bot/group/#{group_id}/member/#{user_id}"
  get(endpoint_path)
end

#get_message_content(identifier) ⇒ Net::HTTPResponse

Get message content.

Parameters:

  • identifier (String)

    Message’s identifier

Returns:

  • (Net::HTTPResponse)


165
166
167
168
# File 'lib/line/bot/client.rb', line 165

def get_message_content(identifier)
  endpoint_path  = "/bot/message/#{identifier}/content"
  get(endpoint_path)
end

#get_profile(user_id) ⇒ Net::HTTPResponse

Get an user’s profile.

Parameters:

  • user_id (String)

    User’s identifier

Returns:

  • (Net::HTTPResponse)


175
176
177
178
# File 'lib/line/bot/client.rb', line 175

def get_profile(user_id)
  endpoint_path  = "/bot/profile/#{user_id}"
  get(endpoint_path)
end

#get_rich_menu(rich_menu_id) ⇒ Net::HTTPResponse

Get a rich menu via a rich menu ID

Parameters:

  • rich_menu_id (String)

    ID of an uploaded rich menu

Returns:

  • (Net::HTTPResponse)


241
242
243
244
# File 'lib/line/bot/client.rb', line 241

def get_rich_menu(rich_menu_id)
  endpoint_path = "/bot/richmenu/#{rich_menu_id}"
  get(endpoint_path)
end

#get_rich_menu_image(rich_menu_id) ⇒ Net::HTTPResponse

Download an image associated with a rich menu

Parameters:

  • rich_menu_id (String)

    ID of an uploaded rich menu

Returns:

  • (Net::HTTPResponse)


315
316
317
318
# File 'lib/line/bot/client.rb', line 315

def get_rich_menu_image(rich_menu_id)
  endpoint_path = "/bot/richmenu/#{rich_menu_id}/content"
  get(endpoint_path)
end

#get_rich_menusNet::HTTPResponse

Get a list of all uploaded rich menus

Returns:

  • (Net::HTTPResponse)


231
232
233
234
# File 'lib/line/bot/client.rb', line 231

def get_rich_menus
  endpoint_path = '/bot/richmenu/list'
  get(endpoint_path)
end

#get_room_member_ids(room_id, continuation_token = nil) ⇒ Net::HTTPResponse

Get user IDs of a room

Parameters:

  • group_id (String)

    Room’s identifier

  • continuation_token (String) (defaults to: nil)

    Identifier to return next page (next property to be included in the response)

Returns:

  • (Net::HTTPResponse)


222
223
224
225
226
# File 'lib/line/bot/client.rb', line 222

def get_room_member_ids(room_id, continuation_token = nil)
  endpoint_path  = "/bot/room/#{room_id}/members/ids"
  endpoint_path += "?start=#{continuation_token}" if continuation_token
  get(endpoint_path)
end

#get_room_member_profile(room_id, user_id) ⇒ Net::HTTPResponse

Get an user’s profile of a room.

Parameters:

  • room_id (String)

    Room’s identifier

  • user_id (String)

    User’s identifier

Returns:

  • (Net::HTTPResponse)


197
198
199
200
# File 'lib/line/bot/client.rb', line 197

def get_room_member_profile(room_id, user_id)
  endpoint_path = "/bot/room/#{room_id}/member/#{user_id}"
  get(endpoint_path)
end

#get_user_rich_menu(user_id) ⇒ Net::HTTPResponse

Get the ID of the rich menu linked to a user

Parameters:

  • user_id (String)

    ID of the user

Returns:

  • (Net::HTTPResponse)


278
279
280
281
# File 'lib/line/bot/client.rb', line 278

def get_user_rich_menu(user_id)
  endpoint_path = "/bot/user/#{user_id}/richmenu"
  get(endpoint_path)
end

#leave_group(group_id) ⇒ Object



134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/line/bot/client.rb', line 134

def leave_group(group_id)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = "/bot/group/#{group_id}/leave"
    config.credentials    = credentials
  end

  request.post
end

#leave_room(room_id) ⇒ Object



147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/line/bot/client.rb', line 147

def leave_room(room_id)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = "/bot/room/#{room_id}/leave"
    config.credentials    = credentials
  end

  request.post
end

Link a rich menu to a user

Parameters:

  • user_id (String)

    ID of the user

  • rich_menu_id (String)

    ID of an uploaded rich menu

Returns:

  • (Net::HTTPResponse)


289
290
291
292
293
294
295
296
297
298
# File 'lib/line/bot/client.rb', line 289

def link_user_rich_menu(user_id, rich_menu_id)
  request = Request.new do |config|
    config.httpclient = httpclient
    config.endpoint = endpoint
    config.endpoint_path = "/bot/user/#{user_id}/richmenu/#{rich_menu_id}"
    config.credentials = credentials
  end

  request.post
end

#multicast(to, messages) ⇒ Net::HTTPResponse

Multicast messages to line server and to users.

Parameters:

  • to (Array or String)
  • messages (Hash or Array)

Returns:

  • (Net::HTTPResponse)

Raises:



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

def multicast(to, messages)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  to = [to] if to.is_a?(String)
  messages = [messages] if messages.is_a?(Hash)

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = '/bot/message/multicast'
    config.credentials    = credentials
    config.to             = to
    config.messages       = messages
  end

  request.post
end

#parse_events_from(request_body) ⇒ Array<Line::Bot::Event::Class>

Parse events from request.body

Parameters:

  • request_body (String)

Returns:

  • (Array<Line::Bot::Event::Class>)


379
380
381
382
383
384
385
386
387
388
389
390
# File 'lib/line/bot/client.rb', line 379

def parse_events_from(request_body)
  json = JSON.parse(request_body)

  json['events'].map { |item|
    begin
      klass = Line::Bot::Event.const_get(item['type'].capitalize)
      klass.new(item)
    rescue NameError => e
      Line::Bot::Event::Base.new(item)
    end
  }
end

#push_message(user_id, messages) ⇒ Net::HTTPResponse

Push messages to line server and to user.

Parameters:

  • user_id (String)

    User’s identifiers

  • messages (Hash or Array)

Returns:

  • (Net::HTTPResponse)

Raises:



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/line/bot/client.rb', line 70

def push_message(user_id, messages)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  messages = [messages] if messages.is_a?(Hash)

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = '/bot/message/push'
    config.credentials    = credentials
    config.to             = user_id
    config.messages       = messages
  end

  request.post
end

#reply_message(token, messages) ⇒ Net::HTTPResponse

Reply messages to line server and to users.

Parameters:

  • token (String)
  • messages (Hash or Array)

Returns:

  • (Net::HTTPResponse)

Raises:



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/line/bot/client.rb', line 93

def reply_message(token, messages)
  raise Line::Bot::API::InvalidCredentialsError, 'Invalidates credentials' unless credentials?

  messages = [messages] if messages.is_a?(Hash)

  request = Request.new do |config|
    config.httpclient     = httpclient
    config.endpoint       = endpoint
    config.endpoint_path  = '/bot/message/reply'
    config.credentials    = credentials
    config.reply_token    = token
    config.messages       = messages
  end

  request.post
end

Unlink a rich menu from a user

Parameters:

  • user_id (String)

    ID of the user

Returns:

  • (Net::HTTPResponse)


305
306
307
308
# File 'lib/line/bot/client.rb', line 305

def unlink_user_rich_menu(user_id)
  endpoint_path  = "/bot/user/#{user_id}/richmenu"
  delete(endpoint_path)
end

#validate_signature(content, channel_signature) ⇒ Boolean

Validate signature

Parameters:

  • content (String)

    Request’s body

  • channel_signature (String)

    Request’header ‘X-LINE-Signature’ # HTTP_X_LINE_SIGNATURE

Returns:

  • (Boolean)


398
399
400
401
402
403
404
405
# File 'lib/line/bot/client.rb', line 398

def validate_signature(content, channel_signature)
  return false if !channel_signature || !channel_secret

  hash = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA256.new, channel_secret, content)
  signature = Base64.strict_encode64(hash)

  variable_secure_compare(channel_signature, signature)
end