Skip to content
🤖 SDK for the LINE Messaging API for Node.js
JavaScript
Branch: master
Clone or download
Latest commit 3da40f4 Jul 20, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
examples Fix leave demo Jul 20, 2019
lib fix for the PR changes required Jul 18, 2019
test Feature: Broadcast message added and tested Apr 30, 2019
.eslintrc.json implement new api for group and room Jan 28, 2018
.gitignore Initial commit Oct 8, 2016
.travis.yml Drop Node v4 support May 8, 2019
LICENSE readme Oct 8, 2016
README.md feat: Add new events memberJoined and memberLeft Jun 30, 2019
iisnode.yml rename iisnode config file Oct 16, 2016
index.js lint all js files Oct 15, 2016
package-lock.json 1.5.3 Jul 20, 2019
package.json 1.5.3 Jul 20, 2019

README.md

linebot

NPM Version NPM Downloads NPM Dependencies Build

🤖 SDK for the LINE Messaging API for Node.js

  • Come with built-in server for quick setup
  • Provide convenient addon functions to event object

About LINE Messaging API

Please refer to the official API documents for details.

Installation

$ npm install linebot --save

Usage

var linebot = require('linebot');

var bot = linebot({
  channelId: CHANNEL_ID,
  channelSecret: CHANNEL_SECRET,
  channelAccessToken: CHANNEL_ACCESS_TOKEN
});

bot.on('message', function (event) {
  event.reply(event.message.text).then(function (data) {
    // success
  }).catch(function (error) {
    // error
  });
});

bot.listen('/linewebhook', 3000);

Using with your own Express.js server

const app = express();
const linebotParser = bot.parser();
app.post('/linewebhook', linebotParser);
app.listen(3000);

See examples folder for more examples.

API

LineBot object

linebot(config)

Create LineBot instance with specified configuration.

var bot = linebot({
  channelId: CHANNEL_ID,
  channelSecret: CHANNEL_SECRET,
  channelAccessToken: CHANNEL_ACCESS_TOKEN,
  verify: true // Verify 'X-Line-Signature' header (default=true)
});

LineBot.listen(webHookPath, port, callback)

Start built-in http server on the specified port, and accept POST request callback on the specified webHookPath.

This method is provided for convenience. You can write you own server and use verify and parse methods to process webhook events. See examples/echo-express-long.js for example.

LineBot.parser()

Create Express.js middleware to parse the request.

The parser assumes that the request body has never been parsed by any body parser before, so it must be placed BEFORE any generic body parser e.g. app.use(bodyParser.json());

LineBot.verify(rawBody, signature)

Verify X-Line-Signature header.

LineBot.parse(body)

Process incoming webhook request, and raise an event.

LineBot.on(eventType, eventHandler)

Raised when a Webhook event is received.

bot.on('message',      function (event) { });
bot.on('follow',       function (event) { });
bot.on('unfollow',     function (event) { });
bot.on('join',         function (event) { });
bot.on('leave',        function (event) { });
bot.on('memberJoined', function (event) { });
bot.on('memberLeft',   function (event) { });
bot.on('postback',     function (event) { });
bot.on('beacon',       function (event) { });

LineBot.reply(replyToken, message)

Reply a message.

See: Event.reply(message)

LineBot.push(to, message)

Send push message.

to is a userId, or an array of userId. A userId can be saved from event.source.userId when added as a friend (follow event), or during the chat (message event).

message can be a string, an array of string, a Send message object, or an array of Send message objects.

LineBot.multicast(to, message)

Send push message to multiple users (Max: 150 users). This is more efficient than push as it will make api call only once.

to is an array of userId.

message can be a string, an array of string, a Send message object, or an array of Send message objects.

LineBot.broadcast(message)

Send push message to all users. This is more efficient than push as it will make api call only once.

message can be a string, an array of string, a Send message object, or an array of Send message objects.

LineBot.getMessageContent(messageId)

Get image, video, and audio data sent by users as a Buffer object.

See: Event.message.content()

LineBot.getUserProfile(userId)

Get user profile information of the user.

See: Event.source.profile()

LineBot.getGroupMemberProfile(groupId, userId)

Get user profile of a member in a group.

LineBot.getGroupMember(groupId)

Get userId of all members in a group.

See: Event.source.member()

LineBot.leaveGroup(groupId)

Leave a group.

LineBot.getRoomMemberProfile(roomId, userId)

Get user profile of a member in a chat room.

LineBot.getRoomMember(roomId)

Get userId of all members in a chat room.

See: Event.source.member()

LineBot.leaveRoom(roomId)

Leave a room.

Event object

Provide convenient shorthands to call LineBot's functions which require parameter from a source event object.

Event.reply(message)

Respond to the event.

message can be a string, an array of string, a Send message object, or an array of Send message objects.

Return a Promise object from node-fetch module.

