1

Тема: AHK: Как получать данные с сайта?

Здравствуйте, у меня есть скрипт который в будущем я собираюсь обновлять, но с автоматическим обновлением у меня проблемы, по этому у меня другая идея. В документе у меня будет записано текущая версия скрипта, а уже в GUI будет это отображаться. Да я знаю уже есть такая тема, но мне нужно именно объяснение как это делать, потому что с AutoHotKey wiki я ничего не понял. Вот пример ссылки https://docs.google.com/document/d/1cVG … sp=sharing, мне нужно GUI в котором будет отображаться текст который записан в документе по ссылке, и если нет интернета появлялась ошибка. И пожалуйста распишите что делает каждая команда в коде. Заранее благодарю.

2

Re: AHK: Как получать данные с сайта?

Думаю найти сайт, который будет стабильно выдавать код - самое оно. Вроде такое есть на github.
В скрипте прописываем ссылку, которая будет постоянна, а код на странице можно обновлять хоть каждый день.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Как получать данные с сайта?

На сервер заливать актуальную версию скрипта, а в скрипте проверять имя(версию) этого файла. И если они не совпадают, скачивать с сервера новую версию. Это конечно не автообновление, придется руками удалять старую версию, но как бюджетный вариант, вполне реальный.

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

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

#Warn
#NoEnv
SendMode, Input 
SetWorkingDir %A_ScriptDir%

url = http
Filename = Update.zip

FileReadLine, VNum, %A_WorkingDir%\version.txt, 1
	if ErrorLevel = 1
	Vnum = 0
whr := ComObjCreate("WinHttp.WinHttpRequest.5.1")
whr.Open("GET", "http", true)
whr.Send()
whr.WaitForResponse() 
version := whr.ResponseText
MsgBox, 1, Press OK to download, Your current version is %Vnum%. This latest is %version%.
	IfMsgBox OK
		UrlDownloadToFile, *0 %url%, %A_WorkingDir%\%Filename%
		if ErrorLevel = 1
			MsgBox, There was some error updating the file. You may have the latest version, or it is blocked.
		else if ErrorLevel = 0
			MsgBox, The update/ download appears to have been successful or you clicked cancel. Please check the update folder. 
		else 
			MsgBox, some other crazy error occured. 
Return

А вот вариант с github, тоже с оффа.

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

If (Settings.Settings.CheckforUpdates != 0) {
	;API call to check for latest version
	
	Endpoint := "https://api.github.com/..."
	LatestAPI := ComObjCreate("WinHttp.WinHttpRequest.5.1")
	LatestAPI.Open("GET", Endpoint, False)
	LatestAPI.Send()
	Response := LatestAPI.ResponseText
	The_LatestVersion := Json_ToObj(Response).files.LoneIRC_LatestVersion.content
	
	;;Try to update if there is a new version detected. This will involve moving the executable 
	If (The_LatestVersion != "") {
		If (The_VersionName != The_LatestVersion && A_IsCompiled) {
			Msgbox, Updating to latest version: %The_LatestVersion%`n`nCheck your ...\Data\Settings.ini if you do not want to update automatically.
			FileMove, %A_ScriptFullPath%, %A_ScriptDir%\Data\%A_ScriptName%, 1
			Sleep 1000
			UrlDownloadToFile, http://../%The_ProjectName%.exe, %A_ScriptFullPath%
			Sleep 1000
			Run, %A_ScriptFullPath%
			ExitApp
		}
	}	
}

Может поможет.

GD

4 (изменено: svoboden, 2020-12-09 06:54:08)

Re: AHK: Как получать данные с сайта?

Примерно так посылает в гугл документы данные, прочитать похожим образом можно. Только нужно свое приложение создавать в гугле, еще библиотека class JSON нужна.

ClientId := "513776191582-5ncn9n03hheqpf74q4mg0d.apps.googleusercontent.com" 
 ClientSecret := "Vll3gaxJdvRIDsr30lmRGNaj" 
  RefreshToken := "1//0cDiJRIgO-H-ICgGAwSNwF-L9IrYNFVHRsN72oqO-WBIPT2FVSKF2o23RFMLYslhoJ4vGZDemRTxDXU" 

  Request := "refresh_token=" RefreshToken "&client_id=" ClientId "&client_secret=" ClientSecret "&grant_type=refresh_token" 
   WinHTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1") 
    WinHTTP.Open("POST", "https://accounts.google.com/o/oauth2/token", true) 
     WinHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
   WinHTTP.Send(Request) 
  WinHTTP.WaitForResponse()
 lkdjfs := WinHTTP.ResponseText

parsed := JSON.Load(lkdjfs)

parsed_out := Format("
(
)"
, parsed.access_token)

vardfwm := parsed.access_token
global GetKeyHttp = "Bearer "" " vardfwm


 WinHTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
  WinHTTP.Open("POST", "https://content-docs.googleapis.com/v1/documents/1Nnz-z-28q_thEyggkb79PIhWx1E:batchUpdate?alt=json&key=AIzaSyBaZYhFVmtVnA2FlabxaVgreLYdlmu04Ew", true)
    WinHTTP.SetRequestHeader("Authorization", GetKeyHttp)
   WinHTTP.SetRequestHeader("Content-Type", "application/json")
  Data = {"requests":[{"insertText":{"text":"%activation_key% ключ\n","location":{"index":1}}}]}
  WinHTTP.Send(Data)
    WinHTTP.WaitForResponse()
    Body := WinHTTP.ResponseBody 
     pData := NumGet(ComObjValue(Body)+8+A_PtrSize) 
   lkdjfsxcvx := StrGet(pData, Body.MaxIndex() + 1, "utf-8")
  ; msgbox % lkdjfsxcvx

; msgbox % Key

  
 

5

Re: AHK: Как получать данные с сайта?

Botsy
Спасибо

6

Re: AHK: Как получать данные с сайта?

Botsy
А если нет интернета, как сделать что бы скрипт об этом сообщил?

7

Re: AHK: Как получать данные с сайта?

Vsevolod Есть простой способ и нормальный. Сам пользуюсь простым: добавь подключение к серверу в блок "try", а в блоке "catch" обработай его, например выводом сообщения "нет интернета". А нормальный способ, это еще обрабатывать коды ошибок в http запросах(ну там ошибка 404 и т.д.), тогда будет полное сообщение об ошибке, а не просто "нет интернета".

GD

8

Re: AHK: Как получать данные с сайта?

Botsy пишет:

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

Почему же это не автообновление? Очень даже дельно, на мой взгляд.
Если стоит галочка в программе 'Проверять обнову' - скачать с сервера файл / код. Затем спросить пользователя на замену версии - если он согласиться - заменить текущую на новую. Можно сохранить старую, а новую рядом поставить и в конце добавить 'v2.0' например.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

9

Re: AHK: Как получать данные с сайта?

__Михаил__ В том варианте, который есть - базовый функционал. Можно дописать немного и будет вообще по красоте.

GD

10

Re: AHK: Как получать данные с сайта?

Botsy

FileReadLine, VNum, %A_WorkingDir%\version.txt, 1

Чтение файла, зачем? Это на мой взгляд глупо. В программе должна быть переменная, её сверить быстрее и правильнее.

Можно сделать более менее красивое окошко с предложением на обновление, стандартные ToolTip и MsgBox думаю уже не актуальны в готовом продукте.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Как получать данные с сайта?

Вот и пригодилось автообновление, было два варианта: либо сделать второй скрипт типо лаунчера, либо просто скачает новую версию -> запустит и сам себя удалит.
Остановился на второй. В не скомпилированном варианте все работает (если указать в FileRecycle -> A_ScriptFullPath), а после компиляции - нет. Т.е. "exe" не удаляет сам себя. Подскажите где ошибка?


SetWorkingDir %A_ScriptDir%
Current_version := 1
URL := "https://delete_download.exe"
link := "https://update.txt"

http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", link, False)
http.Send()
http.WaitForResponse()
Server_version := http.responseText

If (Server_version > Current_version)
{
		UrlDownloadToFile, %URL%, delete_download.exe
		if !FileExist("delete_download.exe")
			ExitApp
		Run, *RunAs delete_download.exe 1
		FileRecycle, delete_copy.exe
			ExitApp
}
else msgbox, Not
return
GD

12

Re: AHK: Как получать данные с сайта?

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

13

Re: AHK: Как получать данные с сайта?

Это базовые функции ОС. Саму себя удалять программа запретит. Нужен 'помощник' в этом. Например батник создать и запустить после выхода программы.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

14

Re: AHK: Как получать данные с сайта?

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

Во-первых, батник привязан по названию программ. Их можно изменить и т.д. Лучше было бы привязывать по PID процесса, чтобы удалить 100% нужную программу, но не нашел инфу как передать PID в батник при запуске. Во-вторых, привязан локально. Файлы могут разделить и т.д., и если программы не будет в каталоге с батником - ничего не получится. В-третьих, открывается командная строка и это может пугать пользователя или типо того. В-четвёртых, выполнение команд в батнике фиксировано задержкой между командами, а не их фактическим выполнением. У кого-то комп динозавр и команды не будут выполнены корректно.

В общем, в каталогах нормальных программ не нашел батников, хотя они обновляются красиво. За-то всегда есть 2-3 дополнительных ярлыка с названиями типо "service, update и прочее". Попробую альтернативный метод, без батника, а с промежуточной программой.


If (Server_version > Current_version)
{
		UrlDownloadToFile, %URL%, delete_download.exe
		if !FileExist("delete_download.exe")
			ExitApp
		Run, test.bat
			ExitApp
}

test.bat


@timeout /t 2
@erase "%~dp0delete_bat.exe" ; удаляем старую программу
@timeout /t 1
@rename delete_download2.exe delete_download.exe ; переименовываем новую в старую
@timeout /t 1
@start "" "%~dp0delete_download.exe" ; запускаем новую
GD

15

Re: AHK: Как получать данные с сайта?

1) Что мешает создавать батник с нужным названием программы? Ахк скрипт спокойно может получить свое название и создать батник с нужными данными.
2) Так же как с 1 пунктом. Ахк может получить полный путь где он находится.
3) Командую строку можно скрыть. Зачем она нам нужна, верно?
4) Сделать красивую анимацию якобы скачивания обновы?

Высосанные из пальца проблемы, как по мне.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

16 (изменено: __Михаил__, 2021-01-31 15:39:47)

Re: AHK: Как получать данные с сайта?

Ещё как вариант - скачать новую версию и запустить. В ней уже если всё устраивает пользователя предложить удаление старой. Если нужно то можно сохранить новую версию под старым названием (например запуск с ярлыка и прочее).

Вот проверил, работает:

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%

; Отобразить текущий полный путь:
F2::
Tool("Полный путь к программе: " A_ScriptFullPath,,0,0)
Return


; Переименовать текущую программу:
F3::
SplitPath, A_ScriptFullPath,, dir,, name_no_ext

FileMove, % A_ScriptFullPath, % dir "\" name_no_ext (A_IsCompiled ? " v2.exe" : " v2.ahk") ; Добавит к текущему названию 'v2'.
If ErrorLevel
 Tool("Не вышло переименовать",,0,0)
Else
 Tool("Всё ок",,0,0)
Return




;16.06.2020	показать на время ToolTip, с указанием позиции:
Tool(txt, wait := 2000, X := "", Y := "")
{
 SetTimer, Show0, Off
 ToolTip, % txt, % X, % Y

 If wait
  SetTimer, Show0, %wait%
 Else
 {
  KeyWait, %A_ThisHotkey%, U
  ToolTip
 }
}


~Esc::
Show0:
SetTimer, Show0, Off
ToolTip
Return

F4:: ExitApp
F6:: Reload
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

17

Re: AHK: Как получать данные с сайта?

Переделал без батника, по мне так стало надёжнее. Есть программа и апдейтер.
Программа скачивает новую версию и запускает апдейтер, передавая ему параметры(особенно порадовало передача PID, потому что с батником этого не получилось).


SetWorkingDir %A_ScriptDir%

PID := DllCall("GetCurrentProcessId")
Current_version := 1
old_File_path := A_ScriptFullPath
new_File_path := A_ScriptDir "\new_version.exe"
URL := "/new_version.exe"
link := "/update.txt"

http := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
http.Open("GET", link, False)
http.Send()
http.WaitForResponse()
Server_version := http.responseText

If (Server_version > Current_version)
{
		UrlDownloadToFile, %URL%, new_version.exe
		Run, parametrs_test.exe "%PID%" "%old_File_path%" "%new_File_path%"
		ExitApp
}
return

Апдейтер обрабатывает входные параметры, завершает и удаляет старую версию, переименовывает новую и запускает ее.

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

#NoEnv
SetWorkingDir %A_ScriptDir%

if A_Args.Count() > 3
	ExitApp
else if A_Args.Count() > 0
{
	for index, element in A_Args
	{
		first_element := SubStr(element, 1, 1)
		if (first_element = "-")
		{
			element := SubStr(element, 2)
		}
		input_parametrs%index% := element
	}
			;	input_parametrs1 = PID
			;	input_parametrs2 = old_File_path
			;	input_parametrs3 = new_File_path

	if !FileExist(input_parametrs2)
		ExitApp
	old_version(input_parametrs1, input_parametrs2)
	new_version(input_parametrs2, input_parametrs3)
	run %input_parametrs2%
}
else ExitApp

ExitApp

old_version(old_PID, old_File_path) 
{
Process, Exist, %old_PID%
if Errorlevel != 0
{
	Process, Close, %old_PID%
	Process, WaitClose, %old_PID%, 1
	if ErrorLevel != 0
	{
		MsgBox, Error
		ExitApp
	}
}

if FileExist(old_File_path) 
{
	FileDelete, %old_File_path%
	if ErrorLevel != 0
	{
		MsgBox, Error
		ExitApp
	}
}
return
}

new_version(old_File_path, new_File_path) 
{
if FileExist(new_File_path)
{
	FileMove, %new_File_path%, %old_File_path%, 1
	if ErrorLevel != 0
	{
		MsgBox, Error
		ExitApp
	}
}
return
}

Пока что всё работает тип-топ). Не знаю насколько корректно написал, мб забыл что-то проверить или может подскажите на ошибки, если есть?

GD

18 (изменено: __Михаил__, 2021-02-02 18:59:38)

Re: AHK: Как получать данные с сайта?

Первый косяк что сразу в глаза попадается - 'parametrs_test.exe', не указано где его искать, что если его не будет в папке?
Либо он должен проверяться перед запуском, либо скачиваться / извлекаться из основы.

2) 'Server_version' точно будет нужным числом? Что если ссылка окажется не действительной?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

19

Re: AHK: Как получать данные с сайта?

Апдейтер в комплекте сразу буду кидать, а проверку на наличие файла - добавлю. А все действия с ссылкой, добавлю в блок try.

GD

20

Re: AHK: Как получать данные с сайта?

Всё же, наличие файла, который может неожиданно 'пропасть' - не очень хороший вариант как по мне. Если всё же оставить как есть, тогда при первой установке сразу переместить основную программу и обновлялку в отдельную папку, например в 'C:\Program Files\' а на рабочем столе создать ярлык?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

21 (изменено: Botsy, 2021-02-03 00:13:02)

Re: AHK: Как получать данные с сайта?

Как вариант, спасибо за советы.

GD