1 (изменено: serzh82saratov, 2012-09-26 20:56:01)

Тема: AHK: Отправка сообщений в порт

Господа столкнулся с управлением портом в первый раз, терминов совсем не знаю. Вообщем есть программа у меня у неё есть веб интерфейс. Если прописать в адресной строке интернет браузера

http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111, 22222, 10000)

то она (программа) получает желаемое сообщение.

Вопрос как его отправить без помощи браузера, только с помощью AutoHotkey?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Отправка сообщений в порт

Да забыл, есть ещё пример подобного скрипта под Powershell

param (
    [string] $header = $(throw “Please specify the header!”),
    [string] $text =$(throw “Please specify the text!”),
    [int] $Duration = 10000
    )
$url='http://localhost:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(' + $header.Replace(' ','%20') + ',' + $text.Replace(' ','%20') +',' + $Duration +')'
$client = new-object system.net.WebClient
$data = $client.OpenRead($url)

автор утверждает что работает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Отправка сообщений в порт

UrlDownloadToFile или сокетами.

4 (изменено: serzh82saratov, 2012-09-26 20:41:09)

Re: AHK: Отправка сообщений в порт

Александр_ пишет:

UrlDownloadToFile или сокетами.

Спасибо за ответ.
UrlDownloadToFile он же просто скачивает файл?!
А что такое сокетами, просвятите пожалуйста.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

UrlDownloadToFile он же просто скачивает файл?!

Ну да, браузер тоже не в пинг-понг играет.

serzh82saratov пишет:

А что такое сокетами, просвятите пожалуйста.

Пока это единственный пример в разделе. Но там асинхронные запросы, блокирующие проще.

6 (изменено: serzh82saratov, 2012-09-26 21:01:44)

Re: AHK: Отправка сообщений в порт

Ну да, браузер тоже не в пинг-понг играет.

Может я непонятно изъяснился, сообщение получает сама программа с веб интерфейсом, а не скрипт.
Или не понял вас.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Отправка сообщений в порт

Пока это единственный пример в разделе. Но там асинхронные запросы, блокирующие проще.

Можно пожалуйста на коротком примере, а то ничего непонятно дилетанту

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Отправка сообщений в порт

Ну да, браузер тоже не в пинг-понг играет.

Вы это имели ввиду?

UrlDownloadToFile, http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: Александр_, 2012-09-26 21:14:18)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Может я непонятно изъяснился, сообщение получает сама программа с веб интерфейсом, а не скрипт.

Когда браузер получает команду отобразить страницу "http://forum.script-coding.com/viewtopic.php?pid=64253", он переводит имя узла(localhost) в ip-адрес и подключается к порту 8080, по этому адресу. Когда соединение установлено, начинается общение по протоколу http, браузер формирует запрос такого вида:

GET /viewtopic.php?pid=64253 HTTP/1.1
Host: forum.script-coding.com

А в ответ на это сервер отправляет ему запрошенную страницу(код страницы).
UrlDownloadToFile делает тоже самое, только не отображает страницу, а сохраняет её код в файл.

10 (изменено: serzh82saratov, 2012-09-26 21:20:40)

Re: AHK: Отправка сообщений в порт

Александр_ пишет:
serzh82saratov пишет:

Может я непонятно изъяснился, сообщение получает сама программа с веб интерфейсом, а не скрипт.

Когда браузер получает команду отобразить страницу "http://forum.script-coding.com/viewtopic.php?pid=64253", он переводит имя узла(localhost) в ip-адрес и подключается к порту 8080, по этому адресу. Когда соединение установлено, начинается общение по протоколу http, браузер формирует запрос такого вида:

GET /viewtopic.php?pid=64253 HTTP/1.1
Host: forum.script-coding.com

А в ответ на это сервер отправляет ему запрошенную страницу(код страницы).
UrlDownloadToFile делает тоже самое, только не отображает страницу, а сохраняет её код в файл.

Ничего непонимаю... так надо?

 UrlDownloadToFile, http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000), D:\AutoIt\new  3.txt

непроисходит ничего. и файл пустой, да и непонятно зачем вообще файл.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

11 (изменено: serzh82saratov, 2012-09-27 18:14:27)

Re: AHK: Отправка сообщений в порт

Всю голову поломал! Подскажите ещё чуть чуть.
В случае с  сокетами так понял что надо ковырять клиент.?
С UrlDownloadToFile совсем не понятно что делать.

Пока это единственный пример в разделе. Но там асинхронные запросы, блокирующие проще.

Дайте пожалуйста совсем короткий пример с блокирующим запросом.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Отправка сообщений в порт

Не смейтесь надо мной, для меня DllCall тёмный лес хочу в нём начать разбиратся надеюсь на подсказки
так понял что для работы с портами необходима библиотека Ws2_32.dll (а она есть в 64 бит винде?)
так она загружается в скрипт

DllCall("LoadLibrary", "str", "Ws2_32.dll")

Думал что сокет это какой то вид манипуляций с функциями
Значит socket это некая функция Ws2_32.dll

Socket := DllCall("Ws2_32.dll\socket", "int", AF_INET, "int", SOCK_STREAM, "int", IPPROTO_TCP, "ptr")

что значат AF_INET, "int", SOCK_STREAM, "int", IPPROTO_TCP непонял

потом видимо надо некой Function Ws2_32.dll в Arg1 передать то что мне надо

Arg1 = http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000)
DllCall("Ws2_32.dll\Function" , , Arg1)

вообщем полная каша в голове

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13 (изменено: Александр_, 2012-09-27 20:52:11)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

так понял что для работы с портами необходима библиотека Ws2_32.dll (а она есть в 64 бит винде?)

она есть на всех системах, начиная с Win2000
Простейший пример тут точно не поможет, пойдут вопросы "почему скрипт завис??".
Часть функций выдрана из старого скрипта, поэтому отсутствие багов не гарантирую, но я их не заметил:

socketInit()
s := socketConnect("pop.mail.ru", 110)
socketReadStrA(s)
socketSendStrA(s, "USER sdfsdfsdg2012@mail.ru`r`n")
socketReadStrA(s)
socketSendStrA(s, "PASS EasyPassword`r`n")
socketReadStrA(s)
socketSendStrA(s, "STAT`r`n")
RegExMatch(socketReadStrA(s), "^\+OK (\d+)", x)
socketClose(s)
msgbox В почтовом ящике %x1% писем.
return
;читает строку в кодировке CP1251
socketReadStrA(Socket, WaitTime = 1000)
{
   return socketReadStr(Socket, "CP1251", WaitTime)
}
;отправляет строку в кодировке CP1251
socketSendStrA(Socket, String)
{
   return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
   if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
   {
      SocketError := 1
      return 1
   }
   VarSetCapacity(WSAData, 108, 0)
   if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
   {
      SocketError := 2
   }
   VarSetCapacity(WSAData, 0)
   return
}
;отправляет строку в указанной кодировке
socketSendStr(Socket, String, Encoding="UTF-8")
{
   BufSize := (strlen(String)+1)*2
   VarSetCapacity(Buffer, BufSize, 0)
   BufSize := StrPut(String, &Buffer, BufSize, Encoding)
   ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
   VarSetCapacity(Buffer, 0)
   return ret
}
;сколько байт данных не прочитано
socketNewDataLength(Socket)
{
   ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
   if(!ret)
      return Size
   return -1
}
;читает данные
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
   StartTime := A_TickCount
   NewData := socketNewDataLength(Socket)
   while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
      NewData := socketNewDataLength(Socket)
   if(NewData>0)
   {
      Buffer := DllCall("LocalAlloc", "uint", 0, "ptr", NewData, "ptr")
      len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", Buffer, "int", NewData, "int", 0, "int")
	  return Buffer
   }
   return 0
}
;освобождает память, выделенную socketReadData
socketFreeData(Data)
{
   return DllCall("LocalFree", "ptr", Data, "ptr")
}
;закрывает соединение
socketClose(s)
{
   return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
;читает строку в указанной кодировке
socketReadStr(Socket, Encoding="UTF-8", WaitTime = 1000)
{
   Data := socketReadData(Socket, len, WaitTime)
   if(Data)
   {
      str := StrGet(Data, len, Encoding)
      socketFreeData(Data)
	  return str
   }
   return 0
}
;устанавливает подключение к порту "Port", хоста "HostOrIP".
socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
   if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
      return -10
   ret := 0
   VarSetCapacity(SockAddr, 16, 0)
   Socket := 0
   Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
   if(Socket=-1)
   {
	  ret := -11
      goto Clear
   }
   if(LocalPort)
   {
      NumPut(2, &SockAddr, 0, "short")
      NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
      NumPut(0, &SockAddr, 4, "uint")
	  if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
      {
	     ret := -12
         goto Clear
      }
   }
   NumPut(2, &SockAddr, 0, "short")
   NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
   if(socketIsIP(HostOrIP))
   {
      NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
   }
   else
   {
      RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
	  if(!RemoteHost)
	  {
	     ret := -13
         goto Clear
	  }
	  RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
	  NumPut(RemoteHost, &SockAddr, 4, "uint")
   }
   if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
   {
	  ret := -14
	  goto Clear
   }
   return Socket
Clear:
   if(Socket)
      DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
   return ret
}
;в слове меняет порядок байт на сетевой
sockethtons(port)
{
   return ((port&0xFF)<<8)|(port>>8)
}
;конвертирует строку с IP-адресом в четырёхбайтовое число.
inet_addr(StringWithIP)
{
   RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   VarSetCapacity(ip, 4, 0)
   NumPut(ArrayWithIP1, &ip, 0, "uchar")
   NumPut(ArrayWithIP2, &ip, 1, "uchar")
   NumPut(ArrayWithIP3, &ip, 2, "uchar")
   NumPut(ArrayWithIP4, &ip, 3, "uchar")
   return NumGet(&ip, 0, "uint")
}
;Возвращает 1 если строка является корректным IP-адресом и 0 в ином случае.
socketIsIP(StringWithIP)
{
   ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   if((ret="")||(ret=0))
      return 0
   if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
      return 0
   return 1
}

