תכונה נסתרת של Whatsup

מצאנו תכונת WhatsApp שפורסמה מראש

תוך כדי מחקר WhatsApp אינטרנט עבור פרויקט שנכתוב עליו בקרוב, גילינו בטעות שלוואטסאפ יש סימון תכונה עבור תכונה נסתרת – כזו שמאפשרת למשתמשים לשנות את קצב ההשמעה של הודעות קוליות.

התנהגות שבורה

אחד מכלי המחקר שלנו מאפשר לנו לשנות את קצב ההשמעה של הודעות קוליות. כל הודעה קולית היא בעצם audio תג עם כתם של מקור שמע.

document.querySelectorAll('audio').forEach(e => {
  e.playbackRate = 2;
});

קטע זה ישנה את המהירות של כל ההודעות הקוליות של WhatsApp למהירות פי 2.

להפעיל אותו היום לא עשה כלום. אין שגיאות בקונסולה או תופעות לוואי קוויות, ההודעות התנגנו במהירות רגילה.

הנדסה הפוכה

אנחנו די נזילים בהנדסה לאחור אינטרנט ו אפליקציות ניידות, וכבר בדקנו את קוד המקור הממוזער ברשת WhatsApp, אז היה לנו מושג טוב איפה לחפש.

לא לקח הרבה זמן למצוא את שורות הקוד הבאות:

...
initialize() {
  i.default.prototype.initialize.call(this),
    this.playbackRate = (0,
      s.getPttPlaybackRate)(),
    this.listenTo(this, "change:playbackRate", ((e,t)=>{
        (0,
          s.setPttPlaybackRate)(t)
      }
    ))
}
...

שורות אלו מוסיפות מאזין עבור change:playbackRate, המופעל בכל פעם שקצב ההשמעה של תג אודיו משתנה. ואז זה מתקשר setPttPlaybackRate, אשר עוקף את קצב ההשמעה לערך מחושב מראש. זה משבית את הכלי שלנו מלהגדיר את קצב ההשמעה.

למה שוואטסאפ יעשה את זה? ואיזה ערך הם התגברו?

setPttPlaybackRate משתמש ב-Enum כדי לקבוע איזה ערך מהירות השמעה להגדיר:

...
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),
...

אז לוואטסאפ יש שלוש מהירויות מוגדרות מראש לבחירה. זה העלה את החשד שלנו שמשהו אחר קורה כאן - תכונה חדשה אולי? קבענו לברר מה קורה.

קצת הקשר רקע קודם. חלקים בודדים של האינטרנט של WhatsApp, ובמיוחד אלה שמבצעים השמעת אודיו, משתמשים באפליקציית React "פשוטה". הוא משתמש בבניית Webpack לא כל כך רחוקה מהסטנדרטית.

כשעבדנו על הרכיבים המרכיבים את תגי האודיו, מצאנו את זה:

...
if (m.default.pttPlaybackSpeedEnabled && "ptt" === i) {
  P = b === r.toString();
  var A = (0,
    s.default)(o.default.playbackRateButtonContainer, {
    [o.default.playbackRateButtonContainerVisible]: P
  });

...

באמצעות Chrome DevTools, הגדרנו נקודת עצירה בשורת הקוד הזו ובדקנו את הערך של m.default.pttPlaybackSpeedEnabled:

הסתכלות דינמית על הערך של דגל התכונה

מעניין! מה יקרה אם נציב את הדגל הזה true? קפצנו במהירות לקונסולה, בעוד הביצוע עדיין נעצר על ידי נקודת השבירה, והרצנו:

m.default.pttPlaybackSpeedEnabled = true

ובאופן קסם, לכל ההודעות הקוליות שלנו היה מחוון קצב השמעה חדש. בנושא אפל, זה נראה כך:

התוצאה הסופית
עבור לתוכן