Форум » [x]Harbour » Облачные сервисы (WebDAV, CalDAV &Co) » Ответить

Облачные сервисы (WebDAV, CalDAV &Co)

Dr. Oldwarez: После некоторого разбирательства с прогой удалось организовать импорт из ICAL-файлов и экспорт в оные. Но тут шеф захотел, чтобы был прямой контакт с CalDav через интернет. Я знаю, что на питоне такое возможно. На дельфине и даже Xojo (RealBasic) тоже - через спецбиблиотеку. Но как реализовать подключение к облачному сервису в Harbour/Minigui? Возможно ли это вообще?

Ответов - 174, стр: 1 2 3 4 5 6 7 8 9 All

SergKis: Dr. Oldwarez пишет А мне надо именно, что ВСЕ события получить. Дата модификации неинформативна. Не дата модификации мне нужна, а дата и время события. Это и есть первичный ключ в моём локальном календаре Причем здесь, информативно\не информативно и ваш первичный ключ. Есть архитектура, устройство календаря и оно такое какое есть. Есть правила доступа и вы их соблюдаете или нет. Как минимум, надо сделать все запросы для понимания ситуевины и от нее переходить к вашему устройству базы, но точно не наоборот

Dr. Oldwarez: Петр пишет: Да втащите весь календарь на локальный комп (за один запрос), а потом синхронизируйте его с сервером Пример с GET делали или нет? Сделал [pre2]curl -o test2.txt --user USERNAME:PASSWORD -i -X GET https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/[/pre2] И вот... [pre2]HTTP/1.1 200 OK Date: Sun, 21 Mar 2021 17:51:23 GMT Server: Apache X-Powered-By: PHP/7.3.27 Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Vary: Accept-Encoding Set-Cookie: PHPSESSID=e5ud2bc6fab8mv59hf8hanbhd8; path=/ Set-Cookie: horde_secret_key=e5ud2bc6fab8mv59hf8hanbhd8; path=/; domain=webmail.kleeblatt.com; HttpOnly Set-Cookie: default_horde_view=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=webmail.kleeblatt.com X-Powered-By: PleskLin Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 <html> <head> <title>Index for calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/ - SabreDAV 1.8.12-stable</title> <style type="text/css"> body { Font-family: arial} h1 { font-size: 150% } </style> <link rel="shortcut icon" href="/rpc.php/?sabreAction=asset&assetName=favicon.ico" type="image/vnd.microsoft.icon" /></head> <body> <h1>Index for calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/</h1> <table> <tr><th width="24"></th><th>Name</th><th>Type</th><th>Size</th><th>Last modified</th></tr> <tr><td colspan="5"><hr /></td></tr><tr> <td><a href="/rpc.php/calendars/illya@kleeblatt.com"> <img src="/rpc.php/?sabreAction=asset&assetName=icons%2Fparent.png" width="24" alt="Parent" /></a></td> <td><a href="/rpc.php/calendars/illya@kleeblatt.com">..</a></td> <td>[parent]</td> <td></td> <td></td> </tr><tr> <td><a href="/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/w7klsLDepGCBYAA7Gmr4GIe.ics"> <img src="/rpc.php/?sabreAction=asset&assetName=icons%2Ffile.png" alt="" width="24" /></a></td> <td><a href="/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/w7klsLDepGCBYAA7Gmr4GIe.ics">w7klsLDepGCBYAA7Gmr4GIe.ics</a></td> <td>text/calendar; charset=utf-8</td> <td>500</td> <td>2021-03-13T16:58:11+00:00</td> </tr><tr> <td><a href="/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/8gpZuoZBJQDnLlr-66brhHG.ics"> <img src="/rpc.php/?sabreAction=asset&assetName=icons%2Ffile.png" alt="" width="24" /></a></td> <td><a href="/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/8gpZuoZBJQDnLlr-66brhHG.ics">8gpZuoZBJQDnLlr-66brhHG.ics</a> </td> <td>text/calendar; charset=utf-8</td>[/pre2]

Петр: Dr. Oldwarez пишет: curl -o test2.txt --user USERNAME:PASSWORD -i -X GET https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/ И что мы пытались скачать ?! Присобачьте к url имя календаря, например, seukIp8ajv0rOXXx8IG4Q9j.ics ... GET https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics


Dr. Oldwarez: Петр пишет: Присобачьте к url имя календаря, например, seukIp8ajv0rOXXx8IG4Q9j.ics ... GET https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics Йееес!!! Получилось! [pre2] BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:Kalender von illya@kleeblatt.com PRODID:-//The Horde Project//Horde iCalendar Library//EN BEGIN:VEVENT DTSTART:20210318T140000Z DTEND:20210318T150000Z DTSTAMP:20210321T192856Z UID:20210315125442.qQtI4Rdk7FakWsfY8RiLVTg@webmail.kleeblatt.com CREATED:20210315T125442Z LAST-MODIFIED:20210315T125641Z SUMMARY:Testing of Import DESCRIPTION:Not so easy, but I will try to do it LOCATION:Somewhere on the Earth CLASS:PUBLIC STATUS:CONFIRMED TRANSP:OPAQUE END:VEVENT END:VCALENDAR [/pre2]

Петр: Dr. Oldwarez пишет: Йееес!!! Получилось! Вери велл.. Результат применения PROPFIND / GET к колекции мы видели. Сделайте еще PROPFIND для календаря ... PROPFIND https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics

Dr. Oldwarez: Петр пишет: Вери велл.. Результат применения PROPFIND / GET к колекции мы видели. Сделайте еще PROPFIND для календаря ... PROPFIND https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics [pre2] <?xml version="1.0" encoding="utf-8"?> <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:card="urn:ietf:params:xml:ns:carddav"> <d:response> <d:href>/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics</d:href> <d:propstat> <d:prop> <d:getlastmodified>Mon, 15 Mar 2021 12:56:41 GMT</d:getlastmodified> <d:getcontentlength>546</d:getcontentlength> <d:resourcetype/> <d:getetag>"fa79fe0b28dea03c0db457af39980eae"</d:getetag> <d:getcontenttype>text/calendar; charset=utf-8</d:getcontenttype> </d:prop> <d:status>HTTP/1.1 200 OK</d:status> </d:propstat> </d:response> </d:multistatus> [/pre2] И что дальше?

Петр: Dr. Oldwarez пишет: И что дальше? Все. Спасибо. Дальше сами, согласно техзадания шефа.

SergKis: Dr. Oldwarez пишет И что дальше? Теперь, как минимум, знаете устройство календаря (по запросам), т.е. 1. Список календарей (пост 259) 2. Оглавление календаря (список событий, предыдущий ваш пост 267). Идентификатор события <d:getetag>"fa79fe0b28dea03c0db457af39980eae"</d:getetag> 3. Содержимое календаря (GET запрос), правда вы дали его в усеченном виде, т.к. нет идентификатора события События оглавления содержат дату <d:getlastmodified>Mon, 15 Mar 2021 12:56:41 GMT</d:getlastmodified> и Содержимое события содержит дату LAST-MODIFIED:20210315T125641Z Т.е. получая Оглавление календаря, а не все содержимое, можно знать менялось событие в календаре на сервере, сравнивая со значением в dbf и брать с сервера только измененные данные (содержимое).

