From c65277a619d40392b2e3d07f63efb253e1fead95 Mon Sep 17 00:00:00 2001 From: yeyang <746659424@qq.com> Date: Sat, 4 Feb 2023 03:05:05 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20=E4=BC=98=E5=8C=96SauceNAO?= =?UTF-8?q?=E6=90=9C=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/picSearch.js | 12 +++++--- config/config/picSearch.yaml | 3 ++ config/default_config/picSearch.yaml | 3 ++ model/PicSearch.js | 41 ++++++++++++++++++---------- model/common.js | 7 +++-- tools/{sites.js => sagiri.js} | 7 ++--- 6 files changed, 46 insertions(+), 27 deletions(-) rename tools/{sites.js => sagiri.js} (98%) diff --git a/apps/picSearch.js b/apps/picSearch.js index 5de3f61..2b3d962 100644 --- a/apps/picSearch.js +++ b/apps/picSearch.js @@ -1,4 +1,5 @@ -import { common, PicSearch } from '../model/index.js' +import { PicSearch, common } from '../model/index.js' + export class newPicSearch extends plugin { constructor () { super({ @@ -16,8 +17,11 @@ export class newPicSearch extends plugin { async search (e) { if (!e.img) return e.reply('请将图片与消息一起发送') - let msg = await PicSearch.SauceNAO(e.img[0]) - if (msg.error) return e.reply(msg.error) - common.getforwardMsg(e, msg) + let res = await PicSearch.SauceNAO(e.img[0]) + if (res.error) e.reply(res.error) + if (!res.error && res.isTooLow) { + return res.length > 1 ? common.recallsendMsg(e, res, true) : common.getRecallsendMsg(e, res) + } + e.reply(`相似度 ${res.maxSimilarity}% 过低,自动使用 Ascii2D 进行搜索`) } } diff --git a/config/config/picSearch.yaml b/config/config/picSearch.yaml index bc67a25..0d7e072 100644 --- a/config/config/picSearch.yaml +++ b/config/config/picSearch.yaml @@ -1 +1,4 @@ +#SauceNAO搜图apikey 请在 https://saucenao.com/user.php?page=search-api 进行获取 SauceNAOApiKey: +#SauceNAO搜图相似度低于这个百分比将被认定为相似度过低 +SauceNAO_Min_sim: 60 diff --git a/config/default_config/picSearch.yaml b/config/default_config/picSearch.yaml index bc67a25..0d7e072 100644 --- a/config/default_config/picSearch.yaml +++ b/config/default_config/picSearch.yaml @@ -1 +1,4 @@ +#SauceNAO搜图apikey 请在 https://saucenao.com/user.php?page=search-api 进行获取 SauceNAOApiKey: +#SauceNAO搜图相似度低于这个百分比将被认定为相似度过低 +SauceNAO_Min_sim: 60 diff --git a/model/PicSearch.js b/model/PicSearch.js index ebbb351..623328e 100644 --- a/model/PicSearch.js +++ b/model/PicSearch.js @@ -1,9 +1,8 @@ -/* eslint-disable no-void */ import fetch from 'node-fetch' import { Config } from '../components/index.js' import { common } from './index.js' -import sites from '../tools/sites.js' - +import sagiri from '../tools/sagiri.js' +import lodash from 'lodash' export default new class { async SauceNAO (url) { let apiKey = Config.picSearch.SauceNAOApiKey @@ -17,20 +16,32 @@ export default new class { numres: 3 } let res = await this.request('https://saucenao.com/search.php', params) - if (!res) return { error: 'SauceNAO搜图请求失败' } - if (res.header.status != 0) return { error: res.header.message } - let msg = await Promise.all(sites(res).map(async item => [ - `SauceNAO (${item.similarity})\n`, + if (!res) return { error: 'SauceNAO搜图网络请求失败' } + if (res.header.status != 0) return { error: 'SauceNAO搜图,错误信息:' + res.header.message.replace(/<.*?>/g, '') } + let format = sagiri(res) + if (lodash.isEmpty(format)) return { error: 'SauceNAO搜图无数据,使用 Ascii2D 进行搜图' } + + let msgMap = async item => [ + `SauceNAO (${item.similarity}%)\n`, await common.proxyRequestImg(item.thumbnail), - `\nsite:${item.site}\n`, - `作者:${item.authorName}\n`, - `作者主页:${item.authorUrl}\n`, - `作品链接:${item.url[0]}` - ])) - if (res.header.long_remaining < 10) { - msg.push(`SauceNAO 24h 内仅剩 ${res.header.long_remaining} 次使用次数`) + `\nSite:${item.site}\n`, + `作者:${item.authorName}(${item.authorUrl})\n`, + `来源:${item.url[0]}` + ] + let maxSimilarity = format[0].similarity + let message = maxSimilarity > 80 ? [await msgMap(format[0])] : await Promise.all(format.map(msgMap)) + + if (res.header.long_remaining < 30) { + message.push(`${maxSimilarity > 80 ? '\n' : ''}SauceNAO 24h 内仅剩 ${res.header.long_remaining} 次使用次数`) + } + if (res.header.short_remaining < 3) { + message.push(`${maxSimilarity > 80 ? '\n' : ''}SauceNAO 30s 内仅剩 ${res.header.short_remaining} 次。`) + } + return { + maxSimilarity, + isTooLow: maxSimilarity > Config.picSearch.SauceNAO_Min_sim, + message } - return msg } async request (url, params, headers) { diff --git a/model/common.js b/model/common.js index 1486400..ba66ad2 100644 --- a/model/common.js +++ b/model/common.js @@ -109,14 +109,15 @@ export default new class newCommon { /** * @description: 发送普通消息并根据指定时间撤回群消息 * @param {*} e oicq - * @param {*} msg 消息 + * @param {Array|String} msg 消息 + * @param {Boolean} quote 是否引用回复 * @param {Number} time 撤回时间 * @param {Boolean} fkmsg 风控消息 * @return {*} */ - async recallsendMsg (e, msg, time = setu.getRecallTime(e.group_id), fkmsg = '') { + async recallsendMsg (e, msg, quote, time = setu.getRecallTime(e.group_id), fkmsg = '') { // 发送消息 - let res = await e.reply(msg, false, { recallMsg: time }) + let res = await e.reply(msg, quote, { recallMsg: time }) if (!res) await e.reply(fkmsg || '消息发送失败,可能被风控') return res } diff --git a/tools/sites.js b/tools/sagiri.js similarity index 98% rename from tools/sites.js rename to tools/sagiri.js index c91ef27..5fb6b8b 100644 --- a/tools/sites.js +++ b/tools/sagiri.js @@ -1,8 +1,4 @@ /* eslint-disable no-void */ -'use strict' -// Object.defineProperty(exports, '__esModule', { value: true }) -// const errors_1 = require('./errors') -// #region Site data objects const DoujinMangaLexicon = { name: 'The Doujinshi & Manga Lexicon', index: 3, @@ -357,7 +353,7 @@ const resolveResult = item => { }, ((_a = authorData === null || authorData === void 0 ? void 0 : authorData(item.data)) !== null && _a !== void 0 ? _a : { authorName: null, authorUrl: null })) } -export default (response) => { +const sagiri = (response) => { const unknownIds = new Set(response.results.filter((result) => !sites[result.header.index_id]).map((result) => result.header.index_id)) const results = response.results .filter((result) => !unknownIds.has(result.header.index_id)) @@ -378,4 +374,5 @@ export default (response) => { } }) } +export default sagiri // # sourceMappingURL=sites.js.map