все функции удобнее скопировать в отдельный файл и подключать через "include". Первые 12 строчек получают количество писем в почтовом ящике через протокол POP3. socketInit() вызывается один раз в начале работы с сетью. socketConnect() устанавливает соединение. socketSendStrA() посылает текстовое сообщение, socketReadStrA() читает ответ, а socketClose() закрывает соединение.

serzh82saratov пишет:

что значат AF_INET, "int", SOCK_STREAM, "int", IPPROTO_TCP непонял

Описание и примеры применения всех использованных функций, на русском языке, есть в книге "Программирование в сетях Microsoft Windows".

14

Re: AHK: Отправка сообщений в порт

Большущее Спасибо за Ваш ответ!
Буду пытатся вникать в каждую строку.

Ещё вопрос функция NumPut для чего нужна? Переводчик не наталкивает на вывод.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Отправка сообщений в порт

NumPut(Number, VarOrAddress [, Offset = 0, Type = "UInt"])
помещает число "Number" типа "Type" по адресу "VarOrAddress"+"Offset".
Например в функции socketConnect:

VarSetCapacity(SockAddr, 16, 0) ;выделяем 16 байт
...
NumPut(2, &SockAddr, 0, "short") ;помещаем в первые два байта двойку(нулевое смещение)
NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort") ; помещаем во вторые два байта номер порта(смещение 2).
NumPut(0, &SockAddr, 4, "uint") ;помещаем в следующие 4 байта ноль(смещение 4).

16

Re: AHK: Отправка сообщений в порт

помещает число "Number" типа "Type" по адресу "VarOrAddress"+"Offset".

Т.е. грубо говоря - NumPut это типа StringReplace только для замены байтов?
И потом изменённый SockAddr передаётся функции bind с помощью -  DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int") ?

и скажите верен ли этот мой вывод?

потом видимо надо некой Function Ws2_32.dll в Arg1 передать то что мне надо

Arg1 = http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000)
Socket = ?
DllCall("Ws2_32.dll\Function", "ptr", Socket, "uint", Arg1)

И какая Function мне нужна для передачи?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Т.е. грубо говоря - NumPut это типа StringReplace только для замены байтов?

Ну, наверно можно и так сказать. Для процесса, память- это непрерывный набор байтов. Переменная- это область памяти, т.е. тоже набор байтов. Командой VarSetCapacity(SockAddr, 16, 0) мы говорим, что нам нужна область памяти, размером 16 байт, заполненная нулями, которую мы будем называть SockAddr, а её виртуальный адрес можно получить через амперсанд(&). После выполнения этой команды память по адресу &SockAddr выглядит так:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
после NumPut(2, &SockAddr, 0, "short") так(перезаписанная часть выделена):
00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Дальше опустим преобразование порта NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort"). Если там 80-й порт, то он преобразуется в 20480(0x5000):
00 02 50 00 00 00 00 00 00 00 00 00 00 00 00 00
после NumPut(0, &SockAddr, 4, "uint") ничего не изменится, нули перезапишутся нулями:
00 02 50 00 00 00 00 00 00 00 00 00 00 00 00 00

serzh82saratov пишет:

И потом изменённый SockAddr передаётся функции bind с помощью -  DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int") ?

Да, в данном случае эта функция привязывает соединение к конкретному порту на локальной машине, обычно это не нужно.

serzh82saratov пишет:

и скажите верен ли этот мой вывод?

потом видимо надо некой Function Ws2_32.dll в Arg1 передать то что мне надо

Arg1 = http://localhost:8081/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000)
Socket = ?
DllCall("Ws2_32.dll\Function", "ptr", Socket, "uint", Arg1)

И какая Function мне нужна для передачи?

Нет, не верен. Нужно соединиться с localhost по 8081-му порту и запросить страницу "/xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000)" по протоколу http. Примерно так:

socketInit()
s := socketConnect("localhost", 8081)
socketSendStrA(s, "GET /xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=XBMC.Notification(11111,22222,10000) HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n")
msgbox % socketReadStrA(s)
socketClose(s)

18

Re: AHK: Отправка сообщений в порт

Ура! Всё заработало! Александр_ Вы всемогущи!


1::
Action = XBMC.ACTION(Right)
Call = GET /xbmcCmds/xbmcHttp?command=ExecBuiltIn&parameter=%Action% HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n
socketInit()
s := socketConnect("localhost", 8081)
socketSendStrA(s, Call) 
socketClose(s)
Return

sockethtons(port)
{
   return ((port&0xFF)<<8)|(port>>8)
}
socketSendStr(Socket, String, Encoding="UTF-8")
{
   BufSize := (strlen(String)+1)*2
   VarSetCapacity(Buffer, BufSize, 0)
   BufSize := StrPut(String, &Buffer, BufSize, Encoding)
   ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
   VarSetCapacity(Buffer, 0)
   return ret
}
socketFreeData(Data)
{
   return DllCall("LocalFree", "ptr", Data, "ptr")
}
socketNewDataLength(Socket)
{
   ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
   if(!ret)
      return Size
   return -1
}
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
   StartTime := A_TickCount
   NewData := socketNewDataLength(Socket)
   while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
      NewData := socketNewDataLength(Socket)
   if(NewData>0)
   {
      Buffer := DllCall("LocalAlloc", "uint", 0, "ptr", NewData, "ptr")
      len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", Buffer, "int", NewData, "int", 0, "int")
      return Buffer
   }
   return 0
}
socketReadStr(Socket, Encoding="UTF-8", WaitTime = 1000)
{
   Data := socketReadData(Socket, len, WaitTime)
   if(Data)
   {
      str := StrGet(Data, len, Encoding)
      socketFreeData(Data)
      return str
   }
   return 0
}
socketClose(s)
{
   return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
socketReadStrA(Socket, WaitTime = 1000)
{
   return socketReadStr(Socket, "CP1251", WaitTime)
}
socketSendStrA(Socket, String)
{
   return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
   if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
   {
      SocketError := 1
      return 1
   }
   VarSetCapacity(WSAData, 108, 0)
   if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
   {
      SocketError := 2
   }
   VarSetCapacity(WSAData, 0)
   return
}

socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
   if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
      return -10
   ret := 0
   VarSetCapacity(SockAddr, 16, 0)
   Socket := 0
   Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
   if(Socket=-1)
   {
      ret := -11
      goto Clear
   }
   if(LocalPort)
   {
      NumPut(2, &SockAddr, 0, "short")
      NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
      NumPut(0, &SockAddr, 4, "uint")
      if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
      {
         ret := -12
         goto Clear
      }
   }
   NumPut(2, &SockAddr, 0, "short")
   NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
   if(socketIsIP(HostOrIP))
   {
      NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
   }
   else
   {
      RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
      if(!RemoteHost)
      {
         ret := -13
         goto Clear
      }
      RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
      NumPut(RemoteHost, &SockAddr, 4, "uint")
   }
   if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
   {
      ret := -14
      goto Clear
   }
   return Socket
Clear:
   if(Socket)
      DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
   return ret
}
socketIsIP(StringWithIP)
{
   ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   if((ret="")||(ret=0))
      return 0
   if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
      return 0
   return 1
}
inet_addr(StringWithIP)
{
   RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   VarSetCapacity(ip, 4, 0)
   NumPut(ArrayWithIP1, &ip, 0, "uchar")
   NumPut(ArrayWithIP2, &ip, 1, "uchar")
   NumPut(ArrayWithIP3, &ip, 2, "uchar")
   NumPut(ArrayWithIP4, &ip, 3, "uchar")
   return NumGet(&ip, 0, "uint")
}

