使用 PHP 批量删除 新浪微博内容

发布于 2021-04-20 13:15:46 字数 4900 浏览 1282 评论 0

新浪微博开放平台的删除 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84960 人气
更多

推荐作者

1CH1MKgiKxn9p

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

JackDx

文章 0 评论 0

信远

文章 0 评论 0

yaoduoduo1995

文章 0 评论 0

霞映澄塘

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文