facebook-messenger 1.1.2 → 1.2.0
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.
- checksums.yaml +5 -5
- data/README.md +21 -3
- data/lib/facebook/messenger/bot.rb +11 -5
- data/lib/facebook/messenger/configuration/app_secret_proof_calculator.rb +16 -0
- data/lib/facebook/messenger/configuration/providers/base.rb +29 -0
- data/lib/facebook/messenger/configuration/providers/environment.rb +7 -1
- data/lib/facebook/messenger/incoming/common.rb +16 -4
- data/lib/facebook/messenger/incoming/postback.rb +1 -0
- data/lib/facebook/messenger/incoming/referral.rb +5 -0
- data/lib/facebook/messenger/server.rb +1 -0
- data/lib/facebook/messenger/version.rb +1 -1
- metadata +4 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: f17a2863cfd6e0797b3a942f6fb5959557be525c40e1efc698542a6ab3662ac6
         | 
| 4 | 
            +
              data.tar.gz: e94ac387ab7174e04429cc5afa2b27121fb1bfd03afa3067e3ed61db3b4f34ba
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 2d673c880dfd1647805347e666586aa7478be689b2660e2a91a69084d7b63f576509c917751b7fcc10f8fa8f28147fe1ff8041a196d8aa5850a2bfa0dd1d60c5
         | 
| 7 | 
            +
              data.tar.gz: 801a4fa53d78bfd7e03cf365b57899b25ac085f12507b8307d468b132dac2caeff2d149ee5eb521967548933ded81f0a27957995257e2a0e2a6f21870aec5555
         | 
    
        data/README.md
    CHANGED
    
    | @@ -48,9 +48,21 @@ Bot.deliver({ | |
| 48 48 | 
             
                text: 'Human?'
         | 
| 49 49 | 
             
              },
         | 
| 50 50 | 
             
              message_type: Facebook::Messenger::Bot::MessagingType::UPDATE
         | 
| 51 | 
            -
            }, access_token: ENV['ACCESS_TOKEN'] | 
| 51 | 
            +
            }, access_token: ENV['ACCESS_TOKEN'], app_secret_proof: app_secret_proof
         | 
| 52 | 
            +
            )
         | 
| 53 | 
            +
            ```
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            NOTE: `app_secret_proof` is an optional parameter to [secure your requests](https://developers.facebook.com/docs/graph-api/securing-requests/),
         | 
| 56 | 
            +
            and you can generate it from your configuration provider like so:
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            ```ruby
         | 
| 59 | 
            +
            configuration_provider = Facebook::Messenger::Configuration::Providers.Environment.new
         | 
| 60 | 
            +
            app_secret_proof = configuration_provider.app_secret_proof_for(page_id)
         | 
| 52 61 | 
             
            ```
         | 
| 53 62 |  | 
| 63 | 
            +
            For the methods you'll usually use (like `reply` and `typing_on`), the app secret proof will be set and sent
         | 
| 64 | 
            +
            automatically if you set the environment variable `APP_SECRET_PROOF_ENABLED` to `true`.
         | 
| 65 | 
            +
             | 
| 54 66 | 
             
            ##### Messages with images
         | 
| 55 67 |  | 
| 56 68 | 
             
            The human may require visual aid to understand:
         | 
| @@ -432,7 +444,10 @@ Once you've configured your bot, subscribe it to the Page to get messages | |
| 432 444 | 
             
            from Facebook:
         | 
| 433 445 |  | 
| 434 446 | 
             
            ```ruby
         | 
