超自分好みのなろう小説を検索してくれるLINE Botを作ってみた

你有最喜欢的小说吗?

作者是成为小说家我喜欢,每天都在寻找新作品的邂逅。
还有一个搜索功能,我经常用,但是书名太多,搜索条件太广,被书名吸引了,但是看的时候经常觉得不喜欢。

同时,我发现有一个Narou小说的API。
我经常在智能手机上看小说,所以我想通过与 LINE 的链接,我可以创建一个 LINE 机器人,可以根据自己的喜好搜索和推荐小说,所以我开始研究它。

创建了一个搜索您喜欢的作品的机器人。

当您输入一个关键字时,将随机显示两个作品。
(由于一次搜索的上限是20,如果设置为3就没意思了,因为容易重叠。)
把喜欢的关键词转换成丰富的菜单,省去输入的麻烦。
您还可以使用免费关键字进行搜索。
超自分好みのなろう小説を検索してくれるLINE Botを作ってみた

这是您朋友的二维码!
超自分好みのなろう小説を検索してくれるLINE Botを作ってみた

部署工作还没有完成,但如果你不介意,如果你能成为我的朋友,我会很高兴。
部署完成后,我们将与您联系。

环境和源代码

环境

我在以下环境中工作。

源代码

太长了,我先收藏了**(点击查看)**
'use strict';

// ########################################
//               初期設定など
// ########################################

// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');

// ローカル(自分のPC)でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;

// Messaging APIで利用するクレデンシャル(秘匿情報)です。
const config = {
    channelSecret: '*********************',
    channelAccessToken: '*******************'
};

// ########## ▼▼▼ サンプル関数 ▼▼▼ ##########

const getNovelName = async (userId, tag) => {
    let result1 = '';
    let result2 = '';
    for (let i = 0; i < 2; i++) {
        let num = Math.floor(Math.random() * (20 - 1) + 1);
        try {
            // axiosでなろうAPIを叩きます
            const res = await axios.get('https://api.syosetu.com/novelapi/api/?time=30-&word=' + encodeURI(tag) + '&out=json&type=re&stop=1&order=dailypoint');
            const item = res.data;

            result1 = item[num].title
            result2 = item[num].ncode
            // ターミナルにも検索結果を出しておきます
            console.log(item[num].title);
            console.log(item[num].ncode);
            console.log(num);
            // 正常に取得できればここで終了

            // リプライではなく「プッシュ」を送ります
            // Botからユーザーへ一方的に通知を送ることができる機能です
            await client.pushMessage(userId, {
                type: 'text',
                text: `${result1} \n ${'https://ncode.syosetu.com/' + result2 + '/'}`
            });

        } catch (error) {
            console.log(error);
        }
    }
}

const sampleFunction = async (event) => {
    // ユーザーIDとメッセージ文字列を関数に渡します
    // メッセージ文字列でなろうAPIタグを検索し、結果をなろうAPIから受け取ったらユーザーIDに対して「プッシュ」送信します
    // 検索には少し時間がかかるので、これの結果は後でユーザーに送られます
    getNovelName(event.source.userId, event.message.text);

    // こちらが先に返事を返します
    // ユーザーからのメッセージに対する「リプライ」です
    // リプライは、受信したメッセージ1つにつき1回しか使えません
    return client.replyMessage(event.replyToken, {
        type: 'text',
        text: '検索しています……'
    });
};
// ########## ▲▲▲ サンプル関数 ▲▲▲ ##########

// ########################################
//  LINEサーバーからのWebhookデータを処理する部分
// ########################################

// LINE SDKを初期化します
const client = new line.Client(config);

// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
    // 受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視します
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }
    // サンプル関数を実行します
    return sampleFunction(event);
}

// ########################################
//          Expressによるサーバー部分
// ########################################

// expressを初期化します
const app = express();

// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {

    // 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
    if (req.body.events.length === 0) {
        res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
        console.log('検証イベントを受信しました!'); // ターミナルに表示します
        return; // これより下は実行されません
    } else {
        // 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
        console.log('受信しました:', req.body.events);
    }

    // あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
    // 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
    Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);

已在生产中设计的零件

① 无论如何,根据自己的喜好连接 API

命中 API(摘自源代码)
'https://api.syosetu.com/novelapi/api/?time=30-&word=' + encodeURI(tag) + '&out=json&type=re&stop=1&order=dailypoint'

我在阅读Narou Novel API时发现有很多搜索条件。
我将其设置如下,以尽可能适合我的口味。

  1. 相当值得一读(读完需要30多分钟):time=30-
  2. 继续或完成:type=re
  3. 热度高的文章好(不是长期连载停止):stop=1
  4. 提取的小说不固定:order=dailypoint

    ②注意能搜索到日语单词
    您可以通过参考 Naro Novel API 来搜索单词。
    原以为它会像日语一样命中,但它必须是 2 个字节或更多
    我选择使用+ encodeURI(tag) +,因为它不执行。

    (3)获取代码并转换成网址,方便访问文章

    const getNovelName = async (userId, tag) => {
        let result1 = '';
        let result2 = '';
        for (let i = 0; i < 2; i++) {
            let num = Math.floor(Math.random() * (20 - 1) + 1);
            try {
                // axiosでなろうAPIを叩きます
                const res = await axios.get('https://api.syosetu.com/novelapi/api/?time=30-&word=' + encodeURI(tag) + '&out=json&type=re&stop=1&order=dailypoint');
                const item = res.data;
    
                result1 = item[num].title
                result2 = item[num].ncode
                // ターミナルにも検索結果を出しておきます
                console.log(item[num].title);
                console.log(item[num].ncode);
                console.log(num);
                // 正常に取得できればここで終了
    
                // リプライではなく「プッシュ」を送ります
                // Botからユーザーへ一方的に通知を送ることができる機能です
                await client.pushMessage(userId, {
                    type: 'text',
                    text: `${result1} \n ${'https://ncode.syosetu.com/' + result2 + '/'}`
                });
    
    

    由于无法使用 Narou Novel API 直接点击 URL
    为一部名为 N Corde 的小说的每部作品分配的唯一代码和
    通过在前半部分连接固定的 URL,我们可以在 LINE 上显示 URL。

    ④ 注意JSON的结构
    引用 JSON 结构时,只有 allcount 为 0 时的信息。
    因此,在获取文章标题和③的N码时,需要将其设置为1以上的整数。
    超自分好みのなろう小説を検索してくれるLINE Botを作ってみた

    有了这个,你也可以成为最喜欢的组的成员!

    我是那种喜欢反复阅读我喜欢的作品的人,所以我想实现一个功能,当我发送特定消息时会显示我喜欢的作品,但它没有按计划进行,我给了向上。
    另外,这次我从20个案例中随机选择了2个案例,但我认为最好从更多的参数中搜索以结识新朋友。
    另外,当发生错误时,我没有收到通知,尤其是现在,所以我认为这有点不友好。
    有些部分令人沮丧,但我想在未来继续制作它们。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308628376.html

相关文章:

  • 2018-12-24
  • 2021-12-12
  • 2022-01-01
  • 2019-06-26
  • 2021-07-31
  • 2021-11-06
猜你喜欢
  • 2021-01-06
  • 2021-09-06
  • 2021-12-29
  • 2018-10-13
  • 2021-11-08
  • 2021-12-15
相关资源
相似解决方案