@@ -41,45 +41,72 @@ gem install line-bot-api
41
41
```
42
42
43
43
## Synopsis
44
+ ### RBS
45
+ This library provides [ RBS] ( https://github.com/ruby/rbs ) files for type checking.\
46
+ You can code with type support in the corresponding IDE or editor.
44
47
45
- Usage:
48
+ ### Basic Usage
46
49
47
50
``` ruby
48
51
# app.rb
49
52
require ' sinatra'
50
- require ' line/bot'
53
+ require ' line-bot-api'
54
+
55
+ set :environment , :production
51
56
52
57
def client
53
- @client ||= Line ::Bot ::Client .new { |config |
54
- config.channel_id = ENV [" LINE_CHANNEL_ID" ]
55
- config.channel_secret = ENV [" LINE_CHANNEL_SECRET" ]
56
- config.channel_token = ENV [" LINE_CHANNEL_TOKEN" ]
57
- }
58
+ @client ||= Line ::Bot ::V2 ::MessagingApi ::ApiClient .new (
59
+ channel_access_token: ENV .fetch(" LINE_CHANNEL_ACCESS_TOKEN" )
60
+ )
61
+ end
62
+
63
+ def blob_client
64
+ @blob_client ||= Line ::Bot ::V2 ::MessagingApi ::ApiBlobClient .new (
65
+ channel_access_token: ENV .fetch(" LINE_CHANNEL_ACCESS_TOKEN" )
66
+ )
67
+ end
68
+
69
+ def parser
70
+ @parser ||= Line ::Bot ::V2 ::WebhookParser .new (channel_secret: ENV .fetch(" LINE_CHANNEL_SECRET" ))
58
71
end
59
72
60
73
post ' /callback' do
61
74
body = request.body.read
62
-
63
75
signature = request.env[' HTTP_X_LINE_SIGNATURE' ]
64
- unless client.validate_signature(body, signature)
65
- error 400 do ' Bad Request' end
76
+
77
+ begin
78
+ events = parser.parse(body: body, signature: signature)
79
+ rescue Line ::Bot ::V2 ::WebhookParser ::InvalidSignatureError
80
+ halt 400 , { ' Content-Type' => ' text/plain' }, ' Bad Request'
66
81
end
67
82
68
- events = client.parse_events_from(body)
69
83
events.each do |event |
70
84
case event
71
- when Line ::Bot ::Event ::Message
72
- case event.type
73
- when Line ::Bot ::Event ::MessageType ::Text
74
- message = {
75
- type: ' text' ,
76
- text: event.message[' text' ]
77
- }
78
- client.reply_message(event[' replyToken' ], message)
79
- when Line ::Bot ::Event ::MessageType ::Image , Line ::Bot ::Event ::MessageType ::Video
80
- response = client.get_message_content(event.message[' id' ])
85
+ when Line ::Bot ::V2 ::Webhook ::MessageEvent
86
+ case event.message
87
+ when Line ::Bot ::V2 ::Webhook ::TextMessageContent
88
+ case event.message.text
89
+ when ' profile'
90
+ if event.source.type == ' user'
91
+ profile_response = client.get_profile(user_id: event.source.user_id)
92
+ reply_text(event, " Display name: #{ profile_response.display_name } \n Status message: #{ profile_response.status_message } " )
93
+ else
94
+ reply_text(event, " Bot can't use profile API without user ID" )
95
+ end
96
+ else
97
+ request = Line ::Bot ::V2 ::MessagingApi ::ReplyMessageRequest .new (
98
+ reply_token: event.reply_token,
99
+ messages: [
100
+ Line ::Bot ::V2 ::MessagingApi ::TextMessage .new (text: " [ECHO] #{ event.message.text } " )
101
+ ]
102
+ )
103
+ client.reply_message(reply_message_request: request)
104
+ end
105
+
106
+ when Line ::Bot ::V2 ::Webhook ::ImageMessageContent , Line ::Bot ::V2 ::Webhook ::VideoMessageContent
107
+ response = blob_client.get_message_content(message_id: event.message.message_id)
81
108
tf = Tempfile .open (" content" )
82
- tf.write(response.body )
109
+ tf.write(response)
83
110
end
84
111
end
85
112
end
@@ -89,19 +116,195 @@ post '/callback' do
89
116
end
90
117
```
91
118
92
- ## Migration way from v1 to v2
93
- Migration guide: https://github.com/line/line-bot-sdk-ruby/releases/tag/v1.30.0
119
+ ### Use HTTP Information
120
+ You may need to store the ``` x-line-request-id ``` header obtained as a response from several APIs.\
121
+ In this case, please use ``` *_with_http_info ``` methods. You can get headers and status codes.\
122
+ The ` x-line-accepted-request-id ` or ` content-type ` header can also be obtained in the same way. Note header name must be lowercase.
123
+
124
+ ``` ruby
125
+ push_request = Line ::Bot ::V2 ::MessagingApi ::PushMessageRequest .new (
126
+ to: event.source.user_id,
127
+ messages: [
128
+ Line ::Bot ::V2 ::MessagingApi ::TextMessage .new (text: " [^Request ID] #{ headers[' x-line-request-id' ] } " )
129
+ ]
130
+ )
131
+ _body , _status_code , headers = client.push_message_with_http_info(push_message_request: push_request)
132
+
133
+ puts headers[' x-line-request-id' ]
134
+ puts headers[' x-line-accepted-request-id' ]
135
+ puts headers[' content-type' ]
136
+ ```
137
+
138
+ ### Error handling
139
+ If an API call fails, the SDK does not generate an Error in Ruby; use the status code for proper error handling.
140
+ Error details are stored in body.
141
+
142
+ ``` ruby
143
+ require ' json'
144
+ require ' line-bot-api'
145
+
146
+ def client
147
+ @client ||= Line ::Bot ::V2 ::MessagingApi ::ApiClient .new (
148
+ channel_access_token: ENV .fetch(" LINE_CHANNEL_ACCESS_TOKEN" ),
149
+ )
150
+ end
151
+
152
+ def main
153
+ dummy_message = Line ::Bot ::V2 ::MessagingApi ::TextMessage .new (
154
+ text: " Hello, world!" ,
155
+ )
156
+
157
+ valid_request = Line ::Bot ::V2 ::MessagingApi ::ValidateMessageRequest .new (
158
+ messages: [dummy_message, dummy_message, dummy_message, dummy_message, dummy_message],
159
+ )
160
+ body, status_code, _headers = client.validate_push_with_http_info(validate_message_request: valid_request)
161
+ handle_response(body, status_code)
162
+
163
+ invalid_request = Line ::Bot ::V2 ::MessagingApi ::ValidateMessageRequest .new (
164
+ messages: [dummy_message, dummy_message, dummy_message, dummy_message, dummy_message, dummy_message],
165
+ )
166
+ body, status_code, _headers = client.validate_push_with_http_info(validate_message_request: invalid_request)
167
+ handle_response(body, status_code)
168
+ end
169
+
170
+ def handle_response (body , status_code )
171
+ case status_code
172
+ when 200
173
+ puts " Valid"
174
+ when 400 ..499
175
+ puts " Invalid: #{ JSON .parse(body)} "
176
+ else
177
+ puts " Other Status: #{ status_code } "
178
+ end
179
+ end
180
+
181
+ main
182
+ ```
183
+
184
+ ### Use with Hash / JSON
185
+ You can use Hash instead of the SDK classes.
186
+ So you can also use Hash parsed from JSON as a parameter.
187
+
188
+ This is useful, for example, in migrating from v1 or building Flex Message.
189
+
190
+ ** But this is not recommended because you lose type checking by RBS.**
191
+
192
+ ``` ruby
193
+ client = Line ::Bot ::V2 ::MessagingApi ::ApiClient .new (
194
+ channel_access_token: ENV .fetch(" LINE_CHANNEL_ACCESS_TOKEN" ),
195
+ )
196
+
197
+ request = {
198
+ to: " U4af4980629..." ,
199
+ messages: [
200
+ {
201
+ type: " flex" ,
202
+ alt_text: " This is a Flex Message" ,
203
+ contents: {
204
+ type: " bubble" ,
205
+ body: {
206
+ type: " box" ,
207
+ layout: " horizontal" ,
208
+ contents: [
209
+ {
210
+ type: " text" ,
211
+ text: " Hello"
212
+ }
213
+ ]
214
+ }
215
+ }
216
+ }
217
+ ]
218
+ }
219
+ client.push_message(push_message_request: request)
220
+
221
+ # or
222
+
223
+ request = JSON .parse(
224
+ <<~JSON
225
+ {
226
+ "to": "U4af4980629...",
227
+ "messages": [
228
+ {
229
+ "type": "flex",
230
+ "alt_text": "This is a Flex Message",
231
+ "contents": {
232
+ "type": "bubble",
233
+ "body": {
234
+ "type": "box",
235
+ "layout": "horizontal",
236
+ "contents": [
237
+ {
238
+ "type": "text",
239
+ "text": "Hello"
240
+ }
241
+ ]
242
+ }
243
+ }
244
+ }
245
+ ]
246
+ }
247
+ JSON
248
+ )
249
+ client.push_message(push_message_request: request)
250
+ ```
251
+
252
+ #### Convert to SDK classes
253
+ You can convert Hash / JSON to SDK classes using ` #create ` method.
254
+
255
+ ``` ruby
256
+ json = <<~JSON
257
+ {
258
+ "to": "U4af4980629...",
259
+ "messages": [
260
+ {
261
+ "type": "flex",
262
+ "alt_text": "This is a Flex Message",
263
+ "contents": {
264
+ "type": "bubble",
265
+ "body": {
266
+ "type": "box",
267
+ "layout": "horizontal",
268
+ "contents": [
269
+ {
270
+ "type": "text",
271
+ "text": "Hello"
272
+ }
273
+ ]
274
+ }
275
+ }
276
+ }
277
+ ]
278
+ }
279
+ JSON
280
+ request = Line ::Bot ::V2 ::MessagingApi ::PushMessageRequest .create(
281
+ JSON .parse(json)
282
+ )
283
+ ```
94
284
95
- ## Help and media
96
- FAQ: https://developers.line.biz/en/faq/
285
+ ### More examples
286
+ See the [ examples ] ( examples/v2 ) directory for more examples.
97
287
288
+ ## Media
98
289
News: https://developers.line.biz/en/news/
99
290
100
291
## Versioning
101
292
This project respects semantic versioning.
102
293
103
294
See https://semver.org/
104
295
296
+ ### v1 and v2
297
+ v1 and v2 are completely different implementations, v1 is all deprecated and will be removed in the future.
298
+ Migration to v2 is strongly recommended.
299
+
300
+ Migration guide: https://github.com/line/line-bot-sdk-ruby/releases/tag/v1.30.0
301
+
302
+
303
+ #### Deprecation warnings
304
+ When calling the API endpoint with v1, a deprecation warning will occur.\
305
+ If you want to suppress this, please set any value to the environment variable ` SUPRESS_V1_DEPRECATION_WARNINGS ` .
306
+
307
+
105
308
## Contributing
106
309
Please check [ CONTRIBUTING] ( CONTRIBUTING.md ) before making a contribution.
107
310
0 commit comments