Автор | Сообщение |
|
| постоянный участник
|
Пост N: 253
Зарегистрирован: 27.07.08
|
|
Отправлено: 16.03.21 21:55. Заголовок: Облачные сервисы (WebDAV, CalDAV &Co)
После некоторого разбирательства с прогой удалось организовать импорт из ICAL-файлов и экспорт в оные. Но тут шеф захотел, чтобы был прямой контакт с CalDav через интернет. Я знаю, что на питоне такое возможно. На дельфине и даже Xojo (RealBasic) тоже - через спецбиблиотеку. Но как реализовать подключение к облачному сервису в Harbour/Minigui? Возможно ли это вообще?
|
|
|
Ответов - 174
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 3633
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.03.21 16:39. Заголовок: Dr. Oldwarez пишет А..
Dr. Oldwarez пишет цитата: | А мне надо именно, что ВСЕ события получить. Дата модификации неинформативна. Не дата модификации мне нужна, а дата и время события. Это и есть первичный ключ в моём локальном календаре |
| Причем здесь, информативно\не информативно и ваш первичный ключ. Есть архитектура, устройство календаря и оно такое какое есть. Есть правила доступа и вы их соблюдаете или нет. Как минимум, надо сделать все запросы для понимания ситуевины и от нее переходить к вашему устройству базы, но точно не наоборот
|
|
|
|
| постоянный участник
|
Пост N: 265
Зарегистрирован: 27.07.08
|
|
Отправлено: 21.03.21 20:57. Заголовок: Петр пишет: Да втащ..
Петр пишет: цитата: | Да втащите весь календарь на локальный комп (за один запрос), а потом синхронизируйте его с сервером Пример с GET делали или нет? |
| Сделал curl -o test2.txt --user USERNAME:PASSWORD -i -X GET https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/ И вот... 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>
|
|
|
|
| постоянный участник
|
Пост N: 1614
Зарегистрирован: 09.10.06
|
|
Отправлено: 21.03.21 21:21. Заголовок: Dr. Oldwarez пишет: ..
|
|
|
|
| постоянный участник
|
Пост N: 266
Зарегистрирован: 27.07.08
|
|
Отправлено: 21.03.21 22:30. Заголовок: Петр пишет: Присоб..
Петр пишет: Йееес!!! Получилось! 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
|
|
|
|
| постоянный участник
|
Пост N: 1616
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.03.21 09:28. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: Вери велл.. Результат применения PROPFIND / GET к колекции мы видели. Сделайте еще PROPFIND для календаря ... PROPFIND https://webmail.kleeblatt.com/rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7/seukIp8ajv0rOXXx8IG4Q9j.ics
|
|
|
|
| постоянный участник
|
Пост N: 267
Зарегистрирован: 27.07.08
|
|
Отправлено: 23.03.21 19:16. Заголовок: Петр пишет: Вери ве..
Петр пишет: <?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> И что дальше?
|
|
|
|
| постоянный участник
|
Пост N: 1617
Зарегистрирован: 09.10.06
|
|
Отправлено: 23.03.21 20:16. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: Все. Спасибо. Дальше сами, согласно техзадания шефа.
|
|
|
|
| постоянный участник
|
Пост N: 3638
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.03.21 20:21. Заголовок: Dr. Oldwarez пишет И..
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 и брать с сервера только измененные данные (содержимое).
|
|
|
|
| постоянный участник
|
Пост N: 268
Зарегистрирован: 27.07.08
|
|
Отправлено: 23.03.21 21:45. Заголовок: SergKis пишет: Соде..
SergKis пишет: цитата: | Содержимое события содержит дату LAST-MODIFIED:20210315T125641Z Т.е. получая Оглавление календаря, а не все содержимое, можно знать менялось событие в календаре на сервере, сравнивая со значением в dbf и брать с сервера только измененные данные (содержимое). |
| О, точно, как же я сразу до этого не додумался? Надо всё фильтровать по дате последнего обновления, которая также должна храниться в INI Тогда фильтруются только те ICSы, которые не были актуализированы в прошлый раз. И ещё маленький вопрос напоследок. Как с помощью CURL GET сделать так, чтобы НЕСКОЛЬКО событий вывелось в один файл А то у меня так (Strings - список названий ics, TEMPDIR - директория временных файлов, создаваемых в процессе подключения к календарю): ... 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 ... То есть, каждый ICS на одно событие генерит свой собственный файл. Нельзя ли так, чтобы несколько событий отправлялись в один файл? (Настроить вывод на дозапись вместо открытия нового файла)
|
|
|
|
| постоянный участник
|
Пост N: 3639
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.03.21 21:57. Заголовок: Dr. Oldwarez пишет Н..
Dr. Oldwarez пишет цитата: | Нельзя ли так, чтобы несколько событий отправлялись в один файл? |
| Зачем ? Есть a := Directory(<маска>) и собирайте, если надо или проще по одному элементу отрабатывать массив a
|
|
|
|
| постоянный участник
|
Пост N: 3640
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.03.21 22:27. Заголовок: PS А может так ? FO..
PS А может так ? 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
|
|
|
|
|
| постоянный участник
|
Пост N: 269
Зарегистрирован: 27.07.08
|
|
Отправлено: 25.03.21 13:54. Заголовок: SergKis пишет: ICS..
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 И тогда уже можно сделать выбор по дате - только тех, кто позже даты последней автосинхронизации, заносимой в регистр автоматически при нажатии на кнопку "Синхронизация"
|
|
|
|
| постоянный участник
|
Пост N: 3641
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.03.21 15:35. Заголовок: Dr. Oldwarez пишет И..
Dr. Oldwarez пишет цитата: | И хотелось бы привести это всё к одному формату, принятому в ICS: |
| Для этого, вроде, все есть 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
|
|
|
|
| постоянный участник
|
Пост N: 1618
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.03.21 17:16. Заголовок: Dr. Oldwarez пишет: ..
Dr. Oldwarez пишет: цитата: | Отлично! У меня получилось. |
| В цикле выполнить вызов curl? Поздравляю.
|
|
|
|
| постоянный участник
|
Пост N: 270
Зарегистрирован: 27.07.08
|
|
Отправлено: 25.03.21 20:59. Заголовок: Петр пишет: В цикле..
Петр пишет: цитата: | В цикле выполнить вызов curl? Поздравляю. |
| Этак вот 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
|
|
|
|
| постоянный участник
|
Пост N: 271
Зарегистрирован: 27.07.08
|
|
Отправлено: 25.03.21 21:00. Заголовок: Петр пишет: К тому ..
Петр пишет: цитата: | К тому же инсталлятор весом меньше 1 Га в наше время моветон |
| Вот только моему шефу этого не говорите. Для него это как красная тряпка для быка
|
|
|
|
| постоянный участник
|
Пост N: 3645
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.03.21 07:51. Заголовок: Dr. Oldwarez Поправ..
Dr. Oldwarez Поправьте в посте 270 [ i ] без пробелов (это служебный тэг), на [ i ] с пробелами, искажение текста не будет
|
|
|
|
| постоянный участник
|
Пост N: 3646
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.03.21 07:56. Заголовок: Dr. Oldwarez пишет В..
Dr. Oldwarez пишет цитата: | Вот только моему шефу этого не говорите. Для него это как красная тряпка для быка |
| цитата: | В Windows 10 build 17063 и более поздних версиях теперь включен Curl, так что вы можете запускать его непосредственно из Cmd.exe или PowerShell.exe. |
|
|
|
|
|
| |
Пост N: 7289
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.03.21 10:10. Заголовок: SergKis пишет: Попр..
SergKis пишет: цитата: | Поправьте в посте 270 [ i ] без пробелов (это служебный тэг), на [ i ] с пробелами, искажение текста не будет |
| я поправил
|
|
|
|
| постоянный участник
|
Пост N: 272
Зарегистрирован: 27.07.08
|
|
Отправлено: 26.03.21 13:44. Заголовок: SergKis пишет: ци..
SergKis пишет: цитата: | цитата: В Windows 10 build 17063 и более поздних версиях теперь включен Curl, так что вы можете запускать его непосредственно из Cmd.exe или PowerShell.exe. |
| И это радует. А то придётся уже через libcurl продираться.
|
|
|
Ответов - 174
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|