批量删除新浪微博及自动发布微博
前言
最新有批量删除新浪微博的需求,于是在网上查相关代码并动手试了一下。除了实现批量删除微博功能之外,还尝试了自动发布微博,整个过程很有趣,学到了很多东西,于是记录下来。
注意:批量删除会全部删除微博,请慎重操作!
注意:批量删除会全部删除微博,请慎重操作!
注意:批量删除会全部删除微博,请慎重操作!
一、微博批量删除
删除部分代码参考了这篇文章:[详见](https://blog.csdn.net/qq_37537375/article/details/104242890) 通过在控制栏在控制栏输入代码,向指定接口发起请求,实现删除功能。下面是我对源代码加了自己的理解。//向删除接口发起请求,删除对应节点
function del_weibo(id){
console.log(id);
var postdata = "mid="+id;
fetch("https://www.weibo.com/aj/mblog/del?ajwvr=6",
{
"credentials":"include",
"headers":{
"content-type":"application/x-www-form-urlencoded",
},
"referrer":"https://www.weibo.com",
"body":postdata,
"method":"POST",
"mode":"cors"
}).then(response => console.log(response) )
.then(data => console.log(data))
.catch(error => console.log(error));
}
// 查找到所有微博节点并根据其name属性删除(name为唯一标识)
function del_page(){
var wb_list = document.querySelectorAll(".S_txt2");
if(wb_list.length == 0){
console.log("暂无可删除微博");
}
var i = 1;
for(var t of wb_list){
// 每条微博都有一个<a>标签,其name属性为唯一标识,删除需要用到
if(t.name){
setTimeout(function(t) {
// 发起删除请求,从数据库中删除该条微博
del_weibo(t.name);
// 从元素结构中删除该条微博,此处不加也可,只暂时影响页面效果,刷新即可全部删除
var pppp_node = t.parentNode.parentNode.parentNode.parentNode;
pppp_node.parentNode.removeChild(pppp_node);
}, 200*i,t);
i++;
}
}
}
//尝试自动刷新
function auto_update_page(){
// 到达页面的底部时,会出现class=".W_pages"的下一页按钮,点击加载下一页
var pages = document.querySelectorAll(".W_pages > a");
if(pages.length > 0){
var next_page = pages[pages.length-1];
console.log("下一页");//or上一页...
next_page.click();
}else{
//若当前也还没加载完,则跳转到底部触发加载
console.log(new Date().toLocaleTimeString() + ":加载中,请稍等");
window.scrollTo(0, 100000);
}
}
// 主函数
function del_all_weibo(){
del_page();
auto_update_page();
}
window.setInterval(del_all_weibo,4000);
二、微博自动发布
使用上面代码删除全部微博后,想看懂上面的代码,却没微博可删了。于是想着既然能代码删除,那是不是也可以代码发布了。于是通过在控制栏查看发布微博的请求,成功实现!1 代码
function publish(num){
num++;
// 请求需加上时间戳
var timevalue = new Date().getTime();
var url = "https://weibo.com/p/aj/v6/mblog/add?ajwvr=6&domain=100505&__rnd="+ timevalue;
var params = {
title: '有什么新鲜事想告诉大家? ',
location: 'page_100505_home',
text: '发布时间:'+ new Date(parseInt(timevalue)).toLocaleString(),
style_type: "1",
appkey : "",
pdetail: "yourID", //这里换成自己主页上16位的值 https://weibo.com/p/**yourID**/home
isReEdit: false,
rank: "1", // 1为仅自己可见,0为公开
pub_source: "page_2",
topic_id: "1022:",
pub_type: "dialog",
_t: "0"
};
var format_params = "";
for (var i in params) {
format_params = format_params + i + '=' + params[i] + '&';
}
format_params = format_params.slice(0, -1);
fetch(url,
{
"credentials":"include",
"headers":{
"content-type":"application/x-www-form-urlencoded",
},
"body": format_params,
"method":"POST","mode":"cors"
}).then(response => console.log('1', response) )
.then(data => console.log('2', data))
.catch(error => console.log(error));
// 15 为想要发布的微博条数
if(num < 15) {
console.log(num)
setTimeout(publish, 10000, num);
}
}
publish(0)
2.踩坑总结
在使用fetch发起POST请求时,请求体携带在'body'参数中,一开始使用JSON.stringify(params)转化参数,一直显示 302。后来才发现是content-type不同导致的。 Content-Type是Http报头中实体头的一个字段,代表发送端(客户端|服务器)发送的实体数据的数据类型/格式。常见的有以下4种:
- application/x-www-form-urlencoded。提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。是浏览器的原生 form 表单默认参数。
- application/json。 参数以JSON序列化字符串表示,支持比键值对复杂得多的结构化数据,并且参数结构清晰,易读性更高。
- multipart/form-data。使用表单上传文件时,必须让 form 的 enctyped 等于这个值。
- text/xml。类型为文本,格式为xml。
过程中尝试使用JSON.stringify(params) + application/json的组合方式,依然无效,应该是服务端只接受第一种格式的。
参考文章
https://blog.csdn.net/qq_37537375/article/details/104242890
https://segmentfault.com/a/1190000013056786