├── README.md ├── index.js ├── package.json └── pm2.json /README.md: -------------------------------------------------------------------------------- 1 | # Telegram-Find-Jav-bot 2 | Telegram 番号机器人 源码 3 | 4 | ### 不解答任何疑问 5 | 6 | ## 使用和启动 7 | - 安装Node.js [前往下载](https://nodejs.org/zh-cn/download/)(版本越新越好) 8 | - 下载本项目源码到你本地 9 | - **在index.js的第二行填入你的Telegram机器人Token** 10 | - 在命令行工具使用cd命令进入源码目录 11 | - 执行命令 12 | - npm install 13 | - npm run test 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** Telegram机器人的Token */ 2 | const token = '机器人Token'; 3 | const robotName = '@xxxx'; 4 | 5 | 6 | 7 | const TelegramBot = require('node-telegram-bot-api'); 8 | const cheerio = require('cheerio'); 9 | const axios = require('axios'); 10 | const moment = require('moment'); 11 | moment.locale('zh-cn'); 12 | const vm = require('vm'); 13 | const http = axios.create({ 14 | baseURL: 'https://www.javbus.com/', 15 | timeout: 5000, 16 | headers: { 17 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36', 18 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 19 | 'Accept-Language': 'zh-CN,zh;q=0.9', 20 | } 21 | }); 22 | 23 | const bot = new TelegramBot(token, {polling: true}); 24 | 25 | //开始入口 26 | bot.onText(/\/start/, msg => { 27 | bot.sendMessage(msg.chat.id, '欢迎使用番号机器人\n请输入 / 查看命令提示'); 28 | }); 29 | 30 | 31 | //简单保存工作状态 32 | const state = {start: Date.now(), date: {}}; 33 | 34 | bot.onText(/\/state/, msg => {//最近5天工作状态 35 | let buffer = drawState(5); 36 | return bot.sendMessage(msg.chat.id, buffer); 37 | }); 38 | bot.onText(/\/state (\d+)/, (msg, match) => {//工作状态 39 | let days = parseInt(match[1].trim()); // the captured "whatever" 40 | console.log({days}); 41 | let buffer = drawState(days); 42 | 43 | return bot.sendMessage(msg.chat.id, buffer); 44 | }); 45 | 46 | /** 47 | * 绘制图表 48 | * @param range 49 | * @returns {*} 50 | */ 51 | function drawState(range) { 52 | let now = moment(); 53 | let earlyDay = moment().subtract(range, 'day'); 54 | let date = [], data = []; 55 | while (earlyDay.diff(now) <= 0) { 56 | let dateKey = earlyDay.format('YYYY-MM-DD'); 57 | date.push(dateKey); 58 | if (state.date[dateKey]) 59 | data.push(state.date[dateKey]); 60 | else 61 | data.push(0); 62 | earlyDay = earlyDay.add(1, 'day'); 63 | } 64 | let message = '从 ' + moment(state.start).fromNow() + ' 开始工作\n\n 日期 : 查询车牌号次数'; 65 | date.forEach((d, i) => { 66 | message += '\n' + d + ' : ' + data[i]; 67 | }); 68 | return message; 69 | } 70 | 71 | let idRegex = /^([a-z]+)(?:-|_|\s)?([0-9]+)$/; 72 | 73 | // Matches "/echo [whatever]" 74 | bot.onText(/\/av (.+)/, async (msg, match) => { 75 | const today = moment().format('YYYY-MM-DD'); 76 | if (state.date[today]) 77 | state.date[today]++; 78 | else 79 | state.date[today] = 1; 80 | const chatId = msg.chat.id; 81 | let chartType = msg.chat.type; 82 | let isPrivate = chartType === 'private'; 83 | let id = match[1].trim(); // the captured "whatever" 84 | console.log('请求番号', id); 85 | if (idRegex.test(id)) { 86 | id = id.match(idRegex); 87 | id = id[1] + '-' + id[2]; 88 | } 89 | if (isPrivate) 90 | bot.sendMessage(chatId, `开始查找车牌号:${id} ……`); 91 | try { 92 | let result = await parseHtml(id); 93 | await bot.sendPhoto(chatId, result.cover); 94 | let max = isPrivate ? 10 : 3; 95 | let title = '[' + id + '] '; 96 | if (result.magnet.length > 0) { 97 | let message = result.title; 98 | result.magnet.every((magnet, i) => { 99 | message += '\n-----------\n大小: ' + magnet.size + '\n链接: ' + magnet.link.substring(0, 60); 100 | return (i + 1) < max; 101 | }); 102 | if (!isPrivate && result.magnet.length > max) { 103 | message += `\n-----------\n在群聊中发车,还有 ${result.magnet.length - max} 个Magnet链接没有显示\n与 ${robotName} 机器人单聊可以显示所有链接`; 104 | } 105 | bot.sendMessage(chatId, message); 106 | } else { 107 | bot.sendMessage(chatId, title + '还没有Magnet链接'); 108 | } 109 | } catch (e) { 110 | console.error(id, e.message); 111 | if (e.message.indexOf('timeout') !== -1) 112 | return bot.sendMessage(chatId, '机器人查询番号超时,请重试'); 113 | bot.sendMessage(chatId, `找不到 ${id}!`); 114 | } 115 | }); 116 | 117 | 118 | /** 119 | * 解析Javbus网页内容 120 | * @param id 121 | * @returns {{title: string, cover: string, magnet: array}} 122 | */ 123 | async function parseHtml(id) { 124 | const result = {title: '', cover: '', magnet: []}; 125 | let response = await http.get('/' + id); 126 | // fs.writeFileSync('./1.html', response.data); 127 | let $ = cheerio.load(response.data); 128 | let $image = $('a.bigImage img'); 129 | // console.log({$image}); 130 | result.title = $image.attr('title'); 131 | result.cover = $image.attr('src'); 132 | 133 | let ajax = {gid: '', uc: '', img: ''}; 134 | const context = new vm.createContext(ajax); 135 | let $script = $('body > script:nth-child(9)'); 136 | new vm.Script($script.html()).runInContext(context); 137 | let floor = Math.floor(Math.random() * 1e3 + 1); 138 | let url = `/ajax/uncledatoolsbyajax.php?gid=${ajax.gid}&uc=${ajax.uc}&img=${ajax.img}&lang=zh&floor=${floor}`; 139 | response = await http({method: 'get', url, headers: {'referer': 'https://www.javbus.com/' + id}}); 140 | // console.log(response.data); 141 | // fs.writeFileSync('./2.html', response.data); 142 | $ = cheerio.load(response.data, {xmlMode: true, decodeEntities: true, normalizeWhitespace: true}); 143 | let $tr = $('tr'); 144 | if ($tr.length > 0) { 145 | for (let i = 0; i < $tr.length; i++) { 146 | let $a = $tr.eq(i).find('td:nth-child(2) a'); 147 | if ($a.length === 0) 148 | continue; 149 | // console.log('tr', i, $a.length); 150 | result.magnet.push({link: decodeURI($a.attr('href').trim()), size: $a.text().trim()}); 151 | } 152 | } 153 | // console.log(result); 154 | return result; 155 | } 156 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "telegram-bot", 3 | "version": "1.0.0", 4 | "description": "Telegram 番号机器人", 5 | "scripts": { 6 | "test": "pm2 start pm2.json && pm2 logs", 7 | "kill": "pm2 kill", 8 | "logs": "pm2 logs" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.18.0", 12 | "canvas": "^1.6.10", 13 | "cheerio": "^1.0.0-rc.2", 14 | "echarts": "^4.0.4", 15 | "koa": "^2.5.0", 16 | "lodash": "^4.17.5", 17 | "moment": "^2.22.1", 18 | "node-telegram-bot-api": "^0.30.0", 19 | "pm2": "^2.10.2" 20 | }, 21 | "author": "com.nrop19@gmail.com", 22 | "license": "MIT" 23 | } 24 | -------------------------------------------------------------------------------- /pm2.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "机器人", 4 | "script": "./index.js", 5 | "watch": "./index.js", 6 | "watch_options": { 7 | "followSymlinks": false 8 | }, 9 | "error_file": "./logs/机器人-err.log", 10 | "out_file": "./logs/机器人-out.log" 11 | } 12 | ] --------------------------------------------------------------------------------