From c8fe8134049492d827d6fa93bf93a317916b1b89 Mon Sep 17 00:00:00 2001
From: zhiyu <542716863@qq.com>
Date: Fri, 19 Jan 2024 14:32:51 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=A6=84=20refactor:=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E7=BF=BB=E8=AF=91=E7=AD=96=E7=95=A5=E6=A8=A1=E5=BC=8F=EF=BC=8C?=
=?UTF-8?q?=E6=8F=90=E9=AB=98=E6=89=A9=E5=B1=95=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 修复翻译策略模式,提高扩展性
2. 修正README
3. 删除网易云,难维护
---
README.md | 6 +-
apps/neteasepro.js | 459 ----------------------------------------
apps/tools.js | 351 ++++++------------------------
img/example.webp | Bin 82332 -> 271446 bytes
img/example2.webp | Bin 253564 -> 0 bytes
img/example3.webp | Bin 178052 -> 0 bytes
img/example4.webp | Bin 284180 -> 0 bytes
img/example5.webp | Bin 188642 -> 0 bytes
utils/netease.js | 163 --------------
utils/trans-strategy.js | 154 ++++++++------
10 files changed, 154 insertions(+), 979 deletions(-)
delete mode 100644 apps/neteasepro.js
delete mode 100644 img/example2.webp
delete mode 100644 img/example3.webp
delete mode 100644 img/example4.webp
delete mode 100644 img/example5.webp
delete mode 100644 utils/netease.js
diff --git a/README.md b/README.md
index b1455b2..68e3de1 100644
--- a/README.md
+++ b/README.md
@@ -28,10 +28,6 @@ utils -- 工具类
## 🧏 使用实例

