Как массово удалить историю Google Voice?

Как использовать JavaScript для быстрого массового удаления всех моих сообщений Google Voice?

4 ответа

Запустите это в консоли 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();

РЕДАКТИРОВАТЬ: он проходит, но не удаляет..

Испытал это только на "устаревшей" версии 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 и завершив процесс.

Я начал играть с этим кодом, но получил "undefined" при вводе переменной, чтобы посмотреть, как это будет работать, без удаления всего "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 - это внутренняя ошибка сервера. Я попробую другой подход..

Пробуем другой подход на https://voice.google.com/u/1/voicemail?itemId=c.LONG_STRING и используя WrapAPI. Как только вы получите длинный идентификатор строки, я думаю, вы можете использовать его как единственный контент в заголовке данных для POST: https://content.googleapis.com/voice/v1/voiceclient/thread/delete

Получить идентификаторы непросто. Я пытался 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

Я хочу удалить всю свою историю голоса Google. не отправляя его в корзину https://support.google.com/voice/thread/6331069?hl=en

Как удалить несколько телефонных звонков или текстовых сообщений? http://support.google.com/voice/thread/26118990?hl=en

Должен быть в состоянии написать это с помощью сочетаний клавиш.#удаляет текущее сообщение, но появляется диалоговое окно подтверждения.<Tab><Tab>выбирает кнопку удаления и<Enter>удаляет сообщение и переходит к следующему.

Другие вопросы по тегам