Или как @Jack не дал мне кнопку «Удалить все твиты»

Поэтому я сделал свою собственную кнопку вроде ..

Нет особого удовольствия от простого нажатия кнопки деактивировать, учитывая махинации, которые веб-приложения проделывают с вашими личными данными — это было похоже на обеспечение безопасности.

Когда вы, наконец, будете готовы термоядерно со своей учетной записью, вы можете сначала сжечь все дотла — и, если вам повезет быть субъектом данных, добавьте Ст. 17 GDPR.

Сказать, что ситуация вышла из-под контроля, не сказать ничего

Тем более, что сегодня все, от куратора вашего пуделя до вашего бакалейщика и вашего телевидения, являются хранителями данных, лихорадочно собирающими все, что могут.

Например, вы уже встречали селфи-камеру в вашем местном продуктовом магазине, они утверждают, что это просто зеркало и больше ни для чего не используется?

Иногда просто весело сжигать свои следы, несмотря на то, насколько бессмысленным это упражнение может быть, а может и не быть.

Варианты

Для твиттера, когда я решил поджечь свои твиты

Использовать интерфейс прикладного программирования Twitter (API)

Это очень легко сделать, например, с помощью некоторых сценариев Python с использованием Twitter API, и я настоятельно рекомендую это сделать.

Вы также можете запустить python в веб-браузере, но….

Скрипт в браузере, запускающий массовое удаление данных через пользовательский интерфейс

… мы хотим легко удалять данные из любого веб-приложения, что затрудняет работу с API или без него

Однако в образовательных целях, особенно для приложений, у которых нет общедоступных API, я хотел показать это, используя только браузер, такой как Chrome / Firefox, с простым JavaScript — без каких-либо дополнительных ухищрений.

Это обучение можно использовать для любого веб-приложения, которое предоставляет функцию удаления по одному, но не «удалить все» или «удалить многие», как они должны.

Вы можете положить скрипт в консоль браузера/greasemonkey/trapmonkey или даже легко создать из него расширение для браузера, которое даст вам и всем остальным настоящую кнопку :)

Сделайте то, что сделал uBlock Origin для блокировки трекеров/рекламы

Я хочу увидеть сходство происхождения uBlock здесь, где мы управляли репозиториями, чтобы обмениваться «шаблонами удаления» или другими «шаблонами автоматизации» между приложениями, например, даже для получения данных, которые в противном случае потребовали бы неустойчивого количества кликибунти.

Зарегистрируйтесь у какого-нибудь случайного поставщика услуг "мы удалим ваши твиты" или

Было несколько сценариев браузера, но все они:

  • Работало только на древней версии твиттера
  • Полагались на жестко закодированные динамически сгенерированные / запутанные идентификаторы классов CSS.
  • Хрупкая цепочка выполнения One-by-One с бессмысленной рекурсией
  • Не удалил ответы на твиты (теперь темы)

Поэтому я быстро и грязно начал взламывать самостоятельно

Таким образом, этот маршрут «хакерского взлома» может быть применен к любому веб-приложению, которое расстраивает нас этими неуклюжими сложными интерфейсами «удаления один за другим», независимо от того, предоставляют ли они API или нет.

Звучит круто… верно? Что ж, давайте посмотрим, насколько сложным это делает Твиттер.

Чтобы удалить все твиты, Twitter хочет, чтобы вы нажимали x3 для каждого

Сначала нажмите кнопку "Еще". Ведь это не так важно, верно?

Во-вторых вы можете подумать, что все готово, когда вы, наконец, нажмете Удалить?

Третий твиттер действительно хочет знать, что вы действительно уверены, что хотите?

Значит, мы просто выберем некоторые элементы и правильно все сделаем?

Используя эти динамически сгенерированные/обфусцированные идентификаторы классов CSS?

Я имею в виду те, которые выплевывает интерфейс Twitter React?

Это вряд ли сработает один раз, и это не сработает долго, так как мало кто уже узнал довольно много раз, если вы посмотрите вокруг сути.

Поэтому я углубился в Объектную модель предметной области (DOM).

И нашел ARIA: кнопку (W3C), на которую я могу просто отправить событие клик

При наведении на него правильный элемент также выделяется

И написал небольшой фрагмент, чтобы просто отправлять эти клики в массовом порядке

Используя querySelectorAll, мы можем использовать Селектор атрибутов CSS на aria-label.

Еще один способ — использовать XPath, но я оставлю это упражнение вам :)

Но проблема в том, что мы по-прежнему запускаем это «Еще» практически везде

psst: data-testid[“caret”] видит тот же yes ;)

Я мог бы просто вложить другой селектор под каждым data-testid=tweet, но это все равно вызывает меню из ретвитов и любых цитируемых твитов в ответных твитах, написанных другими.

Давайте просто удалим мои собственные ответы/твиты?

Поэтому вместо этого я написал пару подпрограмм помощи для фильтрации того, где твит был написан моей учетной записью — где дочерний элемент имеет ссылку href на вашу / учетную запись, указывающую, кто написал твит.

