XlsxProxy - загрузка табличных данных с ЯндексДиск, GoogleDocs или своего сервера

В свете последних новостей (тут и тут) про будущие блокировки иностранных облачных сервисов для всех пользователей в РФ было решено подготовиться к прозрачной миграции таблиц с GoogleDocs на ЯндексДиск или свой сервер.

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

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

Но напрямую с xlsx-документами на клиенте работать неудобно, слишком “жирные” библиотеки придется таскать с собой. Так появился xlsxproxy - сервер, проксирующий запросы к xlsx-документам, лежащим по указанным url-адресам, разбирающий их на отдельные страницы и отдающий только нужную в формате csv.

Особенности сервера:

  • Написан на golang, потребляет пару десятков мегабайт памяти, хорошо себя ведет под нагрузкой.
  • Умеет собираться/работать в docker, образ занимает меньше 10Мб.
  • Есть поддержка аутентификации для нескольких пользователей.
  • Есть поддержка ssl-ключи для https-шифрации трафика - будет полезным для тех, кто не хочет настраивать фронт-прокси на базе какого-нибудь nginx для этого.
  • Есть поддержка кеширования для уменьшения нагрузки на внешние сервисы и снижения риска быть забаненными за многократное скачивание за короткий период (банят на короткий срок, но все-равно неприятно).

Сервер поддерживает xlsx-документы, доступные по прямым ссылкам (CDN, свой файловый хостинг, например, Seafile + OnlyOffice DocumentServer):

1
curl -L "http://my.proxy.site/direct?url=<url-encoded-ссылка>&page=<url=encoded-имя-страницы>"

Так же есть поддержка xlsx-документов на ЯндексДиск, доступные по ссылкам из веб-интерфейса окна “Поделиться” (https://disk.yandex.ru/i/aABbCcDdEeFfGg):

1
curl -L "http://my.proxy.site/yandex?url=<url-encoded-ссылка>&page=<url=encoded-имя-страницы>"

Для облегчения миграции была добавлена поддержка таблиц-документов и для GoogleDocs, доступные по ссылке из адресной строки браузера (https://docs.google.com/spreadsheets/d/111222__AaaBbb/edit?gid=1548517124):

1
curl -L "http://my.proxy.site/google?url=<url-encoded-ссылка>&page=<url=encoded-имя-страницы>"

Пакет Leopotam.GoogleDocs.Unity был расширен новым функционалом для облегчения работы с xlsxproxy-сервером.

Поддержка скачивания с прямой ссылки:

1
2
3
4
5
6
7
8
9
10
11
// Адрес xlsxproxy-сервера, включая порт и префикс апи.
string xlsxProxy = "http://my.proxy.site";
// Прямая ссылка на xlsx-документ.
string docUrl = "https://direct.download.site/file.xlsx";
string docPage = "Лист1";
var client = new XlsxProxyClient (xlsxProxy);
(string csv, string err) = await client.LoadFromDirect (docUrl, docPage);
if (err != null) {
// Что-то пошло не так, в err текст ошибки.
}
// Можно работать со строкой csv-данных.

Поддержка скачивания с YandexDisk:

1
2
3
4
5
6
string xlsxProxy = "http://my.proxy.site";
// Ссылка на xlsx-документ из окна "Поделиться" веб-интерфейса.
string docUrl = "https://disk.yandex.ru/i/aABbCcDdEeFfGg";
string docPage = "Лист1";
var client = new XlsxProxyClient (xlsxProxy);
(string csv, string err) = await client.LoadFromYandex (docUrl, docPage);

Поддержка скачивания с GoogleDocs:

1
2
3
4
5
6
string xlsxProxy = "http://my.proxy.site";
// Ссылка из адресной строки браузера.
string docUrl = "https://docs.google.com/spreadsheets/d/1_xxxxxxx-yyyy/edit#gid=0";
string docPage = "Лист1";
var client = new XlsxProxyClient (xlsxProxy);
(string csv, string err) = await client.LoadFromGoogle (docUrl, docPage);

Так же поддерживается http basic аутентификация:

1
2
3
4
5
6
7
string xlsxProxy = "http://my.proxy.site";
string login = "test";
string password = "pass";
string pageUrl = "https://direct.download.site/file.xlsx";
string docPage = "Лист1";
var client = new XlsxProxyClient (xlsxProxy, login, pass);
(string csv, string err) = await client.LoadFromDirect (docUrl, docPage);
Актуальные версии пакетов доступны в закрытом discord-сервере для vk/boosty-подписчиков.
Оформить подписку можно здесь: