facebook-messenger 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +183 -18
- data/bin/console +5 -5
- data/lib/facebook/messenger.rb +20 -2
- data/lib/facebook/messenger/bot.rb +123 -0
- data/lib/facebook/messenger/configuration.rb +11 -0
- data/lib/facebook/messenger/error.rb +5 -0
- data/lib/facebook/messenger/incoming.rb +30 -0
- data/lib/facebook/messenger/incoming/delivery.rb +32 -0
- data/lib/facebook/messenger/incoming/message.rb +32 -0
- data/lib/facebook/messenger/incoming/postback.rb +28 -0
- data/lib/facebook/messenger/server.rb +55 -0
- data/lib/facebook/messenger/subscriptions.rb +38 -0
- data/lib/facebook/messenger/version.rb +1 -1
- metadata +110 -8
- data/.gitignore +0 -9
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -21
- data/Rakefile +0 -2
- data/facebook-messenger.gemspec +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f510182ff271bbc196d32186dc1ffb79cfc85a8b
|
4
|
+
data.tar.gz: 7280598efce0fb8f35a5a553bcbad5c62e461064
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa769ba01fb9ec3415e6536a83fe73836e7d54c2f6278176aa9f19356f6d930337f11f22b6e97f85852f5956323f1c25deffec4de4e5c2e4282e6e53cb5a9695
|
7
|
+
data.tar.gz: 4b36aa6de38e44616b07663d8a94112cb0c45aa5875cb786128ee3ed698ee0ba02d1fae3e611b0ad2b1b9f9fb52905a59f202b45ecf0c0fe38d827707c66b382
|
data/README.md
CHANGED
@@ -1,41 +1,206 @@
|
|
1
|
-
|
1
|
+
<p align="center">
|
2
|
+
<img src="https://rawgit.com/hyperoslo/facebook-messenger/master/docs/example_conversation_with_logo.png">
|
3
|
+
</p>
|
2
4
|
|
3
|
-
|
5
|
+
## Installation
|
4
6
|
|
5
|
-
|
7
|
+
$ gem install facebook-messenger
|
6
8
|
|
7
|
-
##
|
9
|
+
## Usage
|
8
10
|
|
9
|
-
|
11
|
+
#### Sending and receiving messages
|
12
|
+
|
13
|
+
You can reply to messages sent by the human:
|
10
14
|
|
11
15
|
```ruby
|
12
|
-
|
16
|
+
# bot.rb
|
17
|
+
require 'facebook/messenger'
|
18
|
+
|
19
|
+
include Facebook::Messenger
|
20
|
+
|
21
|
+
Bot.on :message do |message|
|
22
|
+
message.id # => 'mid.1457764197618:41d102a3e1ae206a38'
|
23
|
+
message.sender # => { id: '1008372609250235' }
|
24
|
+
message.seq # => 73
|
25
|
+
message.sent_at # => 2016-04-22 21:30:36 +0200
|
26
|
+
message.text # => 'Hello, bot!'
|
27
|
+
|
28
|
+
Bot.deliver(
|
29
|
+
recipient: message.sender,
|
30
|
+
message: {
|
31
|
+
text: 'Hello, human!'
|
32
|
+
}
|
33
|
+
)
|
34
|
+
end
|
13
35
|
```
|
14
36
|
|
15
|
-
|
37
|
+
... or even send the human messages out of the blue:
|
16
38
|
|
17
|
-
|
39
|
+
```ruby
|
40
|
+
Bot.deliver(
|
41
|
+
recipient: {
|
42
|
+
id: '45123'
|
43
|
+
},
|
44
|
+
message: {
|
45
|
+
text: 'Human?'
|
46
|
+
}
|
47
|
+
)
|
48
|
+
```
|
18
49
|
|
19
|
-
|
50
|
+
##### Messages with images
|
20
51
|
|
21
|
-
|
52
|
+
The human may require visual aid to understand:
|
22
53
|
|
23
|
-
|
54
|
+
```ruby
|
55
|
+
Bot.deliver(
|
56
|
+
recipient: {
|
57
|
+
id: '45123'
|
58
|
+
},
|
59
|
+
message: {
|
60
|
+
attachment: {
|
61
|
+
type: 'image',
|
62
|
+
payload: {
|
63
|
+
url: {
|
64
|
+
'http://sky.net/visual-aids-for-stupid-organisms/pig.jpg'
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
)
|
70
|
+
```
|
71
|
+
|
72
|
+
##### Messages with buttons
|
73
|
+
|
74
|
+
The human may require simple options to communicate:
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
Bot.deliver(
|
78
|
+
recipient: {
|
79
|
+
id: '45123'
|
80
|
+
},
|
81
|
+
message: {
|
82
|
+
attachment: {
|
83
|
+
type: 'template',
|
84
|
+
payload: {
|
85
|
+
template_type: 'button',
|
86
|
+
text: 'Human, do you like me?',
|
87
|
+
buttons: {
|
88
|
+
{ type: 'postback', title: 'Yes', payload: 'HARMLESS' },
|
89
|
+
{ type: 'postback', title: 'No', payload: 'EXTERMINATE' }
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
94
|
+
)
|
95
|
+
```
|
96
|
+
|
97
|
+
When the human has selected an option, you can act on it:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
Bot.on :postback do |postback|
|
101
|
+
postback.sender # => { id: '1008372609250235' }
|
102
|
+
postback.recipient # => { id: '2015573629214912' }
|
103
|
+
postback.sent_at # => 2016-04-22 21:30:36 +0200
|
104
|
+
postback.payload # => 'EXTERMINATE'
|
105
|
+
|
106
|
+
if postback.payload == 'EXTERMINATE'
|
107
|
+
puts "Human #{postback.recipient} marked for extermination"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
*See Facebook's [documentation][message-documentation] for all message options.*
|
113
|
+
|
114
|
+
#### Message delivery receipts
|
115
|
+
|
116
|
+
You can stalk the human:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
Bot.on :delivery do |delivery|
|
120
|
+
delivery.ids # => 'mid.1457764197618:41d102a3e1ae206a38'
|
121
|
+
delivery.sender # => { id: '1008372609250235' }
|
122
|
+
delivery.recipient # => { id: '2015573629214912' }
|
123
|
+
delivery.at # => 2016-04-22 21:30:36 +0200
|
124
|
+
delivery.seq # => 37
|
125
|
+
|
126
|
+
puts "Human received messages before #{delivery.at}"
|
127
|
+
end
|
128
|
+
```
|
129
|
+
|
130
|
+
## Configuration
|
131
|
+
|
132
|
+
### Create an Application on Facebook
|
133
|
+
|
134
|
+
Create an Application on [developers.facebook.com][facebook-developers] and go
|
135
|
+
to the Messenger tab. Select the Page you want to install your bot on.
|
136
|
+
|
137
|
+
Create a new webhook, enter the domain your bot is connected to and a verify
|
138
|
+
token of your choosing.
|
139
|
+
|
140
|
+
![Application settings](https://scontent-amt2-1.xx.fbcdn.net/hphotos-xfp1/t39.2178-6/12057143_211110782612505_894181129_n.png)
|
141
|
+
|
142
|
+
Use the generated access token and your verify token to configure your bot:
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
Facebook::Messenger.configure do |config|
|
146
|
+
config.access_token = 'EAAG6WgW...'
|
147
|
+
config.verify_token = 'my_voice_is_my_password_verify_me'
|
148
|
+
end
|
149
|
+
```
|
150
|
+
|
151
|
+
### Subscribe your Application to a Page
|
152
|
+
|
153
|
+
Once you've configured your bot, subscribe it to the Page to get messages
|
154
|
+
from Facebook:
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
Facebook::Messenger::Subscriptions.subscribe
|
158
|
+
```
|
159
|
+
|
160
|
+
The bot runs on [Rack][rack], so you hook it up like you would an ordinary
|
161
|
+
web application:
|
162
|
+
|
163
|
+
```ruby
|
164
|
+
# config.ru
|
165
|
+
require 'facebook/messenger'
|
166
|
+
require_relative 'bot'
|
167
|
+
|
168
|
+
run Facebook::Messenger::Server
|
169
|
+
```
|
170
|
+
|
171
|
+
```
|
172
|
+
$ rackup
|
173
|
+
```
|
24
174
|
|
25
|
-
TODO: Write usage instructions here
|
26
175
|
|
27
176
|
## Development
|
28
177
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run
|
178
|
+
After checking out the repo, run `bin/setup` to install dependencies. You can also run
|
179
|
+
`bin/console` for an interactive prompt that will allow you to experiment.
|
30
180
|
|
31
|
-
|
181
|
+
Run `rspec` to run the tests, `rubocop` to lint, or `rake` to do both.
|
32
182
|
|
33
|
-
|
183
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To
|
184
|
+
release a new version, update the version number in `version.rb`, and then run
|
185
|
+
`bundle exec rake release`, which will create a git tag for the version, push git
|
186
|
+
commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
34
187
|
|
35
|
-
|
188
|
+
## Contributing
|
36
189
|
|
190
|
+
Bug reports and pull requests are welcome on GitHub at
|
191
|
+
https://github.com/hyperoslo/facebook-messenger.
|
37
192
|
|
38
|
-
##
|
193
|
+
## Hyper loves you
|
39
194
|
|
40
|
-
|
195
|
+
[Hyper] made this. We're a bunch of folks who love building things. You should
|
196
|
+
[tweet us] if you can't get it to work. In fact, you should tweet us anyway.
|
197
|
+
If you're using Facebook Messenger, we probably want to [hire you].
|
41
198
|
|
199
|
+
[Hyper]: https://github.com/hyperoslo
|
200
|
+
[tweet us]: http://twitter.com/hyperoslo
|
201
|
+
[hire you]: http://www.hyper.no/jobs/engineers
|
202
|
+
[MIT License]: http://opensource.org/licenses/MIT
|
203
|
+
[rubygems.org]: https://rubygems.org
|
204
|
+
[message-documentation]: https://developers.facebook.com/docs/messenger-platform/send-api-reference#request
|
205
|
+
[facebook-developers]: https://developers.facebook.com
|
206
|
+
[rack]: https://github.com/rack/rack
|
data/bin/console
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'facebook/messenger'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
9
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
|
11
|
-
|
10
|
+
require 'pry'
|
11
|
+
Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
data/lib/facebook/messenger.rb
CHANGED
@@ -1,7 +1,25 @@
|
|
1
|
-
require
|
1
|
+
require 'facebook/messenger/version'
|
2
|
+
require 'facebook/messenger/error'
|
3
|
+
require 'facebook/messenger/subscriptions'
|
4
|
+
require 'facebook/messenger/bot'
|
5
|
+
require 'facebook/messenger/server'
|
6
|
+
require 'facebook/messenger/configuration'
|
7
|
+
require 'facebook/messenger/incoming'
|
2
8
|
|
3
9
|
module Facebook
|
10
|
+
# All the code for this gem resides in this module.
|
4
11
|
module Messenger
|
5
|
-
|
12
|
+
def self.configure
|
13
|
+
yield Configuration
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.config
|
17
|
+
Configuration
|
18
|
+
end
|
19
|
+
|
20
|
+
configure do |config|
|
21
|
+
config.access_token = ENV['ACCESS_TOKEN']
|
22
|
+
config.verify_token = ENV['VERIFY_TOKEN']
|
23
|
+
end
|
6
24
|
end
|
7
25
|
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module Facebook
|
2
|
+
module Messenger
|
3
|
+
# The Bot module sends and receives messages.
|
4
|
+
module Bot
|
5
|
+
include HTTParty
|
6
|
+
|
7
|
+
base_uri 'https://graph.facebook.com/v2.6/me'
|
8
|
+
|
9
|
+
EVENTS = [:message, :delivery].freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
# Deliver a message with the given payload.
|
13
|
+
#
|
14
|
+
# message - A Hash describing the recipient and the message*.
|
15
|
+
#
|
16
|
+
# * https://developers.facebook.com/docs/messenger-platform/send-api-reference#request
|
17
|
+
#
|
18
|
+
# Returns a String describing the message ID if the message was sent,
|
19
|
+
# or raises an exception if it was not.
|
20
|
+
def deliver(message)
|
21
|
+
response = post '/messages', body: JSON.dump(message)
|
22
|
+
|
23
|
+
raise_errors_from(response)
|
24
|
+
|
25
|
+
response['message_id']
|
26
|
+
end
|
27
|
+
|
28
|
+
# Register a hook for the given event.
|
29
|
+
#
|
30
|
+
# event - A String describing a Messenger event.
|
31
|
+
# block - A code block to run upon the event.
|
32
|
+
def on(event, &block)
|
33
|
+
unless EVENTS.include? event
|
34
|
+
raise ArgumentError,
|
35
|
+
"#{event} is not a valid event; " \
|
36
|
+
"available events are #{EVENTS.join(',')}"
|
37
|
+
end
|
38
|
+
|
39
|
+
hooks[event] = block
|
40
|
+
end
|
41
|
+
|
42
|
+
# Receive a given message from Messenger.
|
43
|
+
#
|
44
|
+
# payload - A Hash describing the message.
|
45
|
+
#
|
46
|
+
# * https://developers.facebook.com/docs/messenger-platform/webhook-reference
|
47
|
+
def receive(payload)
|
48
|
+
klass = Facebook::Messenger::Incoming.parse(payload)
|
49
|
+
|
50
|
+
case klass
|
51
|
+
when Incoming::Message then trigger(:message, klass)
|
52
|
+
when Incoming::Delivery then trigger(:delivery, klass)
|
53
|
+
when Incoming::Postback then trigger(:postback, klass)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Trigger the hook for the given event.
|
58
|
+
#
|
59
|
+
# event - A String describing a Messenger event.
|
60
|
+
# args - Arguments to pass to the hook.
|
61
|
+
def trigger(event, *args)
|
62
|
+
@hooks.fetch(event).call(*args)
|
63
|
+
rescue KeyError
|
64
|
+
$stderr.puts "Ignoring #{event} (no hook registered)"
|
65
|
+
end
|
66
|
+
|
67
|
+
# Raise any errors in the given response.
|
68
|
+
#
|
69
|
+
# response - A HTTParty::Response object.
|
70
|
+
#
|
71
|
+
# Returns nil if no errors were found, otherwises raises appropriately.
|
72
|
+
def raise_errors_from(response)
|
73
|
+
return unless response.key? 'error'
|
74
|
+
error = response['error']
|
75
|
+
|
76
|
+
raise(
|
77
|
+
error_class_from_error_code(error['code']),
|
78
|
+
(error['error_data'] || error['message'])
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Find the appropriate error class for the given error code.
|
83
|
+
#
|
84
|
+
# error_code - An Integer describing an error code.
|
85
|
+
#
|
86
|
+
# Returns an error class, or raises KeyError if none was found.
|
87
|
+
def error_class_from_error_code(error_code)
|
88
|
+
{
|
89
|
+
100 => RecipientNotFound,
|
90
|
+
10 => PermissionDenied,
|
91
|
+
2 => InternalError
|
92
|
+
}[error_code] || Facebook::Messenger::Error
|
93
|
+
end
|
94
|
+
|
95
|
+
# Return a Hash of hooks.
|
96
|
+
def hooks
|
97
|
+
@hooks ||= {}
|
98
|
+
end
|
99
|
+
|
100
|
+
# Deregister all hooks.
|
101
|
+
def unhook
|
102
|
+
@hooks = {}
|
103
|
+
end
|
104
|
+
|
105
|
+
# Default HTTParty options.
|
106
|
+
def default_options
|
107
|
+
super.merge(
|
108
|
+
query: {
|
109
|
+
access_token: Facebook::Messenger.config.access_token
|
110
|
+
},
|
111
|
+
headers: {
|
112
|
+
'Content-Type' => 'application/json'
|
113
|
+
}
|
114
|
+
)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class RecipientNotFound < Facebook::Messenger::Error; end
|
119
|
+
class PermissionDenied < Facebook::Messenger::Error; end
|
120
|
+
class InternalError < Facebook::Messenger::Error; end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'facebook/messenger/incoming/message'
|
2
|
+
require 'facebook/messenger/incoming/delivery'
|
3
|
+
require 'facebook/messenger/incoming/postback'
|
4
|
+
|
5
|
+
module Facebook
|
6
|
+
module Messenger
|
7
|
+
# The Incoming module parses and abstracts incoming requests from
|
8
|
+
# Facebook Messenger.
|
9
|
+
module Incoming
|
10
|
+
# Parse the given payload.
|
11
|
+
#
|
12
|
+
# payload - A Hash describing a payload from Facebook.
|
13
|
+
#
|
14
|
+
# * https://developers.facebook.com/docs/messenger-platform/webhook-reference
|
15
|
+
def self.parse(payload)
|
16
|
+
{
|
17
|
+
'message' => Message,
|
18
|
+
'delivery' => Delivery,
|
19
|
+
'postback' => Postback
|
20
|
+
}.each do |key, klass|
|
21
|
+
return klass.new(payload) if payload.key? key
|
22
|
+
end
|
23
|
+
|
24
|
+
raise UnknownPayload, payload
|
25
|
+
end
|
26
|
+
|
27
|
+
class UnknownPayload < Facebook::Messenger::Error; end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Facebook
|
2
|
+
module Messenger
|
3
|
+
module Incoming
|
4
|
+
# The Delivery class represents the receipt of a delivered message.
|
5
|
+
class Delivery
|
6
|
+
def initialize(payload)
|
7
|
+
@payload = payload
|
8
|
+
end
|
9
|
+
|
10
|
+
def ids
|
11
|
+
@payload['delivery']['mids']
|
12
|
+
end
|
13
|
+
|
14
|
+
def at
|
15
|
+
Time.at(@payload['delivery']['watermark'] / 1000)
|
16
|
+
end
|
17
|
+
|
18
|
+
def seq
|
19
|
+
@payload['delivery']['seq']
|
20
|
+
end
|
21
|
+
|
22
|
+
def sender
|
23
|
+
@payload['sender']
|
24
|
+
end
|
25
|
+
|
26
|
+
def recipient
|
27
|
+
@payload['recipient']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Facebook
|
2
|
+
module Messenger
|
3
|
+
module Incoming
|
4
|
+
# The Message class represents an incoming Facebook Messenger message.
|
5
|
+
class Message
|
6
|
+
def initialize(payload)
|
7
|
+
@payload = payload
|
8
|
+
end
|
9
|
+
|
10
|
+
def id
|
11
|
+
@payload['message']['mid']
|
12
|
+
end
|
13
|
+
|
14
|
+
def sender
|
15
|
+
@payload['sender']
|
16
|
+
end
|
17
|
+
|
18
|
+
def seq
|
19
|
+
@payload['message']['seq']
|
20
|
+
end
|
21
|
+
|
22
|
+
def sent_at
|
23
|
+
Time.at(@payload['timestamp'] / 1000)
|
24
|
+
end
|
25
|
+
|
26
|
+
def text
|
27
|
+
@payload['message']['text']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Facebook
|
2
|
+
module Messenger
|
3
|
+
module Incoming
|
4
|
+
# The Postback class represents an incoming Facebook Messenger postback.
|
5
|
+
class Postback
|
6
|
+
def initialize(payload)
|
7
|
+
@payload = payload
|
8
|
+
end
|
9
|
+
|
10
|
+
def sender
|
11
|
+
@payload['sender']
|
12
|
+
end
|
13
|
+
|
14
|
+
def recipient
|
15
|
+
@payload['recipient']
|
16
|
+
end
|
17
|
+
|
18
|
+
def sent_at
|
19
|
+
Time.at(@payload['timestamp'] / 1000)
|
20
|
+
end
|
21
|
+
|
22
|
+
def payload
|
23
|
+
@payload['postback']['payload']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Facebook
|
5
|
+
module Messenger
|
6
|
+
# This module holds the server that processes incoming messages from the
|
7
|
+
# Facebook Messenger Platform.
|
8
|
+
class Server
|
9
|
+
class << self
|
10
|
+
def call(env)
|
11
|
+
@request = Rack::Request.new(env)
|
12
|
+
@response = Rack::Response.new
|
13
|
+
|
14
|
+
case @request.request_method
|
15
|
+
when 'GET' then verify
|
16
|
+
when 'POST' then receive
|
17
|
+
else method_not_allowed
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def verify
|
22
|
+
verify_token = Facebook::Messenger.config.verify_token
|
23
|
+
|
24
|
+
if @request.params['hub.verify_token'] == verify_token
|
25
|
+
@response.write @request.params['hub.challenge']
|
26
|
+
else
|
27
|
+
@response.write 'Error; wrong verify token'
|
28
|
+
end
|
29
|
+
|
30
|
+
@response.finish
|
31
|
+
end
|
32
|
+
|
33
|
+
def receive
|
34
|
+
hash = JSON.parse(@request.body.read)
|
35
|
+
# Facebook may batch several items in the 'entry' array during
|
36
|
+
# periods of high load.
|
37
|
+
hash['entry'].each do |entry|
|
38
|
+
# Facebook may batch several items in the 'messaging' array during
|
39
|
+
# periods of high load.
|
40
|
+
entry['messaging'].each do |messaging|
|
41
|
+
Facebook::Messenger::Bot.receive(messaging)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
@response.finish
|
46
|
+
end
|
47
|
+
|
48
|
+
def method_not_allowed
|
49
|
+
@response.status = 405
|
50
|
+
@response.finish
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
module Facebook
|
4
|
+
module Messenger
|
5
|
+
# This module handles subscribing and unsubscribing Applications to Pages.
|
6
|
+
module Subscriptions
|
7
|
+
include HTTParty
|
8
|
+
|
9
|
+
base_uri 'https://graph.facebook.com/v2.6/me'
|
10
|
+
|
11
|
+
def self.subscribe
|
12
|
+
response = post '/subscribed_apps', query: {
|
13
|
+
access_token: Facebook::Messenger.config.access_token
|
14
|
+
}
|
15
|
+
|
16
|
+
raise_errors(response)
|
17
|
+
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.unsubscribe
|
22
|
+
response = delete '/subscribed_apps', query: {
|
23
|
+
access_token: Facebook::Messenger.config.access_token
|
24
|
+
}
|
25
|
+
|
26
|
+
raise_errors(response)
|
27
|
+
|
28
|
+
true
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.raise_errors(response)
|
32
|
+
raise Error, response['error']['message'] if response.key? 'error'
|
33
|
+
end
|
34
|
+
|
35
|
+
class Error < Facebook::Messenger::Error; end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: facebook-messenger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johannes Gorset
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.13.7
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.13.7
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.6.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.6.4
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +52,62 @@ dependencies:
|
|
24
52
|
- - "~>"
|
25
53
|
- !ruby/object:Gem::Version
|
26
54
|
version: '1.11'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.4'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack-test
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.6.3
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.6.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.39'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.39'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: webmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.24'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.24'
|
27
111
|
- !ruby/object:Gem::Dependency
|
28
112
|
name: rake
|
29
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +122,20 @@ dependencies:
|
|
38
122
|
- - "~>"
|
39
123
|
- !ruby/object:Gem::Version
|
40
124
|
version: '10.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
41
139
|
description: Facebook Messenger client
|
42
140
|
email:
|
43
141
|
- jgorset@gmail.com
|
@@ -45,17 +143,21 @@ executables: []
|
|
45
143
|
extensions: []
|
46
144
|
extra_rdoc_files: []
|
47
145
|
files:
|
48
|
-
- ".gitignore"
|
49
|
-
- Gemfile
|
50
|
-
- LICENSE.txt
|
51
146
|
- README.md
|
52
|
-
- Rakefile
|
53
147
|
- bin/console
|
54
148
|
- bin/setup
|
55
|
-
- facebook-messenger.gemspec
|
56
149
|
- lib/facebook/messenger.rb
|
150
|
+
- lib/facebook/messenger/bot.rb
|
151
|
+
- lib/facebook/messenger/configuration.rb
|
152
|
+
- lib/facebook/messenger/error.rb
|
153
|
+
- lib/facebook/messenger/incoming.rb
|
154
|
+
- lib/facebook/messenger/incoming/delivery.rb
|
155
|
+
- lib/facebook/messenger/incoming/message.rb
|
156
|
+
- lib/facebook/messenger/incoming/postback.rb
|
157
|
+
- lib/facebook/messenger/server.rb
|
158
|
+
- lib/facebook/messenger/subscriptions.rb
|
57
159
|
- lib/facebook/messenger/version.rb
|
58
|
-
homepage: https://github.com/
|
160
|
+
homepage: https://github.com/hyperoslo/facebook-messenger
|
59
161
|
licenses:
|
60
162
|
- MIT
|
61
163
|
metadata: {}
|
data/.gitignore
DELETED
data/Gemfile
DELETED
data/LICENSE.txt
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
The MIT License (MIT)
|
2
|
-
|
3
|
-
Copyright (c) 2016 Johannes Gorset
|
4
|
-
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
7
|
-
in the Software without restriction, including without limitation the rights
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
10
|
-
furnished to do so, subject to the following conditions:
|
11
|
-
|
12
|
-
The above copyright notice and this permission notice shall be included in
|
13
|
-
all copies or substantial portions of the Software.
|
14
|
-
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
-
THE SOFTWARE.
|
data/Rakefile
DELETED
data/facebook-messenger.gemspec
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'facebook/messenger/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "facebook-messenger"
|
8
|
-
spec.version = Facebook::Messenger::VERSION
|
9
|
-
spec.authors = ["Johannes Gorset"]
|
10
|
-
spec.email = ["jgorset@gmail.com"]
|
11
|
-
|
12
|
-
spec.summary = %q{Facebook Messenger client}
|
13
|
-
spec.description = %q{Facebook Messenger client}
|
14
|
-
spec.homepage = "https://github.com/jgorset/facebook-messenger"
|
15
|
-
spec.license = "MIT"
|
16
|
-
|
17
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir = "exe"
|
19
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = ["lib"]
|
21
|
-
|
22
|
-
spec.add_development_dependency "bundler", "~> 1.11"
|
23
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
-
end
|