С другой стороны, теперь у нас есть огромный скрипт, который мы могли бы реорганизовать..

О, подождите, нам все еще нужно нажать кнопку «Удалить».

Мы находим интерактивный элемент span, но проблема в том, что нам нужно сопоставить внутренний HTML, а не атрибут.

Мы можем просто использовать XPath text() или просто innerHTML

Таким образом, вместо того, чтобы проверять, не существует ли дочерний элемент с данным селектором CSS, как мы делали с querySelectorHas, мы можем сделать querySelectorInner, который соответствует вложенным узлам, содержащим определенный innerHTML.

Все это можно написать короче, но в учебных целях так лучше.

Наконец, вам нужно вызвать модальные окна, чтобы подтвердить удаление.

А потом самое простое

Теперь, изучив вышеизложенное, если мы хотим удалить лайки / ретвиты, это очень просто, так как нет меню / просмотров тем, с которыми нужно иметь дело.

Нам также нужно добавить прокрутку

window.scrollTo(0, document.body.scrollHeight)

Проблема с многопоточным представлением в твиттере заключается в том, что когда вы удаляете свои твиты/ответы в самой ветке, она не исчезает, когда у вас не осталось ни одного твита в представлении.

Чтобы справиться с отложенной загрузкой...

Кроме того, поскольку твиттер загружает твиты динамически при прокрутке вниз, нам нужно добавить прокрутку, в идеале срабатывающую, когда ничего не было удалено (вы можете считать из массива по кликам), и соответствующим образом настроить интервальный таймер сна.

Если вы хотите работать лучше, вы можете просто реализовать DOM Mutation Observer, чтобы увидеть добавленные узлы.

Отложенный загрузчик не всегда подходит для всего

Ленивый загрузчик также часто используется в загрузчиках изображений, и часто эти загрузчики реализованы шатко, поэтому вы видите много заиканий и часто с бесконечной прокруткой, когда он не меняет URL-адрес, что портит навигацию.

Познакомьтесь с бесконечной прокруткой, нарушающей навигацию

Или даже перезагрузить, когда вы, очевидно, прокручиваете чьи-то твиты за 10 лет, а затем браузер решает отказаться от этой вкладки, забивая память (iOS была первой, кто сделал это, поскольку устройствам Apple катастрофически не хватало оперативной памяти, и замена на их припаянном SSD слишком сильно изнашивала бы ее)

Плюс для непрерывной прокрутки

Вы можете просто обернуть все в setInterval, например. каждые 3 секунды

setInterval(() => {
}, 3000)

Если поставить все удаления/сделать все остальное и потом прокручивать окно вы каждые три секунды удаляете все что есть на экране.

Условия гонки

Иногда вам нужно будет вручную прокручивать вверх, так как будут условия гонки, когда, например, в твиттере еще нет отложенных загруженных элементов (для которых вы можете использовать DOM Mutation Observer, если вам это небезразлично) среди прочего.

Может быть, кроме наблюдателя, вы можете прокрутить вверх при обнаружении конца, но я оставляю этот орех для вас;)

Следите за ограничениями!

Я не врезался в стену — или какие-либо ограничения пользовательского интерфейса, поскольку я делал это постепенно, но я знаю, что у твиттера есть ограничения скорости API отдельно на серверной части за пределами внешнего интерфейса / пользовательского интерфейса, которые могут или не могут быть неактуальны. .

Просто имейте в виду, что твиттер может подумать, что вы бот :)

Или приложения говорят, что использование Content Distribution Network (CDN) может иметь какое-то постоянно развивающееся волшебство, если вы делаете это в масштабе.

Таким образом, важно установить соответствующие значения для задержки повторного запуска setInterval(), чтобы превзойти эти алгоритмы, наблюдающие за тем, как вы записываете свои собственные данные.

Другие забавные ошибки Твиттера или, скажем… функции

Твиттер, похоже, затенил неретвиты и непохожие данные за ‹ 2015 год, и кажется, что это нельзя удалить даже через API.

Я подозреваю, что они выполнили некоторую миграцию данных и каким-то образом сделали все эти перенесенные данные неизменяемыми или они находятся в каком-то ссылочном архиве, доступном только для чтения.

Данные не всегда легко масштабировать

Все, что я знаю, как Twitter infra постепенно мигрировала с Ruby + Rails на Node/JVM/Scala в своей серверной части и как неудивительно, что у них были проблемы с ростом с MySQL и добавление слоев/шардинга, чтобы попытаться преодолеть это, пока в В апреле 2014 года они сделали эту Манхэттенскую вещь, которая, кажется, совпадает с временами, которые я вижу.. совпадение или нет, кто знает? Правило Гибба №39

Когда я удалил все свои твиты до этого момента, устаревшие данные также исчезли из представления, но как только я добавил твит, все вернулось.

Мне также не нравится тот факт, что все комментарии / ответы к вам остаются там, и нет никакого способа контролировать это — по сравнению, скажем, с Reddit, когда вы удаляете свой дескриптор, он присоединяется к армии [удалено], и нельзя искать удаленные ручки.

Джек, поправляйся... пожалуйста.