Даа, что бы такое понять надо много учится, тут с "кандычка" не подойшешь.
Отличная библиотека получится!
-----------------------------

и запросить страницу

не могу ещё понять зачем запрашивать страницу, если требуется только отправить сообщение? для этого функция socketReadStrA?
в ответ приходит

---------------------------
=Test.ahk
---------------------------
HTTP/1.1 200 OK

Content-Length: 22

Date: Thu, 27 Sep 2012 20:44:53 GMT



<html>
<li>OK
</html>

---------------------------
ОК   
---------------------------

и если всё таки не требуется запрашивать страницу, то какие функции лишние?
список функций

sockethtons
socketSendStr
socketFreeData
socketNewDataLength
socketReadData
socketReadStr
socketClose
socketReadStrA
socketSendStrA
socketInit
socketConnect
socketIsIP
inet_addr

и ещё не пойму для чего каждый раз (socketClose) закрывается соединение? если скрипт остаётся запущенным.

П.С.
Спасибо Вам за помощь людям в освоении этой сложной и интересной науки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Отличная библиотека получится!

Сомнительно, я уже несколько явных косяков нашёл, завтра исправлю.

serzh82saratov пишет:

не могу ещё понять зачем запрашивать страницу, если требуется только отправить сообщение? для этого функция socketReadStrA?

Протокол HTTP так устроен, на любой запрос клиента должен быть отправлен ответ.

serzh82saratov пишет:

и ещё не пойму для чего каждый раз (socketClose) закрывается соединение? если скрипт остаётся запущенным.

Экономия ресурсов компьютера. Иначе соединение так и будет висеть, несмотря на то, что сервер его давно закрыл.

20 (изменено: serzh82saratov, 2012-09-28 04:02:12)

Re: AHK: Отправка сообщений в порт

Заметил проблему с передачей русских символов

Сначала возникла проблема с передачей пробелов решил с помощью замены всех пробелов на %20
При передаче пути к файлу в браузере заметил что \ заменяется на %5C, но в скрипте почему-то замена не требуется.
Ну и каждый русский символ заменяется на что то своё, но файл не запускается в программе, в отличие от файла без кирилицы пути.

И такой момент - интерфейс программы открывается в браузерах при вводе http://localhost:8081 и из под него всё запускается.
То есть в логе программы отображается нормальный русский путь, а при вводе со строки браузера или из скрипта - крякозябры.

Да и человек, скрипт (на Powershell) которого я приводил во втором посте, говорит что проблем нет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Отправка сообщений в порт

Улучшенный вариант, в виде подключаемого файла BSockets.ahk:

global socketError = 0
if(!socketBufferSize)
   socketBufferSize := 0x8000
socketBuffer := DllCall("LocalAlloc", "uint", 0, "ptr", socketBufferSize, "ptr")
socketInit()

;читает строку в кодировке CP1251
socketReadStrA(Socket)
{
   return socketReadStr(Socket, "CP1251")
}
;отправляет строку в кодировке CP1251
socketSendStrA(Socket, String)
{
   return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
   if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
   {
      SocketError := 1
      return 1
   }
   VarSetCapacity(WSAData, 108, 0)
   if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
   {
      SocketError := 2
   }
   VarSetCapacity(WSAData, 0)
   return
}
;отправляет строку в указанной кодировке
socketSendStr(Socket, String, Encoding="UTF-8")
{
   BufSize := (strlen(String)+1)*2
   VarSetCapacity(Buffer, BufSize, 0)
   BufSize := StrPut(String, &Buffer, BufSize, Encoding)
   ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
   VarSetCapacity(Buffer, 0)
   return ret
}
;сколько байт данных не прочитано
socketNewDataLength(Socket)
{
   ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
   if(!ret)
      return Size
   return -1
}
;читает данные
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
   global socketBuffer
   StartTime := A_TickCount
   NewData := socketNewDataLength(Socket)
   while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
      NewData := socketNewDataLength(Socket)
   if(NewData>0)
   {
      len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", socketBuffer, "int", NewData, "int", 0, "int")
	  return socketBuffer
   }
   return 0
}
;закрывает соединение
socketClose(s)
{
   return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
;читает строку в указанной кодировке
socketReadStr(Socket, Encoding="UTF-8")
{
   critical
   str := ""
   loop
   {
      Data := socketReadData(Socket, len, 100)
      if(Data)
	     str .= StrGet(Data, len, Encoding)
	  else
	     break
   }
   SocketError := 0
   if(str != "")
      return str
   SocketError := -1
   return 0
}
;устанавливает подключение к порту "Port", хоста "HostOrIP".
socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
   global socketBufferSize
   if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
      return -10
   ret := 0
   VarSetCapacity(SockAddr, 16, 0)
   Socket := 0
   Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
   if(Socket=-1)
   {
	  ret := -11
      goto Clear
   }
   DllCall("Ws2_32.dll\setsockopt", "ptr", Socket, "int", 0xFFFF, "int", 0x1002, "int*", socketBufferSize, "int", 4, "int")
   if(LocalPort)
   {
      NumPut(2, &SockAddr, 0, "short")
      NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
      NumPut(0, &SockAddr, 4, "uint")
	  if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
      {
	     ret := -12
         goto Clear
      }
   }
   NumPut(2, &SockAddr, 0, "short")
   NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
   if(socketIsIP(HostOrIP))
   {
      NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
   }
   else
   {
      RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
	  if(!RemoteHost)
	  {
	     ret := -13
         goto Clear
	  }
	  RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
	  NumPut(RemoteHost, &SockAddr, 4, "uint")
   }
   if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
   {
	  ret := -14
	  goto Clear
   }
   return Socket
Clear:
   if(Socket)
      DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
   return ret
}
;в слове меняет порядок байт на сетевой
sockethtons(port)
{
   return ((port&0xFF)<<8)|(port>>8)
}
;конвертирует строку с IP-адресом в четырёхбайтовое число.
inet_addr(StringWithIP)
{
   RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   VarSetCapacity(ip, 4, 0)
   NumPut(ArrayWithIP1, &ip, 0, "uchar")
   NumPut(ArrayWithIP2, &ip, 1, "uchar")
   NumPut(ArrayWithIP3, &ip, 2, "uchar")
   NumPut(ArrayWithIP4, &ip, 3, "uchar")
   return NumGet(&ip, 0, "uint")
}
;Возвращает 1 если строка является корректным IP-адресом и 0 в ином случае.
socketIsIP(StringWithIP)
{
   ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   if((ret="")||(ret=0))
      return 0
   if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
      return 0
   return 1
}

Используется так же, только не нужно самому вызывать socketInit(). Например:

#include BSockets.ahk
s := socketConnect("pop.mail.ru", 110)
socketReadStrA(s)
socketSendStrA(s, "USER sdfsdfsdg2012@mail.ru`r`n")
socketReadStrA(s)
socketSendStrA(s, "PASS EasyPassword`r`n")
socketReadStrA(s)
socketSendStrA(s, "STAT`r`n")
RegExMatch(socketReadStrA(s), "^\+OK (\d+)", x)
socketClose(s)
msgbox В почтовом ящике %x1% писем.
return
serzh82saratov пишет:

Заметил проблему с передачей русских символов

Сначала возникла проблема с передачей пробелов решил с помощью замены всех пробелов на %20
При передаче пути к файлу в браузере заметил что \ заменяется на %5C, но в скрипте почему-то замена не требуется.
Ну и каждый русский символ заменяется на что то своё, но файл не запускается в программе, в отличие от файла без кирилицы пути.

Попробуй другую кодировку, например UTF-8(socketSendStr вместо socketSendStrA). Пробелы запрещены, поскольку являются разделителями, а вообще любой символ можно передать в виде %XX, где XX это код символа в шестнадцатеричной системе счисления.

22

Re: AHK: Отправка сообщений в порт

Попробуй другую кодировку, например UTF-8(socketSendStr вместо socketSendStrA)

О, помогло! Класс!

а вообще любой символ можно передать в виде %XX, где XX это код символа в шестнадцатеричной системе счисления.

Он так и передаётся из строки браузера, но для сервера это иероглифы то бишь уже не путь и не слово.

Улучшенный вариант

А можете вкратце изменения рассказать, или они касаются только socketInit().

Используется так же, только не нужно самому вызывать socketInit()

это хорошо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

А можете вкратце изменения рассказать, или они касаются только socketInit()..

Добавлена переменная socketError, по которой можно судить успешно прочитана строка или нет. Буфер для чтения данных из сокета теперь выделяется вначале программы и не освобождается(это увеличивает быстродействие), как следствие убрана функция освобождающая память. Размер этого буфера увеличен со стандартных 8кб до 32кб. Осталась путаница с WaitTime, из функций, которые работают со строками я её убрал, а из функции читающей произвольные данные поленился, надо будет тоже убрать. Кроме того тут нет серверных функций, т.е. нельзя ждать подключения, можно только самому подключаться.

24

Re: AHK: Отправка сообщений в порт

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

Вот видимо почему я уже не могу прочитать с сервера msgbox % socketReadStrA(s) по началу не видел применения этому, а сейчас оказалось нужным... Но были проблемы с нестабильным чтением с сервера, иногда были пустые сообщения.

Тут я видимо опять не понял ничего, ведь ваш скрипт выдаёт "msgbox В почтовом ящике %x1% писем", а значит он может читать. И никак не дойдет откуда рождается переменная x1 в msgbox...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Тут я видимо опять не понял ничего, ведь ваш скрипт выдаёт "msgbox В почтовом ящике %x1% писем", а значит он может читать. И никак не дойдет откуда рождается переменная x1 в msgbox...

Ну если сообщения отправляются в кодировке utf-8, то логично было бы и ответ читать в этой кодировке, а не в CP-1251. x1 берётся из RegExMatch, первый найденный подшаблон.

26

Re: AHK: Отправка сообщений в порт

Ну если сообщения отправляются в кодировке utf-8, то логично было бы и ответ читать в этой кодировке, а не в CP-1251.

Если грубо говоря имеется ввиду msgbox % socketReadStr(s) то тоже пусто

x1 берётся из RegExMatch, первый найденный подшаблон.

Спасибо , буду перечитывать справку.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Если грубо говоря имеется ввиду msgbox % socketReadStr(s) то тоже пусто

А можно весь код увидеть?

28 (изменено: serzh82saratov, 2012-09-28 21:59:23)

Re: AHK: Отправка сообщений в порт

Александр_ пишет:
serzh82saratov пишет:

Если грубо говоря имеется ввиду msgbox % socketReadStr(s) то тоже пусто

А можно весь код увидеть?


Call:
Action = %1command%%2command%
StringReplace, Action, Action, %A_Space%, `%20, All
Call = GET /xbmcCmds/xbmcHttp?command=%Action% HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n
socketInit()
s := socketConnect("" Host "", Port)
socketSendStr(s, Call)
if msg = 1
{
msgbox % socketReadStr(s)       ; %
msg = 0
}
socketClose(s)
Return

global socketError = 0
if(!socketBufferSize)
   socketBufferSize := 0x8000
socketBuffer := DllCall("LocalAlloc", "uint", 0, "ptr", socketBufferSize, "ptr")
socketInit()
 
;читает строку в кодировке CP1251
socketReadStrA(Socket)
{
   return socketReadStr(Socket, "CP1251")
}
;отправляет строку в кодировке CP1251
socketSendStrA(Socket, String)
{
   return socketSendStr(Socket, String, "CP1251")
}
;инициализация
socketInit()
{
   if(DllCall("LoadLibrary", "str", "Ws2_32.dll", "ptr")=0)
   {
      SocketError := 1
      return 1
   }
   VarSetCapacity(WSAData, 108, 0)
   if(DllCall("Ws2_32.dll\WSAStartup", "ushort", 0x0202, "ptr", &WSAData))
   {
      SocketError := 2
   }
   VarSetCapacity(WSAData, 0)
   return
}
;отправляет строку в указанной кодировке
socketSendStr(Socket, String, Encoding="UTF-8")
{
   BufSize := (strlen(String)+1)*2
   VarSetCapacity(Buffer, BufSize, 0)
   BufSize := StrPut(String, &Buffer, BufSize, Encoding)
   ret := DllCall("Ws2_32.dll\send", "ptr", Socket, "ptr", &Buffer, "int", BufSize, "int", 0)
   VarSetCapacity(Buffer, 0)
   return ret
}
;сколько байт данных не прочитано
socketNewDataLength(Socket)
{
   ret := DllCall("Ws2_32.dll\ioctlsocket", "ptr", Socket, "uint", 0x4004667f, "uint*", Size, "int")
   if(!ret)
      return Size
   return -1
}
;читает данные
socketReadData(Socket, ByRef len, WaitTime = 1000)
{
   global socketBuffer
   StartTime := A_TickCount
   NewData := socketNewDataLength(Socket)
   while((NewData<=0)&&(A_TickCount-StartTime<WaitTime))
      NewData := socketNewDataLength(Socket)
   if(NewData>0)
   {
      len:=DllCall("Ws2_32.dll\recv", "ptr", Socket, "ptr", socketBuffer, "int", NewData, "int", 0, "int")
      return socketBuffer
   }
   return 0
}
;закрывает соединение
socketClose(s)
{
   return DllCall("Ws2_32.dll\closesocket", "ptr", s)
}
;читает строку в указанной кодировке
socketReadStr(Socket, Encoding="UTF-8")
{
   critical
   str := ""
   loop
   {
      Data := socketReadData(Socket, len, 100)
      if(Data)
         str .= StrGet(Data, len, Encoding)
      else
         break
   }
   SocketError := 0
   if(str != "")
      return str
   SocketError := -1
   return 0
}
;устанавливает подключение к порту "Port", хоста "HostOrIP".
socketConnect(HostOrIP, Port = 80, LocalPort = 0)
{
   global socketBufferSize
   if(!((Port>=0&&Port<=0xFFFF)&&(LocalPort>=0&&LocalPort<=0xFFFF)))
      return -10
   ret := 0
   VarSetCapacity(SockAddr, 16, 0)
   Socket := 0
   Socket := DllCall("Ws2_32.dll\socket", "int", 2, "int", 1, "int", 6, "ptr")
   if(Socket=-1)
   {
      ret := -11
      goto Clear
   }
   DllCall("Ws2_32.dll\setsockopt", "ptr", Socket, "int", 0xFFFF, "int", 0x1002, "int*", socketBufferSize, "int", 4, "int")
   if(LocalPort)
   {
      NumPut(2, &SockAddr, 0, "short")
      NumPut(sockethtons(LocalPort), &SockAddr, 2, "ushort")
      NumPut(0, &SockAddr, 4, "uint")
      if(DllCall("Ws2_32.dll\bind", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
      {
         ret := -12
         goto Clear
      }
   }
   NumPut(2, &SockAddr, 0, "short")
   NumPut(sockethtons(Port), &SockAddr, 2, "ushort")
   if(socketIsIP(HostOrIP))
   {
      NumPut(inet_addr(HostOrIP), &SockAddr, 4, "uint")
   }
   else
   {
      RemoteHost := DllCall("Ws2_32.dll\gethostbyname", "AStr", HostOrIP, "ptr")
      if(!RemoteHost)
      {
         ret := -13
         goto Clear
      }
      RemoteHost:=NumGet(NumGet(NumGet(RemoteHost|0, A_PtrSize*3, "ptr"), 0, "ptr"), 0, "uint")
      NumPut(RemoteHost, &SockAddr, 4, "uint")
   }
   if(DllCall("Ws2_32.dll\connect", "ptr", Socket, "ptr", &SockAddr, "int", 16, "int")=-1)
   {
      ret := -14
      goto Clear
   }
   return Socket
Clear:
   if(Socket)
      DllCall("Ws2_32.dll\closesocket", "ptr", Socket)
   return ret
}
;в слове меняет порядок байт на сетевой
sockethtons(port)
{
   return ((port&0xFF)<<8)|(port>>8)
}
;конвертирует строку с IP-адресом в четырёхбайтовое число.
inet_addr(StringWithIP)
{
   RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   VarSetCapacity(ip, 4, 0)
   NumPut(ArrayWithIP1, &ip, 0, "uchar")
   NumPut(ArrayWithIP2, &ip, 1, "uchar")
   NumPut(ArrayWithIP3, &ip, 2, "uchar")
   NumPut(ArrayWithIP4, &ip, 3, "uchar")
   return NumGet(&ip, 0, "uint")
}
;Возвращает 1 если строка является корректным IP-адресом и 0 в ином случае.
socketIsIP(StringWithIP)
{
   ret := RegExMatch(StringWithIP, "^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ArrayWithIP)
   if((ret="")||(ret=0))
      return 0
   if((ArrayWithIP1>255)||(ArrayWithIP2>255)||(ArrayWithIP3>255)||(ArrayWithIP4>255))
      return 0
   return 1
}

#SingleInstance force
#NoEnv
Host = localhost
Port = 8081
#IncludeAgain %A_ScriptDir%\CallPortLib.ahk

1::
1command = ExecBuiltIn
2command = &parameter=Notification(Привет, мир, 3000)
GoTo, Call
Return
2::
1command = GetCurrentlyPlaying
2command =
msg = 1
GoTo, Call
Return

По "двойке" команда GetCurrentlyPlaying с первоначальной либой возвращает желаемое, с последней либой возвращает "0".
Наверно я что то намудрил в этом месте, точнее оставил как есть от старой либы

Call:
Action = %1command%%2command%
StringReplace, Action, Action, %A_Space%, `%20, All
Call = GET /xbmcCmds/xbmcHttp?command=%Action% HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n
socketInit()
s := socketConnect("" Host "", Port)
socketSendStr(s, Call)
if msg = 1
{
msgbox % socketReadStr(s)       ; %
msg = 0
}
socketClose(s)
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Отправка сообщений в порт

...
socketClose(s)
Return
 
global socketError = 0
...

Код после "return" никогда не получит управление. Кроме того параметр "Accept-Charset" явно игнорируется сервером, можно его убрать.

30

Re: AHK: Отправка сообщений в порт

Ура! Теперь чтение стабильно!

Код после "return" никогда не получит управление.


Кроме того параметр "Accept-Charset" явно игнорируется сервером, можно его убрать.

HTTP/1.1`nHost: localhost`nProxy-Connection: Close`n: windows-1251`n`n - так правильно?

и пара вопросов по этой строке: нужен ли windows-1251 если у меня всё через UTF-8, и localhost - а если будет использоватся некий внешний IP в переменной Host ( "s := socketConnect("" Host "", Port)" ) localhost не помешает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31 (изменено: Александр_, 2012-09-28 22:39:11)

Re: AHK: Отправка сообщений в порт

GET /xbmcCmds/xbmcHttp?command=грррагрххх HTTP/1.1`nHost: localhost`nProxy-Connection: Close`nAccept-Charset: windows-1251`n`n

Структура GET-запроса: сначала идёт ключевое слово GET, затем пробел. После этого запрашиваемый ресурс, возможно с параметрами, в данном случае это "/xbmcCmds/xbmcHttp", с параметром "command", равным "грррагрххх". Затем снова пробел и указание протокола, в данном случае это "HTTP/1.1". После этого идёт перевод строки и дополнительные параметры в формате "параметр: значение", каждый такой параметр располагается на отдельной строке. В данном случае это "Host: localhost", идентифицирует сайт,  к которому идёт запрос, значением параметра может быть как имя ресурса, так и его ip-адрес. "Proxy-Connection: Close" говорит серверу разорвать соединение сразу после отправки ответа, это не обязательный параметр. "Accept-Charset: windows-1251" тут перечисляются поддерживаемые кодировки, параметр тоже не обязательный. После последнего параметра должна идти пустая строка.
Первым параметром в socketConnect() может идти как доменное имя, так и ip-адрес.

32

Re: AHK: Отправка сообщений в порт

Спасибо за ответ, так понял что строка может выглядеть так

GET /xbmcCmds/xbmcHttp?command=%Action% HTTP/1.1`nHost: %Host%`nProxy-Connection: Close`n: `n`n

удалил - UTF-8, и заменил Host: localhost на Host: %Host%

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Спасибо за ответ, так понял что строка может выглядеть так

Зачем строка с двоеточием и пробелом?

34

Re: AHK: Отправка сообщений в порт

Александр_ пишет:

Зачем строка с двоеточием и пробелом?


Call = GET /xbmcCmds/xbmcHttp?command=%Action% HTTP/1.1`nHost: %Host%`nProxy-Connection: Close`n`n
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: Отправка сообщений в порт

Хорошая и нужная библиотека.
Однозначно в коллекцию скриптов и идей!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

36

Re: AHK: Отправка сообщений в порт

Заранее прошу прощения за глупый вопрос.
Попытался поместить библиотеку внутрь функциии, но выдаёт ошибку на строке с первой же функцией библиотеки. Скажите воможно ли в принципе использование функций внутри функции, ответ на вопрос в справке не нашёл. Либо это неполучается из-за некой специфики данной библиотеки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37

Re: AHK: Отправка сообщений в порт

Нельзя, транслятор ведь так и пишет: "functions cannot contain functions". А если бы и можно было, то встал бы вопрос об области видимости.

38 (изменено: serzh82saratov, 2013-02-21 23:05:09)

Re: AHK: Отправка сообщений в порт

Доброго времени суток.
В новой версии программы удалили web-API, через который передавались команды в эту программу скриптом выше, и оставили только некий JSON-RPC. Подскажите, как быть?
Этот скрипт на питоне работает:


01    #!/usr/bin/python2
02      
03    import json, urllib2
04      
05    URL = 'http://localhost:8080/jsonrpc'
06    HEADER = {'Content-Type': 'application/json'}
07    update_request = json.dumps({'jsonrpc': "2.0", 'method': "VideoLibrary.Scan", 'id': "1"})
08    request = urllib2.Request(URL, update_request, HEADER)
09    try:
10        urllib2.urlopen(request).close()
11    except urllib2.URLError: pass

VideoLibrary.Scan - команда которую надо послать.

Помогите понять и сделать на AutoHotkey, как теперь отправить нужный запрос?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39

Re: AHK: Отправка сообщений в порт

Вроде как есть поддержка этого самого JSON-RPC. и здесь что-то про это сказано.
Ещё все ссылаются на curl, вроде бы его можно как костыль использовать.
Помогите разобратся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

40 (изменено: Александр_, 2013-02-27 01:30:24)

Re: AHK: Отправка сообщений в порт

Похоже это опять обычный http-запрос. Что-то типа:

POST /jsonrpc HTTP/1.0
Host: localhost:8080
Content-Type: application/json

jsonrpc=2.0&method=VideoLibrary.Scan&id=1

И почему бы просто не пустить трафик через логгирующий прокси и не посмотреть что там отправляется?

41 (изменено: serzh82saratov, 2013-02-27 01:49:16)

Re: AHK: Отправка сообщений в порт

пустить трафик через логгирующий прокси

   Это для меня, как китайская грамота.

   Так что, получается можно как-то отправить этот запрос, с помощью вашего кода?

что-то типа:

Call = POST /jsonrpc HTTP/1.0`nHost: localhost:8080`nContent-Type: application/json`n`njsonrpc=2.0&method=VideoLibrary.Scan&id=1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

42 (изменено: Александр_, 2013-02-27 02:18:16)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Это для меня, как китайская грамота.

Запускаем у себя прокси-сервер(например wpf, его любят на allcheats). Запускаешь его, затем идёшь в настройки своей программы и указываешь его как прокси-сервер. Выполняешь нужную команду и смотришь в логе результат. Если в программе нет возможности указать прокси, то придётся ещё скачать любую программу-проксификатор.

serzh82saratov пишет:

что-то типа:

Именно "что-то типа", точнее без дополнительных данных не скажу.

43

Re: AHK: Отправка сообщений в порт

Запускаем у себя прокси-сервер(например wpf, его любят на allcheats). Запускаешь его, затем идёшь в настройки своей программы и указываешь его как прокси-сервер.

Так и непонял как ето Windows Presentation Foundation запускается

Выполняешь нужную команду и смотришь в логе результат.

И не понял бы, как выполнить нужную команду, если я незнаю как её послать в эту программу, с этого сайта

Если в программе нет возможности указать прокси, то придётся ещё скачать любую программу-проксификатор.

Тут ещё сложнее...

...без дополнительных данных не скажу.

Где бы их взять, деревянному человечку

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

44

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Так и непонял как ето Windows Presentation Foundation запускается

Не, это Walker Patcher вроде расшифровывается, изначально использовался в основном с ботом для lineage2(игра такая была).

serzh82saratov пишет:

И не понял бы, как выполнить нужную команду, если я незнаю как её послать в эту программу, с этого сайта

А с чего ты взял, что это вообще возможно?

45

Re: AHK: Отправка сообщений в порт

А с чего ты взял, что это вообще возможно?

Так ведь у людей на питоне работает

Не, это Walker Patcher...

Пока ясности не внесло

Может накидаете пару вариантов того, как может выглядеть запрос в вашей библиотеке

Call = POST /jsonrpc HTTP/1.0`nHost: localhost:8080`nContent-Type: application/json`n`njsonrpc=2.0&method=VideoLibrary.Scan&id=1

метод ненаучного тыка иногда выручает

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

46

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Так ведь у людей на питоне работает

Ссылку на "людей" можно? .

47

Re: AHK: Отправка сообщений в порт

Ссылку на "людей" можно?  .

Ссылка1 & Ссылка2 & Ссылка3

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

48

Re: AHK: Отправка сообщений в порт

Отлично, а как настроить саму программу на приём этих сообщений? По дефолту порт 8080 закрыт. И, кстати, веб-интерфейс там есть, просто отключён по-умолчанию, в нём нужных функций нет?

49

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

может быть. В 12 версии софтины, остался только JSON. Или я не так понял.

см. скриншоты:
http://s019.radikal.ru/i605/1302/37/0ff87466f74ft.jpghttp://s019.radikal.ru/i610/1302/fb/ebcaf9146134t.jpghttp://s47.radikal.ru/i117/1302/7c/443573e9ff46t.jpg

50

Re: AHK: Отправка сообщений в порт

Я тоже так думал.
Но видимо сейчас какой-то совсем другой веб-интерфейс.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

51

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Я тоже так думал.
Но видимо сейчас какой-то совсем другой веб-интерфейс.

А какая разница? Команды ведь через него можно отправлять? А JS, flash или HTML не важно.

52

Re: AHK: Отправка сообщений в порт

Александр_ пишет:

А какая разница? Команды ведь через него можно отправлять? А JS, flash или HTML не важно.

Разницы для меня никакой. Но я непонимаю, как мне теперь отправлять команды...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

53

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Разницы для меня никакой. Но я непонимаю, как мне теперь отправлять команды...

Так ты можешь сделать то что тебе нужно через браузер или нет?

54

Re: AHK: Отправка сообщений в порт

Нет, не могу. Как теперь должен выглядеть запрос, я понятия не имею...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

55

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Нет, не могу. Как теперь должен выглядеть запрос, я понятия не имею...

Ладно... Тогда что должна сделать программа при получении этого запроса?

56

Re: AHK: Отправка сообщений в порт

Пример с командой VideoLibrary.Scan не будет работать, так как это действие для программы в которой настроена пользовательская видео библиотека. Проще и наглядней пробовать например команду "нажать вправо". Думаю этот кусок из скачанного файла должен её выполнять:


        "Input.Right": {
            "description": "Navigate right in GUI",
            "params": [

            ],
            "returns": {
                "type": "string"
            },
            "type": "method"
        },
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

57

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Проще и наглядней пробовать например команду "нажать вправо".

http://s017.radikal.ru/i432/1302/2b/b0f3490b8205t.jpg
???

58

Re: AHK: Отправка сообщений в порт

Что-то я всё равно туплю...
Вот старый запрос:


Port = 8080
Host = localhost
XBMCControl()

1::
 ; Какую мне тут (вместо "SendKey(61571)") указать команду?
XBMCControl("SendKey(61571)")
return

XBMCControl(command = "", com = 0)
{
global
s := socketConnect(Host, Port)
StringReplace, command, command, %A_Space%, `%20, All

Call = GET /xbmcCmds/xbmcHttp?command=%command% HTTP/1.1`nHost: %Host%`nProxy-Connection: Close`n`n
***

а как написать новый. Вроде уже по всякому попробовал!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

59 (изменено: serzh82saratov, 2013-03-01 01:51:52)

Re: AHK: Отправка сообщений в порт

Аллилуя!
Тоже нашёл в опере

+ открыть спойлер
POST /jsonrpc?Input.Right HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14
Host: localhost:8080
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 47
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/json

{"jsonrpc":"2.0","method":"Input.Right","id":1}

Запрос


Host := "localhost"
Port := "8080"

