标题: 新浪微博批量拉黑/解除拉黑脚本(2) 创建: 2023-02-16 14:26 更新: 2023-08-08 09:46 链接: https://scz.617.cn/web/202302161426.txt -------------------------------------------------------------------------- 目录: ☆ 背景介绍 ☆ 获取自己的黑名单 ☆ 批量清理黑名单中已被杀档的UID ☆ 获取自己的关注列表 ☆ 获取指定微博的点赞列表 ☆ 获取指定评论的点赞列表 1) 获取UID列表 2) 批量移除对自己的关注 -------------------------------------------------------------------------- ☆ 背景介绍 PC端微博被强制新版,试了wvr6=0,没生效,TK说这种是某些账号被灰度了强制新版。 新版实现有BUG,页面失去响应多次,各种刷新小故障。产品经理为了刷存在感,强 改旧版,和市政拆了修、修了拆一样一样的。从如下入口访问PC版微博,清爽 https://m.weibo.cn/ 但该入口交互性很低,我经常移除别人对我的关注,用前述URL不合适。最近简单看 了看被强制使用的新版微博,做些笔记。 参看 《新浪微博批量拉黑/解除拉黑脚本》 https://scz.617.cn/web/202208141754.txt 本文是其后续。 ☆ 获取自己的黑名单 新版微博在此显示黑名单 https://weibo.com/set/shield?type=user https://weibo.com/ajax/setting/getFilteredUsers?page=1 查看前述第二个URL的返回数据,可知每页20个UID,每页最后都有个total字段,对 应当前黑名单总数,递增page将显示其他页。 如下脚本析取黑名单UID,每析取10个UID休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function GetBlackList ( group, interval ) { var http_0 = new XMLHttpRequest(); var http_1 = new XMLHttpRequest(); var pagenum = 1; var count = 0; var total = 0; var uidlist = []; while ( 1 ) { var url = 'https://weibo.com/ajax/setting/getFilteredUsers?page=' + pagenum; http_0.open( 'GET', url, false ); http_0.send( null ); if ( http_0.status === 200 ) { var resp = JSON.parse( http_0.responseText ); // console.log( resp ); var next = resp.next_cursor; // console.log( next ); for ( var c = 0; c < resp.card_group.length; c++ ) { // console.log( resp.card_group[c].scheme ); var temp = resp.card_group[c].scheme.match( /(?:uid=)(\d+)(?:)/g )[0]; // console.log( temp ); if ( temp ) { var uid = temp.match( /(?:uid=)(\d+)/ )[1]; // console.log( uid ); // uidlist.push( uid ); uidlist.unshift( uid ); count++; total++; if ( count % group === 0 ) { console.log( total ); await sleep( interval * 1000 ); count = 0; } } } if ( 0 == next ) { break; } pagenum++; } } console.log( uidlist ); } GetBlackList( 10, 1 ); -------------------------------------------------------------------------- /* * 这个版本同时取uid、nick */ function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function GetBlackList ( group, interval ) { var http_0 = new XMLHttpRequest(); var http_1 = new XMLHttpRequest(); var pagenum = 1; var count = 0; var total = 0; var uidlist = []; while ( 1 ) { var url = 'https://weibo.com/ajax/setting/getFilteredUsers?page=' + pagenum; http_0.open( 'GET', url, false ); http_0.send( null ); if ( http_0.status === 200 ) { var resp = JSON.parse( http_0.responseText ); // console.log( resp ); var next = resp.next_cursor; // console.log( next ); for ( var c = 0; c < resp.card_group.length; c++ ) { // console.log( resp.card_group[c].scheme ); /* * 《ChatGPT之JavaScript非捕获组》 * https://scz.617.cn/web/202302201525.txt */ var temp = Array.from( resp.card_group[c].scheme.matchAll( /(?:uid=)(\d+)(?:)/g ), m => m[1] ); if ( temp ) { var uid = temp[0]; var nick = resp.card_group[c].title_sub; var item = uid + ':' + nick; // console.log( uid ); // console.log( nick ); console.log( item ); // uidlist.push( item ); uidlist.unshift( item ); count++; total++; if ( count % group === 0 ) { console.log( total ); await sleep( interval * 1000 ); count = 0; } } } if ( 0 == next ) { break; } pagenum++; } } console.log( uidlist ); } GetBlackList( 10, 1 ); -------------------------------------------------------------------------- ☆ 批量清理黑名单中已被杀档的UID 新版微博的屏蔽名单里可以看到早些年系统帮你自动拉黑的那一类UID,还不少,主 要是什么多少钱加多少粉的那种卖粉UID,大部分已被系统杀档,但仍出现在屏蔽名 单中,不知占不占黑名单的配额,我猜是占的。心疼黑名单配额的,有洁癖的,可从 黑名单中删除这些卖粉UID。但量大时手工删这些UID可费劲了,因为每删一个就要弹 框告诉你该UID不存在,虽然也删掉了。程序员的话,得设法js批量删之。 如下脚本从闭区间[page_start,page_stop]析取UID,每解除拉黑10个UID休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } // // 闭区间[page_start,page_stop] // async function unblock_a ( group, interval, page_start, page_stop ) { var http_0 = new XMLHttpRequest(); var http_1 = new XMLHttpRequest(); var pagenum = page_start; var count = 0; while ( 1 ) { var url = 'https://weibo.com/ajax/setting/getFilteredUsers?page=' + pagenum; http_0.open( 'GET', url, false ); http_0.send( null ); if ( http_0.status === 200 ) { var resp = JSON.parse( http_0.responseText ); // console.log( resp ); for ( var c = 0; c < resp.card_group.length; c++ ) { // console.log( resp.card_group[c].scheme ); var temp = resp.card_group[c].scheme.match( /(?:uid=)(\d+)(?:)/g )[0]; // console.log( temp ); if ( temp ) { var uid = temp.match( /(?:uid=)(\d+)/ )[1]; // console.log( uid ); var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); http_1.open( 'POST', 'https://weibo.com/aj/f/delblack?ajwvr=6', false ); http_1.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http_1.send( 'uid=' + uid + '&objectid=&f=1&__rnd' + rnd ); count++; if ( count % group === 0 ) { console.log( uid ); await sleep( interval * 1000 ); count = 0; } } } if ( pagenum > page_stop ) { break; } pagenum++; } } } // // https://weibo.com/ajax/setting/getFilteredUsers?page=6 // https://weibo.com/ajax/setting/getFilteredUsers?page=8 // unblock_a( 10, 1, 6, 8 ); -------------------------------------------------------------------------- 如下脚本从pagenum析取UID,从start开始解除拉黑,每解除拉黑10个UID休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function unblock_b ( group, interval, pagenum, start ) { var http_0 = new XMLHttpRequest(); var http_1 = new XMLHttpRequest(); var count = 0; var url = 'https://weibo.com/ajax/setting/getFilteredUsers?page=' + pagenum; http_0.open( 'GET', url, false ); http_0.send( null ); if ( http_0.status === 200 ) { var resp = JSON.parse( http_0.responseText ); // console.log( resp ); for ( var c = start; c < resp.card_group.length; c++ ) { // console.log( resp.card_group[c].scheme ); var temp = resp.card_group[c].scheme.match( /(?:uid=)(\d+)(?:)/g )[0]; // console.log( temp ); if ( temp ) { var uid = temp.match( /(?:uid=)(\d+)/ )[1]; // console.log( uid ); var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); http_1.open( 'POST', 'https://weibo.com/aj/f/delblack?ajwvr=6', false ); http_1.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http_1.send( 'uid=' + uid + '&objectid=&f=1&__rnd' + rnd ); count++; if ( count % group === 0 ) { console.log( uid ); await sleep( interval * 1000 ); count = 0; } } } } } // // https://weibo.com/ajax/setting/getFilteredUsers?page=5 // unblock_b( 10, 1, 5, 10 ); -------------------------------------------------------------------------- 我现在的黑名单中全是手工显式拉黑的,不再包含系统帮我拉黑的UID。unblock_a、 unblock_b可以优化合并,无此刚需,仅为演示。 ☆ 获取自己的关注列表 新版微博在此查看自己的关注列表,每页50个UID,脚本留成作业吧 https://weibo.com/ajax/profile/followContent?sortType=all https://weibo.com/ajax/profile/followContent?page=2 https://weibo.com/ajax/profile/followContent?page=3 ☆ 获取指定微博的点赞列表 以此为例 https://weibo.com/1273725432/MtywWBgs2 用F12抓到上述微博的点赞列表 https://weibo.com/ajax/statuses/likeShow?id=4870442508881378&attitude_type=0&attitude_enable=1&page=1 每页最多20个UID,递增page显示其他页。有时系统会吃掉一些UID,比如上例,响应 内容指明total_number等于21,但实际只能取到12个UID,剩下9个不知为何消失了, 原因不明。UID(5927891460)就此有个反馈,微博在2019年5月30日15:00启用新的赞 计数规则,每条微博外显的赞数是对微博本身及其评论的赞数总和。参看 《评论赞相关问题》 https://kefu.weibo.com/faqdetail?id=21674 用F12抓点赞、取消点赞,看到 curl 'https://weibo.com/ajax/statuses/setLike' \ --data-raw '{"id":"4870442508881378"}' curl 'https://weibo.com/ajax/statuses/cancelLike' \ --data-raw '{"id":"4870442508881378"}' 4870442508881378可以唯一标定前述微博,可以写js获取它的点赞列表。 ☆ 获取指定评论的点赞列表 1) 获取UID列表 以此为例 https://weibo.com/1273725432/MtywWBgs2 下方有一条我自己的评论,有2个点赞,用F12抓点赞、取消点赞 curl 'https://weibo.com/ajax/statuses/updateLike' \ --data-raw '{"object_id":"4870442782033445","object_type":"comment"}' curl 'https://weibo.com/ajax/statuses/destroyLike' \ --data-raw '{"object_id":"4870442782033445","object_type":"comment"}' 对于新版微博,没有GUI操作获取指定评论的点赞列表,UID(5036455239)说接口未变, 于是可以盲套旧版微博的接口 https://weibo.com/aj/like/object/big?ajwvr=6&page=1&object_id=4870442782033445&object_type=comment 虽然Request未变,但Response有变,需要修改脚本中的正则匹配。如下脚本获取指 定评论的点赞列表,输出的第一项就是第一个点赞的UID -------------------------------------------------------------------------- var cid = 4870442782033445; var http = new XMLHttpRequest(); var uidlist = []; var pagenum = 1; while ( 1 ) { var url = 'https://weibo.com/aj/like/object/big?ajwvr=6&page=' + pagenum + '&object_id=' + cid + '&object_type=comment'; http.open( 'GET', url, false ); http.send( null ); if ( http.status === 200 ) { var resp = JSON.parse( http.responseText ); var temp = resp.data.html.match( /(?:li uid=\")(\d+)(?:\")/g ); if ( temp ) { for ( var i = 0; i < temp.length; i++ ) { uidlist.unshift( temp[i].match( /\d+/ )[0] ); } } if ( resp.data.page.pagenum == resp.data.page.totalpage ) { break; } } pagenum++; } console.log( uidlist ); -------------------------------------------------------------------------- 2) 批量移除对自己的关注 如下脚本批量移除某条评论的所有点赞UID,每移除10个UID休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function remove ( cid, group, interval ) { var http_0 = new XMLHttpRequest(); var http_1 = new XMLHttpRequest(); var pagenum = 1; var count = 0; while ( 1 ) { var url = 'https://weibo.com/aj/like/object/big?ajwvr=6&page=' + pagenum + '&object_id=' + cid + '&object_type=comment'; http_0.open( 'GET', url, false ); http_0.send( null ); if ( http_0.status === 200 ) { var resp = JSON.parse( http_0.responseText ); var temp = resp.data.html.match( /(?:li uid=\")(\d+)(?:\")/g ); if ( temp ) { for ( var i = 0; i < temp.length; i++ ) { var uid = temp[i].match( /\d+/i )[0] console.log( uid ); var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); http_1.open( 'POST', 'https://weibo.com/aj/f/remove?ajwvr=6', false ); http_1.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http_1.send( 'uid=' + uid + '&f=1&__rnd' + rnd ); count++; if ( count % group === 0 ) { console.log( uid ); await sleep( interval * 1000 ); count = 0; } } } if ( resp.data.page.pagenum == resp.data.page.totalpage ) { break; } } pagenum++; } } remove( 4870492319911222, 10, 1 ); --------------------------------------------------------------------------