Тема: AHK: посещаемые URL
Возможно ли с помощью AHK отслеживать посещаемые URL и при совпадении с URL из списка производить какое-либо действие?
Если возможно насколько это сложно и в какую сторону копать?
Заранее спасибо за ответы.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Возможно ли с помощью AHK отслеживать посещаемые URL и при совпадении с URL из списка производить какое-либо действие?
Если возможно насколько это сложно и в какую сторону копать?
Заранее спасибо за ответы.
Что такое "посещаемые URL"?
Урл на который зашел человек в каком-либо браузере
Можно периодически проверять содержимое адресной строки или строки состояния.
Возможно ли с помощью AHK отслеживать посещаемые URL...
Если в браузере есть стандартный контрол в котором располагается адресная строка, то не сложно взять от туда информацию, а вот если контрол не определяется как на пример в Opera или FF, то можно эту задачу решить по средству Dynamic Data Exchange (DDE), достаточно скачать уже готовые решения и выставить нужный браузер.
...насколько это сложно...
Это Вам решать.
; http://www.autohotkey.com/forum/post-121422.html&sid=c2e6ca647e407e4e4514de2e39f2815c#121422
SetTimer, CheckURL, 1000
Return
CheckURL:
Itr++
;sServer := "iexplore"
sServer := "opera"
;sServer := "firefox"
sTopic := "WWW_GetWindowInfo"
sItem := "0xFFFFFFFF"
idInst := DdeInitialize()
hServer := DdeCreateStringHandle(idInst, sServer)
hTopic := DdeCreateStringHandle(idInst, sTopic)
hItem := DdeCreateStringHandle(idInst, sItem)
hConv := DdeConnect(idInst, hServer, hTopic)
hData := DdeClientTransaction(0x20B0, hConv, hItem)
sData := DdeAccessData(hData)
DdeFreeStringHandle(idInst, hServer)
DdeFreeStringHandle(idInst, hTopic)
DdeFreeStringHandle(idInst, hItem)
DdeUnaccessData(hData)
DdeFreeDataHandle(hData)
DdeDisconnect(hConv)
DdeUninitialize(idInst)
Loop, Parse, sData, CSV
If A_Index = 1
sURL := A_LoopField
Else If A_Index = 2
sTitle := A_LoopField
RegExMatch(sTitle, "(?<=\[).*(?=\])", sTitle) ; эта строка нужна, если браузер опера
If (Itr >= 1 And PassedURL <> sURL)
{
IfNotExist, % A_ScriptDir "\HistoryURL.txt"
FileAppend, % sURL "`n"sTitle, % A_ScriptDir "\HistoryURL.txt"
Else
{
Loop, Read, % A_ScriptDir "\HistoryURL.txt"
{
If (A_LoopReadLine = sURL)
MsgBox, 4,, % "совпадение в строке №"A_Index
. "`n`nтекущий URL: "sURL
. "`nURL из истории: "A_LoopReadLine
. "`n`nназвание страницы: "sTitle
. "`n`n`t`t`t`t`tпродолжить отчёт?", 2
IfMsgBox, No
Break
}
FileAppend, % "`n`n"sURL "`n"sTitle, % A_ScriptDir "\HistoryURL.txt"
}
}
Else
Itr :=
PassedURL := sURL
Return
DdeInitialize(pCallback = 0, nFlags = 0)
{
DllCall("DdeInitialize", "UIntP", idInst
, "UInt", pCallback
, "UInt", nFlags
, "UInt", 0)
Return idInst
}
DdeUninitialize(idInst)
{
Return DllCall("DdeUninitialize", "UInt", idInst)
}
DdeConnect(idInst, hServer, hTopic, pCC = 0)
{
Return DllCall("DdeConnect", "UInt", idInst
, "UInt", hServer
, "UInt", hTopic
, "UInt", pCC)
}
DdeDisconnect(hConv)
{
Return DllCall("DdeDisconnect", "UInt", hConv)
}
DdeAccessData(hData)
{
Return DllCall("DdeAccessData", "UInt", hData, "UInt", 0, "Str")
}
DdeUnaccessData(hData)
{
Return DllCall("DdeUnaccessData", "UInt", hData)
}
DdeFreeDataHandle(hData)
{
Return DllCall("DdeFreeDataHandle", "UInt", hData)
}
DdeCreateStringHandle(idInst, sString, nCodePage = 1004)
{
Return DllCall("DdeCreateStringHandle", "UInt", idInst
, "UInt", &sString
, "int", nCodePage)
}
DdeFreeStringHandle(idInst, hString)
{
Return DllCall("DdeFreeStringHandle", "UInt", idInst, "UInt", hString)
}
DdeClientTransaction(nType, hConv, hItem, sData = ""
, nFormat = 1, nTimeOut = 10000)
{
Return DllCall("DdeClientTransaction", "UInt", sData = "" ? 0 : &sData
, "UInt", sData = "" ? 0 : StrLen(sData)+1
, "UInt", hConv
, "UInt", hItem
, "UInt", nFormat
, "UInt", nType
, "UInt", nTimeOut
, "UIntP", nResult)
}
Esc::ExitApp
Чуть подправил код, потому как, когда совпадений много, то устанешь ждать, пока они все отобразятся.
В актив видоу инфо во всех браузерах в графе >>>>( TitleMatchMode=slow Visible Text )<<<< отображается URL открытой страницы. Можно каким-либо образом извлекать информацию от туда?
...во всех браузерах...
Не во всех, опять таки только в тех у которых адресная строка находится в контроле и этот контрол стандартный (IE, Google Chrome). Из IE я могу скопировать адрес двумя способами:
DetectHiddenWindows, On
ControlGetText, CText, Edit1, ahk_class IEFrame
MsgBox, % CText
или
DetectHiddenWindows, On
PostMessage, 0xB1, 0, -1, Edit1, ahk_class IEFrame ; EM_SETSEL
Sleep, 25
PostMessage, 0x301,,, Edit1, ahk_class IEFrame ; WM_COPY
Sleep, 25
MsgBox, % Clipboard
Из Google Chrome (почему-то не получается по классу окна...) тоже почти такими же двумя:
DetectHiddenWindows, On
SetTitleMatchMode, RegEx
ControlGetText, CText, Chrome_OmniboxView1, Google Chrome
MsgBox, % CText
и
DetectHiddenWindows, On
SetTitleMatchMode, RegEx
PostMessage, 0xB1, 0, -1, Chrome_OmniboxView1, Google Chrome
Sleep, 25
PostMessage, 0x301,,, Chrome_OmniboxView1, Google Chrome
Sleep, 25
MsgBox, % Clipboard
Sleep, 25 ; в контроле остаётся выделение текста,
PostMessage, 0xB1, -1,, Chrome_OmniboxView1, Google Chrome ; приходится его снимать, чего нет в IE
Ну а в Opera и FF, как я уже говорил, контролы устроены не стандартно и они не определяются, по этому считаю сбор информации через DDE технологию универсальным вариантом (правда у меня не получилось приобщить туда Google Chrome - sServer := "chrome").
...правда у меня не получилось приобщить туда Google Chrome - sServer := "chrome").
Теперь ясно почему.
Возможно ли с помощью AHK отслеживать посещаемые URL и при совпадении с URL из списка производить какое-либо действие?
Если возможно насколько это сложно и в какую сторону копать?Заранее спасибо за ответы.
Я бы посоветовал пустить трафик интересующих вас программ через Wicked Patcher. В нём имеется поддержка скриптов(описание языка тут), которые позволяют производить любые манипуляции с пакетами.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться