如何使用 JavaScript 快速批量删除所有 Google Voice 消息?
答案1
在浏览器的 JavaScript 控制台中运行此命令:
// Code to be run at Legacy Google Voice
// Run at: https://www.google.com/voice/b/0#history
// https://www.google.com/voice/b/0#spam
// https://www.google.com/voice/b/0#trash
function sleep(ms) { // courtesy: https://stackoverflow.com/a/39914235/1429450
return new Promise(resolve => setTimeout(resolve, ms));
}
async function deleteMessages() {
do {
// Get message IDs.
var msgs = document.getElementsByClassName("gc-message"),
msgids = [];
itemcount = msgs.length;
for (var i = 0; i < itemcount; ++i) {
msgids.push(msgs[i].id);
};
// Construct form. courtesy: https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects#Creating_a_FormData_object_from_scratch
try {
var formData = new FormData();
for (var i in msgids) {
formData.append("messages", msgids[i]);
}
formData.append("_rnr_se", _gcData["_rnr_se"]);
var request = new XMLHttpRequest();
request.open("POST", "https://www.google.com/voice/b/0/inbox/deleteForeverMessages/");
request.send(formData);
} catch (a) {
return;
}
await sleep(1000);
try {
document.getElementById("gc-inbox-next").click();
} catch (b) {
try {
document.getElementById("gc-inbox-prev").click();
} catch (c) {
continue;
}
}
await sleep(1000);
} while (itemcount != 0);
}
deleteMessages();
答案2
编辑:它循环进行,但不会删除..
仅在 GV 的“旧版”版本上测试过此功能。单击“使用旧版”。其 URL 以“https://www.google.com/voice',而不是“voice.google.com”。
要删除除最近 x 天之外的所有内容,请单击底部的“下一页”,URL 将更改为在末尾添加“inbox/p1”。更改数字,直到找到包含要保留的最后消息的页面;我 6 个月前使用过。
@Geremia 的代码很棒,但有一个拼写错误,因此请删除第二个“await sleep”上方的 }。同时删除“try {document.getElementById("gc-inbox-prev").click();} catch (c) {”,这会删除历史记录中直到当前时刻为止的内容。
现在按 Ctrl+Shift+i 或右键单击并单击“检查源”。单击 JS 控制台的“源”选项卡,然后单击“页面和文件系统”旁边的 >> 箭头,然后单击“代码片段”。粘贴函数代码并按 Ctrl+Enter 运行。按源下的暂停图标也可以停止无限循环。此外,您必须手动终止它,方法是按“源”下的“暂停”,或按 Ctrl+Esc 并结束进程。
我开始玩这个代码,但在输入变量以查看它是否能工作时,得到了一个“未定义”,而不删除所有内容“var msgs = document.getElementsByClassName("gc-message")”。根据这个答案,我猜它通常会这样做,因为它没有返回值(https://stackoverflow.com/questions/24342748/why-does-console-log-say-undefined-and-then-the-correct-value)。我到了需要暂停 while 循环的地方,然后回到 Geremias 代码。然后意识到它会按照我的要求做,只需要进行少量的手动页面操作。但这里有代码可以自动浏览每一页,直到正确的日期开始删除。Geremias 代码的工作原理是删除整页消息,然后重新加载,所以如果有人想为其他人完成它,我的代码可以找到起点。或者你可以手动完成。
var dateLast = new Date(document.getElementsByClassName('gc-message-time')[0].innerText)
var dateNow = new Date()
var dateCutoff = new Date(dateNow - 30*24*60*60*1000)
while (dateLast > dateCutoff) {
document.getElementById('gc-inbox-next').click();
var dateLast = new Date(document.getElementsByClassName('gc-message-time')[0].innerText)
await sleep(1000)
}
还有这个相关问题:https://webapps.stackexchange.com/questions/55378/how-do-i-delete-text-messages-from-google-voice/
var msgs = document.getElementsByClassName("gc-message"), msgids = []; msgids
msgids.push(msgs[0].id)
var formData = new FormData()
formData.append("messages", msgids[0])
formData.append("_rnr_se", _gcData["_rnr_se"])
for (var pair of formData.entries()) {
console.log(pair[0]+ ', ' + pair[1]);
}
var request = new XMLHttpRequest();
request.open("POST", "https://www.google.com/voice/b/0/inbox/deleteForeverMessages/");
request.send(formData);
returns:.. POST https://www.google.com/voice/b/0/inbox/deleteForeverMessages/ 500
500 是内部服务器错误。我将尝试不同的方法。
答案3
尝试另一种方法https://voice.google.com/u/1/voicemail?itemId=c.LONG_STRING并使用 WrapAPI。获取长字符串 ID 后,我认为您可以将其用作 POST 数据标头中的唯一内容,以便:https://content.googleapis.com/voice/v1/voiceclient/thread/delete
获取 ID 并不容易。我尝试过document.querySelector("#messaging-view > div > md-content > div > gv-conversation-list > md-virtual-repeat-container > div > div.md-virtual-repeat-offsetter > div:nth-child(2) > div")
手动选择它,并且这个对象出现了,$0.$gvCtrlRef
但我无法data-thread-id
从中得到任何结果,除非innerHTML
我必须解析它data-thread-id=
。
我认为在花了一天多的时间处理这个问题之后,删除我的整个帐户并在另一个帐户上声明我的号码会更容易。
使用 Selenium 可能可行,但我无法登录,因为 Google 说 Chromedriver 不安全。我尝试了以下几种解决方案:https://stackoverflow.com/a/61219342/4240654,没有成功。新帐户似乎没有那么多问题,如下所述(https://stackoverflow.com/questions/59380356/how-to-handle-browser-or-app-may-not-be-secure-issue-with-web-driver-selenium-py)。
作为参考,以下是相关的 Google 支持主题:
如何批量删除 Google Voice 中的通话/消息 https://support.google.com/voice/forum/AAAAjq5-_rM4iYc83j4mRo?hl=en
我想删除我的整个谷歌语音历史记录。但又不想把它扔进垃圾箱 https://support.google.com/voice/thread/6331069?hl=en
如何删除多个电话或短信? http://support.google.com/voice/thread/26118990?hl=en
答案4
应该能够使用键盘快捷键编写脚本。 #
删除当前消息,但会出现确认对话框。 <Tab><Tab>
选择删除按钮,<Enter>
删除该消息并前进到下一条。