#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
]]
);