| 435 | 
            -
            Facebook::Messenger::Subscriptions.subscribe( | 
| 447 | 
            +
            Facebook::Messenger::Subscriptions.subscribe(
         | 
| 448 | 
            +
              access_token: access_token,
         | 
| 449 | 
            +
              subscribed_fields: %w[feed mention name]
         | 
| 450 | 
            +
            )
         | 
| 436 451 | 
             
            ```
         | 
| 437 452 |  | 
| 438 453 | 
             
            You only need to subscribe your page once. As long as your bot works and
         | 
| @@ -536,7 +551,10 @@ require 'facebook/messenger' | |
| 536 551 | 
             
            include Facebook::Messenger
         | 
| 537 552 |  | 
| 538 553 | 
             
            class Listener
         | 
| 539 | 
            -
              Facebook::Messenger::Subscriptions.subscribe( | 
| 554 | 
            +
              Facebook::Messenger::Subscriptions.subscribe(
         | 
| 555 | 
            +
                access_token: ENV["FB_ACCESS_TOKEN"],
         | 
| 556 | 
            +
                subscribed_fields: %w[feed mention name]
         | 
| 557 | 
            +
              )
         | 
| 540 558 |  | 
| 541 559 | 
             
              Bot.on :message do |message|
         | 
| 542 560 | 
             
                Bot.deliver({
         | 
| @@ -13,7 +13,7 @@ module Facebook | |
| 13 13 | 
             
                  include HTTParty
         | 
| 14 14 |  | 
| 15 15 | 
             
                  # Define base_uri for HTTParty.
         | 
| 16 | 
            -
                  base_uri 'https://graph.facebook.com/ | 
| 16 | 
            +
                  base_uri 'https://graph.facebook.com/v3.2/me'
         | 
| 17 17 |  | 
| 18 18 | 
             
                  #
         | 
| 19 19 | 
             
                  # @return [Array] Array containing the supported webhook events.
         | 
| @@ -39,16 +39,22 @@ module Facebook | |
| 39 39 | 
             
                    #
         | 
| 40 40 | 
             
                    # @param [Hash] message A Hash describing the recipient and the message.
         | 
| 41 41 | 
             
                    # @param [String] access_token Access token.
         | 
| 42 | 
            +
                    # @param [String] app_secret_proof proof of the app_secret
         | 
| 43 | 
            +
                    # https://developers.facebook.com/docs/graph-api/securing-requests/
         | 
| 44 | 
            +
                    # Note: we provide a helper function available at
         | 
| 45 | 
            +
                    # Messenger::Configuration::Providers::Base#calculate_app_secret_proof
         | 
| 42 46 | 
             
                    #
         | 
| 43 47 | 
             
                    # Returns a String describing the message ID if the message was sent,
         | 
| 44 48 | 
             
                    # or raises an exception if it was not.
         | 
| 45 | 
            -
                    def deliver(message, access_token:)
         | 
| 49 | 
            +
                    def deliver(message, access_token:, app_secret_proof: nil)
         | 
| 50 | 
            +
                      query = {
         | 
| 51 | 
            +
                        access_token: access_token
         | 
| 52 | 
            +
                      }
         | 
| 53 | 
            +
                      query[:appsecret_proof] = app_secret_proof if app_secret_proof
         | 
| 46 54 | 
             
                      response = post '/messages',
         | 
| 47 55 | 
             
                                      body: JSON.dump(message),
         | 
| 48 56 | 
             
                                      format: :json,
         | 
| 49 | 
            -
                                      query:  | 
| 50 | 
            -
                                        access_token: access_token
         | 
| 51 | 
            -
                                      }
         | 
| 57 | 
            +
                                      query: query
         | 
| 52 58 |  | 
| 53 59 | 
             
                      Facebook::Messenger::Bot::ErrorParser.raise_errors_from(response)
         | 
| 54 60 |  | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            module Facebook
         | 
| 2 | 
            +
              module Messenger
         | 
| 3 | 
            +
                class Configuration
         | 
| 4 | 
            +
                  # We provide a service to calculate an app_secret_proof
         | 
| 5 | 
            +
                  class AppSecretProofCalculator
         | 
| 6 | 
            +
                    def self.call(app_secret, access_token)
         | 
| 7 | 
            +
                      OpenSSL::HMAC.hexdigest(
         | 
| 8 | 
            +
                        OpenSSL::Digest.new('SHA256'.freeze),
         | 
| 9 | 
            +
                        app_secret,
         | 
| 10 | 
            +
                        access_token
         | 
| 11 | 
            +
                      )
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            require 'facebook/messenger/configuration/app_secret_proof_calculator'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Facebook
         | 
| 2 4 | 
             
              module Messenger
         | 
| 3 5 | 
             
                class Configuration
         | 
| @@ -7,6 +9,16 @@ module Facebook | |
| 7 9 | 
             
                    #   Be sure to implement all the functions as it raises
         | 
| 8 10 | 
             
                    #   NotImplementedError errors.
         | 
| 9 11 | 
             
                    class Base
         | 
| 12 | 
            +
                      # A default caching implentation of generating the app_secret_proof
         | 
| 13 | 
            +
                      # for a given page_id
         | 
| 14 | 
            +
                      def app_secret_proof_for(page_id = nil)
         | 
| 15 | 
            +
                        return unless fetch_app_secret_proof_enabled?
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                        memo_key = [app_secret_for(page_id), access_token_for(page_id)]
         | 
| 18 | 
            +
                        memoized_app_secret_proofs[memo_key] ||=
         | 
| 19 | 
            +
                          calculate_app_secret_proof(*memo_key)
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
             | 
| 10 22 | 
             
                      def valid_verify_token?(*)
         | 
| 11 23 | 
             
                        raise NotImplementedError
         | 
| 12 24 | 
             
                      end
         | 
| @@ -18,6 +30,23 @@ module Facebook | |
| 18 30 | 
             
                      def access_token_for(*)
         | 
| 19 31 | 
             
                        raise NotImplementedError
         | 
| 20 32 | 
             
                      end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                      private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                      def calculate_app_secret_proof(app_secret, access_token)
         | 
| 37 | 
            +
                        Facebook::Messenger::Configuration::AppSecretProofCalculator.call(
         | 
| 38 | 
            +
                          app_secret,
         | 
| 39 | 
            +
                          access_token
         | 
| 40 | 
            +
                        )
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                      def memoized_app_secret_proofs
         | 
| 44 | 
            +
                        @memoized_app_secret_proofs ||= {}
         | 
| 45 | 
            +
                      end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                      def fetch_app_secret_proof_enabled?
         | 
| 48 | 
            +
                        false
         | 
| 49 | 
            +
                      end
         | 
| 21 50 | 
             
                    end
         | 
| 22 51 | 
             
                  end
         | 
| 23 52 | 
             
                end
         | 
| @@ -1,9 +1,11 @@ | |
| 1 | 
            +
            require 'facebook/messenger/configuration/providers/base'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Facebook
         | 
| 2 4 | 
             
              module Messenger
         | 
| 3 5 | 
             
                class Configuration
         | 
| 4 6 | 
             
                  module Providers
         | 
| 5 7 | 
             
                    # The default configuration provider for environment variables.
         | 
| 6 | 
            -
                    class Environment
         | 
| 8 | 
            +
                    class Environment < Base
         | 
| 7 9 | 
             
                      def valid_verify_token?(verify_token)
         | 
| 8 10 | 
             
                        verify_token == ENV['VERIFY_TOKEN']
         | 
| 9 11 | 
             
                      end
         | 
| @@ -20,6 +22,10 @@ module Facebook | |
| 20 22 | 
             
                      def access_token_for(*)
         | 
| 21 23 | 
             
                        ENV['ACCESS_TOKEN']
         | 
| 22 24 | 
             
                      end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      def fetch_app_secret_proof_enabled?
         | 
| 27 | 
            +
                        ENV['APP_SECRET_PROOF_ENABLED'] == 'true'.freeze
         | 
| 28 | 
            +
                      end
         | 
| 23 29 | 
             
                    end
         | 
| 24 30 | 
             
                  end
         | 
| 25 31 | 
             
                end
         | 
| @@ -74,7 +74,7 @@ module Facebook | |
| 74 74 | 
             
                        sender_action: 'typing_on'
         | 
| 75 75 | 
             
                      }
         | 
| 76 76 |  | 
| 77 | 
            -
                       | 
| 77 | 
            +
                      deliver_payload(payload)
         | 
| 78 78 | 
             
                    end
         | 
| 79 79 |  | 
| 80 80 | 
             
                    #
         | 
| @@ -90,7 +90,7 @@ module Facebook | |
| 90 90 | 
             
                        sender_action: 'typing_off'
         | 
| 91 91 | 
             
                      }
         | 
| 92 92 |  | 
| 93 | 
            -
                       | 
| 93 | 
            +
                      deliver_payload(payload)
         | 
| 94 94 | 
             
                    end
         | 
| 95 95 |  | 
| 96 96 | 
             
                    #
         | 
| @@ -106,7 +106,7 @@ module Facebook | |
| 106 106 | 
             
                        sender_action: 'mark_seen'
         | 
| 107 107 | 
             
                      }
         | 
| 108 108 |  | 
| 109 | 
            -
                       | 
| 109 | 
            +
                      deliver_payload(payload)
         | 
| 110 110 | 
             
                    end
         | 
| 111 111 |  | 
| 112 112 | 
             
                    #
         | 
| @@ -123,7 +123,7 @@ module Facebook | |
| 123 123 | 
             
                        message_type: Facebook::Messenger::Bot::MessageType::RESPONSE
         | 
| 124 124 | 
             
                      }
         | 
| 125 125 |  | 
| 126 | 
            -
                       | 
| 126 | 
            +
                      deliver_payload(payload)
         | 
| 127 127 | 
             
                    end
         | 
| 128 128 |  | 
| 129 129 | 
             
                    #
         | 
| @@ -134,6 +134,18 @@ module Facebook | |
| 134 134 | 
             
                    def access_token
         | 
| 135 135 | 
             
                      Facebook::Messenger.config.provider.access_token_for(recipient)
         | 
| 136 136 | 
             
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    def app_secret_proof
         | 
| 139 | 
            +
                      Facebook::Messenger.config.provider.app_secret_proof_for(recipient)
         | 
| 140 | 
            +
                    end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                    private
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    def deliver_payload(payload)
         | 
| 145 | 
            +
                      Facebook::Messenger::Bot.deliver(payload,
         | 
| 146 | 
            +
                                                       access_token: access_token,
         | 
| 147 | 
            +
                                                       app_secret_proof: app_secret_proof)
         | 
| 148 | 
            +
                    end
         | 
| 137 149 | 
             
                  end
         | 
| 138 150 | 
             
                end
         | 
| 139 151 | 
             
              end
         | 
| @@ -160,6 +160,7 @@ module Facebook | |
| 160 160 | 
             
                      # If the application has subscribed to webhooks other than Messenger,
         | 
| 161 161 | 
             
                      # 'messaging' won't be available and it is not relevant to us.
         | 
| 162 162 | 
             
                      next unless entry['messaging'.freeze]
         | 
| 163 | 
            +
             | 
| 163 164 | 
             
                      # Facebook may batch several items in the 'messaging' array during
         | 
| 164 165 | 
             
                      # periods of high load.
         | 
| 165 166 | 
             
                      entry['messaging'.freeze].each do |messaging|
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: facebook-messenger
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.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:  | 
| 11 | 
            +
            date: 2019-04-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: httparty
         | 
| @@ -174,6 +174,7 @@ files: | |
| 174 174 | 
             
            - lib/facebook/messenger/bot/messaging_type.rb
         | 
| 175 175 | 
             
            - lib/facebook/messenger/bot/tag.rb
         | 
| 176 176 | 
             
            - lib/facebook/messenger/configuration.rb
         | 
| 177 | 
            +
            - lib/facebook/messenger/configuration/app_secret_proof_calculator.rb
         | 
| 177 178 | 
             
            - lib/facebook/messenger/configuration/providers.rb
         | 
| 178 179 | 
             
            - lib/facebook/messenger/configuration/providers/base.rb
         | 
| 179 180 | 
             
            - lib/facebook/messenger/configuration/providers/environment.rb
         | 
| @@ -216,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 216 217 | 
             
                  version: '0'
         | 
| 217 218 | 
             
            requirements: []
         | 
| 218 219 | 
             
            rubyforge_project: 
         | 
| 219 | 
            -
            rubygems_version: 2.6 | 
| 220 | 
            +
            rubygems_version: 2.7.6
         | 
| 220 221 | 
             
            signing_key: 
         | 
| 221 222 | 
             
            specification_version: 4
         | 
| 222 223 | 
             
            summary: Facebook Messenger client
         |