{"id":13480578,"url":"https://github.com/jgorset/facebook-messenger","last_synced_at":"2025-04-13T04:58:09.150Z","repository":{"id":7417476,"uuid":"56318788","full_name":"jgorset/facebook-messenger","owner":"jgorset","description":"Definitely the best way to make Bots on Facebook Messenger with Ruby","archived":false,"fork":false,"pushed_at":"2024-09-03T06:53:31.000Z","size":24691,"stargazers_count":965,"open_issues_count":15,"forks_count":212,"subscribers_count":29,"default_branch":"master","last_synced_at":"2025-04-13T04:58:03.078Z","etag":null,"topics":["bot","facebook","messenger","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jgorset.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-04-15T12:34:06.000Z","updated_at":"2025-03-07T00:17:11.000Z","dependencies_parsed_at":"2024-06-18T14:08:24.356Z","dependency_job_id":"7db7231c-b1f8-4f8d-bd8b-27c7b3474720","html_url":"https://github.com/jgorset/facebook-messenger","commit_stats":{"total_commits":373,"total_committers":49,"mean_commits":7.612244897959184,"dds":0.5093833780160858,"last_synced_commit":"64fe1f5cef4c1e3fca295b205037f64dfebdbcab"},"previous_names":["hyperoslo/facebook-messenger"],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgorset%2Ffacebook-messenger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgorset%2Ffacebook-messenger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgorset%2Ffacebook-messenger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgorset%2Ffacebook-messenger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jgorset","download_url":"https://codeload.github.com/jgorset/facebook-messenger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248665761,"owners_count":21142123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","facebook","messenger","ruby"],"created_at":"2024-07-31T17:00:41.759Z","updated_at":"2025-04-13T04:58:09.129Z","avatar_url":"https://github.com/jgorset.png","language":"Ruby","funding_links":[],"categories":["Frameworks and libraries","Ruby","Uncategorized"],"sub_categories":["Facebook Messenger","Uncategorized"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/jgorset/facebook-messenger/blob/master/docs/conversation.gif?raw=true\"\u003e\n\u003c/p\u003e\n\n\n[![Gem Version](https://img.shields.io/gem/v/facebook-messenger.svg?style=flat)](https://rubygems.org/gems/facebook-messenger)\n[![Gem Downloads](https://img.shields.io/gem/dt/facebook-messenger.svg)](https://rubygems.org/gems/facebook-messenger)\n[![Build Status](https://img.shields.io/travis/jgorset/facebook-messenger.svg?style=flat)](https://travis-ci.org/jgorset/facebook-messenger)\n[![Code Climate](https://img.shields.io/codeclimate/maintainability/jgorset/facebook-messenger.svg)](https://codeclimate.com/github/jgorset/facebook-messenger)\n[![Coverage Status](https://coveralls.io/repos/github/jgorset/facebook-messenger/badge.svg?branch=master)](https://coveralls.io/github/jgorset/facebook-messenger?branch=master)\n[![Documentation Coverage](http://inch-ci.org/github/jgorset/facebook-messenger.svg?branch=master)](http://inch-ci.org/github/jgorset/facebook-messenger)\n\n## Installation\n\n    $ gem install facebook-messenger\n\n## Usage\n\n#### Sending and receiving messages\n\nYou can reply to messages sent by the human:\n\n```ruby\n# bot.rb\nrequire 'facebook/messenger'\n\nFacebook::Messenger::Bot.on :message do |message|\n  message.id          # =\u003e 'mid.1457764197618:41d102a3e1ae206a38'\n  message.sender      # =\u003e { 'id' =\u003e '1008372609250235' }\n  message.recipient   # =\u003e { 'id' =\u003e '2015573629214912' }\n  message.seq         # =\u003e 73\n  message.sent_at     # =\u003e 2016-04-22 21:30:36 +0200\n  message.text        # =\u003e 'Hello, bot!'\n  message.attachments # =\u003e [ { 'type' =\u003e 'image', 'payload' =\u003e { 'url' =\u003e 'https://www.example.com/1.jpg' } } ]\n\n  message.reply(text: 'Hello, human!')\nend\n```\n\n... or even send the human messages out of the blue:\n\n```ruby\nFacebook::Messenger::Bot.deliver({\n  recipient: {\n    id: YOUR_RECIPIENT_ID\n  },\n  message: {\n    text: 'Human?'\n  },\n  messaging_type: Facebook::Messenger::Bot::MessagingType::UPDATE\n}, page_id: YOUR_PAGE_ID)\n```\n\n##### Messages with images\n\nThe human may require visual aid to understand:\n\n```ruby\nmessage.reply(\n  attachment: {\n    type: 'image',\n    payload: {\n      url: 'http://sky.net/visual-aids-for-stupid-organisms/pig.jpg'\n    }\n  }\n)\n```\n\n##### Messages with quick replies\n\nThe human may appreciate hints:\n\n```ruby\nmessage.reply(\n  text: 'Human, who is your favorite bot?',\n  quick_replies: [\n    {\n      content_type: 'text',\n      title: 'You are!',\n      payload: 'HARMLESS'\n    }\n  ]\n)\n```\n\n##### Messages with buttons\n\nThe human may require simple options to communicate:\n\n```ruby\nmessage.reply(\n  attachment: {\n    type: 'template',\n    payload: {\n      template_type: 'button',\n      text: 'Human, do you like me?',\n      buttons: [\n        { type: 'postback', title: 'Yes', payload: 'HARMLESS' },\n        { type: 'postback', title: 'No', payload: 'EXTERMINATE' }\n      ]\n    }\n  }\n)\n```\n\nWhen the human has selected an option, you can act on it:\n\n```ruby\nBot.on :postback do |postback|\n  postback.sender    # =\u003e { 'id' =\u003e '1008372609250235' }\n  postback.recipient # =\u003e { 'id' =\u003e '2015573629214912' }\n  postback.sent_at   # =\u003e 2016-04-22 21:30:36 +0200\n  postback.payload   # =\u003e 'EXTERMINATE'\n\n  if postback.payload == 'EXTERMINATE'\n    puts \"Human #{postback.recipient} marked for extermination\"\n  end\nend\n```\n\n*See Facebook's [documentation][message-documentation] for all message options.*\n\n##### Reactions\n\nHumans have feelings, and they can react to your messages. You can pretend to understand:\n\n```ruby\nBot.on :reaction do |message|\n  message.emoji # =\u003e \"👍\"\n  message.action # =\u003e \"react\"\n  message.reaction # =\u003e \"like\"\n\n  message.reply(text: 'Your feelings have been registered')\nend\n```\n\n##### Typing indicator\n\nShow the human you are preparing a message for them:\n\n```ruby\nBot.on :message do |message|\n  message.typing_on\n\n  # Do something expensive\n\n  message.reply(text: 'Hello, human!')\nend\n```\n\nOr that you changed your mind:\n\n```ruby\nBot.on :message do |message|\n  message.typing_on\n\n  if # something\n    message.reply(text: 'Hello, human!')\n  else\n    message.typing_off\n  end\nend\n```\n\n##### Mark as viewed\n\nYou can mark messages as seen to keep the human on their toes:\n\n```ruby\nBot.on :message do |message|\n  message.mark_seen\nend\n```\n\n##### Record messages\n\nYou can keep track of messages sent to the human:\n\n```ruby\nFacebook::Messenger::Bot.on :message_echo do |message_echo|\n  message_echo.id          # =\u003e 'mid.1457764197618:41d102a3e1ae206a38'\n  message_echo.sender      # =\u003e { 'id' =\u003e '1008372609250235' }\n  message_echo.seq         # =\u003e 73\n  message_echo.sent_at     # =\u003e 2016-04-22 21:30:36 +0200\n  message_echo.text        # =\u003e 'Hello, bot!'\n  message_echo.attachments # =\u003e [ { 'type' =\u003e 'image', 'payload' =\u003e { 'url' =\u003e 'https://www.example.com/1.jpg' } } ]\n\n  # Log or store in your storage method of choice (skynet, obviously)\nend\n```\n\n##### Record accepted message requests\n\nYou can keep track of message requests accepted by the human:\n\n```ruby\nBot.on :message_request do |message_request|\n  message_request.accept? # =\u003e true\n\n  # Log or store in your storage method of choice (skynet, obviously)\nend\n```\n\n##### Record instant game progress\n\nYou can keep track of instant game progress:\n\n```ruby\nBot.on :game_play do |game_play|\n  game_play.sender    # =\u003e { 'id' =\u003e '1008372609250235' }\n  game_play.recipient # =\u003e { 'id' =\u003e '2015573629214912' }\n  game_play.sent_at   # =\u003e 2016-04-22 21:30:36 +0200\n  game_play.game      # =\u003e \"\u003cGAME-APP-ID\u003e\"\n  game_play.player    # =\u003e \"\u003cPLAYER-ID\u003e\"\n  game_play.context   # =\u003e { 'context_type' =\u003e \"\u003cCONTEXT-TYPE:SOLO|THREAD\u003e\", 'context_id' =\u003e \"\u003cCONTEXT-ID\u003e\" }\n  game_play.score     # =\u003e 100\n  game_play.payload   # =\u003e \"\u003cPAYLOAD\u003e\"\nend\n```\n\n#### Send to Facebook\n\nWhen the human clicks the [Send to Messenger button][send-to-messenger-plugin]\nembedded on a website, you will receive an `optin` event.\n\n```ruby\nBot.on :optin do |optin|\n  optin.sender    # =\u003e { 'id' =\u003e '1008372609250235' }\n  optin.recipient # =\u003e { 'id' =\u003e '2015573629214912' }\n  optin.sent_at   # =\u003e 2016-04-22 21:30:36 +0200\n  optin.ref       # =\u003e 'CONTACT_SKYNET'\n\n  optin.reply(text: 'Ah, human!')\nend\n```\n\n#### Message delivery receipts\n\nYou can stalk the human:\n\n```ruby\nBot.on :delivery do |delivery|\n  delivery.ids       # =\u003e 'mid.1457764197618:41d102a3e1ae206a38'\n  delivery.sender    # =\u003e { 'id' =\u003e '1008372609250235' }\n  delivery.recipient # =\u003e { 'id' =\u003e '2015573629214912' }\n  delivery.at        # =\u003e 2016-04-22 21:30:36 +0200\n  delivery.seq       # =\u003e 37\n\n  puts \"Human was online at #{delivery.at}\"\nend\n```\n\n#### Referral\n\nWhen the human follows a m.me link with a ref parameter like http://m.me/mybot?ref=myparam,\nyou will receive a `referral` event.\n\n```ruby\nFacebook::Messenger::Bot.on :referral do |referral|\n  referral.sender    # =\u003e { 'id' =\u003e '1008372609250235' }\n  referral.recipient # =\u003e { 'id' =\u003e '2015573629214912' }\n  referral.sent_at   # =\u003e 2016-04-22 21:30:36 +0200\n  referral.ref       # =\u003e 'MYPARAM'\nend\n```\n\n#### Pass thread control\n\nAnother bot can pass a human to you:\n\n```ruby\nFacebook::Messenger::Bot.on :pass_thread_control do |pass_thread_control|\n  pass_thread_control.new_owner_app_id # =\u003e '123456789'\n  pass_thread_control.metadata # =\u003e 'Additional content that the caller wants to set'\nend\n```\n\n#### Change messenger profile\n\nYou can greet new humans to entice them into talking to you, in different locales:\n\n```ruby\nFacebook::Messenger::Profile.set({\n  greeting: [\n    {\n      locale: 'default',\n      text: 'Welcome to your new bot overlord!'\n    },\n    {\n      locale: 'fr_FR',\n      text: 'Bienvenue dans le bot du Wagon !'\n    }\n  ]\n}, page_id: YOUR_PAGE_ID)\n```\n\nYou can define the action to trigger when new humans click on the Get\nStarted button. Before doing it you should check to select the messaging_postbacks field when setting up your webhook.\n\n```ruby\nFacebook::Messenger::Profile.set({\n  get_started: {\n    payload: 'GET_STARTED_PAYLOAD'\n  }\n}, page_id: YOUR_PAGE_ID) \n```\n\nYou can show a persistent menu to humans.\n\n```ruby\nFacebook::Messenger::Profile.set({\n  persistent_menu: [\n    {\n      locale: 'default',\n      composer_input_disabled: true,\n      call_to_actions: [\n        {\n          title: 'My Account',\n          type: 'nested',\n          call_to_actions: [\n            {\n              title: 'What is a chatbot?',\n              type: 'postback',\n              payload: 'EXTERMINATE'\n            },\n            {\n              title: 'History',\n              type: 'postback',\n              payload: 'HISTORY_PAYLOAD'\n            },\n            {\n              title: 'Contact Info',\n              type: 'postback',\n              payload: 'CONTACT_INFO_PAYLOAD'\n            }\n          ]\n        },\n        {\n          type: 'web_url',\n          title: 'Get some help',\n          url: 'https://github.com/jgorset/facebook-messenger',\n          webview_height_ratio: 'full'\n        }\n      ]\n    },\n    {\n      locale: 'zh_CN',\n      composer_input_disabled: false\n    }\n  ]\n}, page_id: YOUR_PAGE_ID)\n```\n\n#### Handle a Facebook Policy Violation\n\nSee Facebook's documentation on [Messaging Policy Enforcement](https://developers.facebook.com/docs/messenger-platform/reference/webhook-events/messaging_policy_enforcement)\n\n```ruby\nFacebook::Messenger::Bot.on :'policy_enforcement' do |referral|\n  referral.action # =\u003e 'block'\n  referral.reason # =\u003e \"The bot violated our Platform Policies (https://developers.facebook.com/policy/#messengerplatform). Common violations include sending out excessive spammy messages or being non-functional.\"\nend\n```\n\n#### messaging_type\n\n##### Sending Messages\n\nSee Facebook's documentation on [Sending Messages](https://developers.facebook.com/docs/messenger-platform/send-messages#standard_messaging)\n\nAs of May 7th 2018 all messages are required to include a messaging_type\n\n```ruby\nFacebook::Messenger::Bot.deliver({\n  recipient: {\n    id: '45123'\n  },\n  message: {\n    text: 'Human?'\n  },\n  messaging_type: Facebook::Messenger::Bot::MessagingType::UPDATE\n}, page_id: YOUR_PAGE_ID)\n```\n\n##### MESSAGE_TAG\n\nSee Facebook's documentation on [Message Tags](https://developers.facebook.com/docs/messenger-platform/send-messages/message-tags)\n\nWhen sending a message with messaging_type: MESSAGE_TAG (Facebook::Messenger::Bot::MessagingType::MESSAGE_TAG) you must ensure you add a tag: parameter\n\n```ruby\nFacebook::Messenger::Bot.deliver({\n  recipient: {\n    id: '45123'\n  },\n  message: {\n    text: 'Human?'\n  },\n  messaging_type: Facebook::Messenger::Bot::MessagingType::MESSAGE_TAG\n  tag: Facebook::Messenger::Bot::Tag::NON_PROMOTIONAL_SUBSCRIPTION\n}, page_id: YOUR_PAGE_ID) \n```\n\n## Configuration\n\n### Create an Application on Facebook\n\nFollow the [Quick Start][quick-start] guide to create an Application on\nFacebook.\n\n[quick-start]: https://developers.facebook.com/docs/messenger-platform/guides/quick-start\n\n### Make a configuration provider\n\nUse the generated access token and your verify token to configure your bot. Most\nbots live on a single Facebook Page. If that is the case with yours, too, just\nset these environment variables and skip to the next section:\n\n```bash\nexport ACCESS_TOKEN=EAAAG6WgW...\nexport APP_SECRET=a885a...\nexport VERIFY_TOKEN=95vr15g...\n```\n\nIf your bot lives on multiple Facebook Pages, make a _configuration provider_\nto keep track of access tokens, app secrets and verify tokens for each of them:\n\n```ruby\nclass ExampleProvider \u003c Facebook::Messenger::Configuration::Providers::Base\n  # Verify that the given verify token is valid.\n  #\n  # verify_token - A String describing the application's verify token.\n  #\n  # Returns a Boolean representing whether the verify token is valid.\n  def valid_verify_token?(verify_token)\n    bot.exists?(verify_token: verify_token)\n  end\n\n  # Find the right application secret.\n  #\n  # page_id - An Integer describing a Facebook Page ID.\n  #\n  # Returns a String describing the application secret.\n  def app_secret_for(page_id)\n    bot.find_by(page_id: page_id).app_secret\n  end\n\n  # Find the right access token.\n  #\n  # recipient - A Hash describing the `recipient` attribute of the message coming\n  #             from Facebook.\n  #\n  # Note: The naming of \"recipient\" can throw you off, but think of it from the\n  # perspective of the message: The \"recipient\" is the page that receives the\n  # message.\n  #\n  # Returns a String describing an access token.\n  def access_token_for(recipient)\n    bot.find_by(page_id: recipient['id']).access_token\n  end\n\n  private\n\n  def bot\n    MyApp::Bot\n  end\nend\n\nFacebook::Messenger.configure do |config|\n  config.provider = ExampleProvider.new\nend\n```\n\nYou can get the current configuration provider with `Facebook::Messenger.config.provider`.\n\n### Subscribe your Application to a Page\n\nOnce you've configured your bot, subscribe it to the Page to get messages\nfrom Facebook:\n\n```ruby\nFacebook::Messenger::Subscriptions.subscribe(\n  access_token: access_token,\n  subscribed_fields: %w[feed mention name]\n)\n```\n\nYou only need to subscribe your page once. As long as your bot works and\nresponds to Messenger's requests in a timely fashion it will remain\nsubscribed, but if your bot crashes or otherwise becomes unavailable Messenger\nmay unsubscribe it and you'll have to subscribe again.\n\n### Run it\n\n##### ... on Rack\n\nThe bot runs on [Rack][rack], so you hook it up like you would an ordinary\nweb application:\n\n```ruby\n# config.ru\nrequire 'facebook/messenger'\nrequire_relative 'bot'\n\nrun Facebook::Messenger::Server\n\n# or Facebook::Messenger::ServerNoError for dev\n```\n\n```\n$ rackup\n```\n\n##### ... on Rails\n\nRails doesn't give you much that you'll need for a bot, but if you have an\nexisting application that you'd like to launch it from or just like Rails\na lot, you can mount it:\n\n```ruby\n# config/routes.rb\n\nRails.application.routes.draw do\n  # ...\n\n  mount Facebook::Messenger::Server, at: 'bot'\nend\n```\n\nWe suggest that you put your bot code in `app/bot`.\n\n```ruby\n# app/bot/example.rb\n\ninclude Facebook::Messenger\n\nFaceboook::Messenger::Bot.on :message do |message|\n  message.reply(text: 'Hello, human!')\nend\n```\n\nRemember that Rails only eager loads everything in its production environment.\nIn the development and test environments, it only requires files as you\nreference constants. You'll need to explicitly load `app/bot`, then:\n\n```ruby\n# config/initializers/bot.rb\nunless Rails.env.production?\n  bot_files = Dir[Rails.root.join('app', 'bot', '**', '*.rb')]\n  bot_reloader = ActiveSupport::FileUpdateChecker.new(bot_files) do\n    bot_files.each{ |file| require_dependency file }\n  end\n\n  ActiveSupport::Reloader.to_prepare do\n    bot_reloader.execute_if_updated\n  end\n\n  bot_files.each { |file| require_dependency file }\nend\n```\n\nAnd add below code into `config/application.rb` to ensure rails knows bot files.\n\n```ruby\n# Auto-load the bot and its subdirectories\nconfig.paths.add File.join('app', 'bot'), glob: File.join('**', '*.rb')\nconfig.autoload_paths += Dir[Rails.root.join('app', 'bot', '*')]\n```\n\n\n### Test it...\n\n##### ...locally\n\nTo test your locally running bot, you can use [ngrok]. This will create a secure\ntunnel to localhost so that Facebook can reach the webhook.\n\n##### ... with RSpec\n\nIn order to test that behaviour when a new event from Facebook is registered, you can use the gem's `trigger` method. This method accepts as its first argument the type of event that it will receive, and can then be followed by other arguments that mock objects received from Messenger. Using Ruby's [Struct](https://ruby-doc.org/core-2.5.0/Struct.html) class can be very useful for creating these mock objects.\n\nIn this case, subscribing to Messenger events has been extracted into a `Listener` class.\n\n```ruby\n# app/bot/listener.rb\nrequire 'facebook/messenger'\n\ninclude Facebook::Messenger\n\nclass Listener\n  Facebook::Messenger::Subscriptions.subscribe(\n    access_token: ENV['ACCESS_TOKEN'],\n    subscribed_fields: %w[feed mention name]\n  )\n\n  Bot.on :message do |message|\n    Bot.deliver({\n      recipient: message.sender,\n      message: {\n        text: 'Uploading your message to skynet.'\n      }\n    }, access_token: ENV['ACCESS_TOKEN'])\n  end\nend\n```\n\nIts respective test file then ensures that the `Bot` object receives a call to `deliver`. This is just a basic test, but check out the [RSpec docs](http://rspec.info/) for more information on testing with RSpec.\n\n```ruby\nrequire 'rails_helper'\n\nRSpec.describe Listener do\n  FakeMessage = Struct.new(:sender, :recipient, :timestamp, :message)\n\n  describe 'Bot#on(message)' do\n    it 'responds with a message' do\n      expect(Bot).to receive(:deliver)\n      Bot.trigger(:message, fake_message)\n    end\n  end\n\n  private\n\n  def fake_message\n    sender = {\"id\"=\u003e\"1234\"}\n    recipient = {\"id\"=\u003e\"5678\"}\n    timestamp = 1528049653543\n    message = {\"text\"=\u003e\"Hello, world\"}\n    FakeMessage.new(sender, recipient, timestamp, message)\n  end\nend\n```\n\n## Development\n\nAfter checking out the repo, run `bin/setup` to install dependencies. You can also run\n`bin/console` for an interactive prompt that will allow you to experiment.\n\nRun `rspec` to run the tests, `rubocop` to lint, or `rake` to do both.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To\nrelease a new version, update the version number in `version.rb`, and then run\n`bundle exec rake release`, which will create a git tag for the version, push git\ncommits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at\nhttps://github.com/jgorset/facebook-messenger.\n\n## Projects using Facebook Messenger\n\n* [Rubotnik](https://github.com/progapandist/rubotnik-boilerplate) is a boilerplate\nfor Facebook Messenger, and a great place to start if you're new to bots.\n\n* [Chatwoot](http://chatwoot.com/) use Facebook Messenger to integrate their customer\nsupport bots with, well, Facebook Messenger.\n\n* [Botamp](https://botamp.com) is the all-in-one solution for Marketing Automation via messaging apps.\n\n## I love you\n\nJohannes Gorset made this. You should [tweet me](http://twitter.com/jgorset) if you can't get it\nto work. In fact, you should tweet me anyway.\n\n## I love Schibsted\n\nI work at [Schibsted Products \u0026 Technology](https://github.com/schibsted) with a bunch of awesome folks\nwho are every bit as passionate about building things as I am. If you're using Facebook Messenger,\nyou should probably join us.\n\n[Hyper]: https://github.com/hyperoslo\n[tweet us]: http://twitter.com/hyperoslo\n[hire you]: http://www.hyper.no/jobs/engineers\n[MIT License]: http://opensource.org/licenses/MIT\n[rubygems.org]: https://rubygems.org\n[message-documentation]: https://developers.facebook.com/docs/messenger-platform/send-api-reference#request\n[developers.facebook.com]: https://developers.facebook.com/\n[rack]: https://github.com/rack/rack\n[send-to-messenger-plugin]: https://developers.facebook.com/docs/messenger-platform/plugin-reference\n[ngrok]: https://ngrok.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgorset%2Ffacebook-messenger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjgorset%2Ffacebook-messenger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgorset%2Ffacebook-messenger/lists"}