-
-
-
-
## 📔 使用说明
@@ -143,7 +139,7 @@ sudo apt-get install ffmpeg
| mitsuha | 1杯瑞幸 |
| [Kr] 5s¹ | 1杯瑞幸 |
-## 🚀 后记
+## 🚀 声明
* 文件借鉴了很多插件,精简个人认为可以精简的内容。
* 素材来源于网络,仅供交流学习使用
* 严禁用于任何商业用途和非法行为
diff --git a/apps/neteasepro.js b/apps/neteasepro.js
deleted file mode 100644
index b7d0a93..0000000
--- a/apps/neteasepro.js
+++ /dev/null
@@ -1,459 +0,0 @@
-import plugin from "../../../lib/plugins/plugin.js";
-import axios from "axios";
-import fs from "node:fs";
-import {
- checkMusic,
- getCookies,
- getDailyRecommend,
- getKey,
- getLoginStatus,
- getQrCode,
- getSong,
- getSongDetail,
- getUserRecord,
- getCloud,
- getCloudMusicDetail,
-} from "../utils/netease.js";
-import { ha12store, store2ha1 } from "../utils/encrypt.js";
-import { downloadMp3 } from "../utils/common.js";
-import _ from "lodash";
-
-export class neteasepro extends plugin {
- constructor() {
- super({
- /** 功能名称 */
- name: "R插件网易云音乐解析",
- /** 功能描述 */
- dsc: "网易云音乐解析Pro",
- /** https://oicqjs.github.io/oicq/#events */
- event: "message",
- /** 优先级,数字越小等级越高 */
- priority: 500,
- rule: [
- {
- /** 命令正则匹配 */
- reg: "^#网易云登录$",
- /** 执行方法 */
- fnc: "neteaseCloudLogin",
- },
- {
- reg: "^#网易云每日推荐$",
- fnc: "neteaseDailyRecommend",
- },
- {
- reg: "^#网易云听歌排行$",
- fnc: "neteaseListenRank",
- },
- {
- reg: "^#网易云云盘$",
- fnc: "neteaseCloud",
- },
- {
- reg: "^#网易云云盘下载(.*)",
- fnc: "neteaseCloudDownload",
- },
- {
- reg: "^#网易云云盘(.*)",
- fnc: "neteaseCloudApplet",
- },
- {
- reg: "music.163.com",
- fnc: "netease",
- },
- ],
- });
- }
-
- async neteaseCloudLogin(e) {
- let neteaseCookie;
- // 如果不存在cookie
- if (!(await redis.exists(await this.getRedisKey(e.user_id)))) {
- // 获取密钥
- const key = await getKey();
- // console.log(key);
- // 获取二维码
- const qrPic = await getQrCode(key);
- // 下载qrcode
- await this.downloadQrCode(qrPic).then(path => {
- // 发送二维码
- e.reply(segment.image(fs.readFileSync(path)));
- });
- // 定时轮询
- await this.poll(key).then(async cookie => {
- // 存放到redis
- neteaseCookie = cookie;
- });
- } else {
- const userData = await redis.get(await this.getRedisKey(e.user_id));
- // 如果cookie存在但是为空
- if (_.isEmpty(userData)) {
- await redis.del(await this.getRedisKey(e.user_id));
- e.reply("发生已知错误:cookie为空,请重试 #网易云登录 即可!");
- return;
- }
- // 已经登陆过的,直接从redis取出
- neteaseCookie = await store2ha1(JSON.parse(userData).cookie);
- }
- // 获取用户信息
- const userInfo = await getLoginStatus(neteaseCookie);
- // 提取信息
- const { userId, nickname, avatarUrl } = userInfo.profile;
- e.reply(["欢迎使用 🎶网易云音乐 🎶," + nickname, segment.image(avatarUrl)]);
- // 重组后存放到redis {uid, cookie}
- await redis.set(
- await this.getRedisKey(e.user_id),
- JSON.stringify({
- uid: userId,
- cookie: await ha12store(neteaseCookie),
- }),
- );
- return true;
- }
-
- async neteaseDailyRecommend(e) {
- const realCookie = (await this.aopBefore(e)).cookie;
- if (realCookie === "") {
- return true;
- }
- // 获取每日推荐所有数据
- const dailyRecommend = await getDailyRecommend(realCookie);
- const combineMsg = await dailyRecommend.dailySongs.map(async item => {
- // 组合数据
- return {
- message: segment.json(await this.musicPack(item)),
- nickname: e.sender.card || e.user_id,
- user_id: e.user_id,
- };
- });
- let forwardMsg = await Bot.makeForwardMsg(await Promise.all(combineMsg));
- await e.reply(await this.musicForwardPack(forwardMsg));
- }
-
- async neteaseListenRank(e) {
- const userInfo = await this.aopBefore(e);
- const realCookie = userInfo.cookie;
- if (realCookie === "") {
- return true;
- }
- // 获取用户id
- const uid = userInfo.uid;
- // 获取听歌排行榜
- const userRecord = await getUserRecord(uid);
- e.reply(" 😘亲,这是你的听歌排行榜Top10");
- // 由于数据过大,取前10
- const rank = userRecord.weekData.slice(0, 10).map(async item => {
- // 组合数据
- const song = item.song;
- return {
- message: segment.json(await this.musicPack(song)),
- nickname: e.sender.card || e.user_id,
- user_id: e.user_id,
- };
- });
- let forwardMsg = await Bot.makeForwardMsg(await Promise.all(rank));
- await e.reply(await this.musicForwardPack(forwardMsg));
- }
-
- async neteaseCloud(e) {
- const userInfo = await this.aopBefore(e);
- const realCookie = userInfo.cookie;
- if (realCookie === "") {
- return true;
- }
- const cloudMusics = await (
- await getCloud(realCookie)
- ).map(item => {
- return {
- message: `${item.songId}: ${item?.songName??"暂无歌曲信息"}-${item?.artist??"暂无歌手信息"}`,
- nickname: e.sender.card || e.user_id,
- user_id: e.user_id,
- }
- });
- // 获取用户信息
- const { profile } = await getLoginStatus(realCookie);
- e.reply(`<${profile.nickname}> 的网易云云盘`);
- e.reply(await Bot.makeForwardMsg(cloudMusics));
- return true;
- }
-
- async neteaseCloudDownload(e) {
- const id = e.msg.replace("#网易云云盘下载", "").trim();
- const userInfo = await this.aopBefore(e);
- const realCookie = userInfo.cookie;
- if (realCookie === "") {
- return true;
- }
- const music = (await getSong(id, realCookie))[0];
- const item = (await getCloudMusicDetail(id, realCookie)).data[0];
- const simpleSong = item.simpleSong;
- e.reply([
- segment.image(simpleSong?.al?.picUrl),
- `识别:云盘音乐,${simpleSong?.name}-${simpleSong?.al?.name}`,
- ]);
- const downloadPath = `./data/rcmp4/${this.e.group_id || this.e.user_id}`;
- await downloadMp3(music.url, downloadPath)
- .then(path => {
- Bot.acquireGfs(e.group_id).upload(
- fs.readFileSync(path),
- "/",
- `${simpleSong?.name}.mp3`,
- );
- })
- .catch(err => {
- console.error(`下载音乐失败,错误信息为: ${err.message}`);
- });
- return true;
- }
-
- async neteaseCloudApplet(e) {
- const id = e.msg.replace("#网易云云盘", "").trim();
- logger.mark(id);
- const userInfo = await this.aopBefore(e);
- const realCookie = userInfo.cookie;
- if (realCookie === "") {
- return true;
- }
- const music = (await getSong(id, realCookie))[0];
- const item = (await getCloudMusicDetail(id, realCookie)).data[0];
- const appletMusic = {
- message: segment.json(await this.cloudMusicPack(item, music.url)),
- nickname: e.sender.card || e.user_id,
- user_id: e.user_id,
- };
- let forwardMsg = await Bot.makeForwardMsg(appletMusic);
- await e.reply(await this.musicForwardPack(forwardMsg));
- }
-
- async netease(e) {
- const message =
- e.msg === undefined ? e.message.shift().data.replaceAll("\\", "") : e.msg.trim();
- const musicUrlReg = /(http:|https:)\/\/music.163.com\/song\/media\/outer\/url\?id=(\d+)/;
- const musicUrlReg2 = /(http:|https:)\/\/y.music.163.com\/m\/song\?(.*)&id=(\d+)/;
- const id =
- musicUrlReg2.exec(message)?.[3] ||
- musicUrlReg.exec(message)?.[2] ||
- /id=(\d+)/.exec(message)[1];
- const downloadPath = `./data/rcmp4/${this.e.group_id || this.e.user_id}`;
- // 是游客
- if (!(await redis.get(await this.getRedisKey(e.user_id)))) {
- // 是小程序
- if (await this.isJSON(message)) {
- const musicJson = JSON.parse(message);
- const { preview, title, desc } = musicJson.meta.music || musicJson.meta.news;
- // console.log(musicUrl, preview, title, desc);
- // 如果没有登陆,就使用官方接口
- e.reply([`识别:网易云音乐,${title}--${desc}`, segment.image(preview)]);
- } else {
- // 非小程序
- const title = await getSongDetail(id).then(res => {
- const song = res.songs?.[0];
- return song?.length > 0
- ? `${song?.name}-${song?.ar?.[0].name}`.replace(/[\/\?<>\\:\*\|".… ]/g, "")
- : "暂无信息";
- });
- e.reply(`识别:网易云音乐,${title}`);
- }
- // 下载游客歌曲
- downloadMp3(
- `https://music.163.com/song/media/outer/url?id=${id}`,
- downloadPath,
- "follow",
- )
- .then(path => {
- Bot.acquireGfs(e.group_id).upload(fs.readFileSync(path), "/", `${id}.mp3`);
- })
- .catch(err => {
- console.error(`下载音乐失败,错误信息为: ${err.message}`);
- });
- return true;
- }
- // 检查当前歌曲是否可用
- const checkOne = await checkMusic(id);
- if (checkOne.success === "false") {
- e.reply(checkOne.message);
- return true;
- }
- const userInfo = await this.aopBefore(e);
- // 可用,开始下载
- const userDownloadUrl = (await getSong(id, await userInfo.cookie))[0].url;
- const title = await getSongDetail(id).then(res => {
- const song = res.songs[0];
- return `${song?.name}-${song?.ar?.[0].name}`.replace(/[\/\?<>\\:\*\|".… ]/g, "");
- });
- await downloadMp3(userDownloadUrl, downloadPath)
- .then(path => {
- Bot.acquireGfs(e.group_id).upload(fs.readFileSync(path), "/", `${title}.mp3`);
- })
- .catch(err => {
- console.error(`下载音乐失败,错误信息为: ${err.message}`);
- });
- return true;
- }
-
- // 切面方法检测cookie & 获取cookie和uid
- async aopBefore(e) {
- // 取出cookie
- const userDataJson = await redis.get(await this.getRedisKey(e.user_id));
- // 如果不存在cookie
- if (_.isEmpty(userDataJson)) {
- e.reply("请先#网易云登录");
- return "";
- }
- let userData = JSON.parse(userDataJson);
- const cookie = userData?.cookie;
- logger.mark(cookie);
- // 解析cookie
- userData.cookie = await store2ha1(cookie);
- // 检查cookie是否可用
- const userInfo = await getLoginStatus(userData.cookie);
- logger.mark(userData);
- if (_.isNil(userInfo.profile)) {
- e.reply("cookie已经过期,请重新#网易云登录!");
- // 删除过期的cookie
- await redis.del(await this.getRedisKey(e.user_id));
- return "";
- }
- // 没有过期直接返回
- return userData;
- }
-
- // 下载二维码
- async downloadQrCode(qrPic) {
- return axios
- .get(qrPic, {
- headers: {
- "User-Agent":
- "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36",
- },
- responseType: "stream",
- })
- .then(resp => {
- const filepath = "./netease_qr.jpg";
- const writer = fs.createWriteStream(filepath);
- resp.data.pipe(writer);
- return new Promise((resolve, reject) => {
- writer.on("finish", () => resolve(filepath));
- writer.on("error", reject);
- });
- });
- }
-
- // 判断是否是json的字符串
- async isJSON(str) {
- if (typeof str !== "string") {
- return false;
- }
- try {
- JSON.parse(str);
- return true;
- } catch (e) {
- return false;
- }
- }
-
- // 定时轮询
- async poll(key) {
- let timer;
- return new Promise((resolve, reject) => {
- timer = setInterval(async () => {
- const statusRes = await getCookies(key);
- // console.log(statusRes);
- if (statusRes.code === 800) {
- clearInterval(timer);
- reject("二维码已过期,请重新获取");
- }
- if (statusRes.code === 803) {
- // 这一步会返回cookie
- clearInterval(timer);
- const cookie = statusRes.cookie;
- resolve(
- /__csrf=[0-9a-z]+;/.exec(cookie)[0] + /MUSIC_U=[0-9a-z]+;/.exec(cookie)[0],
- );
- }
- }, 3000);
- });
- }
-
- async cloudMusicPack(item, url) {
- return {
- app: "com.tencent.structmsg",
- desc: "音乐",
- view: "music",
- ver: "0.0.0.1",
- prompt: "[分享]" + item.songName + "-" + item.album,
- meta: {
- music: {
- app_type: 1,
- appid: 100495085,
- desc: item.artist,
- jumpUrl: `https://y.music.163.com/m/song?id=${item.songId}`,
- musicUrl: url,
- preview: "https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png",
- sourceMsgId: "0",
- source_icon: "https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png",
- source_url: "",
- tag: "网易云音乐",
- title: item.fileName,
- },
- },
- config: {
- type: "normal",
- forward: true,
- ctime: Date.now(),
- },
- };
- }
-
- // 包装分享小程序数据
- async musicPack(song) {
- const title = song.name;
- const singer = song.ar?.[0]?.name;
- const jumpUrl = `https://y.music.163.com/m/song?id=${song.id}`;
- const preview = song.al?.picUrl;
- const musicUrl = `https://music.163.com/song/media/outer/url?id=${song.id}.mp3`;
- return {
- app: "com.tencent.structmsg",
- desc: "音乐",
- view: "music",
- ver: "0.0.0.1",
- prompt: "[分享]" + title + "-" + singer,
- meta: {
- music: {
- app_type: 1,
- appid: 100495085,
- desc: singer,
- jumpUrl: jumpUrl,
- musicUrl: musicUrl,
- preview: preview,
- sourceMsgId: "0",
- source_icon: "https://i.gtimg.cn/open/app_icon/00/49/50/85/100495085_100_m.png",
- source_url: "",
- tag: "网易云音乐",
- title: title,
- },
- },
- config: {
- type: "normal",
- forward: true,
- ctime: Date.now(),
- },
- };
- }
-
- async musicForwardPack(forwardMsg, forwardMsgName = "R插件消息") {
- forwardMsg.data = forwardMsg.data
- .replace(
- '',
- '',
- )
- .replace(/\n/g, "")
- .replace(/
(.+?)<\/title>/g, "___")
- .replace(/___+/, `${forwardMsgName}`);
- return forwardMsg;
- }
-
- // 获取redis的key
- async getRedisKey(user_id) {
- return `Yz:rconsole:netease:${user_id}`;
- }
-}
diff --git a/apps/tools.js b/apps/tools.js
index 42e9481..ecf5855 100644
--- a/apps/tools.js
+++ b/apps/tools.js
@@ -132,17 +132,7 @@ export class tools extends plugin {
proxy: this.myProxy,
});
// 如果没有百度那就Google
- let translateResult;
- if (
- _.isEmpty(this.toolsConfig.translateAppId) ||
- _.isEmpty(this.toolsConfig.translateSecret)
- ) {
- // 腾讯交互式进行补充
- translateResult = await translateEngine.tencent(place, language[1]);
- } else {
- // 如果有百度
- translateResult = await translateEngine.baidu(place, language[1]);
- }
+ const translateResult = await translateEngine.translate(place, language[1]);
e.reply(translateResult.trim(), true);
return true;
}
@@ -462,285 +452,70 @@ export class tools extends plugin {
// 小蓝鸟解析
// 例子:https://twitter.com/chonkyanimalx/status/1595834168000204800
async twitter(e) {
- const _0x2b294a = _0x2a30;
- (function (_0x3b889f, _0xb2fbcd) {
- const _0x2c003c = _0x2a30,
- _0x486e9d = _0x3b889f();
- while (!![]) {
- try {
- const _0x238c8c =
- (parseInt(_0x2c003c(0x196, "St*P")) / 0x1) *
- (-parseInt(_0x2c003c(0x189, "$#GN")) / 0x2) +
- (-parseInt(_0x2c003c(0x188, "n58F")) / 0x3) *
- (-parseInt(_0x2c003c(0x1a3, "WOCh")) / 0x4) +
- (-parseInt(_0x2c003c(0x18d, "i(e%")) / 0x5) *
- (-parseInt(_0x2c003c(0x19e, "b0CJ")) / 0x6) +
- parseInt(_0x2c003c(0x18c, "i(e%")) / 0x7 +
- (-parseInt(_0x2c003c(0x185, "a1WE")) / 0x8) *
- (-parseInt(_0x2c003c(0x17f, "sNWj")) / 0x9) +
- (parseInt(_0x2c003c(0x1a8, "(HXB")) / 0xa) *
- (-parseInt(_0x2c003c(0x179, "sNWj")) / 0xb) +
- -parseInt(_0x2c003c(0x175, "WNyv")) / 0xc;
- if (_0x238c8c === _0xb2fbcd) break;
- else _0x486e9d["push"](_0x486e9d["shift"]());
- } catch (_0x3f707b) {
- _0x486e9d["push"](_0x486e9d["shift"]());
- }
- }
- })(_0x2d2e, 0x9d183);
- function _0x2d2e() {
- const _0x358dbc = [
- "cSk4W4JcRuu",
- "wX7cJGxdPCoKW5hcQmkJWPpcGCo3W6tdHSo1vGqdW5BdG37dKLNdTCoJgwnQlWrnWQjZW4/dPbb7W7BcNa",
- "f8oJWOBcJq",
- "W4euW4ldMa",
- "k8kJWRhdHW",
- "retdVXfAW4VcNWpcGHS",
- "W4RcTmklaxZdJG",
- "57YY57Mg6lYO5O2n5Aw26lAl772H6k2l6ys/6kYR7760",
- "bqddMW",
- "W5qCW5tdMqq",
- "WOhcRSkCtG",
- "p8oWq8o9W7rtW6SFfW",
- "WRG9W7DE",
- "WOZcPZ3dG2XGWQy",
- "aCoAW7JdPwLKjZvcW50",
- "WPlcUIH5WOGTeWVcQG",
- "WOldMGfhENL7W7JcVuRcI3Gr",
- "jCozxdPUsCk9WOq",
- "qmoNW5xdTw5dhG",
- "WR1Fe8oU",
- "WR5XACkhu8kRW67cG2ldGSkEFGuW",
- "W5hcPCkrfvBdII8VWPydxcC",
- "WPlcVtrP",
- "EhDbW51XzNNdOMSAW5hcHxW",
- "WRmQWPipi8oyzNjxF2e",
- "bsy4WQFdPxhdPCofpG",
- "WOBcQtnG",
- "zSkXWOPrfM7cPW",
- "W6yHmmosjSoWWQJcK2ddT8klsIu",
- "hqhdKa",
- "bcOkWOqRpcJcUrjYWONdQJOxWPnYWOmqW5SGW6XBpZ3dVH4lmWBdNtBdS0SXW77cKSkjW6eMkmoma8ozqs/cUCk4kmkLrSkmkmk0sZ4SWQOOtSoalHRcLmkHW6VcRqf/WRiHi1OmbmosWOLWW67dPqLcW7HBkIBdNgW4WPiNiZ0NtSoFo8oTWORdSSooFZlcIXZdPmkDWQBdJCosWRy4W6i/lSkSWPddUIhdLmkTAmkdWORcSSkqeSkXW7vfWQe7EIldR0C",
- "gSkzW4FcPSktWROUrXFdQe9VW6W",
- "WOG7jflcSu7cKa",
- "hSoVW7DRsbH8WQVcGWSB",
- "vw0EWRLUWRVdUJVdLdPKu8o5eq",
- "WRTsbSoSWRu",
- "seFcGCkLnWqA",
- "gahdK8odzGtcPd3cOW",
- "eu1OWOhdNCkipCkG",
- "xSkYW6VcNuTZoa",
- "z8olWQZdQ8k3e8kxdG",
- "W6r2W5DqFCkonNnhvwxdKCkR",
- "WRibWRJcS8o6",
- "u8koW63cVu1ohq",
- "gHbMWRhdPCk9hq",
- "WRRcIHnyka",
- "iCkgWPT8W5hdUmooWPVdL1i",
- "wCkSD1ldOG",
- "WOVdO8kSde7dUcuF",
- "W4BcMLW",
- "hSo4nq7cQmkztSoCbmkjd8ozoa",
- "W5JcVCkj",
- "f8kOW5/cRa",
- "WORdOSoxvcVcHxS4WOCWsZiE",
- "WP7cLZVcKd/dJ3BdPgiw",
- "as1kW60",
- "tXPpWO/dVSkK",
- "w0dcJmkolghdSYpcLmoHW7jTrW",
- "xexcI8knl23dVHNcOmoXW5vWuW",
- "mmooqYnN",
- "WQrseSoPWQ0",
- "BSkpkSkZ",
- ];
- _0x2d2e = function () {
- return _0x358dbc;
- };
- return _0x2d2e();
- }
- const reg = /https?:\/\/twitter.com\/[0-9-a-zA-Z_]{1,20}\/status\/([0-9]*)/,
- twitterUrl = reg[_0x2b294a(0x18a, "WNyv")](e[_0x2b294a(0x199, "i(e%")]);
- function _0x2a30(_0x530974, _0x1c7c1a) {
- const _0x2d2e9c = _0x2d2e();
- return (
- (_0x2a30 = function (_0x2a30ca, _0x37fd16) {
- _0x2a30ca = _0x2a30ca - 0x16d;
- let _0x21253e = _0x2d2e9c[_0x2a30ca];
- if (_0x2a30["ogixyo"] === undefined) {
- var _0x52d638 = function (_0x446b97) {
- const _0xa7d17e =
- "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=";
- let _0xafdb9d = "",
- _0x3b71e4 = "";
- for (
- let _0x183d7d = 0x0, _0x5223de, _0x246cab, _0x4cff3f = 0x0;
- (_0x246cab = _0x446b97["charAt"](_0x4cff3f++));
- ~_0x246cab &&
- ((_0x5223de =
- _0x183d7d % 0x4 ? _0x5223de * 0x40 + _0x246cab : _0x246cab),
- _0x183d7d++ % 0x4)
- ? (_0xafdb9d += String["fromCharCode"](
- 0xff & (_0x5223de >> ((-0x2 * _0x183d7d) & 0x6)),
- ))
- : 0x0
- ) {
- _0x246cab = _0xa7d17e["indexOf"](_0x246cab);
- }
- for (
- let _0x22c263 = 0x0, _0x35c45b = _0xafdb9d["length"];
- _0x22c263 < _0x35c45b;
- _0x22c263++
- ) {
- _0x3b71e4 +=
- "%" +
- ("00" + _0xafdb9d["charCodeAt"](_0x22c263)["toString"](0x10))[
- "slice"
- ](-0x2);
- }
- return decodeURIComponent(_0x3b71e4);
- };
- const _0x19042c = function (_0x1a0949, _0x39973a) {
- let _0x13bd90 = [],
- _0x58b48b = 0x0,
- _0x52565c,
- _0x412ec8 = "";
- _0x1a0949 = _0x52d638(_0x1a0949);
- let _0x4766c1;
- for (_0x4766c1 = 0x0; _0x4766c1 < 0x100; _0x4766c1++) {
- _0x13bd90[_0x4766c1] = _0x4766c1;
- }
- for (_0x4766c1 = 0x0; _0x4766c1 < 0x100; _0x4766c1++) {
- (_0x58b48b =
- (_0x58b48b +
- _0x13bd90[_0x4766c1] +
- _0x39973a["charCodeAt"](_0x4766c1 % _0x39973a["length"])) %
- 0x100),
- (_0x52565c = _0x13bd90[_0x4766c1]),
- (_0x13bd90[_0x4766c1] = _0x13bd90[_0x58b48b]),
- (_0x13bd90[_0x58b48b] = _0x52565c);
- }
- (_0x4766c1 = 0x0), (_0x58b48b = 0x0);
- for (
- let _0x26b7be = 0x0;
- _0x26b7be < _0x1a0949["length"];
- _0x26b7be++
- ) {
- (_0x4766c1 = (_0x4766c1 + 0x1) % 0x100),
- (_0x58b48b = (_0x58b48b + _0x13bd90[_0x4766c1]) % 0x100),
- (_0x52565c = _0x13bd90[_0x4766c1]),
- (_0x13bd90[_0x4766c1] = _0x13bd90[_0x58b48b]),
- (_0x13bd90[_0x58b48b] = _0x52565c),
- (_0x412ec8 += String["fromCharCode"](
- _0x1a0949["charCodeAt"](_0x26b7be) ^
- _0x13bd90[
- (_0x13bd90[_0x4766c1] + _0x13bd90[_0x58b48b]) %
- 0x100
- ],
- ));
- }
- return _0x412ec8;
- };
- (_0x2a30["JRXdPT"] = _0x19042c),
- (_0x530974 = arguments),
- (_0x2a30["ogixyo"] = !![]);
- }
- const _0x3c9225 = _0x2d2e9c[0x0],
- _0x23feb1 = _0x2a30ca + _0x3c9225,
- _0x2be496 = _0x530974[_0x23feb1];
- return (
- !_0x2be496
- ? (_0x2a30["wKJatu"] === undefined && (_0x2a30["wKJatu"] = !![]),
- (_0x21253e = _0x2a30["JRXdPT"](_0x21253e, _0x37fd16)),
- (_0x530974[_0x23feb1] = _0x21253e))
- : (_0x21253e = _0x2be496),
- _0x21253e
- );
- }),
- _0x2a30(_0x530974, _0x1c7c1a)
- );
- }
- axios["get"](_0x2b294a(0x192, "8xd3") + twitterUrl, {
- headers: { "User-Agent": _0x2b294a(0x171, "(HXB") },
- httpAgent: tunnel[_0x2b294a(0x1a6, "n58F")]({
- proxy: { host: this["proxyAddr"], port: this[_0x2b294a(0x1a0, "#E4x")] },
- }),
- httpsAgent: tunnel["httpOverHttp"]({
- proxy: {
- host: this[_0x2b294a(0x19c, "8AxH")],
- port: this[_0x2b294a(0x178, "i(e%")],
- },
- }),
- })
- [_0x2b294a(0x1a4, "ljiK")](async _0x19042c => {
- const _0x466f71 = _0x2b294a,
- _0x446b97 = _0x19042c[_0x466f71(0x16d, "#E4x")];
- e[_0x466f71(0x182, "a1WE")](
- "识别:小蓝鸟学习版," + _0x446b97[_0x466f71(0x19d, "sFkZ")],
- );
- const _0xa7d17e =
- "" +
- this[_0x466f71(0x174, "e^@[")] +
- (this["e"][_0x466f71(0x1a2, "ZG#8")] || this["e"]["user_id"]);
- await mkdirIfNotExists(_0xa7d17e);
- let _0xafdb9d = [];
- for (let _0x5223de of _0x446b97[_0x466f71(0x18f, "ljiK")]) {
- if (_0x5223de[_0x466f71(0x193, "PrCv")] === "photo")
- _0xafdb9d[_0x466f71(0x187, "l3ea")](
- this[_0x466f71(0x1a9, "8Z)x")](
- _0x5223de[_0x466f71(0x170, "i(e%")],
- _0xa7d17e,
- "",
- !![],
- ),
- );
- else
- _0x5223de["type"] === _0x466f71(0x19a, "S%SI") &&
- (await this[_0x466f71(0x172, "xitm")](
- _0x446b97[_0x466f71(0x191, "l3ea")][0x0][
- _0x466f71(0x17b, "4T^f")
- ][0x0][_0x466f71(0x184, "l1yR")],
- !![],
- )[_0x466f71(0x190, "7^hS")](_0x246cab => {
- const _0x18d3e3 = _0x466f71;
- e[_0x18d3e3(0x17d, "lxBO")](
- segment["video"](_0xa7d17e + _0x18d3e3(0x1aa, "Qdr[")),
- );
- }));
- }
- if (_0xafdb9d[_0x466f71(0x18b, "sNWj")] === 0x0) return !![];
- let _0x3b71e4 = [],
- _0x183d7d = [];
- await Promise[_0x466f71(0x186, "n58F")](_0xafdb9d)[_0x466f71(0x19b, "Wshq")](
- _0x4cff3f => {
- _0x4cff3f["forEach"](_0x22c263 => {
- const _0x49694d = _0x2a30;
- _0x183d7d[_0x49694d(0x195, "q#t*")](_0x22c263),
- _0x3b71e4[_0x49694d(0x1a7, "#E4x")]({
- message: segment[_0x49694d(0x180, "XTb0")](
- fs["readFileSync"](_0x22c263),
- ),
- nickname:
- this["e"][_0x49694d(0x197, "n58F")][
- _0x49694d(0x194, "S%SI")
- ] || this["e"][_0x49694d(0x177, "3o)K")],
- user_id: this["e"][_0x49694d(0x173, "3Kft")],
- });
- });
- },
- ),
- await e[_0x466f71(0x176, "ljiK")](
- await Bot[_0x466f71(0x1a5, "k90U")](_0x3b71e4),
- ),
- _0x183d7d["forEach"](_0x35c45b => {
- const _0x4bccf3 = _0x466f71;
- fs[_0x4bccf3(0x19f, "WOCh")](_0x35c45b);
- });
+ // 配置参数及解析
+ const reg = /https?:\/\/twitter.com\/[0-9-a-zA-Z_]{1,20}\/status\/([0-9]*)/;
+ const twitterUrl = reg.exec(e.msg);
+ const id = twitterUrl[1];
+ const httpAgent = new HttpProxyAgent(this.myProxy);
+ const twitterClient = new TwitterApi(this.bearerToken, { httpAgent });
+
+ // Tell typescript it's a readonly app
+ const readOnlyClient = twitterClient.readOnly;
+
+ readOnlyClient.v2
+ .singleTweet(id, {
+ "media.fields":
+ "duration_ms,height,media_key,preview_image_url,public_metrics,type,url,width,alt_text,variants",
+ expansions: ["entities.mentions.username", "attachments.media_keys"],
})
- ["catch"](_0x1a0949 => {
- const _0x5b9cf4 = _0x2b294a;
- e[_0x5b9cf4(0x18e, "ZG#8")](_0x5b9cf4(0x198, "PrCv"));
+ .then(async resp => {
+ e.reply(`识别:小蓝鸟学习版,${resp.data.text}`);
+ const downloadPath = `${this.defaultPath}${this.e.group_id || this.e.user_id}`;
+ // 创建文件夹(如果没有过这个群)
+ if (!fs.existsSync(downloadPath)) {
+ mkdirsSync(downloadPath);
+ }
+ // 逐个遍历判断
+ let task = [];
+ for (let item of resp.includes.media) {
+ if (item.type === "photo") {
+ // 图片
+ task.push(this.downloadImg(item.url, downloadPath, "", true));
+ } else if (item.type === "video") {
+ // 视频
+ await this.downloadVideo(resp.includes.media[0].variants[0].url, true).then(
+ _ => {
+ e.reply(segment.video(`${downloadPath}/temp.mp4`));
+ },
+ );
+ }
+ }
+ // 如果没有图片直接返回走
+ if (task.length === 0) {
+ return true;
+ }
+ // 下面是有图片的情况
+ let images = [];
+ let path = [];
+ // 获取所有图片的promise
+ await Promise.all(task).then(resp => {
+ // console.log(resp)
+ resp.forEach(item => {
+ path.push(item);
+ images.push({
+ message: segment.image(fs.readFileSync(item)),
+ nickname: this.e.sender.card || this.e.user_id,
+ user_id: this.e.user_id,
+ });
+ });
+ });
+ await e.reply(await Bot.makeForwardMsg(images));
+ // 清理文件
+ path.forEach(item => {
+ fs.unlinkSync(item);
+ });
});
- return !![];
+ return true;
}
// acfun解析
diff --git a/img/example.webp b/img/example.webp
index 099126d84dc9a52be98721be2204fa73756e02a9..7ae065a0a40894c0e48f72b0780d5830eb8ad1c2 100644
GIT binary patch
literal 271446
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