标题: 新浪微博批量拉黑/解除拉黑脚本 创建: 2022-08-14 17:54 更新: 2023-02-19 16:30 链接: https://scz.617.cn/web/202208141754.txt 先说清楚,此法不适合非程序员,根据自身情况酌情继续阅读。 之前在一个假群里假狗2号(没记错的话)提供了一个Chrome插件及教学视频,对某条 评论的所有点赞uid进行批量拉黑。我基本上没这个需求,所发微博阅读量极小,也 不怎么发引战话题,所以一直未测前述插件。 近日TK提到一个类似插件,不知与我说的是不是同一个,他批量误拉黑了一千多人。 为了某种程度地回滚,他提供了一个批量解除拉黑的法子,参看 https://weibo.com/1401527553/M115vv3F7 在微博评论页F12,切至Network标签页。点击某条评论的"回复",有个请求形如 https://weibo.com/aj/comment/privacy?ajwvr=6&ouid=...&cid=4802692784066365&nick=... 从中获取"cid=4802692784066365",该值只是示例,不要出现将示例私钥抄进代码的 笑话啊。查看Network标签页时,可在Filter中选中"Fetch/XHR"。 在控制台执行如下脚本获取给该条评论点赞的用户列表 -------------------------------------------------------------------------- var cid = 4802692784066365; 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 ); /* * What does ?: do in regex - [2010-09-14] * https://stackoverflow.com/questions/3705842/what-does-do-in-regex * * 脚本中的"?:"好像未达预期目的 */ var temp = resp.data.html.match( /(?:uid=\")(\d+)(?:\")/g ); // console.log( temp ); if ( temp ) { for ( var i = 0; i < temp.length; i++ ) { /* * uidlist.push( temp[i].match( /\d{10}/i )[0] ); * * g表示全局匹配,i表示忽略大小写 */ uidlist.unshift( temp[i].match( /\d+/ )[0] ); } } if ( resp.data.page.pagenum == resp.data.page.totalpage ) { break; } } pagenum++; } console.log( uidlist ); -------------------------------------------------------------------------- GUI中第一个点赞的在最右侧,最后一个点赞的在最左侧,我将push换成unshift,输 出列表中第一个元素就是第一个点赞的uid。这没啥必要,只是个人喜好。 将uidlist复制到如下脚本,在account.weibo.com页面的控制台对uidlist解除拉黑, 如下示例假设uidlist只含有一个uid。 -------------------------------------------------------------------------- var uidlist = ['5878659096']; var http = new XMLHttpRequest(); for ( var i = 0; i < uidlist.length; i++ ) { var uid = uidlist[i]; var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); var url = 'https://account.weibo.com/set/aj5/filter/delfeeduser'; http.open( 'POST', url, false ); http.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http.send( 'uid=' + uid + '&_t=0&__rnd' + rnd ); if ( http.status === 200 ) { var resp = JSON.parse( http.responseText ); if ( resp.code != 100000 ) { console.error( '失败: ' + uid ); } } } -------------------------------------------------------------------------- 我用"超话社区"进行拉黑、解除拉黑测试 https://weibo.com/u/5878659096 上面是TK提供的法子,适用于我。就此需求而言,不太喜欢全自动插件,这是一种非 正常人类研究中心后遗症,而前述两个脚本简单易懂,心里有数。 下面来点狗尾续貂。有很多URL可用于解除拉黑,用F12看了另一种解除拉黑的操作。 去目标主页,手动解除拉黑,同时看Network标签页中的日志,选中"Preserve log", 否则页面刷新时之前的日志会被清空。在此看到一个 -------------------------------------------------------------------------- curl 'https://weibo.com/aj/f/delblack?ajwvr=6' \ ... -H 'x-requested-with: XMLHttpRequest' \ --data-raw 'uid=5878659096&objectid=&f=1&extra=&...' -------------------------------------------------------------------------- 我不会WEB前端编程,简单套用TK的示例,切至weibo.com页面,测试解除拉黑脚本 -------------------------------------------------------------------------- var uidlist = ['5878659096']; var http = new XMLHttpRequest(); for ( var i = 0; i < uidlist.length; i++ ) { var uid = uidlist[i]; var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); var url = 'https://weibo.com/aj/f/delblack?ajwvr=6'; http.open( 'POST', url, false ); http.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http.send( 'uid=' + uid + '&objectid=&f=1&__rnd' + rnd ); if ( http.status === 200 ) { var resp = JSON.parse( http.responseText ); if ( resp.code != 100000 ) { console.error( '失败: ' + uid ); } } } -------------------------------------------------------------------------- 同理,去目标主页,手动拉黑,看到 -------------------------------------------------------------------------- curl 'https://weibo.com/aj/filter/block?ajwvr=6' \ ... -H 'x-requested-with: XMLHttpRequest' \ --data-raw 'uid=5878659096&filter_type=1&status=1&interact=1&follow=1' -------------------------------------------------------------------------- 切至weibo.com页面,测试拉黑脚本 -------------------------------------------------------------------------- var uidlist = ['5878659096']; var http = new XMLHttpRequest(); for ( var i = 0; i < uidlist.length; i++ ) { var uid = uidlist[i]; var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); var url = 'https://weibo.com/aj/filter/block?ajwvr=6'; http.open( 'POST', url, false ); http.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http.send( 'uid=' + uid + '&filter_type=1&status=1&interact=1&follow=1&__rnd' + rnd ); if ( http.status === 200 ) { var resp = JSON.parse( http.responseText ); if ( resp.code != 100000 ) { console.error( '失败: ' + uid ); } } } -------------------------------------------------------------------------- 将uidlist扩展成多个uid,就是批量拉黑操作。 把获取uidlist的脚本与批量拉黑的脚本合一起,每拉黑10个uid休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function block ( 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( /(?: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/filter/block?ajwvr=6', false ) http_1.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ) http_1.send( 'uid=' + uid + '&filter_type=1&status=1&interact=1&follow=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++; } } block( 4802692784066365, 10, 1 ); -------------------------------------------------------------------------- 把获取uidlist的脚本与批量解除拉黑的脚本合一起,每解除拉黑10个uid休眠1秒 -------------------------------------------------------------------------- function sleep ( ms ) { return new Promise( resolve => setTimeout( resolve, ms ) ); } async function unblock ( 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( /(?: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/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 ( resp.data.page.pagenum == resp.data.page.totalpage ) { break; } } pagenum++; } } unblock( 4802692784066365, 10, 1 ); -------------------------------------------------------------------------- 是不是得随机延时啥的啊,别被渣浪给那啥了。 用法是去找"目标评论",停在那个页面时F12呼出Console,copy/paste脚本,记得改 cid值。block/unblock并不对称,解除拉黑后除非有意识地重新关注,否则找不到来 时的路。 本文展示了一名不会WEB前端编程的老年C/ASM程序员如何照猫画虎胡整的过程,很可 能存在大量低级错误,贻笑大方。 2022-08-15 19:50 scz 特别感谢如下134个uid,对cid=4802692784066365的评论"静等被拉黑"进行了测试性 点赞,用自己实践了"试试就逝世"的伟大信念,非常感谢你们,我爱你们。 "2862790901","6299284202","3013106632","6823975771","1578682090","1928070271", "3260461905","5359923437","1668330500","7432902670","2367005972","7721586322", "5902564829","5515200606","1915960807","1656900765","5975293259","3888688852", "3081922935","1926822403","1990463350","5605258137","1737398655","1222900173", "6732007395","5384732020","5034270943","2465991392","1923822961","6136649601", "6210610218","1865758477","6096879960","1401478137","7630592330","5630747919", "1874001013","2011618092","1516788117","2154114494","6299329349","2767028513", "5812821033","1949598237","7244669038","1864052740","3176203334","1495115843", "3272283243","7408425829","2628112923","2786318091","5031521746","2343889597", "5886427019","7370514459","6512423445","6294688217","1408687195","3831142517", "1758731061","3919776447","6077702777","1652713357","1762568450","1875577765", "3786354031","5982457152","7430718823","2391856431","5386752174","2005777661", "6511336167","7257322225","3686662853","7362348164","5756614044","3219056421", "1915334297","2106361354","2320707601","7592343338","2633835427","1697676190", "3169698175","7763389308","1757314025","2327147702","1962130783","5638008266", "5368783384","3921140792","5857374573","1370952234","6096812570","1454226082", "3246017765","6652704790","1401399733","5738409982","3055160200","3101848757", "3194670380","1767501411","2362520072","2574005327","5816265033","7758366816", "5823040177","6273740577","2480861967","6085851717","1661113433","7733395360", "2053480544","6442225270","2622682681","1294312341","7524104768","6524256025", "5745970299","1752905482","5684968545","6356474295","5255042032","1796204072", "1677490383","6609297913","5856042200","6295118923","1850558691","3527764957", "7771560957","2142909410" 有人问怎么看自己的uid。在PC上绝大多数情况直接就能看到,鼠标hover过去,URL 中有个/u/后面的数字,那就是uid。若启用了个性域名,随便hover一条TA发的微博, URL中同样有uid。但是,若TA启用了个性域名,又未发过任何微博,hover是行不通 的。通用办法,F12,inspect TA,有usercard="id=...",即uid。普通人不需要知 道这个,有特殊需求者才需要知道。 测试已结束,我回原测试主贴,对每一位有效参与测试者的留言进行了逐条点赞,因 为也没有别的办法可有效致谢,只能如此了。另有一些朋友,从留言判断TA们是计划 参与测试的,但可能不太理解测试上下文,未被脚本取到uid,未被拉黑,在此一并 感谢。 对了,我已将测试结束前脚本取到的134个uid列入TXT备忘。万一将来有天本想拉黑 谁,但在这张uidlist中发现有TA,会想起TA头铁的岁月而假装没看见新近的内容。 我是个很念香火情的老家伙。 2022-08-16 08:59 scz 看到一个类似的批量拉黑脚本 https://github.com/overtrue/weibo-dogs-killer https://github.com/overtrue/weibo-dogs-killer/blob/master/weibo-dogs-killer.js 该脚本演示了另一种定时执行的办法,以及异步方式调用XMLHttpRequest对象的open 方法,TK则是同步方式调用open。open第三形参决定异步、同步。 下列脚本采集"微博社区志愿者(微博监督员)官方微博"的粉丝列表 https://weibo.com/p/1006066264005608/follow?relate=fans&wvr=6 https://github.com/LyZane/weibo-supervisor-jsCrawler https://github.com/LyZane/weibo-supervisor-jsCrawler/blob/master/main.js 上述脚本已不适用于当前新浪微博,修改脚本简单获取目标用户粉丝列表前5页数据 -------------------------------------------------------------------------- function crawl ( pagemax, interval ) { /* * 1 */ if ( 1 != document.querySelector( ".page.S_bg1" ).innerText ) { console.error( "请先手动跳转到粉丝列表的第一页后再执行此脚本!" ); return; } var uidlist = []; var page = 1; var timer = setInterval ( function () { if ( page != document.querySelector( ".page.S_bg1" ).innerText ) { return; } console.log( "第" + page + "页采集中..." ); var list = document.querySelectorAll( "li.follow_item.S_line2" ); // console.log( list ) for ( var i = 0; i < list.length; i++ ) { var item = list[i].childNodes[1].childNodes[3].childNodes[1].childNodes[1]; var usercard = item.attributes["usercard"].value; // usercard.match( /(?:id=)(\d+)/ )[0].match( /\d+/ )[0]; var uid = usercard.match( /(?:id=)(\d+)/ )[1]; // console.log( uid ) uidlist.push( uid ); } console.log( "第" + page + "页采集完毕" ); page++; if ( page <= pagemax ) { document.querySelector( ".page.next" ).click(); } else { clearInterval( timer ); console.info( uidlist ); } }, interval * 1000 ); } /* * 服务端有限制,最多5页。每1秒采集1页数据。 */ crawl( 5, 1 ); -------------------------------------------------------------------------- TA们是想批量拉黑微博监督员,我则是临时试一下js编程。我是良民,所以上述脚本 没有针对性过滤,也没有合并拉黑操作。 不会js编程,为了改出上述脚本,临时搜了一篇 document.querySelector()方法 - [2018-03-22] https://blog.csdn.net/huangbaokang/article/details/79659246 2022-08-16 15:59 tk 如下脚本获取给某条微博(不是评论)点赞的最新200个uid -------------------------------------------------------------------------- /* * https://weibo.com/1909377960/M1aPZCtuR?type=like * * F12看到 * * https://weibo.com/aj/v6/like/likelist?ajwvr=6&mid=4802799919169853&issingle=1&type=0&_t=0&__rnd=1660637649336 * https://weibo.com/aj/v6/like/likelist?ajwvr=6&mid=4802799919169853&type=0&page=2&issingle=1&max_id=4803120310518797&_t=0&__rnd=1660637604469 */ var mid = 4802799919169853; /* * 0 常规点赞 * 1 竖大拇指 * 2 微笑 * 3 悲伤 * 4 惊讶 * 5 愤怒 */ var type = 0; var url = 'https://weibo.com/aj/v6/like/likelist?ajwvr=6&mid=' + mid + '&issingle=1&type=' + type + '&_t=0'; var http = new XMLHttpRequest(); var uidlist = []; while ( 1 ) { var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); url = url + '&__rnd' + rnd http.open( 'GET', url, false ); http.send( null ); if ( http.status != 200 ) { break; } var resp = JSON.parse( http.responseText ); var temp = resp.data.html.match( /\"id=\d{10}\"/g ); // console.log( temp ) if ( !temp ) { break; } for ( var i = 0; i < temp.length; i++ ) { uidlist.push( temp[i].match( /\d{10}/i )[0] ); } console.log( uidlist.length + '\n' ); temp = resp.data.html.match( /mid=\d+\&type=\d+\&page=\d+\&issingle=\d+\&max_id=\d+/ ); if ( !temp ) { break; } url = 'https://weibo.com/aj/v6/like/likelist?ajwvr=6&' + temp[0] + '&_t=0'; } console.log( uidlist ); -------------------------------------------------------------------------- 2022-08-25 08:19 scz 前面说的是拉黑,有时到不了那一步,只想送走,移除某些uid对自己的关注。用F12 观察一次实际移除关注操作,看到 -------------------------------------------------------------------------- curl 'https://weibo.com/aj/f/remove?ajwvr=6' \ ... -H 'x-requested-with: XMLHttpRequest' \ --data-raw 'uid=7160973228&f=1' -------------------------------------------------------------------------- 切至weibo.com页面,测试移除关注脚本 -------------------------------------------------------------------------- var uidlist = ['7160973228']; var http = new XMLHttpRequest(); for ( var i = 0; i < uidlist.length; i++ ) { var uid = uidlist[i]; var rnd = Math.floor( Math.random() * 1e4 + 1.5788995e12 ); var url = 'https://weibo.com/aj/f/remove?ajwvr=6'; http.open( 'POST', url, false ); http.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' ); http.send( 'uid=' + uid + '&f=1&__rnd' + rnd ); if ( http.status === 200 ) { var resp = JSON.parse( http.responseText ); if ( resp.code != 100000 ) { console.error( '失败: ' + uid ); } } } -------------------------------------------------------------------------- 对某条评论的所有点赞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( /(?: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( 4802692784066365, 10, 1 ); -------------------------------------------------------------------------- 批量拉黑有134位网友友情参与了实际测试,批量移除未经大规模实测,仅为PoC。 2022-08-31 13:16 看到"删除评论并拉黑"的官方说明 《删除评论并拉黑功能升级说明及相关问题》 https://kefu.weibo.com/faqdetail?id=20973 2023-02-16 14:26 参看 《新浪微博批量拉黑/解除拉黑脚本(2)》 https://scz.617.cn/web/202302161426.txt