Dr. Oldwarez: SergKis пишет: Содержимое события содержит дату LAST-MODIFIED:20210315T125641Z Т.е. получая Оглавление календаря, а не все содержимое, можно знать менялось событие в календаре на сервере, сравнивая со значением в dbf и брать с сервера только измененные данные (содержимое). О, точно, как же я сразу до этого не додумался? Надо всё фильтровать по дате последнего обновления, которая также должна храниться в INI Тогда фильтруются только те ICSы, которые не были актуализированы в прошлый раз. И ещё маленький вопрос напоследок. Как с помощью CURL GET сделать так, чтобы НЕСКОЛЬКО событий вывелось в один файл А то у меня так (Strings - список названий ics, TEMPDIR - директория временных файлов, создаваемых в процессе подключения к календарю): [pre2] ... FOR k:=1 TO LEN(aStrings) cCURL2:='curl -o '+cTempDIR+IIF(RIGHT(cTempLW,1)="\",'','\')+'temp_'+STRZERO(k,4)+'.txt --user '+cCALLOgin+':'+cCALPWD+' -i -X GET '+cCalName+; IIF(RIGHT(cCalName,1)='/','','/')+aStrings[k] RUN(cCurl2) NEXT k ... [/pre2] То есть, каждый ICS на одно событие генерит свой собственный файл. Нельзя ли так, чтобы несколько событий отправлялись в один файл? (Настроить вывод на дозапись вместо открытия нового файла)

SergKis: Dr. Oldwarez пишет Нельзя ли так, чтобы несколько событий отправлялись в один файл? Зачем ? Есть a := Directory(<маска>) и собирайте, если надо или проще по одному элементу отрабатывать массив a

SergKis: PS А может так ?[pre2] FOR k:=1 TO LEN(aStrings) cOut := cTempDIR+IIF(RIGHT(cTempLW,1)="\",'','\')+'temp_'+STRZERO(k,4)+'.txt' fErase(cOut) cCURL2:='curl -o '+cOut+' --user '+cCALLOgin+':'+cCALPWD+' -i -X GET '+cCalName+; IIF(RIGHT(cCalName,1)='/','','/')+aStrings[k] RUN(cCurl2) IF file(cOut) // обработка ELSE ? k, "Error", cOut ENDIF NEXT k [/pre2]

Dr. Oldwarez: SergKis пишет: ICS = ARRAY[6] 1 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/w7klsLDepGCBYAA7Gmr4GIe.ics", "Sat, 13 Mar 2021 16:58:11 GMT", "ics 1"} 2 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/8gpZuoZBJQDnLlr-66brhHG.ics", "Thu, 04 Mar 2021 16:51:14 GMT", "ics 2"} 3 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/VM3wwLrVEm3Zwn-UkKAzXra.ics", "Thu, 04 Mar 2021 16:51:33 GMT", "ics 3"} 4 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/e5aab12a-1a2a-4309-96d4-cccb1b67d9ba.ics", "Mon, 08 Mar 2021 06:59:00 GMT", "ics 4"} 5 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics", "Mon, 15 Mar 2021 12:56:41 GMT", "ics 5"} 6 {"/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/83sEK6nFBn4-TQ1XcZoPvWz.ics", "Mon, 15 Mar 2021 12:52:23 GMT", "ics 6"} Отлично! У меня получилось. Теперь вот вопрос по формату времени. Мой шеф проживает в зоне CET (Гринвич+1). Я - в зоне EET. И хотелось бы привести это всё к одному формату, принятому в ICS: YYYYMMDDTHHMMSSZ И тогда уже можно сделать выбор по дате - только тех, кто позже даты последней автосинхронизации, заносимой в регистр автоматически при нажатии на кнопку "Синхронизация"

SergKis: Dr. Oldwarez пишет И хотелось бы привести это всё к одному формату, принятому в ICS: Для этого, вроде, все есть[pre2] c := DtoS(Date()) m := {} FOR i := 1 TO 12 ; AAdd(m, left(cMonth(StoD( left(c,4)+strzero(i,2)+"01" )), 3)) NEXT a := hb_ATokens("Mon, 15 Mar 2021 12:56:41 GMT"," ") cDay := a[2] cMes := a]3] cGod := a[4] cTim := a[5] cMes := StrZero(AScan(m, cMes), 2) cTim := StrTran(cTim, ":", "") cDat := cGod+cMes+cDay+cTim [/pre2]

Петр: Dr. Oldwarez пишет: Отлично! У меня получилось. В цикле выполнить вызов curl? Поздравляю.