XBMCControl()
XBMCControl("Input.Right")
***
Call = 
(
POST /jsonrpc?%command% HTTP/1.1
Host: %Host%:%Port%
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Connection: Keep-Alive`nContent-Length: 47
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/json

{"jsonrpc":"2.0","method":"%command%","id":1}
)

Работает!!!
Чего тут наверное много лишнего... И как интересно будет дело с чтением...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

60 (изменено: serzh82saratov, 2013-03-01 03:32:19)

Re: AHK: Отправка сообщений в порт

методом тыка вроде исключил лишнее:

+ открыть спойлер

Host := "localhost"
Port := "8080"
XBMCControl()

1::XBMCControl("Input.Right")

XBMCControl(command = "", com = 0)
{
global Host, Port
s := socketConnect(Host, Port)
command2 = {"jsonrpc":"2.0","method":"%command%","id":1}

Len := StrLen(command2)

Call =
(
POST /jsonrpc?%command% HTTP/1.1
Host: %Host%:%Port%
Content-Length: %Len%
Content-Type: application/json

%command2%
)

Всплыло странное условие, что в Content-Length: надо передавать длинну строки {"jsonrpc":"2.0","method":"%command%","id":1}, без этого оно как то долго думает при выполнении команды.
И непонятно как теперь закрывать подключение как раньше: Proxy-Connection: Close

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

61 (изменено: Александр_, 2013-03-01 02:18:08)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Всплыло странное условие, что в Content-Length: надо передавать длинну строки {"jsonrpc":"2.0","method":"%command%","id":1}, без этого оно как то долго думает при выполнении команды.

Ничего странного, этот заголовок только для этого и существует. Даже в википедии это написано.

serzh82saratov пишет:

И непонятно как теперь закрывать подключение как раньше: Proxy-Connection: Close

Подключение закрывается через socketClose(s). Заголовок "Proxy-Connection" можно вообще не указывать.

62

Re: AHK: Отправка сообщений в порт

Со чтением беда. Раньше при запросах в переменной "SocketReadStr" был текстовый ответ от сервера, а теперь "0". При вводе в обычном браузере:

http://localhost:8080/jsonrpc?request={"jsonrpc":"2.0","method":"Player.GetItem","params":{"playerid":1},"id":"1"}

он предлагает сохранить файл, и в нём ответ вида:

{"id":"1","jsonrpc":"2.0","result":{"item":{"label":"Джекпот.mkv","type":"unknown"}}}

как бы теперь его получать в переменную...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

63 (изменено: Александр_, 2013-03-02 15:25:17)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Со чтением беда. Раньше при запросах в переменной "SocketReadStr" был текстовый ответ от сервера, а теперь "0".

В функции socketSendStr замени

BufSize := StrPut(String, &Buffer, BufSize, Encoding)

на

BufSize := StrPut(String, &Buffer, BufSize, Encoding)-1

Этот сервер странно реагирует на нулевой байт в конце.
Кстати, параметр Host тоже можно не указывать.

64

Re: AHK: Отправка сообщений в порт

Спасибо Вам большое за помощь.

Заменил на BufSize := StrPut(String, &Buffer, BufSize, Encoding)-1 но в переменной "SocketReadStr" по прежнему почему-то "0".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

65

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Спасибо Вам большое за помощь.

Заменил на BufSize := StrPut(String, &Buffer, BufSize, Encoding)-1 но в переменной "SocketReadStr" по прежнему почему-то "0".

s := socketConnect(Host, Port)
req := "POST /jsonrpc?Input.Right HTTP/1.1`r`nContent-Length: 47`r`n`r`n{""jsonrpc"":""2.0"",""method"":""Input.Right"",""id"":1}"
socketSendStr(s, req)
msgbox % socketReadStr(s)
socketClose(s)

Ответ приходит.

66

Re: AHK: Отправка сообщений в порт

Действие выполняется (то есть нажимается вправо), но в ответе 0

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

67

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Действие выполняется (то есть нажимается вправо), но в ответе 0

В ответе строка "HTTP/1.1 200 OK\r\n...". Проверь исправленный ли файл подключается.

68

Re: AHK: Отправка сообщений в порт

Не знаю что было... Пересоздал файл скрипта и всё заработало!!!
Большое Вам спасибо!

Ещё вопрос: изменение BufSize := StrPut(String, &Buffer, BufSize, Encoding)-1 повлияет на то, что работало до этого?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

69

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Ещё вопрос: изменение BufSize := StrPut(String, &Buffer, BufSize, Encoding)-1 повлияет на то, что работало до этого?

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

70 (изменено: serzh82saratov, 2013-03-02 18:21:33)

Re: AHK: Отправка сообщений в порт

Ещё проблемка. При запросе

{"jsonrpc": "2.0","method": "Player.GetItem","params": {"playerid": 1, "properties":["file", "plot", "thumbnail"]},"id": "1"}

когда проигрывается видео (в другом случае и должно быть "error") :

HTTP/1.1 200 OK

Content-Length: 517

Content-Type: application/json

Date: Sat, 02 Mar 2013 14:08:29 GMT



{"id":"1","jsonrpc":"2.0","result":{"item":{"file":"E:\\Torents\\Клерки.mkv","id":113,"label":"Клерки","plot":"Комедия о молодых ребятах, работающих продавцами и служащими в крохотных, среднего пошиба магазинчиках (бакалея и видеопрокат) захудалого района Нью-Джерси.","thumbnail":"image://video@E%3a%5cTorents%5c%d0%9a%d0%bb%d0%b5%d1%80%d0%ba%d0%b8.mkv/","type":"movie"}}}

снизу в пути к файлу "необработанные символы".

Проверил в файле через браузер, тоже самое.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

71

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

снизу в пути к файлу "необработанные символы".

это не путь, а ссылка, в ней эти символы и должны экранироваться. См. wiki.

72

Re: AHK: Отправка сообщений в порт

Всё же с символами странно с этой программой выходит. Одна версия всё таки возвращает нормально, другая нет, ну и ладно.
По счёт BufSize-1 всё таки почему-то с "-1" в первом варианте чтения (который не jsonrpc) переменная пуста, ну да ладно сделал вычитание по условию, всё это глюки программы.

Ещё раз выражаю Вам искреннюю благодарность за помощь!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

73

Re: AHK: Отправка сообщений в порт

Ещё проблема всплыла с передачей кирилицы. Запрос:

http://localhost:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "E:\\Torents\\Клерки.mkv"}, "options":{"resume": true}}, "id": "1"}

приводит к ошибке.
Запрос:

http://localhost:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "E:\\Video\\BATTLEFIELD\\37.mp4"}, "options":{"resume": true}}, "id": "1"}

Выполняется.
Через браузеры таже самая ситуация.

Человек утверждает, что на питоне запросы с кирилицей выполняются без проблем.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

74

Re: AHK: Отправка сообщений в порт

в url'ах не должно быть кириллицы, я в предыдущем посте давал соответствующую ссылку на википедию.

75 (изменено: creature.ws, 2013-03-06 08:19:20)

Re: AHK: Отправка сообщений в порт

Слово «Клерки» должно выглядеть как %D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8

str := "Клерки"
size := VarSetCapacity(buf, StrLen(str) * 2, 0)
StrPut(str, &buf, "utf-8")

SetFormat, Integer, H
loop % size
    url .= "%" . Substr(NumGet(&buf, A_index - 1, "UChar"), 3)

MsgBox % url

76

Re: AHK: Отправка сообщений в порт

Так как мне быть? Как - то обрабатыать строку если в ней есть кириллица? Вашу ссылку я конечно прочитал.

в url'ах не должно быть кириллицы

Хмм... странно, ведь при запросах к не jsonrpc, русские символы обрабатываются нормально. Этот запрос:

PlayFile(E:\Torents\Клерки.mkv)

работает!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

77

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Хмм... странно, ведь при запросах к не jsonrpc, русские символы обрабатываются нормально. Этот запрос:

PlayFile(E:\Torents\Клерки.mkv)

работает!

Дык это и не url.

78

Re: AHK: Отправка сообщений в порт

Прошу прощения, имел ввиду:

GET /xbmcCmds/xbmcHttp?command=PlayFile(E:\Torents\Клерки.mkv) HTTP/1.1`r`nHost: %Host%`r`n`r`n
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

79

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Прошу прощения, имел ввиду:

GET /xbmcCmds/xbmcHttp?command=PlayFile(E:\Torents\Клерки.mkv) HTTP/1.1`r`nHost: %Host%`r`n`r`n

А с экранированными символами не работает?

80 (изменено: serzh82saratov, 2013-03-05 23:00:00)

Re: AHK: Отправка сообщений в порт

Теперь как-то непонятно:
С экранированным "E:\\Video\\BATTLEFIELD\\37.mp4"

http://localhost:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "%45%3A%5C%5C%56%69%64%65%6F%5C%5C%42%41%54%54%4C%45%46%49%45%4C%44%5C%5C%33%37%2E%6D%70%34"}, "options":{"resume": true}}, "id": "1"}

запрос работает через браузер, но неработает через код.
С экранированным "E:\\Torents\\Клерки.mkv"

http://localhost:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "%45%3A%5C%5C%54%6F%72%65%6E%74%73%5C%5C%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%2E%6D%6B"}, "options":{"resume": true}}, "id": "1"}

нигде неработает.

Если экранировать только слово "Клерки":

{"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "E:\\Torents\\%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8.mkv"}, "options":{"resume": true}}, "id": "1"}

тоже неработает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

81 (изменено: creature.ws, 2013-03-05 23:19:45)

Re: AHK: Отправка сообщений в порт

Буква «К» должна быть представленна в виде %D0%9A
Обратная косая черта (backslash \) — %5C
Percent-encoding

82

Re: AHK: Отправка сообщений в порт

creature.ws пишет:

Обратная косая черта (backslash \) — %5C

причём достаточно одной штуки .

83

Re: AHK: Отправка сообщений в порт

creature.ws пишет:

Буква «К» должна быть представленна в виде %D0%9A
Обратная косая черта (backslash \) — %5C
Percent-encoding

Так вроде так и есть:

http://localhost:8080/jsonrpc?request={"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "%45%3A%5C%5C%54%6F%72%65%6E%74%73%5C%5C%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8%2E%6D%6B"}, "options":{"resume": true}}, "id": "1"}

Александр_ пишет:

причём достаточно одной штуки  .

С одной неработает, jsonrpc нужен двойной backslash.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

84 (изменено: creature.ws, 2013-03-10 15:40:45)

Re: AHK: Отправка сообщений в порт

Как вариант

str := "http://forum.script-coding.com/viewtopic.php?id=7633"
MsgBox % str := URIEncode(str)
MsgBox % URIDecode(str)

URIDecode(ByRef string) {
    static Decode := Func("StringPercentDecode")
    return RegExParse(string, Decode, "S)(?:`%[a-fA-F0-9]{2})+")
}

URIEncode(ByRef string) {
    static Encode := Func("StringPercentEncode")
    return RegExParse(string, Encode, "S)[^0-9a-zA-Z\-_~.]+")
}

RegExParse(ByRef string, Func, pattern) {
    strLen := StrLen(string)
    startPos := 1

    while matchPos := RegExMatch(string, pattern, match, startPos) {
        (matchPos > startPos)
            && buf .= SubStr(string, startPos, matchPos - startPos)
        buf .= %Func%(match)
        startPos := matchPos + (IsObject(match)? match.len : StrLen(match))
    }
    (startPos <= strLen)
        && buf .= SubStr(string, startPos)

    return buf
}

StringPercentDecode(ByRef encodedString) {
    VarSetCapacity(buf, StrLen(encodedString) // 3, 0)
    offset := 0

    loop Parse, encodedString, `%
        (A_LoopField == "") || NumPut("0x" . A_LoopField, buf, offset++, "UChar")

    return StrGet(&buf, offset, "UTF-8")
}

StringPercentEncode(ByRef string) {
    formatInteger := A_FormatInteger
    SetFormat, IntegerFast, H
    VarSetCapacity(buf, StrPut(string, "UTF-8"))

    Loop % StrPut(string, &buf, "UTF-8") - 1 {
        byte := NumGet(buf, A_Index - 1, "UChar")
        encoded .= "%" . Substr(byte, 3)
    }

    SetFormat, IntegerFast, %formatInteger%
    return encoded
}

85

Re: AHK: Отправка сообщений в порт

creature.ws
Спасибо, но в случае с экранированием jsonrpc возвращает:

{"error":{"code":-32602,"message":"Invalid params."},"id":"1","jsonrpc":"2.0"}

то бишь некая его ошибка.

Запросы с экранированием латыни работают через все браузеры.

Запросы с экранированием (и без) кирилицы неработают через браузер Опера и IE.
Но как мне отписался знакомый, у него запросы содержащие кирилицу всё же работают только через Firefox, в Опера и IE неработают.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

86

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

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

Посмотрите какой запрос шлёт лиса и шлите аналогичный.

87

Re: AHK: Отправка сообщений в порт

Я думаю, тема претендует на Коллекцию.

88

Re: AHK: Отправка сообщений в порт

ypppu пишет:

Я думаю, тема претендует на Коллекцию.

Полностью согласен

Александр_ пишет:

Посмотрите какой запрос шлёт лиса и шлите аналогичный.

Только сейчас докачал (скорость 64 к\бит) Firefox. Действительно проблем нет с кирилицей. Как мне посмотреть какой запрос шлёт Firefox? В адресной строке символы не изменяются. Вы до этого мне про какие-то программы писали, которые мониторят это дело, но я непонял как с ними обращатся.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

89

Re: AHK: Отправка сообщений в порт

Вырезал кусок лога программы:

23:02:29 T:4872   DEBUG: webserver: request received for /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Player.Open%22,%20%22params%22:{%22item%22:{%22file%22:%20%22E:\\Torents\\%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8.mkv%22},%20%22options%22:{%22resume%22:%20true}},%20%22id%22:%20%221%22}
23:02:29 T:4872   DEBUG: JSONRPC: Incoming request: {"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "E:\\Torents\\Клерки.mkv"}, "options":{"resume": true}}, "id": "1"}
23:02:29 T:4872   DEBUG: JSONRPC: Calling player.open
23:02:29 T:4872   DEBUG: CVideoDatabase::GetMovieId (E:\Torents\Клерки.mkv), query = select idMovie from movie where idFile=664
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

90 (изменено: serzh82saratov, 2013-03-06 23:18:36)

Re: AHK: Отправка сообщений в порт

Запрос:

http://localhost:8080/jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Player.Open%22,%20%22params%22:{%22item%22:{%22file%22:%20%22E:\\Torents\\%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8.mkv%22},%20%22options%22:{%22resume%22:%20true}},%20%22id%22:%20%221%22}

работает через опера

Запрос:

request := "{%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Player.Open%22,%20%22params%22:{%22item%22:{%22file%22:%20%22E:\\Torents\\%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8.mkv%22},%20%22options%22:{%22resume%22:%20true}},%20%22id%22:%20%221%22}"

неработает через код скрипта.
.........................


Запрос без кирилицы, в логе выглядит так:

/jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Player.Open%22,%20%22params%22:{%22item%22:{%22file%22:%20%22E:\\Video\\BATTLEFIELD\\37.mp4%22},%20%22options%22:{%22resume%22:%20true}},%20%22id%22:%20%221%22}
23:10:40 T:4868   DEBUG: JSONRPC: Incoming request: {"jsonrpc": "2.0", "method": "Player.Open", "params":{"item":{"file": "E:\\Video\\BATTLEFIELD\\37.mp4"}, "options":{"resume": true}}, "id": "1"}

На лицо, обязательное экранирование пробелов и кавычек.

неработает через код скрипта.

Может дело в непрвалином значении длины строки отправляемом в "Content-Length:"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

91

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Только сейчас докачал (скорость 64 к\бит) Firefox. Действительно проблем нет с кирилицей. Как мне посмотреть какой запрос шлёт Firefox? В адресной строке символы не изменяются. Вы до этого мне про какие-то программы писали, которые мониторят это дело, но я непонял как с ними обращатся.

Ну с http/https всё совсем просто. Очень жаль что такие проблемы с интернетом, но тут ничего не попишешь. Нужно скачать Burp Suite(free edition хватит). Затем запускаем Burp Suite, он автоматически создаст прокси на порту 8080. При желании порт можно сменить в настройках(Proxy->options). Далее прописываем этот прокси в браузере(http-прокси, хост 127.0.0.1). На этом всё, теперь все пакеты будут идти через Burp Suite. На вкладке Proxy->Intercept можно "на лету" просматривать пакеты и менять их содержимое. Во вкладке Proxy->History можно посмотреть все отправленные пакеты и ответы сервера на них. Если нужно поиграться с содержимым пакета, то отправляем его в Repeater("send to repeater" в контекстном меню).

92

Re: AHK: Отправка сообщений в порт

Далее прописываем этот прокси в браузере(http-прокси, хост 127.0.0.1)

Можно поподробнее?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

93

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Можно поподробнее?

лиса:
http://s45.radikal.ru/i107/1303/38/542d3cd18962t.jpghttp://s019.radikal.ru/i642/1303/00/cbd85e301c62t.jpghttp://s017.radikal.ru/i434/1303/33/b7d5cd616599t.jpg
В остальных примерно так же. Плюс есть множество дополнений для работы с прокси.

94 (изменено: serzh82saratov, 2013-03-07 00:53:59)

Re: AHK: Отправка сообщений в порт

Тоже самое что и в логе программы:

GET /jsonrpc?request={%22jsonrpc%22:%20%222.0%22,%20%22method%22:%20%22Player.Open%22,%20%22params%22:{%22item%22:{%22file%22:%20%22E:\\Torents\\%D0%9A%D0%BB%D0%B5%D1%80%D0%BA%D0%B8.mkv%22},%20%22options%22:{%22resume%22:%20true}},%20%22id%22:%20%221%22} HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

Как этот запрос отправить в программу, ответ увидеть?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

95

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Как этот запрос отправить в программу, ответ увидеть?

Forward - отправить пакет.
Drop - не отправлять пакет.
Intercept is on/off - включить/отключить перехват.
Все ответы лежат в истории(History). Выбрать нужный запрос в списке, тогда отобразятся "request"(запрос) и "response"(ответ).

96

Re: AHK: Отправка сообщений в порт

Forward - отправить пакет.

Не доходит до адресата, и никакого ответа нет. Да и что оно даст? Ответ известен, запрос уже подсмотрели. Отправка такого-же запроса (с экранированными по нужным правилам символами) через код сабжа результата не даёт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

97

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Не доходит до адресата, и никакого ответа нет.

Наверно Burp Suite и та программа на одном порту висят. Нужно кого-нибудь на другой переселить.

serzh82saratov пишет:

Да и что оно даст? Ответ известен, запрос уже подсмотрели. Отправка такого-же запроса (с экранированными по нужным правилам символами) через код сабжа результата не даёт.

Значит где-то ошибка.

98

Re: AHK: Отправка сообщений в порт

Наверно Burp Suite и та программа на одном порту висят. Нужно кого-нибудь на другой переселить.

Переселив программу на 8081 команды отправляются напрямую в программу, и Burp Suite их уже не перехватывает.

Значит где-то ошибка.

...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

99

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Значит где-то ошибка.

...

значит в браузере не настроен прокси.

100 (изменено: serzh82saratov, 2013-03-07 02:41:23)

Re: AHK: Отправка сообщений в порт

serzh82saratov пишет:

Да и что оно даст? Ответ известен, запрос уже подсмотрели. Отправка такого-же запроса (с экранированными по нужным правилам символами) через код сабжа результата не даёт.

Александр_ пишет:

Значит где-то ошибка.

Александр_ пишет:

значит в браузере не настроен прокси.

Думал что вы имели ввиду скрипт.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui