Тема: AHK: Поиск в Интернете
Возникло из бесконечной маеты с поиском и попыток найти что-нибудь подходящее в природе.
Возможности:
- интернет-поиск по горячим клавишам выделенного в любом приложении текста в соответствии с созданными правилами
- поиск по сайту, открытому в окне браузера или заранее определенному
- возможность создания множественного поиска, когда по одной клавише ищется текст в нескольких поисковых системах, на нескольких сайтах и пр.
- использование различных параметров поисковых систем, в том числе и требующих запроса текущего адреса в браузере
- если под курсором находится файл в проводнике или файловом менеджере, производится поиск по имени файла (опционально - с отбрасыванием расширения)
- поиск по треку под курсором в некоторых медиаплеерах (foobar2000, Hokrain)
- поиск информации по открытому сайту
- сохранение истории запросов (файл Search_history.txt), доступной через выпадающее меню
- возможность использования поиска внутри текущего окна недефолтного браузера без переключения на основной. Скрипт создает вкладки и отправляет в них запросы.
При нажатии горячей клавиши скопированный текст отправляется непосредственно браузеру (во избежание конфликтов используется в качестве модификатора клавиша CapsLock, которая после возвращается в выключенное состояние). Если ничего не скопировано, а также при секундном зажатии CapsLock для редактирования текста, появляется окно (его же можно также вызвать по CapsLock+`):
Функция поиска имеет вид:
Search(url,par,s_name)
Здесь:
url - собственно строка поиска или связанная с ней переменная (несколько таких переменных для основных поисковых систем прописаны в начале скрипта),
par - дополнительные параметры,
s_name - название поиска, отображаемое в выпадающем меню (по ней же скрипт определяет начало нового поиска и сбрасывает значения переменных).
Есть два способа определения url:
1. С помощью браузера Opera 12. Щелкаем правой кнопкой по форме поиска, выбираем "Create Search", появляется маленькое окошко. Если строка "Query String" пуста, копируем строку "Address" и имеем готовый url. Если указанная строка непуста, для поиска по сайту можно почти всегда использовать внешние поисковики, о чем ниже.
2. Способ второй, кустарный, но работающий на чем угодно: следует ввести в интересующую поисковую форму какой-то простой английский текст (например, test) и нажать ввод. Далее копируем адрес открывшейся страницы и заменяя "test" на "%s" получаем требуемый url. Если в адресной строке не удается найти "test" (происходит возврат к исходному или слегка видоизмененному адресу), данный рецепт не работает и следует использовать поиск по сайту сторонней поисковой системой.
На некоторых сайтах возникает ошибка в кодировке введенного текста. Это означает, что текст следует передавать в кодировке ANSI вместо юникода, для чего в строку url следует добавить в начале "#".
Вторая переменная "par" соответствует параметрам поиска - в нее можно вписать все, что соответствует синтаксису запросов используемого поисковика.
Так что
Search(google,"site:forum.script-coding.com","...")
- поиск гууглом по этому форуму,
Search(google,"site:forum.script-coding.com intitle:AutoHotkey","...")
- поиск по его аутохоткейным веткам,
Search(duckduckgo,"site:litmir.me,lib.ru","...")
- поиск по нескольким сайтам с DuckDuckGo.
Для того, чтобы передать в параметры адрес открытой в браузере страницы, используются переменная $url, равная ее точному адресу, и переменная $site, соответствующая корневому каталогу сайта. Следует отметить, что при наличии $url или $site в параметрах скрипт не показывает окно при отсутствии скопированного текста без зажатия CapsLock.
Добавление в начале или в конце второго параметра "noclip" приводит к игнорированию скопированного текста (не адреса страницы!), что может быть использовано для поиска информации о сайте, не требующей ничего, кроме его адреса.
Таким образом
Search(google,"site:$site","...")
- поиск текста по открытому в браузере сайту,
Search(google,"noclip cache:$url","...")
- поиск кэшированной версии открытой страницы.
Search("https://whois.domaintools.com/%s","noclip $site","...")
- поиск информации об открытом сайте на whois.domaintools.com
Множественный поиск осуществляется простой последовательностью
Hotkey::
Search(...)
.........
Search(...)
return
При этом название поиска во всех функциях, кроме первой должно отсутствовать. Если есть желание сделать множественный поиск с использованием адреса текущей страницы, одну из таких функций следует поставить на первое место - тогда его значение будет передано последующим.
Во всех случаях при желании для выбора поиска только из окна GUI можно использовать метки вместо клавиш, например цифровые.
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu Tray, Icon, shell32.dll, 23
Menu Tray, Add
Menu Tray, Add, Help, F1
Menu Tray, Add, Open, Open
Menu Tray, Default, Open
SetTitleMatchMode 2
SetTitleMatchMode Slow
/*
Скрипт для поиска в интернете
http://forum.script-coding.com/viewtopic.php?id=10357
В окне скрипта:
F1 или пункт меню в трэе - cтраница скрипта со справкой
Ctrl+Up/Down - выбор поиска
Home/End - первый и последний поиск
Alt+Down - история поиска
Left/Right автоматически возвращают фокус в поле ввода
Enter или двойной клик по поиску - запуск поиска
Средняя кнопка - переключение режима поверх всех окон
Escape - закрытие окна
CapsLock + Ctrl или двойной щелчок по иконке в трэе - открытие окна поиска
CapsLock + F - поиск выделенного текста на странице браузера
CapsLock + \ - открытие текстовых url
*/
;-------- Основные поисковики ---------
bing:="http://www.bing.com/search?q=%s&go=Submit&qs=bs&form=QBLH"
duckduckgo:="https://duckduckgo.com/?q=%s"
google:="https://www.google.ru/search?client=opera&q=%s&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest&gws_rd=ssl"
nigma:="http://nigma.ru/?s=%s&t=web"
yandex:="http://yandex.ru/yandsearch?lr=157&oprnd=8221201798&text=%s"
;-------- Настройки -----------
def_search:=google ; поисковая система (см. выше) или строка url, используемая по умолчанию
sh:=30 ; размер истории поисковых запросов
fs:=12 ; размер шрифта диалогового окна
width:=860 ; ширина поля ввода
rows:=16 ; число строк в окне выбора поиска
del_ext:=1 ; отбрасывть расширение при поиске по файлу в файловом менеджере, проводнике или плеере
def_br:="" ; путь к основному браузеру (при необходимости)
def_key:="CapsLock" ; кнопка, зажатие которой при поиске выделенного текста ведет к появлению окна (менять при переходе с CapsLock на другие дополнительные клавиши). Если переменная пуста, после нажатия будет всегда открываться окно с выбранным поиском и скопированным текстом
key_delay:=0.8 ; время зажатия дополнительной клавиши для появления интерфейса со скопированным текстом, секунд
s_sort:=0 ; сортировка поисков по алфавиту в выпадающем списке. Если имя поиска начинается с цифр, поставленных для сортировки, они не будут отображаться в окне
highlight:=2 ; подсветка скопированного текста в окне (1 - всегда, 2 - только если результат получен из скопированного файла или при вызове по CapsLock & Ctrl)
ontop:=1 ; окно поверх всех окон
curr_br:=1 ; использовать для поиска активное окно недефолтного браузера
browsers:="Internet Explorer,Maxthon,ahk_class MozillaWindowClass,ahk_class Chrome_WidgetWin_1" ; определения окон недефолтных браузеров, через запятую (все, что может быть вписано в команду IfWinActive - фрагменты заголовков окон, ahk_class ..., ahk_exe ... или их комбинации). Желательно, чтобы используемого по умолчанию здесь не было, т.е. поиск в нем запускался напрямую
del_end:="Больше информации на http|Читайте далее: http|Читать далее: http|Подробности: http" ; начала обрезаемых хвостов, добавляемых скриптами на веб-страницах при копировании текста, разделенные "|"
;---------------------------------
goto start
CapsLock::CapsLock
; ~Capslock::SetCapsLockState Off ; для полного выключения CapsLock
Open:
CapsLock & Ctrl::
open:=1
; далее описания в 3-м параметре 1-й функции
CapsLock & vk53::Search(,,"Поиск в Интернете")
CapsLock & vk44::Search(,"site:$site","Поиск по сайту")
CapsLock & vk5A::
Search(duckduckgo,,"Nigma и DuckDuckGo - альтернативный поиск")
Search(nigma)
return
CapsLock & vk43::
Search(google,"noclip related:$url","Google: кэш, ссылающиеся и связанные страницы")
Search(google,"noclip link:$url")
Search(google,"noclip cache:$url")
return
CapsLock & vk49::
Search("https://www.mywot.com/ru/scorecard/%s","noclip $site","WHOIS, WOT - информация о сайте")
Search("https://whois.domaintools.com/%s","noclip $site")
return
CapsLock & vk4D::Search("http://maps.google.com/maps?q=%s",,"Google Maps")
CapsLock & vk45::Search("www.multitran.ru/c/m.exe?CL=1&s=%s&l1=1",,"Перевод в Multitran-eng")
CapsLock & vk51::Search("https://translate.google.com/#en/ru/%s",,"Google Translate - перевод выделенного текста")
CapsLock & vk54::Search("https://translate.google.com/translate?sl=en&tl=ru&js=y&prev=_t&hl=ru&ie=UTF-8&u=%s&edit-text=","noclip $site","Google Translate - перевод сайта")
CapsLock & vk57::
Search("https://en.wikipedia.org/w/index.php?search=%s&title=Special%3ASearch&go=Go",,"Wikipedia Rus+Eng")
Search("https://ru.wikipedia.org/w/index.php?search=%s&title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&go=%D0%9F%D0%B5%D1%80%D0%B5%D0%B9%D1%82%D0%B8")
return
CapsLock & vk41::
Search(,"site:forum.script-coding.com intitle:AutoHotkey","Autohotkey - документация и Серый форум")
Search("http://cse.google.com/cse?cx=010629462602499112316:ywoq_rufgic&q=StringReplace#gsc.tab=0&gsc.q=%s&gsc.sort=&gsc.ref=more%3Adocumentation")
Search("http://ahk-wiki.ru/search?q=%s")
return
CapsLock & vk4E::Search("https://social.msdn.microsoft.com/Search/ru-RU?query=%s&emptyWatermark=true&ac=2",,"Поиск в MSDN")
CapsLock & vk48::Search("http://htmlbook.ru/sites/search/?q=%s&x=0&y=0",,"Поиск в htmlbook.ru")
CapsLock & vk50::
Search(,"site:http://forum.ru-board.com","Поиск программ (Softodrom, ru-board и Softpedia)")
Search("http://www.softpedia.com/dyn-search.php?search_term=%s&x=0&y=0")
Search("http://www.softodrom.ru/Поиск/?text=%s&where=soft")
return
CapsLock & vk59::
Search("http://dic.academic.ru/searchall.php?SWord=%s&from=xx&to=ru&did=&stype=0",,"Поиск на Академике")
CapsLock & vk4C::
Search("#http://lib.ru/GrepSearch?Search=%s",,"Большой поиск книг")
Search(,"site:litmir.me")
Search(,"site:ihtik.lib.ru")
Search("http://ru.wikisource.org/w/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F%3A%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&profile=default&search=%s&fulltext=Search")
Search("http://www.koob.pro/search/?q=%s&cx=005981379277374831887%3A0jyriruaxh4&cof=FORID%3A9")
Search("#http://www.e-reading.club/?query=%s")
return
CapsLock & vk42::Search("http://flibusta.is/booksearch?ask=%s",,"Флибуста - поиск книг")
CapsLock & vk56::
Search("http://rutracker.org/forum/tracker.php?nm=%s",,"Поиск видео")
Search("#http://search.tfile.co/?q=%s")
Search(,"site:telepoisk.com")
Search(,"site:tvkultura.ru/video")
Search("http://yandex.ru/video/search?text=%s&safety=1&path=main")
Search("http://www.youtube.com/results?search_query=%s&oq=&gs_l=")
return
CapsLock & vk52::
Search(nigma,"torrent","Поиск торрентов")
;~ Search(duckduckgo,"torrent")
;~ Search("http://bitsnoop.com/search/all/%s/c/d/1/")
Search("https://torrentproject.se/?t=%s")
Search("http://tracker.ru/search?q=%s")
Search("#http://search.tfile.co/?q=%s")
Search("https://rutracker.org/forum/tracker.php?nm=%s")
return
CapsLock & vkE2::Search("%s",,"Открытие текстового url")
;----------------------------
CapsLock & vk46::
KeyWait CapsLock, T2
Clipboard:=""
Send ^{vk43}
ClipWait 1
Clipboard:=RegExReplace(Clipboard,"(" del_end ").+$","")
Send ^{vk46}
Sleep 500
Send {Bs 15}^{vk56}{Enter}
SetCapsLockState Off
return
;----------------------------
start:
n:=0
Loop Read, % A_ScriptName
{
If A_LoopReadLine~="^\s*(/\*|\*/)"
{
comment:=!comment
continue
}
If (A_LoopReadLine~="^\s*;" || comment)
continue
If RegExMatch(A_LoopReadLine,"^[^(]+?(?=:{1,2})",k)
key:=Trim(k), string:=A_Index
If (RegExMatch(A_LoopReadLine,"(?<=Search\().+(?=\))",s_arg) && (A_Index-string)<2 && key)
{
Loop Parse, s_arg, CSV
{
If (A_Index=3 && A_LoopField)
stack.="|" A_LoopField, n+=1, key%n%:=key, key:=""
}
}
}
StringReplace stack, stack, ", , All
StringTrimLeft stack, stack, 1
stack_0:=stack
If s_sort
{
Sort stack, D|
stack:=RegExReplace(stack,"(^|\|)\K\d+")
}
FileEncoding utf-8
s_name_old:=RegExReplace(stack,"\|.+$")
return
Search(url="",par="",s_name="")
{
global
url_start:=url, par_start:=par
If !url
url:=def_search
If (s_name && !open)
s_name_old:=s_name
If (s_name && !clip) || open
{
ctrl_start:=ctrl_delay:=1
If !open && def_key
{
KeyWait %def_key%, T%key_delay%
If !ErrorLevel
ctrl_start:=ctrl_delay:=0
}
clipboard_old:=Clipboard, s_numb:=1
WinGetActiveTitle title
id:=WinActive("A")
Clipboard:=""
If title contains Far 1,Far 2,Far 3
Send {Esc}
Send ^{vk43}
ClipWait 1
clip:=Trim(Clipboard)
If (clip~="^https?://\S+$" && url_start!="%s")
clip:=""
If del_end
clip:=RegExReplace(clip,"(" del_end ").+$","")`
clip:=RegExReplace(clip,"\R|#"," ")
RegExMatch(clip,"im)^[A-Z]:\\.+$",path)
If (path && del_ext)
SplitPath clip, , , , clip
If (path && !del_ext)
SplitPath clip, clip
}
If !clip && !open && (s_numb>1)
clip:=clip_old
SetCapsLockState Off
FileAppend, , Search_history.txt
FileRead s_list, Search_history.txt
s_stack:="", s_out:="", n1:=0, n2:=0
Loop Parse, s_list, `n,`r
{
If !A_LoopField
continue
s_stack:=A_LoopField "|" s_stack, clip_end:=A_LoopField
n1+=1
}
If (clip && clip!=clip_old && clip!=clip_end)
{
Loop Parse, s_list, `n,`r
{
n2+=1
If (!A_LoopField || n1-n2>sh-2)
continue
s_out.= A_LoopField "`r`n"
}
s_stack:=clip "|" s_stack
FileDelete Search_history.txt
FileAppend % s_out . clip, Search_history.txt
}
If ctrl_delay || (!clip && !(par_start~="noclip")) || open
{
Gui 1:Destroy
Gui 1:New, -DPIScale LastFound, Поиск в Интернете
If ontop
Gui 1:+AlwaysOnTop
Gui 1:font, Arial s%fs%
Gui 1:Color, D7D7D7
Gui 1:Margin , 10, 6
Gui 1: Add, ListView, r%rows% w%width% Grid -Multi NoSortHdr gListView, Search|Hotkey
Loop Parse, stack, `|
{
If A_LoopField contains % s_name_old
select_raw:=A_Index
kkk:=GetKeyName(RegExReplace(key%A_Index%,".+(?=(vk|sc))"))
prefix:=RegExReplace(key%A_Index%,"(vk|sc)\S+$")
prefix:=RegExReplace(prefix," ?& ?"," + ")
StringUpper kkk,% RUEN(kkk)
If key%A_Index% not contains ^,+,!,&
prefix:=kkk:=""
LV_Add("",A_LoopField,prefix . kkk)
}
LV_ModifyCol(1,width-250)
LV_ModifyCol(2,200)
LV_Modify(n,"+Select Vis")
LV_Modify(select_raw,"+Select Vis")
Gui 1:Add, ComboBox, vclip wp Choose1, % s_stack
GuiControl Focus, Edit1
Gui 1:font, s10
b_width:=width//1.6, x_b:=(width-b_width)//2
Gui 1:Add, Button, x%x_b% w%b_width% h32 Default -TabStop, Search
Gui 1:Show, Center
If ((!highlight || !(highlight=2 && path)) && A_ThisHotkey!="CapsLock & Ctrl")
Send {End}
If !clip
GuiControl Text, Edit1
ctrl_start:=ctrl_delay:=open:="", Clipboard:=clipboard_old
Sleep 2000
SetCapsLockState Off
Exit
}
If (s_name && par_start~="\$(url|site)")
{
Clipboard:=$url:=$site:=""
Send ^{vk4C}
Sleep 200
Send ^{Ins}
ClipWait 0.5
$url:=Trim(Clipboard)
If !($url~="^https?://\S+$")
{
MsgBox, 262160, Ошибка, Адрес недоступен!, 1
Exit
}
$site:=RegExReplace($url,"^.+://")
$site:=RegExReplace($site,"/.+$")
}
StringReplace par, par, $url, % $url, All
StringReplace par, par, $site, % $site, All
Enc:="UTF-8"
If (url~="^#")
Enc:="CP1251", url:=RegExReplace(url,"^#")
If par_start~="noclip"
par:=Trim(StrReplace(par,"noclip"))
else
par:=Trim(clip " " par)
If (url_start="%s")
url:=clip, par:=""
StringReplace url, url, http://
StringReplace url, url, https://
url:="http://" url
StringReplace url, url, `%s, % UriEncode(par,Enc)
;~ OutputDebug % "clip: " clip " par: " par " $url: " $url " $site: " $site "`nurl: " url
WinGetActiveTitle t2
If curr_br
{
Loop Parse, browsers, `,
{
If WinActive(A_LoopField)
{
Send ^{vk54}
WinWaitNotActive % t2, , 1
Sleep 50
Clipboard:=url
Send {Bs 15}^{vk56}{End}{Enter}
Sleep 500
goto end
}
}
}
If def_br
Run % def_br " " url
else
Run % url
If (s_numb=1)
WinWaitNotActive % t2, , 5
Sleep 200
end:
If s_numb=1
s_name_old:=s_name
s_numb+=1, ctrl_delay:=""
Clipboard:=clipboard_old, clip_old:=clip, clip:=""
KeyWait % def_key, T2
Sleep 100
SetCapsLockState Off
return
}
ListView:
If (A_GuiEvent!="DoubleClick")
return
ButtonSearch:
Gui 1: Submit
ControlGet sel, List, Selected, SysListView321
sel:=Trim(RegExReplace(sel,"\t.+$"))
WinActivate ahk_id %id%
Loop Parse, stack_0, `|
{
If A_LoopField contains % sel
{
sn:=A_Index
break
}
}
clip:=Trim(clip)
goto % key%sn%
GuiClose:
GuiEscape:
ControlGet sel, List, Selected, SysListView321
s_name_old:=Trim(RegExReplace(sel,"\t.+$"))
Gui 1: Submit
clip:=ctrl_delay:=""
return
#If WinActive("ahk_pid " DllCall("GetCurrentProcessId"))
MButton::
ontop:=!ontop
goto Open
F1::
Run http://forum.script-coding.com/viewtopic.php?id=10357
return
^Up::
If !sel:=LV_GetNext("F")-1
sel:=1
LV_Modify(sel,"Select Focus Vis")
return
^Down::LV_Modify(LV_GetNext("F")+1,"Select Focus Vis")
PgUp::
If LV_GetNext("F")<rows
LV_Modify(1,"Select Focus Vis")
else
LV_Modify(LV_GetNext("F")-rows,"Select Focus Vis")
return
PgDn::
If LV_GetNext("F")+rows>n
LV_Modify(n,"Select Focus Vis")
else
LV_Modify(LV_GetNext("F")+rows,"Select Focus Vis")
return
Home::LV_Modify(1,"Select Focus Vis")
End::LV_Modify(n,"Select Focus Vis")
!Down::
ControlFocus Edit1
Send !{Down}
return
Enter::
NumpadEnter::
goto ButtonSearch
^vk56::
ControlFocus Edit1
Send ^{vk56}
return
~Left::
~Right::
ControlFocus Edit1
return
#IfWinActive
UriEncode(Uri,Enc)
{
StrPutVar(Uri, Var, Enc)
f := A_FormatInteger
SetFormat, IntegerFast, H
Loop
{
Code := NumGet(Var, A_Index - 1, "UChar")
If (!Code)
Break
If (Code >= 0x30 && Code <= 0x39 ; 0-9
|| Code >= 0x41 && Code <= 0x5A ; A-Z
|| Code >= 0x61 && Code <= 0x7A) ; a-z
Res .= Chr(Code)
Else
Res .= "%" . SubStr(Code + 0x100, -1)
}
SetFormat, IntegerFast, %f%
Return, Res
}
StrPutVar(Str, ByRef Var, Enc = "")
{
Len := StrPut(Str, Enc) * (Enc = "UTF-16" || Enc = "CP1200" ? 2 : 1)
VarSetCapacity(Var, Len, 0)
Return, StrPut(Str, &Var, Enc)
}
RUEN(t)
{
en:="qwertyuiop[]asdfghjkl;'\\zxcvbnm,./"
ru:="йцукенгшщзхъфывапролджэ\\ячсмитьбю."
If p:=InStr(ru,t)
t:=SubStr(en, p, 1)
return t
}