Работа с Яндекс.Диском (обычная и управляемая форма)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

55 Comments

  1. json

    Правильно ли я понимаю, что данная обработка умеет работать с файлами в облаке исключительно средствами http без необходимости установки приложения Яндекс.Диск?

    Reply
  2. Xershi

    (1) yurii_host, все верно! Для работы нужен только логин, пароль и доступ в интернет!

    Reply
  3. apatyukov

    (1) yurii_host, Единственно что автор не указал, файлы размером больше 2 гб не проходят при таком способе подключения.

    Reply
  4. Xershi

    (3) apatyukov, а вы тестировали этот метод? А чем отличается загрузка 2гб+ не в курсе?

    Reply
  5. apatyukov

    (4) yandex принудительно прерывает коннект.

    https://yandex.ru/support/disk/uploading.html

    Reply
  6. Xershi

    (5) apatyukov, так у меня же и используется WebDAV.

    Для загрузки файлов размером больше 2 ГБ используйте программу «Яндекс.Диск» (в версии для Windows, для Mac OS или для Linux) или WebDAV-клиент. Браузеры не смогут обработать такие большие файлы.
    Reply
  7. apatyukov

    (6) ну так попробуй выгрузить 3гб.

    Reply
  8. Xershi

    (7) apatyukov, протестировал обработку — загрузка файла 1.1 Гб прошла, а вот 2.2 ГБ через 30 секунд отваливается:

    Ошибка копирования файлов: Ошибка доступа к файлу ‘https://Логин:xxxxxxx@webdav.yandex.ru/ПапкаИз1С/Видео.rar’: Ошибка работы с Интернет:   Failed sending data to the peer

    На хакере описали как заставить висеть коннект бесконечно:

    request.ReadWriteTimeout = -1;

    Но как это применить к моей разработке, пока не знаю.

    Если есть идеи велком!

    Поэтому пока добавлю в описание, ограничение до 2 Гб.

    Reply
  9. apatyukov

    (8) собственно что и требовалось доказать.

    Reply
  10. sikuda
  11. Xershi

    (12) sikuda, да там ссылка на https://tech.yandex.ru/disk/api/concepts/about-docpage/, а я пока не сильно писал HTTP-запросы. Но я думаю дело за малым. Но смущает регистрация https://tech.yandex.ru/oauth/.

    Reply
  12. DoctorRoza

    + на дальнейшее развитие!

    Reply
  13. sikuda

    (13) Ну если совсем не заморачиваться с безопасностью то диск яндекс можно подключить к своему компьютеру как виртуальный

    https://yandex.ru/support/disk/webdav/webdav-win.xml

    И он вообще будет мало отличаться от реального. Только скоростью.

    Если Вы не хотите передавать пароль в открытом виде или Вам на вашей фирме серьезно относятся к безопасности. То лучше немного напрячься — получить token на год

    Причем token можно получить как на чтение так и на полный доступ. Здесь уже открываются другие перспективы…

    Вот насчет файлов в 3 гб. надо попробовать.

    Reply
  14. Xershi

    (15) sikuda, вчера потестировал сервис, ничего не вышло с запросами, Так что отложим до лучших времен. У меня задача выгружать фото на ядиск, а их размер с текущими камерами на телефонах намного ниже 2 гб, так что задачу я решил.

    Reply
  15. shakmaev

    1С прекрасно работает с Webdav. К чему делать обработку? Простите, немного не понял.

    Путь1 = «https://login:pass@webdav.yandex.ru/path/to/file.txt»;
    Путь2 = «c:file.txt»;
    КопироватьФайл(Путь1, Путь2);
    УдалитьФайлы(Путь1);
    КопироватьФайл(Путь2, Путь1);
    
    Reply
  16. Xershi

    (17) shakmaev, вы сами и ответили на свой вопрос. Обработку пишут для пользователя.

    Reply
  17. kuntashov

    Реализация REST API Я.Диска с OAuth-авторизацией в виде библиотеки для 1Script https://github.com/kuntashov/oscript-yadisk

    Пример использования — скрипт для публикации файлов на Я.Диске: https://github.com/kuntashov/oscript-yadisk-uploader

    p.s.

    1Script: http://oscript.io

    Подробнее об 1Script на ИС: http://infostart.ru/public/327581/

    Reply
  18. Xershi

    (19) kuntashov, реализация в виде библиотеки это самое просто решение, но интересно будет написать все кодом 1С. Конечно тогда будет ограничение на версию 1С: 8.3.

    Reply
  19. kuntashov
    но интересно будет написать все кодом 1С

    Там и написано все «кодом 1С». По ссылке поленились, видимо, пройти?

    Reply
  20. Xershi

    (21) kuntashov, использование скрипта это лишнее звено, вот о чем речь была.

    Reply
  21. kuntashov

    (22) вообще-то код будет работать и, например, в модуле обработки практически «как есть» (копированием-вставкой с небольшими доработками, связанными с необходимостью замены использования библиотеки json на штатные методы 1С для парсинга json).

    Плюс там описана процедура авторизации oauth и получения токена, с чем у вас возникли трудности, судя по вашему же комментарию выше.

    Reply
  22. Xershi

    (23) kuntashov, а вот это уже интересно. Много кода портировать придется?

    Reply
  23. kuntashov

    (24) явные отличия есть только в методах работы с json (но на самом деле они взяты из разработки http://infostart.ru/public/119601/, т.е. можно использовать его же вместо штатных методов платформы) + используется модуль логирования. Но вызовы методов этих библиотек локализованы и могут быть заменены.

    Reply
  24. alem

    Здравствуйте, скачал файл — не работает. Может подскажите в чем причина? При входе в почту диск — файлы добавляются удаляются.

    При копировании строки подключения в браузер система даже запрашивает пароль, но дальше ничего не происходит

    При чтении

    Файл не обнаружен ‘https://imsb1c:xxxxxxx@webdav.yandex.ru/imsb/СКД.jpg’

    по причине:

    Ошибка работы с Интернет: ресурс не найден (404).

    При записи

    Ошибка при выполнении файловой операции ‘https://imsb1c:xxxxxxx@webdav.yandex.ru/imsb/СКД.jpg’

    по причине:

    Ошибка работы с Интернет: запрос не может быть выполнен из-за конфликта с текущим состоянием ресурса (409).

    Reply
  25. Xershi

    (26) alem, проверяйте настройки вашего ПК. Скорее всего антивирус блокирует.

    Reply
  26. alem

    (27) отключил, тоже самое.

    у меня win 10, это может влиять?

    + «При копировании строки подключения в браузер система даже запрашивает пароль, но дальше ничего не происходит «

    Reply
  27. Xershi

    (28) alem, на 10 я не тестировал.

    xxxxxxx это у вас такой пароль?

    Введите туда реальные данные!

    Если и с реальным паролем через браузер качать не будет, то проблема в винде. Ищите решение в интернете. Скорее всего там еще куча всяких блокировщиков, аля защита от фишинга и прочее!

    Reply
  28. alem

    там данные реальные, при ошибки система меняет пароль на хххххх, код полностью ваш, убрал только «попытку», чтобы видеть ошибку

    в яндексе настраивать что то нужно?

    Reply
  29. alem

    попробовал с сервера 2008 r2 — не работает

    Reply
  30. Xershi

    (30) alem, настраивать ничего не нужно. Нужно ввести логин и пароль. Если эта строка в браузере не работает, то я вам уже сказал, проверяйте настройки винды.

    Reply
  31. Xershi

    (31) alem, значит у вас проблемы в настройках сети или ваш провайдер ограничил доступ. Спросите админа сети, какие есть ограничения. Можете также написать запрос в яндекс, чтобы они сообщили вам что нужно для работы сервиса!

    Сейчас проверил работу обработки: проблем нет!

    Решите технические вопросы, которые не связаны с работой обработки и у вас все тоже заработает!

    Reply
  32. alem

    Работает, но только если на компе не установлено приложение диска (если диск установлен, но отключен — не работает)

    Reply
  33. Xershi

    (34) alem, скорее всего он работает как служба и перехватывает запросы. Попробуйте найти его в службах?

    Приложение позволяет же отправлять файлы более 2 ГБ, поэтому они так сделали.

    Reply
  34. o.nikolaev

    На 8.2 падает платформа, было бы неплохо предупреждать о том что на 8.2, как минимум, такой подход не работает.

    Reply
  35. Xershi

    (36) o.nikolaev, а какой у вас релиз? Несовместимости с 8.2 в коде нет. Скорее всего у вас длл сбоит.

    Reply
  36. o.nikolaev

    (37) 8.2.19.130

    Какая именно dll «сбоит»?

    Reply
  37. Xershi

    (38) o.nikolaev, открывайте лог винды и дамп спец утилитой.

    Переустановка платформы не помогает?

    Reply
  38. botman4

    на клюшка заведется ?

    Reply
  39. Xershi

    (40) botman4, если переписать синтаксис, то скорее всего да.

    Но нужно тестировать.

    Reply
  40. ZhakeKZ

    Здравствуйте?

    Выдал ошибку:

    {ВнешняяОбработка.ОбменЯндексДиск.МодульОбъекта(257,11)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Индекс = <<?>>СтрНайти(URL, «/»);

    {ВнешняяОбработка.ОбменЯндексДиск.МодульОбъекта(263,11)}: Процедура или функция с указанным именем не определена (СтрНайти)

    Индекс = <<?>>СтрНайти(ИмяСервера, «:»);

    Reply
  41. Stan

    Выгрузка на яндекс диск работает, загрузка с я.диска — нет. Что может быть не так?

    Reply
  42. Xershi

    (42) добрый день! Если у вас конфигурация без совместимости 8.3.5, то «СтрНайти» нужно заменить на «Найти».

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

    Reply
  43. Xershi

    (43) проверить фаервол!

    Reply
  44. Xershi

    (42) проверил свою разработку! Такой строки кода там нет!

    Но судя по вашему тексту, кто-то вам сделал доработку!

    И в вашей версии конфигурации включен решим совместимости ниже 8.3.6.

    В моей версии есть строка:

    ЭтоОбъект = Найти(ТипЗначенияСтрокой, «Object.») > 0;

    Так вот до 8.3.6 есть метод «Найти», а вот с 8.3.6 нужно использовать метод «СтрНайти».

    Обращайтесь к тому кто вам делал доработку или пишите в ЛС!

    Reply
  45. leks88

    Заметил на практике, что ошибка «ресурс не найден (404)» появляется даже без установленного приложения яндекс-диска, а по банальной причине не соответствия регистра имени файла. В моем примере файл «discount.txt» не читался, если указывал название «Discount.txt»

    Reply
  46. dimasts

    Я правильно понимаю, что не предусмотрена возможность получения публичной ссылки на загруженный в ЯндексДиск файл?

    Reply
  47. Xershi

    (48) все верно! Данная разработка не предполагает такой функционал!

    Reply
  48. greenLiss

    Интересно, а возможно посмотреть список файлов на яндекс диске, так же просто?

    Reply
  49. Xershi

    (50) для этого требуется использовать сервис яндекса. На ИС есть уже публикация, в которой этот алгоритм реализован.

    Reply
  50. Sashares

    (8)

    Но как это применить к моей разработке, пока не знаю.

    Если есть идеи велком!

    Обработку не скачивал.

    Если вы используете http соединение, то добавить в заголовки ReadWriteTimeout со значением -1.

    Reply
  51. Xershi

    (52) там другой принцип. Если переписать на запросы думаю и подойдет, но на текущий момент это уже не требуется.

    Reply
  52. IsiKosta

    А как получить ссылку на загруженный файл?

    Reply
  53. Xershi

    (54) работа обработки не предполагает создание публичной ссылки, только прямой доступ.

    Reply
  54. Sergafan10

    5.5 Гб через webdav грузится. Думаю, что это не потолок.

    Reply
  55. Xershi

    (56) ранее было ограничение, возможно его убрали. Не проверял.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *