[ID CS4-CS6] ExtendScript Socket обращение к HTTPS

Статус
Закрыто для дальнейших ответов.

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Кто-нибудь пытался научить сокеты работать с защищенными ресурсами?
Хочется к REST API Bitbucket-а обращаться для всякого.
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
Так и не разобрались? Меня тоже интересует HTTPS... Еще не пробовал, но думаю что там нужен SSL и ключ How does HTTPS actually work? | Robert Heaton нужно гуглить в этом направлении...

Как вариант - начиная с CC версий - программы устанавливаются с NodeJS (Photoshopgenerator, CC Libraries, CreativeCloud [установщик] и т.п. работают на ноде) - думаю можно соорудить зомби-сервер на NodeJS (или Python / Ruby / что-то еще), который будет получать команды от ExtendScript, выполнять и возвращать результат в ExtendScript

[UPD] В документации пишут что через ExtendScript можно подгружать библиотеки на С/С++
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
@Oleh Melnyk,
1. У меня CS6, поэтому волшебство с NodeJS идет мимо меня.
2. Из форумов понял, что нет, не получится получить ответ на запрос HTTPS.
3. Библиотеки, конечно, прекрасно, но насколько я понял из документации, сначала такую библиотеку нужно сделать и расточить ее под ExternalObject.
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
@Oleh Melnyk,
1. У меня CS6, поэтому волшебство с NodeJS идет мимо меня.
2. Из форумов понял, что нет, не получится получить ответ на запрос HTTPS.
3. Библиотеки, конечно, прекрасно, но насколько я понял из документации, сначала такую библиотеку нужно сделать и расточить ее под ExternalObject.

1а. Неужели лицезия останавливает от перехода на СС версию?)
1б. Что мешает поставить сторонний NodeJS в систему, поднять зомби-сервер (или его правельней назвать прокси-сервер?) и научить его общатся с ExtendScript?
2. Пишут что невозможно, но нет ничего невозможного - есть недостаточное количество попыток, не?
3. К сожалению в программировании не силен, особенно в С/С++ но мне казалось что можно взять готовую С/С++ библиотеку, может даже от того же NodeJS, и подцепить

Неужели не найдется крутых спецов которые могут что-то придумать?
Я конечно буду пробовать, но я пока не настолько крут в программировании((
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
1а. Это не моя личная политика, это политика издательства. Какой софт стоит, на тот и работаю.
1б. Ничего не мешает, кроме см. пункт 1а. Нужно "ничего не ставить". Прав у пользователей на это нет.
2. "Не". Есть целесообразность. А надо ли упираться в моем случае — покумекали, решили, нет смысла, ничего секретного в момент запроса мы не запрашиваем. Оставили обычный HTTP.
3. Нет. См. стр. 203, указанного тобой мануала.

Если у тебя есть время и задача — пробуй, может, действительно, нащупаешь вариант. Для CC, думаю, да, можно было бы нодой это реализовать, но для CS — увы.
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
1б. NodeJS вроде и ставить не надо - можно скопировать папку с установленым и запустить

Еще вроде была возможность с ExtendScript обратиться к Adobe Bridge (через всякие там bridgetalk) и обратиться к https но видимо лавочку прикрыли или я что-то не так делаю?
Loads data from a URL in Adobe Illustrator! (Uses Bridge behind the scenes) · GitHub (первые две строчки там лишние) - данный метод подгружает С/С++ библиотеку webaccesslib из папки Adobe Bridge, т.е. библиотека у нас есть, осталось разобраться как заставить ее работать!
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
И? Из CS6 как к Node обратиться?

Код:
var doc = app.activeDocument;

function loadUrl(url, callback) {

    var bt = new BridgeTalk();
    bt.target = 'bridge' ; 

    var s = '';
    s += "if ( !ExternalObject.webaccesslib ) {\n";
    s += "  ExternalObject.webaccesslib = new ExternalObject('lib:webaccesslib');\n";
    s += "}\n";
    s += "var html = '';\n";
    s += "var http = new HttpConnection('" + url + "') ; \n";
    s += "http.response = html;\n";
    s += "http.execute() ;\n";
    s += "http.response;\n";

    bt.body = s;

    bt.onResult = function( inBT ) {
        callback( null, inBT.body );
    };
    bt.onError = function( inBT ) { callback( 1, null ); };
    bt.send( 50 );       
}

function done( err, data ) {
    if ( err ) {
       $.writeln( 'FAILED' );
    } else {
        $.writeln( data );
    }
}

loadUrl( 'https://yandex.ru', done );
Вот код, который из InDesign обратиться к bridge, загрузит библиотеку и получит страницу Яндекс. Только конявый Bridge запустится.
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
И? Из CS6 как к Node обратиться?
Вот код, который из InDesign обратиться к bridge, загрузит библиотеку и получит страницу Яндекс. Только конявый Bridge запустится.

В том то и фишка что так не работает, но истина где-то рядом...
Кажется я получил и записал https в файл


Код:
#target bridge

if ( !ExternalObject.webaccesslib ) {
    ExternalObject.webaccesslib = new ExternalObject('lib:webaccesslib');
}

var http = new HttpConnection("https://google.com.ua");
http.execute();
var result = http.response;

var f = File("~/Desktop/google.txt");
f.open("w", "utf-8");
f.write(result);
f.close();
f.execute();

PS: и да, оно работает без NodeJS - просто подгружает из папки установки Adobe Bridge файл webaccesslib.dll в котором есть методы для работы с https
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ну и на кой же мне запуск Bridge, если задача в том, чтобы скачать ряд файлов (точнее сравнить их с файлами у пользователя и обновить или добавить новые, убрать ненужные)?
И это нужно сделать максимально незаметно для пользователя, потому что у него не об этом голова болеть должна. А тут запускает индез и понеслось всякое...
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
ах да, как из CS6 можно к ноде обращатся:
1) копируем папку с установленой нодой
2) пишем сервер на ноде, который будет работать по http - принимать и выполнять команды, возвращать результат в JSON или просто в текстовом виде
3) запускаем наш самописный прокси-червер на ноде
4) с ExtendScript делаем запрос на наш Node-сервер по http
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
Ну и на кой же мне запуск Bridge, если задача в том, чтобы скачать ряд файлов (точнее сравнить их с файлами у пользователя и обновить или добавить новые, убрать ненужные)?
И это нужно сделать максимально незаметно для пользователя, потому что у него не об этом голова болеть должна. А тут запускает индез и понеслось всякое...

Ну так можно теперь скопировать webaccesslib.dll в папку с индизом, или из скрипта указать путь к библиотеке и вперёд!
Нужно нагуглить какое там API в webaccesslib - как слать GET / POST и т.п. - главное что возможность получить https есть, и была давно, но никто не знал о ней!
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Ну точно — скрипт же будет весить всего мегов 100, чо такова :) Целесообразность.
 

vbatushev

Топикстартер
20 лет на форуме
Сообщения
2 242
Реакции
1 227
Попробовал скопировать dll-ку в папку со скриптом — ошибка.
Попробовал скопировать dll-ку в папку с индезом — ошибка.
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
Ну точно — скрипт же будет весить всего мегов 100, чо такова :) Целесообразность.
Мы сейчас говорим о двух альтернативные методах:
1) через NodeJS - можно реализовать что угодно!
2) через webaccesslib - в библиотеке должно быть уже готовое айпи для работы с http/https протоколом

почему код (текст) должен быть таким большим? Хотя, если функционал этого требует - почему бы и нет?)) Я так понимаю вам доступ к веб-сервисам на самом деле не нужен раз вы совершенно не разделяете моего энтузиазма ... Я только что нашел ответ на извечный вопрос - как работать с https из ExtendScript!
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
Попробовал скопировать dll-ку в папку со скриптом — ошибка.
Попробовал скопировать dll-ку в папку с индезом — ошибка.
Да, есть такая засада :(

Тогда так:

Код:
#target indesign

BridgeTalk.prototype.sendSynch = function(timeout) {
    var self = this;
    self.onResult = function(res) {
    this.result = res.body;
    this.complete = true;
    }
    self.complete = false;
    self.send();

    if (timeout) {
        for (var i = 0; i < timeout; i++) {
            BridgeTalk.pump(); // process any outstanding messages
            if (!self.complete) {
                $.sleep(1000);
            } else {
                break;
            }
        }
    }
    var res = self.result;
    self.result = self.complete = self.onResult = undefined;
    return res;
}
// for typos, provide an alias
BridgeTalk.prototype.sendSync = BridgeTalk.prototype.sendSynch;

function loadUrl(url, timeout) {
    var bt = new BridgeTalk();
    bt.target = 'bridge';
    var httpTimeout = timeout;
    var script = '';
    script += "if ( !ExternalObject.webaccesslib )\n";
    script += "  ExternalObject.webaccesslib = new ExternalObject('lib:webaccesslib');\n";
    script += "var response = null;\n";
    script += "var retry = true;\n";
    script += "while (retry) {\n";
    script += "  var http = new HttpConnection('" + url + "') ; \n";
    script += "  http.timeout  = " + httpTimeout + ";\n";
    script += "  http.execute() ;\n";
    script += "  try{\n";
    script += "    response = http.response;\n";
    script += "    retry = false;\n";
    script += "  } catch (e){\n";
    script += "    BridgeTalk.bringToFront('indesign');\n";
    script += "    if (!confirm('There was an error communicating with the server. Would you like to retry?'))\n";
    script += "      retry = false;\n";
    script += "  }\n";
    script += "}\n";
    script += "response;\n";
     
    bt.body = script;
    return bt.sendSynch(timeout);
}

var result = loadUrl("https://ya.ru", 50);

// вставляем ответ - html страничку в выделений текстовой фрейм
app.selection[0].contents = result;

В индизе - создаем текстовой фрейм, выделяем и запускаем скрипт...
Чтобы Bridge не выскакивал - его можно запускать при загрузке системы, и держать свернутым
Пока так... можно поискать другие С/С++ библиотеки для https
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 228
Реакции
10 851
Насколько я понимаю, из ES нативную библиотеку невозможно вызвать по определению. Максимум, , что можно сделать - откомпилировать платформеннозависимый исполняемый модуль и вызвать его из индизайна через execute
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Насколько я понимаю, из ES нативную библиотеку невозможно вызвать по определению. Максимум, , что можно сделать - откомпилировать платформеннозависимый исполняемый модуль и вызвать его из индизайна через execute

неправильно понимаешь.
You can extend the JavaScript DOM for an application by writing a C or C++ shared library, compiling it for the platform you are using, and loading it into JavaScript as an ExternalObject object. A shared library is implemented by a DLL in Windows, a bundle or framework in Mac OS, or a SharedObject in UNIX.

You can access the library functions directly through the ExternalObject instance, or you can define an interface that allows your C/C++ code to create and access JavaScript classes and objects.


как-то странно кстати выглядит - тема про cc2015, а копья ломаются о том, что в CS6 node.js недоступна )
 

Oleh Melnyk

Участник
Сообщения
23
Реакции
6
Насколько я понимаю, из ES нативную библиотеку невозможно вызвать по определению. Максимум, , что можно сделать - откомпилировать платформеннозависимый исполняемый модуль и вызвать его из индизайна через execute
Почему же нельзя - выше примеры которые это делают!
Просто Bridge нормально подгружает эту библиотеку, а InDesign выдает ошибку I/O т.е. чтение / запись (Input/Output).
Я так понимаю что или в эту библиоткеку вшита проверка, чтобы он работал только через Bridge, или в Bridge еще какие-то необходимые методы, недостающие в InDesign, или мы что-то делаем "не так"
 
Статус
Закрыто для дальнейших ответов.