使用 PHP 批量删除 新浪微博内容
新浪微博开放平台的删除 API 已经关闭了,目前来说没有其他的方式能有效地删除微博,微博网页版可通过 AJAX 请求删除,唯一的参数是 mid,我们可以理解为微博的唯一 ID,那么我们只要获取到了这个 ID,然后发起请求即可。
新浪微博的翻页是使用直接嵌套的 HTML 代码,里面包含了你看到的所有信息,那么我们可以模拟用户的操作,批量删除微博。
原理分析
首先构建一个 curl 方法,为了标识登录用户,我们要先设置 cookie:
function post($url, $post_data, $method = 'post', $location = 0, $reffer = null, $origin = null, $host = null){ $header = array( 'Host: weibo.com', 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0', 'Accept: */*', 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Accept-Encoding: gzip, deflate, br', 'Connection: keep-alive', 'Referer: https://weibo.com/p/1006061848719402/home?from=page_100606&mod=TAB&is_all=1', 'Cookie: SUB=_2A25Nei59DeRhGedG71oW8SfIyz6IHXVuDhi1rDV8PUNbmtANLWTxkW9NUTJhgRrUko8Y3kcSMy2qik69SLr5cWOz; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5hXoza0gdfeO6EFBAyGQ6P5JpX5KzhUgL.Fo2RShnNeK.Xehz2dJLoIpjLxK.L1KMLB--LxKnLB-qLBoBLxKMLB.BL1K2t; login_sid_t=d86405009f566cd57c8b433b74b96be8; cross_origin_proto=SSL; WBStorage=8daec78e6a891122|undefined; _s_tentry=passport.weibo.com; Apache=2936390402941.201.1618894353597; SINAGLOBAL=2936390402941.201.1618894353597; ULV=1618894353599:1:1:1:2936390402941.201.1618894353597:; wb_view_log=1920*10801; ALF=1650430381; SSOLoginState=1618894382; wb_view_log_1848719402=1920*10801; webim_unReadCount=%7B%22time%22%3A1618894400887%2C%22dm_pub_total%22%3A0%2C%22chat_group_client%22%3A0%2C%22chat_group_notice%22%3A0%2C%22allcountNum%22%3A0%2C%22msgbox%22%3A0%7D', 'X-Requested-With: XMLHttpRequest', ); $curl = curl_init(); // 这里并没有带参数初始化 curl_setopt($curl, CURLOPT_URL, $url); // 这里传入url curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查,不开启次功能 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检测 SSL 加密算法 curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_POST, $method == 'post'?true:false); // 开启 post curl_setopt($curl, CURLOPT_ENCODING, "gzip, deflate" ); curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); // 要传送的数据 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制,防止死循环 curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $tmpInfo = curl_exec($curl); return $tmpInfo; }
通过浏览器调试工具,我们可以查到翻页的 url 地址:
https://weibo.com/p/1006061848719402/home?pids=Pl_Official_MyProfileFeed__21&is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=2&ajaxpagelet=1&ajaxpagelet_v6=1&__ref=%2Fp%2F1006061848719402%2Fhome%3Ffrom%3Dpage_100606%26mod%3DTAB%26is_all%3D1%23place&_t=FM_161847052339555
其中的 page 参数就是页码,这个请求获取到的是一段 JS 代码,放到页面执行就能加载更多的微博内容,但是我们仅仅需要里面的 mid 参数。
可使用正则匹配到:
preg_match_all('/mid=\\\"(.+?)\\\"/', $res, $match);
同理删除的 url 为:
https://weibo.com/aj/mblog/del?ajwvr=6
参数是 mid,如果请求成功,就会得到:
{"code":"100000","msg":"","data":{}}
完整代码
到这里我们基本分析清楚了,完整代码如下:
include_once('curl_post.php'); while(1){ $url = "https://weibo.com/p/1006061848719402/home?pids=Pl_Official_MyProfileFeed__21&is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=2&ajaxpagelet=1&ajaxpagelet_v6=1&__ref=%2Fp%2F1006061848719402%2Fhome%3Ffrom%3Dpage_100606%26mod%3DTAB%26is_all%3D1%23place&_t=FM_161847052339555"; $res = post($url, null, 'get'); preg_match_all('/mid=\\\"(.+?)\\\"/', $res, $match); print_r($match[1]); foreach($match[1] as $key => $mid){ echo "start del ".$mid." ==============\r\n"; $res = post('https://weibo.com/aj/mblog/del?ajwvr=6', array('mid' => $mid)); echo $res."\r\n"; echo 'await 5s ================='."\r\n"; sleep(5); } if(count($match[1]) < 10) break; }
执行 php delWeibo.php,结果如下:
如果你嫌等待时间太长,可自行修改,建议不要调用的太频繁了。
这样调用能够批量删除微博,但是不够人性化,比如想保留点内容就不行了,推荐使用我开发的另一个软件:https://www.wenjiangs.com/weiboi-batch-delete,可手动选择一键删除,精准控制删除动作。
'PHP' 不是内部或外部命令,也不是可运行的程序或批处理文件。
将 PHP 的安装路径添加到环境变量,就可以在命令行中执行 PHP 文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论