Форма входа в систему Guzzle 6 получает xml

#php #guzzle

#php #guzzle

Вопрос:

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

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

идея в том, что мне нужна загрузка по ссылке, например https://www.website.com/create-report.php?type=locationamp;format=xmlamp;start=1618928524amp;end=1618932124amp;module=6F25A5ED98

с выводом, подобным этому

 
    <?xml version="1.0" encoding="UTF-8"?>
    <reports><module><moduleInfo><generatedBy>author</generatedBy><dateGenerated>20-04-2021 16:41:01 CEST</dateGenerated><datesCovered>20-04-2021 15:34:53 CEST tot 20-04-2021 16:34:53 CEST</datesCovered><gatewayName>200-026 XASI</gatewayName><gatewayUSBID>13025867C090F4C</gatewayUSBID><moduleName>200-026 XASI</moduleName><moduleUSBID>6FFDFSDSSA5ED98</moduleUSBID></moduleInfo><row tijdstempel="20-04-2021 15:42:38 CEST" breedtegraad="52.9832530" lengtegraad="6.5652120"/><row tijdstempel="20-04-2021 15:52:38 CEST" breedtegraad="52.9832730" lengtegraad="6.5652380"/><row tijdstempel="20-04-2021 16:02:38 CEST" breedtegraad="52.9832380" lengtegraad="6.5652620"/><row tijdstempel="20-04-2021 16:12:38 CEST" breedtegraad="52.9832630" lengtegraad="6.5652150"/><row tijdstempel="20-04-2021 16:22:38 CEST" breedtegraad="52.9832620" lengtegraad="6.5652420"/><row tijdstempel="20-04-2021 16:32:38 CEST" breedtegraad="52.9832680" lengtegraad="6.5652550"/></module></reports>

 
 
    require 'vendor/autoload.php';
    use GuzzleHttpClient;
    use GuzzleHttpHandlerMockHandler;
    use GuzzleHttpHandlerStack;
    use GuzzleHttpPsr7Response;
    use GuzzleHttpPsr7Request;
    use GuzzleHttpExceptionRequestException;
    use PsrHttpMessageResponseInterface;
    use GuzzleHttpPsr7;
    use GuzzleHttpPsr7Stream;$path = '/httpdocs/power';
    
    $username = 'username';
    $password = 'mypass';
    //$filename = 'order.xml';
    
    $client = new Client();
    $credentials = base64_encode('username:mypass');
    $response = $client->get('https://www.website.com',
            [
                'headers' => [
                    'Authorization' => 'Basic ' . $credentials,
                ],
            ]);
    $response->getStatusCode();
    
    $response2 = $response->getBody();
    print $response2;

 

я получаю в качестве тела форму входа в качестве выходных данных.
я уже пробовал этот код

 
    //Inlog form posten https://docs.guzzlephp.org/en/stable/quickstart.html#uploading-data
    /*
    $response = $client->request('POST', 'https://www.website.com/', [
        'form_params' => [
            'username' => 'user',
            'password' => 'pass'
    ]
    ]);
    */

 

форма входа выглядит следующим образом

 
    <form id="systemForm" method="post" action="/login.php" >
    <div class="clearboth"></div>
    <div class="contentitem">
    <div class="login">
    <div class="row">
       <div class="column">
          <h2>Account Log In</h2>
       </div>
       <div class="column">
          <h2>Register an Account</h2>
       </div>
    </div>
    <div class="row">
    <div class="column">
    <div class="boxArea">
    <div class="widgets_form">
    <script type="text/javascript">
       $.Modules.Form.forms['login'] = new $.Modules.Form({
        formTag: document.getElementById('systemForm'),
        messages: document.getElementById('login[messages]'),
        formID: 'login',
        importField: document.getElementById('login[_formImportFile]'),
        importSubmit: document.getElementById('login[_formImport]')
       });
    </script>
    <table cellpadding="0" cellspacing="5" class="form">
    <tbody>
       <tr>
          <td class="fieldname" style="height:1px; width: 150px"></td>
          <td></td>
       </tr>
       <tr class="field" id="login[username]_container">
          <td class="fieldname" colspan="2">
             <strong>Username:</strong><br />
             <div class="fieldcontainer"><input type="text" name="login[username]" id="login[username]" value="" placeholder="" /></div>
          </td>
       </tr>
       <tr class="field" id="login[password]_container">
          <td class="fieldname" colspan="2">
             <strong>Password:</strong><br />
             <div class="fieldcontainer"><input type="password" name="login[password]" id="login[password]" value="" placeholder="" /></div>
          </td>
       </tr>
       <tr class="field" id="login[rememberMe]_container">
          <td class="fieldname" colspan="2">
             <div class="checkboxcontainer">
                <input type="checkbox" name="login[rememberMe][]" id="login[rememberMe]" value="1"  /><label for="login[rememberMe]"></label>
                <label for="login[rememberMe]">Remember me</label>
                <input type="hidden" name="login[rememberMe][]" value="0" />
             </div>
          </td>
       </tr>

 

с другим кодом я получаю эти заголовки

 
 

теперь изменил код на этот

 //$client = new Client();
$credentials = base64_encode('user:pass');



$client = new GuzzleHttpClient(['base_uri' => 'https://www.website.com/']);
$response = $client->request('GET', 'create-report.php',  ['stream' => true],
    ['query' => ['type' => 'location'],
    'format' => ['xml'], 
    'start' => ['1618928524'], 
    'end' => ['1618932124'], 
    'module' => ['6F25A5ED98']], ['verify' => false,
     'headers' => [
     'Authorization' => 'Basic ' . $credentials,
             ]]);
$body = $response->getBody();
echo $response->getHeader('Content-Length')[0];

 

с выводом, подобным этому

 GuzzleHttpPsr7Stream Object
(
    [stream:GuzzleHttpPsr7Stream:private] => Resource id #57
    [size:GuzzleHttpPsr7Stream:private] => 
    [seekable:GuzzleHttpPsr7Stream:private] => 
    [readable:GuzzleHttpPsr7Stream:private] => 1
    [writable:GuzzleHttpPsr7Stream:private] => 
    [uri:GuzzleHttpPsr7Stream:private] => https://www.website.com/login.php
    [customMetadata:GuzzleHttpPsr7Stream:private] => Array
        (
        )

)```
 

Комментарии:

1. итак, проблема в том, что вы получаете html-файл вместо упомянутого выше xml, который вам требуется

2. да, и с другим кодом я получаю эти заголовки

Ответ №1:

этот код работает идеально

 $client = new GuzzleHttpClient(['base_uri' => 'https://v2.website.com/']);
$response = $client->request('GET', 'user_rss_feed.php',  
    ['auth' => ['user', 'pass!!!!']],
    ['debug' => true],
[
    'allow_redirects' => [
        'max'             => 10,        // allow at most 10 redirects.
        'strict'          => true,      // use "strict" RFC compliant redirects.
        'referer'         => true,      // add a Referer header
        'protocols'       => ['https'], // only allow https URLs
        'on_redirect'     => $onRedirect,
        'track_redirects' => true
    ]]
    );

 

этот код не работает. я получаю форму входа
на тот же сайт, тот же логин.
единственное, что пользовательский rss-канал представляет собой страницу php
и de create-report.php нажал на загрузку XML-файла в жопу…

 $client2 = new GuzzleHttpClient(['base_uri' => 'https://v2.website.com/']);

$response3 = $client2->request('GET', 'create-report.php',  
    ['auth' => ['user', 'pass!!!!']],
    ['headers' => [
        'Accept' => 'application/xml',
            'timeout' => 120
    ]], 
    ['query' => ['type' => 'events'],
    'gateway' => ['13025867C090F4C'], 
    'module' => ['6F25A5ED98'], 
    'start' => ['1617193460'], 
    'end' => ['1619032806'], 
    'format' => ['xml']],

    ['debug' => true],
[
    'allow_redirects' => [
        'max'             => 10,        // allow at most 10 redirects.
        'strict'          => true,      // use "strict" RFC compliant redirects.
        'referer'         => true,      // add a Referer header
        'protocols'       => ['https'], // only allow https URLs
        'on_redirect'     => $onRedirect,
        'track_redirects' => true
    ]]
    );