微信公众平台:前端批量下载语音并重命名文件
一、需求的产生
因为公众号需要根据用户发来的语音信息以用户为单位做一些统计,而暂时未接入自己的服务器,于是花了点时间想办法从前端解决重命名文件和批量下载的问题。
二、难点和解决方案
最先本人准备直接获取下载按钮,然后一个简单的循环click,就可以批量下载了,但是微信消息管理页面的下载文件的文件名是一个随机生成的消息id,并没有可读性,不能和用户关联,而前端又不能重命名服务器给出的文件。本想换用按键精灵实现,但突然看到对于音频文件,还有一个保存为素材按钮,而保存为素材按钮可以在前端传入文件名参数,于是解决方法出现。
注:所有脚本只需在chrome的console中到对应页面执行即可
脚本1:遍历dom节点,执行点击保存,输入文件名,选择类型等操作。
使用:对消息管理页面,每一页运行一次,就可以在素材管理的语音中找到对应文件,文件名为发消息者微信ID。
var start = new Date().getTime(); var len =$(".save_gray").length; var len3 = $(".remark_name").length; var userName = ''; var len2 =$('.jsTypeInput').length; var idx =0; var clickChecked = function(len2){ for (var j = len2-1; j >= 0; j--) { console.log(j+":j"); if ($($('.jsTypeInput')[j]).attr('data-value') == '20') { $($('.jsTypeInput')[j]).attr("checked",true); $(".js_btn").click(); $(".closed ").click() console.log("break closed"); break; }; }; } var clickBTN = function(idx){ for (var n = len3-1; n >= 0; n--) { console.log(n+":file"); console.log(idx); if ($($(".remark_name")[n]).attr("data-id")==idx) { userName = $($(".remark_name")[n]).html(); console.log(userName); $(".jsSaveInput").val(userName); len2 =$('.jsTypeInput').length; clickChecked(len2); console.log("break"); //break; }; }; }; for (var i = 0; i < len; i++) { idx =$($(".save_gray")[i]).attr('idx'); $(".save_gray")[i].click(); clickBTN(idx); $('.page_next').click() }; var end = new Date().getTime(); console.log(end-start);
脚本2:批量下载,因为打开下载窗口会卡,所以做了一点延迟处理。
使用:进入素材管理界面,每一页运行脚本,其中 setInterval("dlfn(20)",1500);的21,为下载的文件个数。因为下载一页有21个文件,这里填入21。
var m = 0; var dlfn = function(num){ if (m==num) { window.clearInterval(dl); console.log("ok:"+m); return; }; console.log("file:"+m); $(".download_gray")[m].click(); m++; console.log("num:"+num); } var dl =setInterval("dlfn(21)",1500);
脚本3:删除作为中转的素材文件(也可以不删除)
使用:进入素材管理界面,每一页运行脚本,其中var dele =setInterval("test(20)",1000);的21为每一页删除的个数。
//delete var i = 1; var test = function(num){ if (i==num) { window.clearInterval(dele); console.log("i:"+i); }; console.log("delete:"+i+",The Operations are an irrevocable"); i++; $(".del_gray")[0].click(); // setTimeout(dlfn(i),1000) $(".btn_primary")[1].click(); } var dele =setInterval("test(20)",1000);