This is a shorthand for: LineBot.reply(event.replyToken, message)

// reply text message
event.reply('Hello, world').then(function (data) {
  // success
}).catch(function (error) {
  // error
});

// reply multiple text messages
event.reply(['Hello, world 1', 'Hello, world 2']);

// reply message object
event.reply({ type: 'text', text: 'Hello, world' });

// reply multiple message object
event.reply([
  { type: 'text', text: 'Hello, world 1' },
  { type: 'text', text: 'Hello, world 2' }
]);

event.reply({
  type: 'image',
  originalContentUrl: 'https://example.com/original.jpg',
  previewImageUrl: 'https://example.com/preview.jpg'
});

event.reply({
  type: 'video',
  originalContentUrl: 'https://example.com/original.mp4',
  previewImageUrl: 'https://example.com/preview.jpg'
});

event.reply({
  type: 'audio',
  originalContentUrl: 'https://example.com/original.m4a',
  duration: 240000
});

event.reply({
  type: 'location',
  title: 'my location',
  address: '〒150-0002 �?�京都渋谷区渋谷2�?目21−1',
  latitude: 35.65910807942215,
  longitude: 139.70372892916203
});

event.reply({
  type: 'sticker',
  packageId: '1',
  stickerId: '1'
});

event.reply({
  type: 'imagemap',
  baseUrl: 'https://example.com/bot/images/rm001',
  altText: 'this is an imagemap',
  baseSize: { height: 1040, width: 1040 },
  actions: [{
    type: 'uri',
    linkUri: 'https://example.com/',
    area: { x: 0, y: 0, width: 520, height: 1040 }
  }, {
    type: 'message',
    text: 'hello',
    area: { x: 520, y: 0, width: 520, height: 1040 }
  }]
});

event.reply({
  type: 'template',
  altText: 'this is a buttons template',
  template: {
    type: 'buttons',
    thumbnailImageUrl: 'https://example.com/bot/images/image.jpg',
    title: 'Menu',
    text: 'Please select',
    actions: [{
      type: 'postback',
      label: 'Buy',
      data: 'action=buy&itemid=123'
    }, {
      type: 'postback',
      label: 'Add to cart',
      data: 'action=add&itemid=123'
    }, {
      type: 'uri',
      label: 'View detail',
      uri: 'http://example.com/page/123'
    }]
  }
});

event.reply({
  type: 'template',
  altText: 'this is a confirm template',
  template: {
    type: 'confirm',
    text: 'Are you sure?',
    actions: [{
      type: 'message',
      label: 'Yes',
      text: 'yes'
    }, {
      type: 'message',
      label: 'No',
      text: 'no'
    }]
  }
});

event.reply({
  type: 'template',
  altText: 'this is a carousel template',
  template: {
    type: 'carousel',
    columns: [{
      thumbnailImageUrl: 'https://example.com/bot/images/item1.jpg',
      title: 'this is menu',
      text: 'description',
      actions: [{
        type: 'postback',
        label: 'Buy',
        data: 'action=buy&itemid=111'
      }, {
        type: 'postback',
        label: 'Add to cart',
        data: 'action=add&itemid=111'
      }, {
        type: 'uri',
        label: 'View detail',
        uri: 'http://example.com/page/111'
      }]
    }, {
      thumbnailImageUrl: 'https://example.com/bot/images/item2.jpg',
      title: 'this is menu',
      text: 'description',
      actions: [{
        type: 'postback',
        label: 'Buy',
        data: 'action=buy&itemid=222'
      }, {
        type: 'postback',
        label: 'Add to cart',
        data: 'action=add&itemid=222'
      }, {
        type: 'uri',
        label: 'View detail',
        uri: 'http://example.com/page/222'
      }]
    }]
  }
});

Event.source.profile()

Get user profile information of the sender.

This is a shorthand for:

  • LineBot.getUserProfile(event.source.userId) if it is 1:1 chat
  • LineBot.getGroupMemberProfile(event.source.groupId, event.source.userId) if bot is in a group
  • LineBot.getRoomMemberProfile(event.source.roomId, event.source.userId) if bot is in a chat room
event.source.profile().then(function (profile) {
  event.reply('Hello ' + profile.displayName);
});

Event.source.member()

Get userId of all members in a group or a chat room.

This is a shorthand for:

  • LineBot.getGroupMember(event.source.groupId) if bot is in a group
  • LineBot.getRoomMember(event.source.roomId) if bot is in a chat room
event.source.member().then(function (member) {
  console.log(member.memberIds);
});

Event.message.content()

Get image, video, and audio data sent by users as a Buffer object.

This is a shorthand for: LineBot.getMessageContent(event.message.messageId)

event.message.content().then(function (content) {
  console.log(content.toString('base64'));
});

License

MIT

You can’t perform that action at this time.