├── .gitignore ├── cookie ├── images └── 获取cookie.png ├── package.json ├── src ├── request.js ├── utils.js ├── deleteFans.js ├── deleteConcern.js ├── deleteTieba.js ├── deletePost.js └── deleteReply.js ├── README.md ├── config.js └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /cookie: -------------------------------------------------------------------------------- 1 | aejawejawella=eewkljakeljalsdjaljsdl -------------------------------------------------------------------------------- /images/获取cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chenchenwuai/tieba-delete/HEAD/images/获取cookie.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tieba-delete", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "dependencies": { 12 | "cheerio": "^1.0.0-rc.10", 13 | "node-fetch": "^2.6.6" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/request.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const fetch = require('node-fetch') 3 | 4 | const cookie = fs.readFileSync('./cookie'); 5 | // 请求 6 | async function request(url,options={}) { 7 | return await fetch(url, { 8 | headers:{ Cookie: encodeURI(cookie.toString('utf-8')) }, 9 | ...options 10 | }) 11 | } 12 | 13 | module.exports.request = request 14 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | const { request } = require('./request') 2 | 3 | // 获取tbs 4 | async function getTBS() { 5 | const response = await request('http://tieba.baidu.com/dc/common/tbs') 6 | const data = await response.json() 7 | if(data && data.is_login && data.tbs){ 8 | return data.tbs 9 | }else{ 10 | return false 11 | } 12 | } 13 | 14 | module.exports.getTBS = getTBS -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 贴吧删除器 2 | 删除我的贴吧记录[回复、帖子、关注、粉丝等](~~也可以说删除以前不堪入目的黑历史~~) 3 | 4 | ## 使用方法 5 | + 设置cookie 6 | + 清空文件夹中cookie文件里面的内容 7 | + 打开[百度贴吧首页](https://tieba.baidu.com/index.html),然后登录贴吧 8 | + 右键页面点击**检查**或者按**F12**进入**控制台**,然后点击**Network** 9 | + 然后刷新页面,然后点击network下方列表中的第一个请求,名称为`tieba.baidu.com` 10 | + 找到右方的`Headers`中`Request Headers`中的`cookie`,然后右键选择复制 11 | + 将复制到的东西粘贴到cookie的文件中,不要忘记保存,(可参考images下面的`获取cookie`图片) 12 | + 当账号在浏览器退出或重新登录后,cookie就失效了,需要重新设置cookie 13 | + 进行操作项配置,详细请查看`config.js`文件 14 | + 配置好之后,在当前路径下运行cmd 15 | + 输入`node install`命令安装模块 16 | + 输入`node index`或者`npm run start`开始执行删除 17 | 18 | ## 功能集合 19 | 20 | - [x] 删除回复 21 | - [x] 删除关注的人 22 | - [x] 删除关注的贴吧 23 | - [x] 删除粉丝 (粉丝太少,未完全测试) 24 | - [x] 删除帖子 25 | 26 | > 贴吧每日删除数量有上限,如果错误中出现`limit`等字样,请第二天在尝试 27 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | reply:{ // 删除回复的配置 4 | enable: true, // true->开启, false->关闭删除回复功能 5 | start: 1, // 回复开始页 http://tieba.baidu.com/i/i/my_reply?&pn=1 6 | end: 2, // 回复结束页 http://tieba.baidu.com/i/i/my_reply?&pn=2 7 | interval: 350 // 删除操作毫秒间隔,根据测试,间隔越小,每日可删除上限越高,风险也越高。建议200~500ms内 8 | }, 9 | 10 | post:{ // 删除发布的帖子 11 | enable: true, // true->开启, false->关闭删除回复功能 12 | start: 1, // 回复开始页 http://tieba.baidu.com/i/i/my_tie?&pn=1 13 | end: 2, // 回复结束页 http://tieba.baidu.com/i/i/my_tie?&pn=2 14 | interval: 350 // 删除操作毫秒间隔,根据测试,间隔越小,每日可删除上限越高,风险也越高。建议200~500ms内 15 | }, 16 | 17 | concern:{ // 取消关注人的配置 18 | enable: true, 19 | start: 1, // 开始页 http://tieba.baidu.com/i/i/concern?pn=1 20 | end: 2, // 结束页 http://tieba.baidu.com/i/i/concern?pn=2 21 | interval: 350 22 | }, 23 | 24 | tieba:{ // 取消关注贴吧的配置 25 | enable: true, 26 | start: 1, // 开始页 http://tieba.baidu.com/f/like/mylike?pn=1 27 | end: 2, // 结束页 http://tieba.baidu.com/f/like/mylike?pn=2 28 | interval: 350 29 | }, 30 | 31 | fans:{ // 删除粉丝的配置 32 | enable: true, 33 | start: 1, // 开始页 http://tieba.baidu.com/i/i/fans?pn=1 34 | end: 2, // 结束页 http://tieba.baidu.com/i/i/fans?pn=2 35 | interval: 350 36 | }, 37 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // const { getReplys } = require('./reply'); 2 | // const { deleteReplys } = require('./delete'); 3 | const fs = require("fs"); 4 | const { getTBS } = require('./src/utils') 5 | const config = require('./config') 6 | const { deleteReplies } = require('./src/deleteReply') 7 | const { deletePosts } = require('./src/deletePost') 8 | const { deleteConcerns } = require('./src/deleteConcern') 9 | const { deleteTieba } = require('./src/deleteTieba') 10 | const { deleteFans } = require('./src/deleteFans') 11 | 12 | const cookie = fs.readFileSync('./cookie'); 13 | 14 | (async () => { 15 | 16 | if(!cookie){ 17 | console.error('无效的cookie!') 18 | return false 19 | } 20 | 21 | const tbs = await getTBS() 22 | if(!tbs){ 23 | console.error('cookie失效,请重新登陆,然后设置cookie!') 24 | return false 25 | } 26 | 27 | const { reply, post, concern, tieba, fans } = config 28 | 29 | if(reply.enable){ 30 | console.log('---------------------------------------') 31 | console.log('开始删除评论...') 32 | await deleteReplies(reply) 33 | } 34 | 35 | if(post.enable){ 36 | console.log('---------------------------------------') 37 | console.log('开始删除帖子...') 38 | await deletePosts(post) 39 | } 40 | 41 | if(concern.enable){ 42 | console.log('---------------------------------------') 43 | console.log('开始取消关注的人...') 44 | await deleteConcerns(concern) 45 | } 46 | 47 | if(tieba.enable){ 48 | console.log('---------------------------------------') 49 | console.log('开始取消关注的贴吧...') 50 | await deleteTieba(tieba) 51 | } 52 | 53 | if(fans.enable){ 54 | console.log('---------------------------------------') 55 | console.log('开始移除粉丝...') 56 | await deleteFans(fans) 57 | } 58 | 59 | })(); -------------------------------------------------------------------------------- /src/deleteFans.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const { request } = require('./request') 3 | const tag = 'FANS' // 粉丝 4 | 5 | let requestInterval = 350 6 | // 删除多个 7 | async function deleteMultiple(config) { 8 | 9 | let { start, end, interval } = config 10 | requestInterval = interval || 350 11 | if(!start || !end){ 12 | if(start){ 13 | end = start 14 | }else if(end){ 15 | start = end 16 | }else{ 17 | console.log(`${tag}: Please set start or end `) 18 | return false 19 | } 20 | }else if(start > end){ 21 | start = end 22 | } 23 | 24 | const list = await getMultiplePage(start,end) 25 | const len = list.length 26 | if (len === 0) { 27 | console.log(`${tag}: Finished`) 28 | return false 29 | } 30 | 31 | for (let index = len - 1; index >= 0; index--) { 32 | console.log(`${tag}: -----Start Deleting No.${index + 1}----------------------`) 33 | const status = await deleteOne(list[index]) 34 | if(status !== true && status && status.err_code == 220034){ 35 | console.log(`${tag}: >>> Delete Limit <<< , Please try again tomorrow!`) 36 | return false 37 | } 38 | } 39 | console.log(`${tag}: Finished`) 40 | } 41 | 42 | // 删除一个 43 | async function deleteOne(params) { 44 | const fd = new URLSearchParams() 45 | Object.keys(params).forEach(key => { 46 | fd.append(key, params[key]) 47 | }) 48 | 49 | const url = 'https://tieba.baidu.com/home/post/unfollow' 50 | const response = await request(url, { 51 | method: 'POST', 52 | body: fd 53 | }) 54 | const data = await response.json() 55 | 56 | return new Promise(resolve => { 57 | setTimeout(() => { 58 | if (data.no === 0) { 59 | console.log(`${tag}: Delete Successed!`) 60 | resolve(true) 61 | } else { 62 | console.log(`${tag}: Delete Error:`, JSON.stringify(data)) 63 | resolve(data) 64 | } 65 | }, requestInterval) 66 | }) 67 | } 68 | 69 | // 获取多页 70 | async function getMultiplePage(start, end) { 71 | console.log(`${tag}: Getting, page:${start}->${end}`) 72 | const data = [] 73 | for (let page = end; page >= start; page--) { 74 | let list = await getOnePage(page) 75 | data.push(...list) 76 | } 77 | console.log(`${tag}: Got Total: ${data.length}`) 78 | return data 79 | } 80 | 81 | // 获取一页 82 | async function getOnePage(page) { 83 | const url = `http://tieba.baidu.com/i/i/fans?pn=${page}` 84 | const response = await request(url) 85 | const data = await response.text() 86 | const $ = cheerio.load(data) 87 | const list = $('input.btn_follow').map((index, el) => { 88 | return { 89 | cmd: 'add_black_list', 90 | tbs: $(el).attr('tbs'), 91 | id: $(el).attr('portrait') 92 | } 93 | }); 94 | return new Promise(resolve=>{ 95 | setTimeout(()=>{ 96 | console.log(`${tag}: Got, page:${page}, number:${list.length}`) 97 | resolve(list) 98 | },requestInterval) 99 | }) 100 | } 101 | 102 | module.exports.deleteFans = deleteMultiple -------------------------------------------------------------------------------- /src/deleteConcern.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const { request } = require('./request') 3 | const tag = 'CONCERN' // 关注的人 4 | 5 | let requestInterval = 350 6 | // 删除多个 7 | async function deleteMultiple(config) { 8 | 9 | let { start, end, interval } = config 10 | requestInterval = interval || 350 11 | if(!start || !end){ 12 | if(start){ 13 | end = start 14 | }else if(end){ 15 | start = end 16 | }else{ 17 | console.log(`${tag}: Please set start or end `) 18 | return false 19 | } 20 | }else if(start > end){ 21 | start = end 22 | } 23 | 24 | const list = await getMultiplePage(start,end) 25 | const len = list.length 26 | if (len === 0) { 27 | console.log(`${tag}: Finished`) 28 | return false 29 | } 30 | 31 | for (let index = len - 1; index >= 0; index--) { 32 | console.log(`${tag}: -----Start Deleting No.${index + 1}----------------------`) 33 | const status = await deleteOne(list[index]) 34 | if(status !== true && status && status.err_code == 220034){ 35 | console.log(`${tag}: >>> Delete Limit <<< , Please try again tomorrow!`) 36 | return false 37 | } 38 | } 39 | console.log(`${tag}: Finished`) 40 | } 41 | 42 | // 删除一个 43 | async function deleteOne(params) { 44 | const fd = new URLSearchParams() 45 | Object.keys(params).forEach(key => { 46 | fd.append(key, params[key]) 47 | }) 48 | 49 | const url = 'https://tieba.baidu.com/home/post/unfollow' 50 | const response = await request(url, { 51 | method: 'POST', 52 | body: fd 53 | }) 54 | const data = await response.json() 55 | 56 | return new Promise(resolve => { 57 | setTimeout(() => { 58 | if (data.no === 0) { 59 | console.log(`${tag}: Delete Successed!`) 60 | resolve(true) 61 | } else { 62 | console.log(`${tag}: Delete Error:`, JSON.stringify(data)) 63 | resolve(data) 64 | } 65 | }, requestInterval) 66 | }) 67 | } 68 | 69 | // 获取多页 70 | async function getMultiplePage(start, end) { 71 | console.log(`${tag}: Getting, page:${start}->${end}`) 72 | const data = [] 73 | for (let page = end; page >= start; page--) { 74 | let list = await getOnePage(page) 75 | data.push(...list) 76 | } 77 | console.log(`${tag}: Got Total: ${data.length}`) 78 | return data 79 | } 80 | 81 | // 获取一页 82 | async function getOnePage(page) { 83 | const url = `http://tieba.baidu.com/i/i/concern?pn=${page}` 84 | const response = await request(url) 85 | const data = await response.text() 86 | const $ = cheerio.load(data) 87 | const list = $('input.btn_unfollow').map((index, el) => { 88 | return { 89 | cmd: 'unfollow', 90 | tbs: $(el).attr('tbs'), 91 | id: $(el).attr('portrait') 92 | } 93 | }); 94 | return new Promise(resolve=>{ 95 | setTimeout(()=>{ 96 | console.log(`${tag}: Got, page:${page}, number:${list.length}`) 97 | resolve(list) 98 | },requestInterval) 99 | }) 100 | } 101 | 102 | module.exports.deleteConcerns = deleteMultiple -------------------------------------------------------------------------------- /src/deleteTieba.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const { request } = require('./request') 3 | const tag = 'TIEBA' // 关注的贴吧 4 | 5 | let requestInterval = 350 6 | // 删除多个 7 | async function deleteMultiple(config) { 8 | 9 | let { start, end, interval } = config 10 | requestInterval = interval || 350 11 | if(!start || !end){ 12 | if(start){ 13 | end = start 14 | }else if(end){ 15 | start = end 16 | }else{ 17 | console.log(`${tag}: Please set start or end `) 18 | return false 19 | } 20 | }else if(start > end){ 21 | start = end 22 | } 23 | 24 | const list = await getMultiplePage(start,end) 25 | const len = list.length 26 | if (len === 0) { 27 | console.log(`${tag}: Finished`) 28 | return false 29 | } 30 | 31 | for (let index = len - 1; index >= 0; index--) { 32 | console.log(`${tag}: -----Start Deleting No.${index + 1}----------------------`) 33 | const status = await deleteOne(list[0]) 34 | if(status !== true && status && status.err_code == 220034){ 35 | console.log(`${tag}: >>> Delete Limit <<< , Please try again tomorrow!`) 36 | return false 37 | } 38 | } 39 | console.log(`${tag}: Finished`) 40 | } 41 | 42 | // 删除一个 43 | async function deleteOne(params) { 44 | const fd = new URLSearchParams() 45 | Object.keys(params).forEach(key => { 46 | fd.append(key, params[key]) 47 | }) 48 | 49 | const url = 'http://tieba.baidu.com/f/like/commit/delete' 50 | const response = await request(url, { 51 | method: 'POST', 52 | body: fd 53 | }) 54 | try { 55 | const data = await response.json() 56 | return new Promise(resolve => { 57 | setTimeout(() => { 58 | if (data.no === 0) { 59 | console.log(`${tag}: Delete Successed!`) 60 | resolve(true) 61 | } else { 62 | console.log(`${tag}: Delete Error:`, JSON.stringify(data)) 63 | resolve(data) 64 | } 65 | }, requestInterval) 66 | }) 67 | } catch (error) { 68 | console.log(`${tag}: Delete Error:`, JSON.stringify(error)) 69 | return false 70 | } 71 | } 72 | 73 | // 获取多页 74 | async function getMultiplePage(start, end) { 75 | console.log(`${tag}: Getting, page:${start}->${end}`) 76 | const data = [] 77 | for (let page = end; page >= start; page--) { 78 | let list = await getOnePage(page) 79 | data.push(...list) 80 | } 81 | console.log(`${tag}: Got Total: ${data.length}`) 82 | return data 83 | } 84 | 85 | // 获取一页 86 | async function getOnePage(page) { 87 | const url = `http://tieba.baidu.com/f/like/mylike?pn=${page}` 88 | const response = await request(url) 89 | const data = await response.text() 90 | const $ = cheerio.load(data) 91 | const list = $('span').map((index, el) => { 92 | return { 93 | tbs: $(el).attr('tbs'), 94 | fid: $(el).attr('balvid'), 95 | fname: $(el).attr('balvname') 96 | } 97 | }); 98 | return new Promise(resolve=>{ 99 | setTimeout(()=>{ 100 | console.log(`${tag}: Got, page:${page}, number:${list.length}`) 101 | resolve(list) 102 | },requestInterval) 103 | }) 104 | } 105 | 106 | module.exports.deleteTieba = deleteMultiple -------------------------------------------------------------------------------- /src/deletePost.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const { request } = require('./request') 3 | const tag = 'POST' // 帖子 4 | const { getTBS, parseReplyParams } = require('./utils') 5 | 6 | let requestInterval = 350 7 | let tbs = '' 8 | 9 | // 删除多个 10 | async function deleteMultiple(config) { 11 | 12 | let { start, end, interval } = config 13 | requestInterval = interval || 350 14 | if(!start || !end){ 15 | if(start){ 16 | end = start 17 | }else if(end){ 18 | start = end 19 | }else{ 20 | console.log(`${tag}: Please set start or end `) 21 | return false 22 | } 23 | }else if(start > end){ 24 | start = end 25 | } 26 | 27 | const list = await getMultiplePage(start,end) 28 | const len = list.length 29 | if (len === 0) { 30 | console.log(`${tag}: Finished`) 31 | return false 32 | } 33 | 34 | for (let index = len - 1; index >= 0; index--) { 35 | console.log(`${tag}: -----Start Deleting No.${index + 1}----------------------`) 36 | const status = await deleteOne(list[index]) 37 | if(status !== true && status && status.err_code == 220034){ 38 | console.log(`${tag}: >>> Delete Limit <<< , Please try again tomorrow!`) 39 | return false 40 | } 41 | } 42 | console.log(`${tag}: Finished`) 43 | } 44 | 45 | // 删除一个 46 | async function deleteOne(params) { 47 | 48 | tbs = await getTBS() 49 | if(!tbs){ 50 | console.log(`${tag}: 请重新登陆,并设置cookie! `) 51 | return false 52 | } 53 | 54 | const fd = new URLSearchParams() 55 | Object.keys(params).forEach(key => { 56 | fd.append(key, params[key]) 57 | }) 58 | fd.append('tbs',tbs) 59 | 60 | const url = 'https://tieba.baidu.com/f/commit/post/delete' 61 | const response = await request(url, { 62 | method: 'POST', 63 | body: fd 64 | }) 65 | const data = await response.json() 66 | 67 | return new Promise(resolve => { 68 | setTimeout(() => { 69 | if (data.err_code === 0) { 70 | console.log(`${tag}: Delete Successed!`) 71 | resolve(true) 72 | } else { 73 | console.log(`${tag}: Delete Error:`, JSON.stringify(data)) 74 | resolve(data) 75 | } 76 | }, requestInterval) 77 | }) 78 | } 79 | 80 | // 获取多页 81 | async function getMultiplePage(start, end) { 82 | console.log(`${tag}: Getting, page:${start}->${end}`) 83 | const data = [] 84 | for (let page = end; page >= start; page--) { 85 | let list = await getOnePage(page) 86 | data.push(...list) 87 | } 88 | console.log(`${tag}: Got Total: ${data.length}`) 89 | return data 90 | } 91 | 92 | // 获取一页 93 | async function getOnePage(page) { 94 | const url = `http://tieba.baidu.com/i/i/my_tie?&pn=${page}` 95 | const response = await request(url) 96 | const data = await response.text() 97 | const $ = cheerio.load(data) 98 | const list = $('a.thread_title').map((index, el) => { 99 | const href = $(el).attr('href') 100 | let tid = href.match(/\/p\/([0-9]+)/) 101 | tid = tid && tid[1] || null 102 | let pid = href.match(/pid=([0-9]+)/) 103 | pid = pid && pid[1] || null 104 | 105 | return { tid, pid } 106 | }); 107 | return new Promise(resolve=>{ 108 | setTimeout(()=>{ 109 | console.log(`${tag}: Got, page:${page}, number:${list.length}`) 110 | resolve(list) 111 | },requestInterval) 112 | }) 113 | } 114 | 115 | module.exports.deletePosts = deleteMultiple -------------------------------------------------------------------------------- /src/deleteReply.js: -------------------------------------------------------------------------------- 1 | const cheerio = require('cheerio') 2 | const { request } = require('./request') 3 | const tag = 'REPLY' // 回复 4 | const { getTBS, parseReplyParams } = require('./utils') 5 | 6 | let requestInterval = 350 7 | let tbs = '' 8 | 9 | // 删除多个 10 | async function deleteMultiple(config) { 11 | 12 | let { start, end, interval } = config 13 | requestInterval = interval || 350 14 | if(!start || !end){ 15 | if(start){ 16 | end = start 17 | }else if(end){ 18 | start = end 19 | }else{ 20 | console.log(`${tag}: Please set start or end `) 21 | return false 22 | } 23 | }else if(start > end){ 24 | start = end 25 | } 26 | 27 | const list = await getMultiplePage(start,end) 28 | const len = list.length 29 | if (len === 0) { 30 | console.log(`${tag}: Finished`) 31 | return false 32 | } 33 | 34 | for (let index = len - 1; index >= 0; index--) { 35 | console.log(`${tag}: -----Start Deleting No.${index + 1}----------------------`) 36 | const status = await deleteOne(list[index]) 37 | if(status !== true && status && status.err_code == 220034){ 38 | console.log(`${tag}: >>> Delete Limit <<< , Please try again tomorrow!`) 39 | return false 40 | } 41 | } 42 | console.log(`${tag}: Finished`) 43 | } 44 | 45 | // 删除一个 46 | async function deleteOne(params) { 47 | tbs = await getTBS() 48 | if(!tbs){ 49 | console.log(`${tag}: 请重新登陆,并设置cookie! `) 50 | return false 51 | } 52 | 53 | const fd = new URLSearchParams() 54 | Object.keys(params).forEach(key => { 55 | fd.append(key, params[key]) 56 | }) 57 | fd.append('tbs',tbs) 58 | 59 | const url = 'https://tieba.baidu.com/f/commit/post/delete' 60 | const response = await request(url, { 61 | method: 'POST', 62 | body: fd 63 | }) 64 | const data = await response.json() 65 | 66 | return new Promise(resolve => { 67 | setTimeout(() => { 68 | if (data.err_code === 0) { 69 | console.log(`${tag}: Delete Successed!`) 70 | resolve(true) 71 | } else { 72 | console.log(`${tag}: Delete Error:`, JSON.stringify(data)) 73 | resolve(data) 74 | } 75 | }, requestInterval) 76 | }) 77 | } 78 | 79 | // 获取多页 80 | async function getMultiplePage(start, end) { 81 | console.log(`${tag}: Getting, page:${start}->${end}`) 82 | const data = [] 83 | for (let page = end; page >= start; page--) { 84 | let list = await getOnePage(page) 85 | data.push(...list) 86 | } 87 | console.log(`${tag}: Got Total: ${data.length}`) 88 | return data 89 | } 90 | 91 | // 获取一页评论 92 | async function getOnePage(page) { 93 | const url = `http://tieba.baidu.com/i/i/my_reply?&pn=${page}` 94 | const response = await request(url) 95 | const data = await response.text() 96 | const $ = cheerio.load(data) 97 | const list = $('a.b_reply').map((index, el) => { 98 | const href = $(el).attr('href') 99 | let tid = href.match(/\/p\/([0-9]+)/) 100 | tid = tid && tid[1] || null // 帖子id 101 | let pid = href.match(/pid=([0-9]+)/) 102 | pid = pid && pid[1] || null 103 | let cid = href.match(/cid=([0-9]+)/) 104 | cid = cid && cid[1] || null 105 | 106 | if (cid && cid != 0) { // cid != 0, 表示是楼中楼回复 107 | pid = cid 108 | } 109 | return { tid, pid } 110 | }); 111 | return new Promise(resolve=>{ 112 | setTimeout(()=>{ 113 | console.log(`${tag}: Got, page:${page}, number:${list.length}`) 114 | resolve(list) 115 | },requestInterval) 116 | }) 117 | } 118 | 119 | module.exports.deleteReplies = deleteMultiple 120 | --------------------------------------------------------------------------------