2017-07-15 1 views
0

Je développe actuellement une extension chrome pour Gmail. Je souhaite déclencher certaines actions lorsque l'utilisateur ouvre un e-mail et expédie l'adresse e-mail de l'expéditeur à partir de là. Donc, l'idée que je suis venu avec est d'intercepter XMLHttpRequest.send via le prototype et si cette demande contient des données e-mail, puis déclencher mes événements à partir de là. Mais gmail n'envoie aucune demande de repos et obtient le corps de l'e-mail en utilisant the dark force. Je suis vraiment coincé dans la question comment googles obtient le corps de l'e-mail et d'autres données à la page. Je veux dire la seule façon dont les nouvelles données peuvent apparaître dans la page est via rest:Comment Gmail récupère les données dans la page

  • soumission de formulaire
  • XMLHttpRequest
  • de WebSockets

Tous ceux-ci peuvent être inspectés par dev-tools. J'ai donc créé un extrait qui ajoute un écouteur DOMSubtreeModified au top du document. Et à l'intérieur de l'écouteur, j'interroge le corps avec xpath pour les données d'email que j'ouvre.

E.g. Je veux trouver comment Gmail récupéré des données pour l'email A. Je sais que cet e-mail contient un texte spécifique comme random text r2d2. Donc, je vérifie juste dans mon auditeur si le document contient maintenant des nœuds avec innerText random text r2d2. Et après je viens de vérifier Network onglet pour la demande qui ont été envoyés entre le clic sur le bouton e-mail ouvert et l'apparition de nouveau texte dans la page. Here's the video to understand what I'm talking about.

function findEleWithText(text) { 
    let parent = document.body; 
    let results = []; 
    let query = document.evaluate("//*[contains(text()," + text + "')]", 
     parent || document, 
     null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
    for (let i=0, length=query.snapshotLength; i<length; ++i) { 
    results.push(query.snapshotItem(i)); 
    } 
    return results; 
} 
document.addEventListener('DOMSubtreeModified', e => { 
    var e2 = findEleWithText("2:09 p.m.", document.body) 
    if (e2.length > 0) { 
    console.log('e'); 
    } 
}) 

Mais voici la question, les données pour le courrier électronique apparaît dans la page mais Network onglet montre qu'aucune demande a été faite. Comment est-il même possible que les données voyagent dans la page? Je veux dire que même si la requête était faite à partir de iframe, elle serait affichée dans le Networks de toute façon. J'ai également vérifié si google ouvre un websocket (les données de ws ne sont pas montrées à Networks) - mais pas!

Des idées? Existe-t-il des moyens d'extraire des données sans REST?

Répondre

0

Il s'est avéré que Gmail préfixe les e-mails lors de l'affichage de la liste des e-mails. Lors de l'ouverture d'un e-mail, Gmail affiche simplement les données de la variable déjà récupérée.