Перейти к содержимому


Фото
- - - - -

Отправка сообщений посредвством drweb c командной строки


  • Please log in to reply
71 ответов в этой теме

#41 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 26 Октябрь 2016 - 19:16

Можно и без баша, но не без iconv:
msg.cmd
@echo off
chcp 65001
echo %1|for /f %%f in ('iconv -f cp1251 -t UTF-8') do (
curl -u admin:pass -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
)
chchp 866
уходит в заэнкоденном utf-8:
> msg.cmd Проверка
> GET /api/3.0/stations/send-message.ds?id=xxx&message=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0 HTTP/1.1


#42 Afalin

Afalin

    Guru

  • Dr.Web Staff
  • 5 851 Сообщений:

Отправлено 26 Октябрь 2016 - 21:09

На пробелах часом не сломается ли? Где-либо в for … in.


Семь раз отрежь – один раз проверь

#43 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 27 Октябрь 2016 - 10:02

Можно и без баша, но не без iconv:
msg.cmd

@echo off
chcp 65001
echo %1|for /f %%f in ('iconv -f cp1251 -t UTF-8') do (
curl -u admin:pass -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
)
chcp 866
уходит в заэнкоденном utf-8:
> msg.cmd Проверка
> GET /api/3.0/stations/send-message.ds?id=xxx&message=%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0 HTTP/1.1

выполняю по аналогии с Вами, получаю снова вопросы вместо русских букв )) Это на Win7 если выполнять, выполняю на Win Server 2003 - вообще ничего не происходит (а выполняться должно именно там по задумке), моргнет окно консоли и тут же закрывается, pause не спасает, в PATH пути прописаны и до curl и до iconv
Касательно того, что происходит на Win7 при выполнении:

Выполняю

@echo off
chcp 65001
echo %1|for /f %%f in ('iconv -f cp1251 -t UTF-8') do (
curl -u admin:pass -k -v -G --data-urlencode id=xxx --data-urlencode message=Проверка "http://server:9080/api/3.0/stations/send-message.ds"
)
chcp 866

Что уходит:
 

Active code page: 65001

C:\Users\User\Desktop>(curl -u admin:Pass -k -v -G --data-urlencode id=xxx
xxx --data-urlencode message=�������� "http://server:9080/api/3.0/stations/send-message.ds"  )
*   Trying server...
* TCP_NODELAY set
* Connected to server (server) port 9080 (#0)
* Server auth using Basic with user 'admin'
> GET /api/3.0/stations/send-message.ds?id=xxxxxx&
message=%3F%3F%3F%3F%3F%3F%3F%3F HTTP/1.1
> Host: server:9080
> Authorization: Basic YWRtaW46QmZ3ITU0OTA2
> User-Agent: curl/7.50.3
> Accept: */*
>
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 381
< Content-Type: text/xml; charset=utf-8
< Date: Thu, 27 Oct 2016 06:51:31 GMT
< Keep-Alive: timeout=15
< Last-Modified: Thu, 27 Oct 2016 06:51:31 GMT
< Server: DrWebEnterpriseServer/REL-600-6.00.4.201211200 Windows_Server 2003/x86
 Lua/5.1.4 OpenSSL/0.9.8t
<
<?xml version="1.0" encoding="utf-8"?><drweb-es-api api_build='201206051' api_ve
rsion='3.1.7' local_timestamp='1477561891' operation='stations-send-message' ser
ver='server' srv_branch='REL-600' srv_version='6.00.4.201211200' status='
true' timestamp='1477551091'><stations total='1'><station id='xxx' status='true'/></stations></drweb-es-api>* Curl_http_done: c
alled premature == 0
* Connection #0 to host server left intact
Текущая кодовая страница: 866


Сообщение было изменено rivaldo89: 27 Октябрь 2016 - 10:03


#44 Kirill Polubelov

Kirill Polubelov

    Hr. Schreibikus

  • Dr.Web Staff
  • 4 362 Сообщений:

Отправлено 27 Октябрь 2016 - 10:43

Посмотрел powershell -- штука, конечно, привлекательная, но там с версиями беда.

Дефолтный ps в семерке не содержит, например, таких вещей как Net.HttpWebRequest или Invoke-WebRequest

То есть или обновлять powershell или как-то в имеющийся доставлять.

 

Предлагаю не мучаться и поставить питон =)

 

Тогда, всё просто:

# -*- coding: utf-8 -*-

import requests

user = 'admin'
passwd = '1'
url = "http://10.4.0.93:9080/api/3.0/stations/send-message.ds?id=f0b08888-d21d-b211-bc9a-a40764eb9c7d&message=Проверка"

response = requests.get(url, auth=(user, passwd))

print(response.content)

Бонус: можно заморочиться и через тот же "из коробки" Tkinter сделать себе крутецкий мессенджер: через xml api забирать список станций, и рассылать им что угодно)


(exit 0)

#45 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 27 Октябрь 2016 - 10:57

Переделал для нескольких слов в сообщении:
@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp1251 -t UTF-8') do curl -u admin:pass -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul
но двойные кавычки в сообщениях лучше не использовать ;) Апострофы ' в сообщениях буду выглядеть & а вот обратные кавычки ` доедут нормально.

#46 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 27 Октябрь 2016 - 12:10

Угу, и пришлось chcp 65001 прямо в скрипт добавить, без которого iconv кашу делал из utf-8.

#47 Afalin

Afalin

    Guru

  • Dr.Web Staff
  • 5 851 Сообщений:

Отправлено 27 Октябрь 2016 - 12:17

Выполняю

@echo off
chcp 65001
echo %1|for /f %%f in ('iconv -f cp1251 -t UTF-8') do (
curl -u admin:pass -k -v -G --data-urlencode id=xxx --data-urlencode message=Проверка "http://server:9080/api/3.0/stations/send-message.ds"
)
chcp 866

 

Прочитал внимательно. Вы делаете совсем не то. =)

Предлагается тот код засунуть в bat, и его вызывать с аргументом "Проверка", которое там будет %1 и конвертиться iconv'ом.


Семь раз отрежь – один раз проверь

#48 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 27 Октябрь 2016 - 12:57

Прочитал внимательно. Вы делаете совсем не то. =)
Предлагается тот код засунуть в bat, и его вызывать с аргументом "Проверка", которое там будет %1 и конвертиться iconv'ом.

Так и было: msg.cmd

Та ладно, ТС разберется :)



#49 Afalin

Afalin

    Guru

  • Dr.Web Staff
  • 5 851 Сообщений:

Отправлено 27 Октябрь 2016 - 13:16

 

Прочитал внимательно. Вы делаете совсем не то. =)
Предлагается тот код засунуть в bat, и его вызывать с аргументом "Проверка", которое там будет %1 и конвертиться iconv'ом.

Так и было: msg.cmd

Та ладно, ТС разберется :)

 

Это у Вас так было. У ТС было совсем не так. =)


Семь раз отрежь – один раз проверь

#50 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 28 Октябрь 2016 - 08:59

получилось только лишь с установкой chcp1251 победить корявые русские символы ), итак:

send Dr.WEB.cmd

chcp 1251
message.cmd Проверка, проверка

message.cmd

@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp1251 -t UTF-8') do curl -u admin:PASSW -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul

Вариант работает, спасибо за помощь

 

 

А не подскажете ли ещё случайно - как это можно красиво в делфях оформить всё, не используя WinExec, не используя curl и прочее внешнее. Только лишь средствами Делфи (7).

Примеру был бы очень рад



#51 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 28 Октябрь 2016 - 09:18

получилось только лишь с установкой chcp1251 победить корявые русские символы ), итак:

А если вместо
send Dr.WEB.cmd

chcp 1251
message.cmd Проверка, проверка

и
message.cmd

@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp1251 -t UTF-8') do curl -u admin:PASSW -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul

указать исходную кодировку в iconv -f cp866?
message.cmd

@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp866 -t UTF-8') do curl -u admin:PASSW -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul

А не подскажете ли ещё случайно - как это можно красиво в делфях оформить всё, не используя WinExec, не используя curl и прочее внешнее. Только лишь средствами Делфи (7).
Примеру был бы очень рад

Сразу хотелось сделать перевод кодировки в Delphi, но тут вспомнили про iconv и питон :)
В новых Delphi с помощью HTTPClientRequest/Response, но в D7 их нет, можно вызовом winhttp обойтись. Останется только найти реализацию кодировки в utf-8 и urlencode.


Сообщение было изменено IlyaS: 28 Октябрь 2016 - 09:19


#52 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 28 Октябрь 2016 - 09:48

А если вместо
send Dr.WEB.cmd

chcp 1251
message.cmd Проверка, проверка

и
message.cmd

@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp1251 -t UTF-8') do curl -u admin:PASSW -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul

указать исходную кодировку в iconv -f cp866?

 

не выходит, абракадарбро)



#53 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 28 Октябрь 2016 - 10:03

а если в delphi 7 через idhttp?



#54 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 28 Октябрь 2016 - 10:48

А если вместо
send Dr.WEB.cmd
chcp 1251
message.cmd Проверка, проверка
и
message.cmd
@echo off
chcp 65001 >nul
echo "%*"|for /f "tokens=*" %%f in ('iconv -f cp1251 -t UTF-8') do curl -u admin:PASSW -k -v -G --data-urlencode id=xxx --data-urlencode message=%%f "http://server:9080/api/3.0/stations/send-message.ds"
chcp 866 >nul
указать исходную кодировку в iconv -f cp866?

не выходит, абракадарбро)

я понял, вы свой send Dr.WEB.cmd сохранили в кодировке 1251, а надо было 866, что соответствует кодировке по-умолчанию для передачи параметров ком.строки. Параметры curl -k -v можно убрать.

#55 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 28 Октябрь 2016 - 10:55

а если в delphi 7 через idhttp?

Почему нет, конечно, можно и через Indy HTTP:
IdHTTP1.Get('http://server:9080/api/3.0/stations/send-message.ds?id=XXX&message=XXX');
только с кодировкой message придется разобраться.

#56 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 28 Октябрь 2016 - 11:13

 

а если в delphi 7 через idhttp?

Почему нет, конечно, можно и через Indy HTTP:
IdHTTP1.Get('http://server:9080/api/3.0/stations/send-message.ds?id=XXX&message=XXX');
только с кодировкой message придется разобраться.

 

а не подскажете как передать логин пароль?



#57 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 28 Октябрь 2016 - 12:16

Так или так?


Сообщение было изменено IlyaS: 28 Октябрь 2016 - 12:17


#58 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 31 Октябрь 2016 - 14:45

Так или так?

да, двигаюсь дальше, кодировку в utf8 сделал в делфи, отрабатывает. Но вот что-то никак не заставлю работать сборный url

procedure TForm1.Button1Click(Sender: TObject);
begin
Messag:=RichEdit1.Text;
Messag:=AnsiToUtf8(Messag);

IdHTTP1.Request.Username:='Login';
IdHTTP1.Request.Password:='Pass';
IdHTTP1.Request.BasicAuthentication:=True;
IdHTTP1.Get('http://server:9080/api/3.0/stations/send-message.ds?id=xxxxxxxx&message='+Messag);
end;

если делать url без переменных, то отлично работает всё, но стоит вставить переменную Messag (да хоть просто RichEdit1.Text) в путь, то крашит плохим запросом:

14746402.jpg

 

не пойму в чем затык



#59 IlyaS

IlyaS

    Massive Poster

  • Posters
  • 2 911 Сообщений:

Отправлено 31 Октябрь 2016 - 14:51

Messag у вас не urlencode (или тут).



#60 rivaldo89

rivaldo89

    Newbie

  • Posters
  • 13 Сообщений:

Отправлено 31 Октябрь 2016 - 15:11

почитаю, спасибо. Хотя в делфи удалось сделать корректную рассылку с русскими буквами просто через WinExec(сmd), просто напросто конвертнув содержимое memo через AnsiToUtf8 )) Думаю это и будет самым простым и рабочим решением


Сообщение было изменено rivaldo89: 31 Октябрь 2016 - 15:12



Читают тему: 0

0 пользователей, 0 гостей, 0 скрытых