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

Тема в разделе "Lotus - Программирование", создана пользователем lionk, 19 фев 2009.

  1. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    Вобщем нужно время от времени обращятся к некоему веб-ресурсу, получать от него данные и их обрабатывать.

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
  3. lionk

    lionk Well-Known Member

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    lionk
    Вопрос без подковырки...
    А почему бы не заюзать GetDocByURL?
    Вместо использования MS объектов?
    Кмк, более платформонезависимо...
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    +1 хотел тож об этом указать, но забыл как называется :)) и хотел спросить "че делать на юнихе?"
     
  6. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    Omh

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

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

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

    Akupaka А че я?.. О.о

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

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

    Omh Lotus team
    Lotus team

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

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    Omh
    то виложи хотябы код запроса к странице по средствам GetDocByURL
     
  10. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    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), пасишь его и вуаля :)
     
  11. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    в принцепе всё понятно, спасибо.

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Код (Text):
    Call Body.SetContentFromText(Stream, Header, ENC_BASE64)   
    Call Body.DecodeContent
    rv = body.ContentAsText
    Тока никому!
     
  13. DNT

    DNT Постоялец форума
    Lotus team

    Регистрация:
    12 окт 2005
    Сообщения:
    592
    Симпатии:
    7
    Моё. Работает по расписанию для затягивания курса валют (Украина). Использует прокси сервер.

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

    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
     
  14. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    DNT ну это решение тоже токо для винодвых машин B)


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

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

    это както можно обойти?
     
  15. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А вот это не знаю, у меня это дело запускается в не шедульном агенте.
    Может security level повысь для агента (это просто как идея)?
    Не пробовал ретрайвить док по урлу в шедульном агенте, и так отрабатывает достаточно быстро B)
     
  16. lionk

    lionk Well-Known Member

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

    Код (Text):
    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 пян, за громатику не отвечаю
     
  17. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    джава не минус, а бальшой плюс! ;)
    есть масса тулзов для парсинга...
    LAX - я описывал на Интертрасте
    просто подключаем по названию метод к нужному тегу - фсё (контент наш)
    VDT - там же
    http://web3.inttrust.ru/site/itforum.nsf/4...33;OpenDocument
     
Загрузка...
Похожие Темы - Url запрос из
  1. deeeman
    Ответов:
    9
    Просмотров:
    357
  2. Triton
    Ответов:
    0
    Просмотров:
    210
  3. puks
    Ответов:
    5
    Просмотров:
    544
  4. proteam
    Ответов:
    7
    Просмотров:
    788
  5. Cleric-Lviv
    Ответов:
    4
    Просмотров:
    1.508

Поделиться этой страницей