Как предоставить имя пользователя / пароль для доступа к веб-ресурсу с помощью Matlab urlread / urlwrite? - PullRequest
5 голосов
/ 23 августа 2009

Исходя из этого вопроса , относительно доступа к PDF на веб-странице с помощью Matlab, который изначально скрыт за функцией Javascript. Теперь у меня есть URL, который позволяет мне получить прямой доступ к странице, это нормально работает с использованием объекта веб-браузера Matlab (PDF отображается на экране), но для сохранения PDF-файла для последующей обработки мне кажется, что нужно использовать функции Matlab urlread / urlwrite , Однако эти функции не обеспечивают способ предоставления учетных данных для аутентификации.

Как мне предоставить имя пользователя / пароль для функций Matlab urlread / urlwrite?

Ответы [ 5 ]

6 голосов
/ 24 августа 2009

Функция Matlab urlread () имеет аргумент «params», но это параметры в стиле CGI, которые кодируются в URL. Аутентификация выполняется с помощью параметров HTTP-запроса более низкого уровня. Urlread не поддерживает их, но вы можете использовать их непосредственно для класса URL-адресов Java, чтобы использовать их.

Вы также можете использовать класс Sun's sun.misc.BASE64Encoder для программного кодирования Base 64. Это нестандартный класс, не входящий в стандартную библиотеку Java, но вы знаете, что JVM, поставляемый с Matlab, будет иметь его, так что вы можете без проблем кодировать его.

Вот быстрый взлом, показывающий его в действии.

function [s,info] = urlread_auth(url, user, password)
%URLREAD_AUTH Like URLREAD, with basic authentication
%
% [s,info] = urlread_auth(url, user, password)
%
% Returns bytes. Convert to char if you're retrieving text.
%
% Examples:
% sampleUrl = 'http://browserspy.dk/password-ok.php';
% [s,info] = urlread_auth(sampleUrl, 'test', 'test');
% txt = char(s)

% Matlab's urlread() doesn't do HTTP Request params, so work directly with Java
jUrl = java.net.URL(url);
conn = jUrl.openConnection();
conn.setRequestProperty('Authorization', ['Basic ' base64encode([user ':' password])]);
conn.connect();
info.status = conn.getResponseCode();
info.errMsg = char(readstream(conn.getErrorStream()));
s = readstream(conn.getInputStream());

function out = base64encode(str)
% Uses Sun-specific class, but we know that is the JVM Matlab ships with
encoder = sun.misc.BASE64Encoder();
out = char(encoder.encode(java.lang.String(str).getBytes()));

%%
function out = readstream(inStream)
%READSTREAM Read all bytes from stream to uint8
try
    import com.mathworks.mlwidgets.io.InterruptibleStreamCopier;
    byteStream = java.io.ByteArrayOutputStream();
    isc = InterruptibleStreamCopier.getInterruptibleStreamCopier();
    isc.copyStream(inStream, byteStream);
    inStream.close();
    byteStream.close();
    out = typecast(byteStream.toByteArray', 'uint8'); %'
catch err
    out = []; %HACK: quash
end
1 голос
/ 05 ноября 2011

urlwrite_auth - следующий шаг, так что вот оно ...

function  [output,status]=urlwrite_auth(url, user, password,location,wanted) 
%URLWRITE_AUTH Like URLWRITE, with basic authentication 
% 
% location is where you want the file saved
% wanted is the name of the file you want
% Returns the output file which is now saved to location. 
% 
% Examples: 
% sampleUrl = 'http://browserspy.dk/password-ok.php'; 
% [output,status] = urlwrite_auth(sampleUrl, 'user', 'password', location, wanted); 


% Matlab's urlread() doesn't do HTTP Request params, so work directly with Java 
jUrl = java.net.URL(url); 
conn = jUrl.openConnection(); 
conn.setRequestProperty('Authorization', ['Basic ' base64encode([user ':' password])]); 
conn.connect()
%note this calls the function below

% Specify the full path to the file so that getAbsolutePath will work when the
% current directory is not the startup directory and urlwrite is given a
% relative path.
file = java.io.File(location);

% the path.
try
    file = file.getCanonicalFile;
catch
    error('MATLAB:urlwrite:InvalidOutputLocation','Could not resolve file    "%s".',char(file.getAbsolutePath));
end

% Open the output file.
pathy=strcat(location,'\',wanted);
try
    fileOutputStream = java.io.FileOutputStream(pathy);
catch
    error('MATLAB:urlwrite:InvalidOutputLocation','Could not open output file "%s".',char(file.getAbsolutePath));
end

% Read the data from the connection.
try
    inputStream = conn.getInputStream;
        import com.mathworks.mlwidgets.io.InterruptibleStreamCopier; 
    % This StreamCopier is unsupported and may change at any time.
    isc = InterruptibleStreamCopier.getInterruptibleStreamCopier;   
    isc.copyStream(inputStream,fileOutputStream);
    inputStream.close;
    fileOutputStream.close;
    output = char(file.getAbsolutePath);
catch
    fileOutputStream.close;
    delete(file);
    if catchErrors, return
    else error('MATLAB:urlwrite:ConnectionFailed','Error downloading URL. Your network     connection may be down or your proxy settings improperly configured.');
    end
end

status = 1;


function out = base64encode(str) 
% Uses Sun-specific class, but we know that is the JVM Matlab ships with 
encoder = sun.misc.BASE64Encoder(); 
out = char(encoder.encode(java.lang.String(str).getBytes())); 
%this is the bit of code that makes it connect!!!!

Обратите внимание, что это развитие ответа Эндрю на загрузку файлов с http-сайта имени пользователя и пароля.

0 голосов
/ 17 октября 2016

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

options = weboptions('Username','user','Password','your password');
data = webread(url, options);

Это также можно использовать для websave или webwrite. Подробнее о weboptions здесь

0 голосов
/ 24 августа 2009

Оказывается, что сайт интрасети использует базовую аутентификацию, которая не поддерживается Matlab "из коробки", но на сайте Mathworks описано обходное решение здесь который работает отлично. Вначале я использовал Firebug, чтобы получить строку в кодировке Base64, необходимую для доступа, но я также провел прямой расчет с использованием инструмента здесь . Теперь я сохранил свой файл отчета в формате PDF на диск - так что работа сделана. Для моего следующего трюка я буду преобразовывать его в текст ...

Насколько я понимаю, методы get и post отличаются от базового метода аутентификации, но базовая аутентификация не часто используется в открытой сети.

0 голосов
/ 23 августа 2009

Я не знаю, Matlab, это просто обоснованное предположение.

В документации по функции здесь перечислены параметры следующим образом:

s = urlread('url','method','params')

В зависимости от того, какую аутентификацию они используют, это может или не может работать, вы захотите использовать метод post.

// Params is supposed to be a "cell array of name/value pairs, I don't know matlab... 
s = urlread('http://whatever.com','post', {'username' 'ian'; 'password' 'awesomepass'})

Вам нужно будет посмотреть фактическую HTML-форму запроса.или просмотрите вкладку net в firebug, чтобы увидеть, каковы действительные имена / значения параметров имени пользователя и пароля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...