Url запрос из агента

  • Автор темы lionk
  • Дата начала
L

lionk

Вобщем нужно время от времени обращятся к некоему веб-ресурсу, получать от него данные и их обрабатывать.

Вот мне интересно возможно ли зделать GET запрос по определённому URL, из агента выполняемого по расписанию, и потом обработать результат этого запроса?
 
L

lionk

должно работать.
Никогда бы не допёр в лотус скрипте заюзать Microsoft.XMLHTTP, хотя в ява агенте приходилось :lol:
Огромное спасибо :)

PS ктото пробывал в скрипте на полную Microsoft.XMLHTTP юзать, при зпросе параметры передавать, setRequestHeader заполнять?
 
O

Omh

lionk
Вопрос без подковырки...
А почему бы не заюзать GetDocByURL?
Вместо использования MS объектов?
Кмк, более платформонезависимо...
 
A

Akupaka

А почему бы не заюзать GetDocByURL?
Вместо использования MS объектов?
Кмк, более платформонезависмо...
+1 хотел тож об этом указать, но забыл как называется :)) и хотел спросить "че делать на юнихе?"
 
L

lionk

Omh

надо rss-фиды читать, которые апач отдаёт.

под GetDocByURL ты имел в виду notesDatabase.GetDocumentByURL(), так она в результате работы даст обект NotesDocument, а мне по факту надо получить строку XML кода и потом её разобрать.

или есть ещё какаято GetDocByURL, кторая открывает что угодно и ответ возвращяет.
 
A

Akupaka

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

к стати, встречал когда-то ява-код, читающий ответ от веб-сервера, но не могу найти, где-то он у меня потерялся... думаю, в нете есть пример...
 
O

Omh

Кстати, я сам тоже написал RSS2.0 ридер :)
И там использую именно GetDocByURL.
В полученном этим методом документе XML структура харанится в одном из полей (в виде аттачмента), откуда её можно достать и распарсить.
Даже без сохрания полученного документа :lol:
 
L

lionk

Omh
то виложи хотябы код запроса к странице по средствам GetDocByURL
 
O

Omh

Код:
Dim RSSDoc As NotesDocument
Set RSSDoc = db.GetDocumentByURL(URL, True)

If Not RSSDoc Is Nothing Then
Dim DXLExporter As NotesDXLExporter
Set DXLExporter = Session.CreateDXLExporter
Call DXLExporter.SetInput(RSSDoc)

Dim DOMParser As NotesDOMParser
Set DOMParser = Session.CreateDOMParser
Call DOMParser.SetInput(DXLExporter)

On Event PostDOMParse From DOMParser Call ReadRSSFeedDOM

G_RSSBase64 = ""
Call DXLExporter.Process 'Here will fill variable G_RSSBase64 (global variable)
If G_RSSBase64 = "" Then Exit Function
End if

Private Sub ReadRSSFeedDOM(Source As NotesDOMParser)
On Error Goto Errh

Dim RootDoc As NotesDOMDocumentNode
Set RootDoc = Source.Document

Dim NodesList As NotesDOMNodeList
Dim Node As NotesDOMElementNode

Set NodesList = RootDoc.GetElementsByTagName("filedata")
If NodesList.NumberOfEntries = 1 Then
Set Node = NodesList.GetItem(1)
If Not Node.IsNull Then G_RSSBase64 = Node.FirstChild.NodeValue
End If

Exit Sub
Errh:
Call ErrHandler
Exit Sub
End Sub

G_RSSBase64 - приватная глобальная переменная на уровне библиотеки (что бы передать из DOM обработчика данные)
После выполнения приведённого кода в переменной G_RSSBase64 у нас содержится Base64 код, декодировав который ты получишь XML.

Полный алгоритм примерно такой:
На лету подгружаешь док из нета, пропускаешь его через DOM парсер при этом получая Base64 код аттачмента (XML), декодишь Base64 (ключевое слово - NotesMIMEEntity), получаешь XML (который RSS), пасишь его и вуаля :)
 
L

lionk

в принцепе всё понятно, спасибо.

токо скажи ещё как Base64 раскодировать(какой функцией).
 
O

Omh

Код:
Call Body.SetContentFromText(Stream, Header, ENC_BASE64)	
Call Body.DecodeContent
rv = body.ContentAsText
Тока никому!
 
D

DNT

Вобщем нужно время от времени обращятся к некоему веб-ресурсу, получать от него данные и их обрабатывать.

Вот мне интересно возможно ли зделать GET запрос по определённому URL, из агента выполняемого по расписанию, и потом обработать результат этого запроса?

Моё. Работает по расписанию для затягивания курса валют (Украина). Использует прокси сервер.

Кусок кода агента:

Sub Initialize
Dim Session As New NotesSession
Dim rtitem As NotesRichTextItem
Dim DB As NotesDatabase
Dim DC As NotesDocumentCollection
Dim Doc As NotesDocument
Dim sDoc As NotesDocument
Dim view As NotesView
Set DB = Session.CurrentDatabase

'url = "http://www.qdpro.com.ua/data/valute/val$%DDMM%"

r=Cstr(Date$)


YYYY = Mid$(Cstr(Date$),7,4)
MM = Mid$(Cstr(Date$),4,2)
DD = Mid$(Cstr(Date$),1,2)

url = "http://www.qdpro.com.ua/data/valute/val$" + DD + MM

Const HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1
Const HTTPREQUEST_PROXYSETTING_PROXY = 2
Const AutoLogonPolicy_Always = 0
Dim httpobj As Variant
Print "Create оbject winhttp.winhttprequest.5.1 ..."
Set httpobj=CreateObject("winhttp.winhttprequest.5.1")
Print "Object winhttp.winhttprequest.5.1 CREATED !!!"
httpobj.SetProxy HTTPREQUEST_PROXYSETTING_PROXY, "192.168.1.10:3128", ""
Call httpobj.Open("GET", url, False)
httpobj.SetCredentials "домен\имя_пользователя","пароль",HTTPREQUEST_SETCREDENTIALS_FOR_PROXY
httpobj.SetAutoLogonPolicy AutoLogonPolicy_Always
httpobj.setRequestHeader "CACHE_CONTROL", "no-cache"
httpobj.setRequestHeader "CONNECTION", "Close"
Call httpobj.Send("")
ProcessPage$=httpobj.ResponseText

...
далее работаем с ProcessPage$ как с текстом
...

End Sub
 
L

lionk

DNT ну это решение тоже токо для винодвых машин B)


Omh Web retrievr ругается что не может в фоне обращятся к страницам требующим авторизацию

WEB(3): Unable to retrieve URL 'http://': Retrieval of authenticated Web pages in background server agent is not supported

это както можно обойти?
 
O

Omh

А вот это не знаю, у меня это дело запускается в не шедульном агенте.
Может security level повысь для агента (это просто как идея)?
Не пробовал ретрайвить док по урлу в шедульном агенте, и так отрабатывает достаточно быстро B)
 
L

lionk

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

Код:
import lotus.domino.*;
import java.net.*;
import java.io.*;
import java.text.*;
import java.util.*;

public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Database db = agentContext.getCurrentDatabase();

//обект url-ки(обезательно в строке URL надо писать протокол "http://")
URL url = new URL("http://www.google.com.ua");
URLConnection conn = url.openConnection();
// передаём пароль и логин
//String encoding = new sun.misc.BASE64Encoder().encode("login:password".getBytes());
//conn.setRequestProperty ("Authorization", "Basic " + encoding);
//получаем ответ в буфер если есть ваторизация
//BufferedReader bin = new BufferedReader ( new InputStreamReader(conn.getInputStream( ) ));

//получаем ответ в буфер если без логина
BufferedReader bin = new BufferedReader (new InputStreamReader(url.openStream( ) ));

//обрабатываем буфер шоб с ним было удобно работать (токо в УРЛ кодировке - руские буквы цыфрами :)
String line; 
StringBuffer sb = new StringBuffer();
while ( (line = bin.readLine( )) != null ) 
{ 
sb.append(line);
}
String ibmString = sb.toString(); //срока ответа(html страницы)

Document newNotesDoc = db.createDocument();
newNotesDoc.replaceItemValue ("form","httprespond");
newNotesDoc.replaceItemValue ("body", ibmString);
newNotesDoc.save( true, true );

newNotesDoc.recycle();

} catch(Exception e) {
e.printStackTrace();
}
}
}


..

ps пян, за громатику не отвечаю
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
если с помощью явы, то лучше заюзать или если нужна подержка яваскрипта
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
джава не минус, а бальшой плюс! ;)
есть масса тулзов для парсинга...
LAX - я описывал на Интертрасте
просто подключаем по названию метод к нужному тегу - фсё (контент наш)
VDT - там же
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!