IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Conception Web Discussion :

Reproduire le "ctrl+s" dans un navigateur(Chrome, Mozilla,etc.), en programmation.


Sujet :

Conception Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut Reproduire le "ctrl+s" dans un navigateur(Chrome, Mozilla,etc.), en programmation.
    Bonjour,

    J'essaye actuellement de résoudre un problème concernant l'analyse du code HTML d'une page web.
    En effet, afin de tester mon programme, j'ai effectué des scans sur des pages contenant beaucoup d'informations et d'import de ressources (css, js, etc.).
    Utilisant la librairie HtmlUnit, je suis confronté à beaucoup d'erreurs lors du scan. J'en convient donc qu'il faut que je traite le problème différemment.

    J'ai trouvé finalement un moyen pour résoudre mon problème : j'enregistre la page (en faisant un "ctrl + s" dans mon navigateur). Ceci me permet d'avoir le code de la page web complet (c'est à dire avec le contenu intégré par de potentiels fichiers javascript).
    Dès lors, il ne s'agit plus que de faire un scan du code HTML statique. En utilisant Jsoup, j'obtiens donc mon résultat.

    Le soucis maintenant est de rendre l'enregistrement "automatique". C'est à dire trouver un moyen de reproduire le "ctrl + s" du navigateur afin d'avoir la page sous sa forme statique finale.

    Merci d'avance pour vos éventuelles propositions !
    J.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Billets dans le blog
    1
    Par défaut Et tu obligé de passer par JS?
    Salut, je me demande s'il ne serait pas préférable de passer par un langage côté serveur ce qui pourra se faire en background sans avoir besoin de simuler l'enregistrer via ton navigateur.

    En php il y a la function get_file_contents('url_de_la_page',..) qui te permet de copier toute la partie html de la page que tu pourra ensuite enregistrer dans ton serveur directement ou ...

    Sinon je trouve un peu casse gueule de passer par un navigateur pour un enregistrement de ta page, je te conseil juste d'utiliser la version js je garantie rien de get_file_contents et utiliser les sessions storages pour engeristrer ta page est ses resources (js, css, ...) voilà un exemple qui demande qu'a être améliorer.

    Merci au contributeur php_js

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
     
    function file_get_contents(url, flags, context, offset, maxLen) {
     
     
      var tmp, headers = [],
        newTmp = [],
        k = 0,
        i = 0,
        href = '',
        pathPos = -1,
        flagNames = 0,
        content = null,
        http_stream = false;
      var func = function(value) {
        return value.substring(1) !== '';
      };
     
      // BEGIN REDUNDANT
      this.php_js = this.php_js || {};
      this.php_js.ini = this.php_js.ini || {};
      // END REDUNDANT
      var ini = this.php_js.ini;
      context = context || this.php_js.default_streams_context || null;
     
      if (!flags) {
        flags = 0;
      }
      var OPTS = {
        FILE_USE_INCLUDE_PATH: 1,
        FILE_TEXT: 32,
        FILE_BINARY: 64
      };
      if (typeof flags === 'number') { 
        // Allow for a single string or an array of string flags
        flagNames = flags;
      } else {
        flags = [].concat(flags);
        for (i = 0; i < flags.length; i++) {
          if (OPTS[flags[i]]) {
            flagNames = flagNames | OPTS[flags[i]];
          }
        }
      }
     
      if (flagNames & OPTS.FILE_BINARY && (flagNames & OPTS.FILE_TEXT)) { 
        // These flags shouldn't be together
        throw 'You cannot pass both FILE_BINARY and FILE_TEXT to file_get_contents()';
      }
     
      if ((flagNames & OPTS.FILE_USE_INCLUDE_PATH) && ini.include_path && ini.include_path.local_value) {
        var slash = ini.include_path.local_value.indexOf('/') !== -1 ? '/' : '\\';
        url = ini.include_path.local_value + slash + url;
      } else if (!/^(https?|file):/.test(url)) { 
        // Allow references within or below the same directory (should fix to allow other relative references or root reference; could make dependent on parse_url())
        href = this.window.location.href;
        pathPos = url.indexOf('/') === 0 ? href.indexOf('/', 8) - 1 : href.lastIndexOf('/');
        url = href.slice(0, pathPos + 1) + url;
      }
     
      var http_options;
      if (context) {
        http_options = context.stream_options && context.stream_options.http;
        http_stream = !! http_options;
      }
     
      if (!context || http_stream) {
        var req = this.window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
        if (!req) {
          throw new Error('XMLHttpRequest not supported');
        }
     
        var method = http_stream ? http_options.method : 'GET';
        var async = !! (context && context.stream_params && context.stream_params['phpjs.async']);
     
        if (ini['phpjs.ajaxBypassCache'] && ini['phpjs.ajaxBypassCache'].local_value) {
          url += (url.match(/\?/) == null ? '?' : '&') + (new Date())
            .getTime(); // Give optional means of forcing bypass of cache
        }
     
        req.open(method, url, async);
        if (async) {
          var notification = context.stream_params.notification;
          if (typeof notification === 'function') {
            // Fix: make work with req.addEventListener if available: https://developer.mozilla.org/En/Using_XMLHttpRequest
            if (0 && req.addEventListener) { // Unimplemented so don't allow to get here
              /*
              req.addEventListener('progress', updateProgress, false);
              req.addEventListener('load', transferComplete, false);
              req.addEventListener('error', transferFailed, false);
              req.addEventListener('abort', transferCanceled, false);
              */
            } else {
              req.onreadystatechange = function(aEvt) { 
                // aEvt has stopPropagation(), preventDefault(); see https://developer.mozilla.org/en/NsIDOMEvent
                // Other XMLHttpRequest properties: multipart, responseXML, status, statusText, upload, withCredentials
                /*
      PHP Constants:
      STREAM_NOTIFY_RESOLVE   1       A remote address required for this stream has been resolved, or the resolution failed. See severity  for an indication of which happened.
      STREAM_NOTIFY_CONNECT   2     A connection with an external resource has been established.
      STREAM_NOTIFY_AUTH_REQUIRED 3     Additional authorization is required to access the specified resource. Typical issued with severity level of STREAM_NOTIFY_SEVERITY_ERR.
      STREAM_NOTIFY_MIME_TYPE_IS  4     The mime-type of resource has been identified, refer to message for a description of the discovered type.
      STREAM_NOTIFY_FILE_SIZE_IS  5     The size of the resource has been discovered.
      STREAM_NOTIFY_REDIRECTED    6     The external resource has redirected the stream to an alternate location. Refer to message .
      STREAM_NOTIFY_PROGRESS  7     Indicates current progress of the stream transfer in bytes_transferred and possibly bytes_max as well.
      STREAM_NOTIFY_COMPLETED 8     There is no more data available on the stream.
      STREAM_NOTIFY_FAILURE   9     A generic error occurred on the stream, consult message and message_code for details.
      STREAM_NOTIFY_AUTH_RESULT   10     Authorization has been completed (with or without success).
     
      STREAM_NOTIFY_SEVERITY_INFO 0     Normal, non-error related, notification.
      STREAM_NOTIFY_SEVERITY_WARN 1     Non critical error condition. Processing may continue.
      STREAM_NOTIFY_SEVERITY_ERR  2     A critical error occurred. Processing cannot continue.
      */
                var objContext = {
                  responseText: req.responseText,
                  responseXML: req.responseXML,
                  status: req.status,
                  statusText: req.statusText,
                  readyState: req.readyState,
                  evt: aEvt
                }; // properties are not available in PHP, but offered on notification via 'this' for convenience
                // notification args: notification_code, severity, message, message_code, bytes_transferred, bytes_max (all int's except string 'message')
                // Need to add message, etc.
                var bytes_transferred;
                switch (req.readyState) {
                  case 0:
                    //     UNINITIALIZED     open() has not been called yet.
                    notification.call(objContext, 0, 0, '', 0, 0, 0);
                    break;
                  case 1:
                    //     LOADING     send() has not been called yet.
                    notification.call(objContext, 0, 0, '', 0, 0, 0);
                    break;
                  case 2:
                    //     LOADED     send() has been called, and headers and status are available.
                    notification.call(objContext, 0, 0, '', 0, 0, 0);
                    break;
                  case 3:
                    //     INTERACTIVE     Downloading; responseText holds partial data.
                    bytes_transferred = req.responseText.length * 2; // One character is two bytes
                    notification.call(objContext, 7, 0, '', 0, bytes_transferred, 0);
                    break;
                  case 4:
                    //     COMPLETED     The operation is complete.
                    if (req.status >= 200 && req.status < 400) {
                      bytes_transferred = req.responseText.length * 2; // One character is two bytes
                      notification.call(objContext, 8, 0, '', req.status, bytes_transferred, 0);
                    } else if (req.status === 403) { // Fix: These two are finished except for message
                      notification.call(objContext, 10, 2, '', req.status, 0, 0);
                    } else { // Errors
                      notification.call(objContext, 9, 2, '', req.status, 0, 0);
                    }
                    break;
                  default:
                    throw 'Unrecognized ready state for file_get_contents()';
                }
              };
            }
          }
        }
     
        if (http_stream) {
          var sendHeaders = http_options.header && http_options.header.split(/\r?\n/);
          var userAgentSent = false;
          for (i = 0; i < sendHeaders.length; i++) {
            var sendHeader = sendHeaders[i];
            var breakPos = sendHeader.search(/:\s*/);
            var sendHeaderName = sendHeader.substring(0, breakPos);
            req.setRequestHeader(sendHeaderName, sendHeader.substring(breakPos + 1));
            if (sendHeaderName === 'User-Agent') {
              userAgentSent = true;
            }
          }
          if (!userAgentSent) {
            var user_agent = http_options.user_agent || (ini.user_agent && ini.user_agent.local_value);
            if (user_agent) {
              req.setRequestHeader('User-Agent', user_agent);
            }
          }
          content = http_options.content || null;
          /*
          // Presently unimplemented HTTP context options
          var request_fulluri = http_options.request_fulluri || false; // When set to TRUE, the entire URI will be used when constructing the request. (i.e. GET http://www.example.com/path/to/file.html HTTP/1.0). While this is a non-standard request format, some proxy servers require it.
          var max_redirects = http_options.max_redirects || 20; // The max number of redirects to follow. Value 1 or less means that no redirects are followed.
          var protocol_version = http_options.protocol_version || 1.0; // HTTP protocol version
          var timeout = http_options.timeout || (ini.default_socket_timeout && ini.default_socket_timeout.local_value); // Read timeout in seconds, specified by a float
          var ignore_errors = http_options.ignore_errors || false; // Fetch the content even on failure status codes.
          */
        }
     
        if (flagNames & OPTS.FILE_TEXT) { // Overrides how encoding is treated (regardless of what is returned from the server)
          var content_type = 'text/html';
          if (http_options && http_options['phpjs.override']) { // Fix: Could allow for non-HTTP as well
            content_type = http_options['phpjs.override']; // We use this, e.g., in gettext-related functions if character set
            //   overridden earlier by bind_textdomain_codeset()
          } else {
            var encoding = (ini['unicode.stream_encoding'] && ini['unicode.stream_encoding'].local_value) ||
              'UTF-8';
            if (http_options && http_options.header && (/^content-type:/im)
              .test(http_options.header)) { // We'll assume a content-type expects its own specified encoding if present
              content_type = http_options.header.match(/^content-type:\s*(.*)$/im)[1]; // We let any header encoding stand
            }
            if (!(/;\s*charset=/)
              .test(content_type)) { // If no encoding
              content_type += '; charset=' + encoding;
            }
          }
          req.overrideMimeType(content_type);
        }
        // Default is FILE_BINARY, but for binary, we apparently deviate from PHP in requiring the flag, since many if not
        //     most people will also want a way to have it be auto-converted into native JavaScript text instead
        else if (flagNames & OPTS.FILE_BINARY) { // Trick at https://developer.mozilla.org/En/Using_XMLHttpRequest to get binary
          req.overrideMimeType('text/plain; charset=x-user-defined');
          // Getting an individual byte then requires:
          // responseText.charCodeAt(x) & 0xFF; // throw away high-order byte (f7) where x is 0 to responseText.length-1 (see notes in our substr())
        }
     
        try {
          if (http_options && http_options['phpjs.sendAsBinary']) { // For content sent in a POST or PUT request (use with file_put_contents()?)
            req.sendAsBinary(content); // In Firefox, only available FF3+
          } else {
            req.send(content);
          }
        } catch (e) {
          // catches exception reported in issue #66
          return false;
        }
     
        tmp = req.getAllResponseHeaders();
        if (tmp) {
          tmp = tmp.split('\n');
          for (k = 0; k < tmp.length; k++) {
            if (func(tmp[k])) {
              newTmp.push(tmp[k]);
            }
          }
          tmp = newTmp;
          for (i = 0; i < tmp.length; i++) {
            headers[i] = tmp[i];
          }
          // see http://php.net/manual/en/reserved.variables.httpresponseheader.php
          this.$http_response_header = headers; 
        }
     
        if (offset || maxLen) {
          if (maxLen) {
            return req.responseText.substr(offset || 0, maxLen);
          }
          return req.responseText.substr(offset);
        }
        return req.responseText;
      }
      return false;
    };
     
    var a=0, name, html;
    var links = document.querySelectorAll('script,link,a');
    console.log(links)
    for(i in links){
      if((links[i].src !== undefined) || (links[i].href !== undefined)){
        a = (links[i].src !== undefined) ? links[i].src : links[i].href;
        name = a.split("/")[a.split("/").length-1];
        html = file_get_contents(a)
        sessionStorage.name = html;
        console.log("OUTPUT HTML : ############" + name + "################")
        console.log(file_get_contents(a));
        console.log("SAVE HTML SESSION : #########" + name + "#############");
        console.log(sessionStorage.name);
      }
       // console.log((links[i].src !== undefined) ? links[i].src : a)
       // console.log((links[i].href !== undefined) ? links[i].href : a);
    }
    Donc il enregistre tes différentes ressources (la page en cours si tu a mit un nom "index.html"..), les différents sources src et href des balise script a link rajoute d'autre si besion... bref ici l'avantage est qu'il écrase si un nom de ressources existe déjà. A améliorer gl.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Bonjour Headmax !
    Merci pour ta proposition.

    J'ai peur que le traitement via php soit fastidieux et long, c'est la raison pour laquelle je n'avais pas vraiment penser à l'utiliser. Néanmoins, je vais tout de même jeter un oeil à ce bout de code!
    Merci à toi.

    Sinon, j'ai finalement réussi à faire ce que je voulais en utilisant un "headless browser" ainsi qu'un programme java développer par mes propres soins.

    Bye!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 24
    Dernier message: 19/05/2010, 16h35
  2. Réponses: 50
    Dernier message: 03/02/2010, 09h50
  3. Variable avec quotes(simple ou double)dans un input
    Par -Neo- dans le forum Langage
    Réponses: 1
    Dernier message: 25/06/2007, 12h23
  4. Réponses: 15
    Dernier message: 21/02/2007, 18h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo