+  HandyCache форум
|-+  Главная категория» Общие вопросы» Расширения на языке Lua в HandyCache
Имя пользователя:
Пароль:
Страниц: [1] 2 3 ... 29   Вниз
  Отправить эту тему    Печать  
Автор Тема: Расширения на языке Lua в HandyCache  (Прочитано 346221 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Wonderboy
Новичок
*

Репутация: +0/-1
Offline Offline

Сообщений: 27


« : 04 Январь 2008, 12:17:58 »

Собственно вышла уже новая версия НС, а на форуме затишье по этому поводу. Я понимаю, что программеры и так все поймут, но может кто-нибудь снизойдет к обыкновенным юзерам и накропает пару примеров на Lua? Конкретно, интересует обработка заголовков рисунков для автоматической фильтрации баннеров по размерам. Возможно, есть и еще какие-то полезные методы, но больше ничего не приходит в голову.



- Полное описание структуры расширений HandyCache, их глобальных переменных и функций находится в файле HCExtensions.html из свежего комплекта HC.
- О синтаксисе языка Lua можно почитать на сайте: http://www.lua.ru/doc/

« Последнее редактирование: 09 Август 2010, 20:52:31 от DenZzz » Сообщить модератору   Записан
alex208210
Beta tester
*****

Репутация: +12/-1
Offline Offline

Сообщений: 129


« Ответ #1 : 28 Май 2009, 12:51:58 »

нарпимер имеется такой скрипт:
function GetRelPath(s)
  _,_,x = string.find(s, "^http://[^/]+/(.*)")
  x,_ = string.gsub(x, "/", "\\")
  return x
end

function main()
  hc_answer_header=
  'HTTP/1.1 200 OK\r\n'..
  'Server: HandyCache\r\n'..
  'Content-Type: text/html\r\n'..
  'Pragma: no-cache\r\n'..
  'Cache-control: no-cache, must-revalidate, no-store\r\n'..
  'Connection: close\r\n\r\n'

  catalog = "C:\\Downloads\\"
  rel_path = GetRelPath(hc_url)
  hc_answer_body = "file="..catalog..rel_path
end

как будет выглядеть текст расширения?
Сообщить модератору   Записан
4e4ako
Пользователь
**

Репутация: +3/-0
Offline Offline

Сообщений: 68


« Ответ #2 : 28 Май 2009, 13:14:57 »

очень хорошая справка по расширениям - HC\Extensions\HCExtensions.html
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #3 : 28 Май 2009, 14:39:52 »

Цитировать
как будет выглядеть текст расширения?
Как-то так:
Код:
--[[ <HCExtension>
@name          Example
@author        alex208210
@version       0.01
@description   Проба
@event         RequestHeaderReceived/request
</HCExtension> ]]

function GetRelPath(s)
  _,_,x = string.find(s, "^http://[^/]+/(.*)")
  x,_ = string.gsub(x, "/", "\\")
  return x
end

function request()
  hc.answer_header=
  'HTTP/1.1 200 OK\r\n'..
  'Server: HandyCache\r\n'..
  'Content-Type: text/html\r\n'..
  'Pragma: no-cache\r\n'..
  'Cache-control: no-cache, must-revalidate, no-store\r\n'..
  'Connection: close\r\n\r\n'

  catalog = "C:\\Downloads\\"
  rel_path = GetRelPath(hc.url)
  hc.answer_body = "file="..catalog..rel_path
end
Сообщить модератору   Записан
alex208210
Beta tester
*****

Репутация: +12/-1
Offline Offline

Сообщений: 129


« Ответ #4 : 28 Май 2009, 16:11:08 »

раньше для lua в luar.lst прописывалось
+stat.local/ <script=lua\_send_my_response.lua>

таким образом скрипт работал только при запросе http://stat.local
как это сделать для расширения?
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #5 : 28 Май 2009, 16:18:43 »

В заголовок добавь строку
Код:
@rule          http://stat\.local
Сообщить модератору   Записан
alex208210
Beta tester
*****

Репутация: +12/-1
Offline Offline

Сообщений: 129


« Ответ #6 : 28 Май 2009, 16:20:20 »

спасибо.. все работает
Сообщить модератору   Записан
Влад22
Пользователь
**

Репутация: +2/-9
Offline Offline

Сообщений: 97


« Ответ #7 : 28 Май 2009, 20:00:33 »

В связи с появлением новой версии не поможете переделать скрипт?
Код:
function GetContentLength(s)
  _,_,x= string.find(s, "[cC]ontent%-[lL]ength: (%d*)")
  if x==nil then return 0 else return tonumber(x) end
end

function main()
  x= GetContentLength(hc_header)
  if x>999 then os.execute([["d:\Program\HandyCache\lua\invmp3.exe d:\Program\HandyCache\lua\beep.mp3"]]) end
end
Сообщить модератору   Записан
Влад22
Пользователь
**

Репутация: +2/-9
Offline Offline

Сообщений: 97


« Ответ #8 : 28 Май 2009, 20:51:44 »

Огромное спасибо!!! Да еще такая оперативность!!!  Отлично!
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #9 : 28 Май 2009, 20:53:29 »

Влад22
Код:
--[[ <HCExtension>
@name          Beeper
@author        ____
@version       0.02
@description   ____
@event         AnswerHeaderReceived/answer
</HCExtension> ]]

function GetContentLength(s)
  _,_,x= string.find(s, "[cC]ontent%-[lL]ength: (%d*)")
  if x==nil then return 0 else return tonumber(x) end
end

function answer()
  x= GetContentLength(hc.answer_header)
  if x>999 then os.execute([["d:\Program\HandyCache\lua\invmp3.exe d:\Program\HandyCache\lua\beep.mp3"]]) end
end
Сообщить модератору   Записан
Влад22
Пользователь
**

Репутация: +2/-9
Offline Offline

Сообщений: 97


« Ответ #10 : 28 Май 2009, 21:48:39 »

Спасибо. работает.
Попробовал заменить
os.execute([["d:\Program\HandyCache\lua\invmp3.exe d:\Program\HandyCache\lua\beep.mp3"]])
на
hc.shell_execute('d:\Program\HandyCache\Extensions\invmp3.exe', 'd:\Program\HandyCache\Extensions\beep.mp3', nil, 'SW_SHOW')
что бы окошко не выскакивало - не работает совсем. Не то, что бы для меня это очень критично - но хотелось бы разобраться где тут собака зарыта, что я не так делаю?
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #11 : 28 Май 2009, 22:02:33 »

Попробуй заменить \ на \\
Lua съедает одиночные символы \
Сообщить модератору   Записан
hc_user
Гость
« Ответ #12 : 29 Май 2009, 07:00:10 »

помогите с таким скриптом... очень нужно...

Код:
function main()

 if hc_user_name == 'user_name' and hc_user_from_internet > 26214400 then
  hc_action = 'only_from_cache'
 end

end
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #13 : 29 Май 2009, 10:45:12 »

Dan Claimant
Покажи свое расширение, я же не знаю, что у тебя получилось.
hc_user
Код:
--[[ <HCExtension>
@name          For_hc_user
@author        ___
@version       0.01
@description   Блокирует пользователя при переборе трафика
@event         RequestHeaderReceived/request
</HCExtension> ]]
function request()

 if hc.user_name == 'user_name' and hc.user_from_internet > 26214400 then
  hc.action = 'only_from_cache'
 end

end
Сообщить модератору   Записан
hc_user
Гость
« Ответ #14 : 29 Май 2009, 12:02:51 »

mai62, спасибо
Сообщить модератору   Записан
divinets
Пользователь
**

Репутация: +1/-0
Offline Offline

Сообщений: 59


« Ответ #15 : 29 Май 2009, 12:48:59 »

Помогите пожалуйста со скриптом вызываемым из луа.лст следующим образом:
Код:
!divinets.ru
#.* <script=lua\block_long_file_by_time.lua>
<new_block>



Код:
--*****************************************************************
-- Скрипт для HandyCache v 1.00 RC1 (1.0.0.11) и выше
-- Автор: DenZzz
-- Назначение: Блокировать загрузку больших файлов в зависимости
--             от системного времени
--*****************************************************************

function GetContentLength(s)
  _,_,x = string.find(s, "[cC]ontent%-[lL]ength: *(%d+)")
  if x==nil then return -1 else return tonumber(x) end
end


function main()
 
 -- Узнаем текущее системное время
  time = os.date("*t")

 if time.hour >= 18 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc_header)
   -- если размер файла есть в заголовке и он больше 512 KБайт
      if len > 1048576 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc_action=="" or hc_action==nil or hc_action=="save" then
        hc_action = "stop"
      end
    end
 end

 if time.hour >= 0 and time.hour < 3 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 52428800 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc_action=="" or hc_action==nil or hc_action=="save" then
        hc_action = "stop"
      end
    end
 end

 if time.hour >= 3 and time.hour < 6 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 252428800 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc_action=="" or hc_action==nil or hc_action=="save" then
        hc_action = "stop"
      end
    end
 end
 
 if time.hour >= 6 and time.hour < 20 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 8388608 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc_action=="" or hc_action==nil or hc_action=="save" then
        hc_action = "stop"
      end
    end
 end

end
Сообщить модератору   Записан
Dan Claimant
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 16


« Ответ #16 : 29 Май 2009, 12:50:51 »

mai62, раньше у меня работаловсе  (то есть обрезало все))) через "управление загрузкой" - script://lua/request и script://lua/answer
и luaR.lst и lua.lst у меня были вида такого:
Код:
; Файл-список скриптов LUA для обработки заголовков запросов клиентов
;--------------------------------------------------------------------

#.  <script=lua\_dont_update_image_by_type_in_cache.lua>

# !#\b(imageshack\.us|photofile\.ru|radikal\.ru)/
#.  <script=lua\_block_external_links.lua>
и
Код:
; Файл-список скриптов LUA для обработки заголовков ответов серверов
;-------------------------------------------------------------------

#.  <script=lua\save_or_block_403_and_404.lua>
#/favicon\.ico$  <script=lua\save_404.lua>
#.  <script=lua\dont_update_image_by_type.lua>
#.  <script=lua\dont_update_file_by_size.lua>
;#.  <script=lua\block_long_file.lua>

может быть стоит ещё добавить какой-нить скрипт к _dont_update_image_by_type_in_cache.lua?
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #17 : 29 Май 2009, 13:10:02 »

Dan Claimant
Строку url_host = GetHost(hc_url) нужно заменить на url_host = GetHost(hc.url) (моя недоработка в сообщении #9)
После строки hc.action = "stop" предлагаю добавить строку hc.monitor_string = hc.monitor_string.."BlockExternal "
Тогда заблокированные запросы будут видны в мониторе в колонке Правила.
Как исправишь файл расширения в НС не забудь нажать кнопку Перечитать расширение.

Добавлено: 29 Мая 2009, 12:59:08

divinets
Пробуй
Код:
--[[ <HCExtension>
@name          BlockLongFiles
@author        DenZzz
@version       0.02
@description   Блокировать загрузку больших файлов в зависимости от системного времени
@exception     divinets.ru
@event         AnswerHeaderReceived/answer
</HCExtension> ]]

function GetContentLength(s)
  _,_,x = string.find(s, "[cC]ontent%-[lL]ength: *(%d+)")
  if x==nil then return -1 else return tonumber(x) end
end


function answer()
 
 -- Узнаем текущее системное время
  time = os.date("*t")

 if time.hour >= 18 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc.answer_header)
   -- если размер файла есть в заголовке и он больше 512 KБайт
      if len > 1048576 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc.action=="" or hc.action==nil or hc.action=="save" then
        hc.action = "stop"
      end
    end
 end

 if time.hour >= 0 and time.hour < 3 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc.answer_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 52428800 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc.action=="" or hc.action==nil or hc.action=="save" then
        hc.action = "stop"
      end
    end
 end

 if time.hour >= 3 and time.hour < 6 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc.answer_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 252428800 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc.action=="" or hc.action==nil or hc.action=="save" then
        hc.action = "stop"
      end
    end
 end
 
 if time.hour >= 6 and time.hour < 20 then
 -- забираем размер файла из заголовка "Content-Length"
  len = GetContentLength(hc.answer_header)
   -- если размер файла есть в заголовке и он больше 10 МБайт
      if len > 8388608 then
     -- и действие HC еще не присвоено или присвоено "Сохранять", то блокировать загрузку
      if hc.action=="" or hc.action==nil or hc.action=="save" then
        hc.action = "stop"
      end
    end
 end

end
Сообщить модератору   Записан
Dan Claimant
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 16


« Ответ #18 : 29 Май 2009, 13:35:24 »

mai62, теперь всё работает отлично Улыбка большое спасибо... осталось теперь понять, куда вписывать исключения, чтобы адреса некоторых сайтов проходили мимо скрипта...

Пы.Сы. за авотматическую очистку кэша - отдельный РЕСПЕКТ - очень удобно Улыбка
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +215/-4
Offline Offline

Сообщений: 6186


« Ответ #19 : 29 Май 2009, 13:55:41 »

Про исключения. В заголовок расширения добавляешь строку вида
@exception     regex
regex - регулярное выражение, оно работает с полным (вместе с http://) входным URL.
Таких строк в заголовке может быть много.
Сообщить модератору   Записан
Страниц: [1] 2 3 ... 29   Вверх
  Отправить эту тему    Печать  

 
Перейти в: