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

Глупая идея: как насчет:

(defun foo (x)
  `(lambda () ,x))

(funcall (foo 10))  ;; => 10
5
задан Community 23 May 2017 в 12:23
поделиться

3 ответа

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

Вы также можете использовать класс Sun.misc.BASE64Encoder от Sun для программного кодирования 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
6
ответ дан 14 December 2019 в 13:43
поделиться

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

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

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

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

// 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, чтобы узнать, какое имя / значения параметров имени пользователя и пароля.

-2
ответ дан 14 December 2019 в 13:43
поделиться

It turns out the intranet site is using basic authentication, which isn't supported by Matlab out-of-the-box but there is a workaround solution described on the Mathworks site here which works fine. In the first instance I used Firebug to get me the Base64 encoded string I needed for access, but I also did a direct calculation using the tool here. I have now saved my PDF report file to disk - so job done. For my next trick I will be converting it into text...

My understanding is that the get and post methods are distinct from the basic authentication method, but that basic authentication is not often used on the open net.

0
ответ дан 14 December 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: