Имя: Пароль:
1C
 
http-запрос через COM-объект, или как переложить код из 77 в 81
0 Cherokee
 
14.10.10
09:14
Здравствуйте!
Стоит задача - сделать отправку смс из 1с. провайдер предоставил набор команд для отправки и проверки состояния. Отправка делается GET-запросом в UTF8 кодировке. Тестовый аккаунт и пароль проверен вчера - все работает.Для начала, вот то что я сам накропал на 8.1

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   WinHttp= Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.Option(2,"Windows-1251");                  
   WinHttp.Open("GET","http://phtest1012:phtest1012@gate.prostor-sms.ru/send/?phone=+79095961559&text=test",0);

   WinHttp.SetRequestHeader("Accept-Language", "ru");
   WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");//
   WinHttp.setRequestHeader("Content-Language", "ru");
   WinHttp.setRequestHeader("Content-Charset", "Windows-1251"); //
   //WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Windows-1251"); //
   WinHttp.Send();
   Сообщить(WinHttp.responsetext);
   
КонецПроцедуры

Приходит ответ: error authorization
1 Cherokee
 
14.10.10
10:11
Задам вопрос по-другому. Помогите перекинуть этот код из 7.7 на 8.1.

Процедура Выполнить()
   
   Параметр=СоздатьОбъект("СписокЗначений");
   Параметр.ДобавитьЗначение(текст, "Текст");
   Параметр.ДобавитьЗначение("1110", "Параметры");
   
   ОткрытьФормуМодально("Отчет",Параметр,КаталогИБ() +  "ExtForms/B_UTF8_3_0.ert");

   текст1 = Параметр;
   
   Попытка
       Соединение = СоздатьОбъект("Addin.V7HttpReader");
   Исключение
       Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"v7plus.dll")=0 Тогда
       Если ЗагрузитьВнешнююКомпоненту("v7plus.dll")=0 Тогда
           Сообщить("Не удалось обнаружить компоненту V7Plus.dll!");
           СтатусВозврата(0);
           Возврат;
       КонецЕсли;
       КонецЕсли;
   КонецПопытки;
   
   Попытка
       Соединение = СоздатьОбъект("Addin.V7HttpReader");
       Соединение.КоличествоПопытокАвторизации = 0;
   Исключение
       Сообщить("Не удалось создать объект Addin.V7HttpReader!");
       СтатусВозврата(0);
       Возврат;
   КонецПопытки;
       
   Попытка        
       ОтзывСервера = "";
       Соединение.Пользователь(сокрЛП(Логин),СокрЛП(Пароль));
       Соединение.Получить("http://" + сокрЛП(Логин) + ":" + СокрЛП(Пароль) + "@gate.prostor-sms.ru/send/?phone=%2B" + СокрЛП(Тел) + "&text=" + сокрЛП(текст1),ОтзывСервера,2);
           
       // запомним id принятого сообщения
       ID_смс = Лев(СокрЛП(ОтзывСервера), СтрДлина(СокрЛП(ОтзывСервера)) - 9);
       
       status_ = Прав(СокрЛП(ОтзывСервера), 8);
       
       Если status_ = "accepted" Тогда
           сообщить("Смс принята сервером...");
           сообщить("---===---");
           
           смс_принято = 0;
           Пока смс_принято = 0 Цикл      
               Соединение.Получить("http://" + сокрЛП(Логин) + ":" + СокрЛП(Пароль) + "@gate.prostor-sms.ru/status/?id=" + ID_смс,ОтзывСервера,2);
               
               состояние("Идет доставка смс...");
               status_ = Прав(СокрЛП(ОтзывСервера), 9);
               
               Если status_ = "delivered" Тогда
                   сообщить("---===---");
                   сообщить("Смс успешно доставлена...");
                   сообщить("---===---");
                   смс_принято = 1;
               КонецЕсли;    
           КонецЦикла;    
                   
       КонецЕсли;    
       
   Исключение  
       Сообщить("Ошибка соединения с сервером: " + ОписаниеОшибки());  
   КонецПопытки;

КонецПроцедуры
2 le_
 
14.10.10
10:20
(0) А что, если без COM-объекта попробовать?

HTTP = Новый HTTPСоединение(...);
HTTP.Получить(...);
//ИЛИ HTTP.ОтправитьДляОбработки(...);

?
3 le_
 
14.10.10
10:22
И еще, в (0) упоминается UTF-8 и в то же время в коде везде Win-1251 - в чем подвох? )
4 acsent
 
14.10.10
10:22
1000р
5 Cherokee
 
14.10.10
10:22
подвох в том что я еще туплю и разбираюсь. За совет спасибо, буду пробовать. Пишите еще, найду решение - отпишусь и сам.
6 Cherokee
 
14.10.10
11:41
продолжаю эксперименты.

   WinHttp= Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.Option(2,"Windows-1251");                  
   //WinHttp.SetProxy(0,"192.168.0.130:8080");
   WinHttp.Open("GET","http://api_phtest1012:api_phtest1012@gate.prostor-sms.ru/",0);
   //WinHttp.SetCredentials("sss","123456",1);

   WinHttp.SetRequestHeader("Accept-Language", "ru");
   WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");//
   WinHttp.setRequestHeader("Content-Language", "ru");
   WinHttp.setRequestHeader("Content-Charset", "Windows-1251"); //
   WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
   WinHttp.Send("send/?phone=79095961559&text=test");
   Сообщить(WinHttp.responsetext);

теперь и смс перестала приходить :(. Ответ тот же - ошибка авторизации
7 le_
 
14.10.10
11:53
(3) и (4) никак не повлияло? )
8 le_
 
14.10.10
11:54
(2) и (3) точнее )
9 Cherokee
 
14.10.10
12:57
все заработало. Окончательный код для будущих страдальцев, мало ли сгодится.

   WinHttp= Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
   WinHttp.Option(2,"Windows-1251");                  
   WinHttp.Open("GET","http://gate.prostor-sms.ru/send/?phone=%2B79211111111&text=тест",0);
   WinHttp.SetCredentials("phtest1012","phtest1012", 0);

   WinHttp.SetRequestHeader("Accept-Language", "ru");
   WinHttp.SetRequestHeader("Accept-Charset","Windows-1251");//
   WinHttp.setRequestHeader("Content-Language", "ru");
   WinHttp.setRequestHeader("Content-Charset", "Windows-1251"); //
   WinHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=Windows-1251");
   WinHttp.Send();
   Сообщить(WinHttp.responsetext);
10 ЗлобнийМальчик
 
14.10.10
12:59
пароль поменяйте)
11 Cherokee
 
14.10.10
13:04
чуток пояснений. Обработка работает, если надо сделать подключение к провайдеру, который отправляет смс-ки путем команды GET.

Подключаем через СОМ виндовую библиотеку, потом в метод OPEN, где сразу прописывается команда send с параметрами смс-ки.

Командой WinHttp.SetCredentials устанавливаем параметры юзер и пароль для входа на сервер провайдера. Последний флаг "0", что означает, что команда работает для входа на сервер. Подробней тут
http://msdn.microsoft.com/en-us/library/aa384058(VS.85).aspx

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

WinHttp.SetProxy(0,"192.168.1.1:3128");
WinHttp.SetCredentials("user","password", 1); где флаг 1 означает что это для прокси настройка.

Дальше не интересно. Последняя команда WinHttp.Send(); ,без текста, т.к. весь запрос прописан в команде Open.

enjoy
12 Cherokee
 
14.10.10
13:05
это тестовый доступ, он на 20 смс всего был