Dr. Oldwarez: Петр пишет: В цикле выполнить вызов curl? Поздравляю. Этак вот [pre2] PROCEDURE SyncDlg() LOCAL cXML:=cTempDIR+IIF(RIGHT(cTempLW,1)="\",'','\')+'listall_ics.xml' LOCAL cRun:='curl -k -o '+cXML+' --user '+cCALLOgin+':'+cCALPWD+' -X PROPFIND "'+cCALName+'"' LOCAL cBuf:="",aBuf:={},nI:=1,aStrings:={},aICS:={},j:=1,cCURL2:="",aHeaders:={"CALENDAR","CHANGE DATE","NUMBER"},aLen:={700,150,80} LOCAL nN:=1,cK:="",cI:="" LOCAL aDimLen := {280,80,50,80,50,200,350} LOCAL aDimHeaders:={"Subject","Start Date", "Start Time","End Date","End Time","Location","Description"},aCalStr:={},aDim:={} LOCAL cLocation:="",cDescription:="",cSubject:="",dStartDate:=CTOD(""),cStartTime:="00:00",dEndDate:=CTOD(""),cEndTime:="00:00",; cStartDateTime:="",cEndDateTime:="" RUN (cRun) cBuf := hb_memoread(cXml) IF CRLF $ cBuf cBuf := StrTran(cBuf, CRLF, "") ENDIF aBuf := hb_ATokens(cBuf, "<d:response><d:href>") nN := 0 FOR nI := 1 TO Len(aBuf) cI := aBuf[nI] nK := AT("</", cI) cK := trim(left(cI, nK-1)) IF right(cK, 4) == ".ics" nN += 1 AAdd(aIcs, { cK, "", "ics "+hb_ntos(nN) }) ENDIF NEXT aBuf := hb_ATokens(cBuf, "<d:propstat><d:prop><d:getlastmodified>") nN := 0 FOR nI := 1 TO Len(aBuf) cI := aBuf[nI] cK := "" IF ! "<?xml " $ cI nN += 1 nK := AT("</", cI) cK := left(cI, nK-1) aIcs[nN][2] := cK ENDIF NEXT FOR i:=1 TO LEN(aICS) //IF aICS[ i ][2]> AADD(aStrings,SUBSTR(aICS[ i ][1],RAT("/",aICS[ i ][1])+1)) //ENDIF NEXT i FOR k:=1 TO LEN(aStrings) cOut := cTempLW+IIF(RIGHT(cTempLW,1)="\",'','\')+'temp_'+STRZERO(k,4)+'.txt' fErase(cOut) cCURL2:='curl -o '+cOut+' --user '+cCALLOgin+':'+cCALPWD+' -i -X GET '+cCalName+; IIF(RIGHT(cCalName,1)='/','','/')+aStrings[k] RUN(cCurl2) IF FILE(cOut) aCalStr:=hb_ATokens(MEMOREAD(cOut),CRLF) FOR nBuf:=1 TO LEN(aCalStr) IF aCalStr[nBuf]="DTSTART" cDateTime:=SUBSTR(aCalStr[nBuf],AT(":",aCalStr[nBuf])+1) dStartDate:=STOD(LEFT(cDateTime,8)) cStartTime:=SUBSTR(cDateTime,10,2)+":"+SUBSTR(cDateTime,12,2) ENDIF IF aCalStr[nBuf]="DTEND" cEndDateTime:=SUBSTR(aCalStr[nBuf],AT(":",aCalStr[nBuf])+1) dEndDate:=STOD(LEFT(cEndDateTime,8)) cEndTime:=SUBSTR(cEndDateTime,10,2)+":"+SUBSTR(cEndDateTime,12,2) ENDIF IF aCalStr[nBuf]="SUMMARY" cSubject:=SUBSTR(aCalStr[nBuf],AT(":",aCalStr[nBuf])+1) ENDIF IF aCalStr[nBuf]="LOCATION" cLocation:=SUBSTR(aCalStr[nBuf],AT(":",aCalStr[nBuf])+1) ENDIF IF aCalStr[nBuf]="DESCRIPTION" cDescription:=SUBSTR(aCalStr[nBuf],AT(":",aCalStr[nBuf])+1) ENDIF NEXT nBuf AADD(aDim,{cSubject,dStartDate,cStartTime,dEndDate,cEndTime,cLocation,cDescription}) // Obrabotka ENDIF NEXT k DEFINE WINDOW wndSync; AT 50,0; WIDTH 1020 HEIGHT 670; CHILD; TITLE "Calendar synchronization" IF LEN(aDim)>0 DEFINE TBROWSE brwImport; AT 10,10; WIDTH 950 HEIGHT 350; GRID brwImport:=SetArrayTo("brwImport","wndSync",aDim) END TBROWSE ENDIF END WINDOW ACTIVATE WINDOW wndSync [/pre2]

Dr. Oldwarez: Петр пишет: К тому же инсталлятор весом меньше 1 Га в наше время моветон Вот только моему шефу этого не говорите. Для него это как красная тряпка для быка

SergKis: Dr. Oldwarez Поправьте в посте 270 [ i ] без пробелов (это служебный тэг), на [ i ] с пробелами, искажение текста не будет

SergKis: Dr. Oldwarez пишет Вот только моему шефу этого не говорите. Для него это как красная тряпка для быка В Windows 10 build 17063 и более поздних версиях теперь включен Curl, так что вы можете запускать его непосредственно из Cmd.exe или PowerShell.exe.

Dima: SergKis пишет: Поправьте в посте 270 [ i ] без пробелов (это служебный тэг), на [ i ] с пробелами, искажение текста не будет я поправил

Dr. Oldwarez: SergKis пишет:  цитата: В Windows 10 build 17063 и более поздних версиях теперь включен Curl, так что вы можете запускать его непосредственно из Cmd.exe или PowerShell.exe. И это радует. А то придётся уже через libcurl продираться.



полная версия страницы