Таблицы numbers icloud и JS


Новый заказ, с которым работаю прямо сейчас, включает в себя организацию совместной работы нескольких систем, одна из них – это таблицы Apple. Требуется периодически брать оттуда информацию и посылать её боту телеграм. Расскажу немного об этом.

Необходимо вытащить, и не просто вытащить, а структурировать данные из таблицы numbers icloud – то есть сервиса таблиц, которым пользуются на айфонах, например. Несколько человек имеют доступ к одной и то же и могут читать и вносить изменения. На первый взгляд задача кажется простой, однако, все не так просто.

Начнем с того, что для таблиц icloud нет апи. Вот совсем нет. Есть неофициальное апи для Apple - Доступ к аккаунту, чтение контактов и тому подобное – теоретически вполне возможно, что с помощью данного апи можно будет и забирать данные из numbers. Но в данной ситуации не стоит предоставлять данные аккаунта apple непонятно кому (в данном случае мне), так что этот вариант исключаем.

Дальше, так как к таблице можно получить доступ из браузера, то пробуем зайти на неё и посмотреть. Обычная таблица напоминает экселевскую и гугл таблицы. Получать страницу через curl php – ничего не выйдет – используется динамическая подгрузка/формирование контента на JS.

В принцип можно попробовать безголовый браузер по типу phantom – но я даже не стал этого делать, посмотрев на внутренности сайта, так как с уверенностью можно сказать, что

  1. будет большая нагрузка на сервер
  2. будут глюки
  3. не факт что вообще безголовый сможет сформировать страницу
Не стоит унывать, всегда же можно использовать настоящий компьютер, написать расширение для браузера и периодически забирать данные со страницы. Если посмотреть на исходник страницы с таблицей, то можно увидеть, что данные ячеек располагаются в тегах <text>. Все их можно получить вот так:

$.each(jQuery(".svg-table-cell-content-layer").find("text"),function(index,value){ 
		Console.log(value.textContent);	
	});
Проблема в том, что они идут не по порядку. Пробуем навести порядок, создать массив и прочее –нет, не получается. Причем при добавлении новой строки или изменении ячейки все еще больше запутывается.

Понятно, что внутри программисты Apple предусмотрели такое и отслеживается каким-то образом доступ к каждому элементу, но немного порывшись в их JS, я навскидку не смог понять системы. Да и логично – вряд ли код будет написан так, чтобы любой мог разобраться

В общем поэкспериментировал я, с разных компьютеров, вообще получил разные результаты и немного приуныл. Оставил решение до следующего дня – может что придет в голову. Утром следующего дня, открыв страницу, и выведя результаты, я очень удивился – все было по порядку! Хм, все понятно – при редактировании ячейки заполняются и создаются по каким то неизвестным мне правилам, но вот после обновления они получаются отлично структурированным.

Теперь можно получить доступ к любому столбцу в таблице

var arr = new Array();
	$.each(jQuery(".svg-table-cell-content-layer").find("text"),function(index,value){ 
		arr[index] = value.textContent;	
	});
	
	for (var i = 0; i < arr.length; i++) {
		if (((i - 2) % 9 == 0) && (i!=2)) {
			name = name+arr[i].trim()+";";
			wallet = wallet+arr[i + 3].trim()+";";
		}
	}
Ну а отправка данных вообще не проблема:

$.post( "принимающий сервер", { 
		name: name, 
		wallet: wallet })
	.done(function( data ) {
		console.log(data);  
	});	
А слона то я и не заметил

Уже в процессе написания данной заметки я снова проглядел страничку и нашел, что вообще-то скорее всего можно структурировать элементы без обновления страницы – по атрибутам икс и игрек:



Логично предположить, что в этих атрибутах указаны координаты ячейки в различных системах отсчёта. Но переделывать расширение пока не стал – оно успешно справляется со своей задачей, стоит себе на виртуальном сервере на виндовс сервер в хроме и отправляет данные круглосуточно. А если работает, то лучше не трогать.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, js, apple, numbers




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 30. Функции JavaScript: параметры и аргументы
Баланс и DRY (Don't Repeat Yourself)
Урок 19. Простые функции форматирования строк C#