Durante la ricerca WhatsApp web per un progetto di cui parleremo presto, abbiamo accidentalmente scoperto che WhatsApp ha un contrassegno per una funzionalità nascosta, che consente agli utenti di modificare la velocità di riproduzione dei messaggi vocali.
Comportamento interrotto
Uno dei nostri strumenti di ricerca ci consente di modificare la velocità di riproduzione dei messaggi vocali. Ogni messaggio vocale è essenzialmente un audio
tag con un blob di una sorgente audio.
document.querySelectorAll('audio').forEach(e => {
e.playbackRate = 2;
});
Questo frammento cambierebbe la velocità di tutti i messaggi vocali di WhatsApp a velocità 2x.
Eseguirlo oggi non ha fatto nulla. Nessun errore nella console o effetti collaterali cablati, i messaggi venivano riprodotti a una velocità normale.
Reverse Engineering
Siamo piuttosto fluidi nel reverse engineering sito web ed Applicazioni mobili, e avevamo già esaminato il codice sorgente web minificato di WhatsApp, quindi avevamo una buona idea di dove cercare.
Non ci è voluto molto per trovare queste righe di codice:
...
initialize() {
i.default.prototype.initialize.call(this),
this.playbackRate = (0,
s.getPttPlaybackRate)(),
this.listenTo(this, "change:playbackRate", ((e,t)=>{
(0,
s.setPttPlaybackRate)(t)
}
))
}
...
Queste righe aggiungono un ascoltatore per change:playbackRate
, che viene attivato ogni volta che cambia la velocità di riproduzione di un tag audio. Quindi chiama setPttPlaybackRate
, che sovrascrive la velocità di riproduzione su un valore precalcolato. Ciò impediva al nostro strumento di impostare la velocità di riproduzione.
Perché WhatsApp dovrebbe farlo? E con quale valore stavano scavalcando?
setPttPlaybackRate
utilizza un Enum per determinare quale valore di velocità di riproduzione impostare:
...
t.pttPlaybackSpeed = function(e) {
switch (e) {
case 1:
return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_1;
case 1.5:
return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_1_5;
case 2:
return v.default.PTT_PLAYBACK_SPEED_TYPE.SPEED_2;
default:
throw new Error("Invalid playback rate: ".concat(e))
}
}(this.props.pttPrefs.playbackRate),
...
Quindi WhatsApp ha tre velocità predeterminate tra cui scegliere. Ciò ha sollevato i nostri sospetti che stesse succedendo qualcos'altro qui - forse una nuova funzionalità? Ci siamo messi a scoprire cosa stava succedendo.
Prima un contesto di fondo. Alcune parti di WhatsApp Web, e in particolare quelle che effettuano la riproduzione audio, utilizzano una "semplice" app React. Utilizza una build Webpack non così lontana dallo standard.
Analizzando i componenti che compongono i tag audio, abbiamo trovato questo:
...
if (m.default.pttPlaybackSpeedEnabled && "ptt" === i) {
P = b === r.toString();
var A = (0,
s.default)(o.default.playbackRateButtonContainer, {
[o.default.playbackRateButtonContainerVisible]: P
});
...
Utilizzando Chrome DevTools, abbiamo impostato un punto di interruzione su quella riga di codice e ispezionato il valore di m.default.pttPlaybackSpeedEnabled
:
Interessante! Cosa accadrebbe se impostiamo questo flag su true
? Siamo passati rapidamente alla console, mentre l'esecuzione era ancora interrotta dal punto di interruzione, e abbiamo eseguito:
m.default.pttPlaybackSpeedEnabled = true
E magicamente, tutti i nostri messaggi vocali avevano un nuovo indicatore della velocità di riproduzione. In un tema scuro, assomiglia a questo:
Vuoi saperne di più?
Un incontro di consulenza gratuito incluso.