Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Сетевые скрипты [PtokaX] _ Kinozal_tv

Автор: Tsd 8.10.2009, 10:00

Название скрипта: Kinozal_tv
Автор: Tsd
Версия скрипта: 1.0
Версия API: API2
Описание скрипта: Скрипт отсылает в личку пользователю последние новости с популярного торрент трекера http://mydc.ru/r/?http://kinozal.tv
Прямая ссылка на интересующую новость. Меню. Для работы скрипта требуется библиотека http://mydc.ru/ipb.html?act=attach&type=post&id=399.
Tsd © 09.2009

 Kinozal_tv.lua ( 3.38 килобайт ) : 584
 

Автор: FurLion 19.11.2009, 19:39

Сразу прошу прощения за возможный оффтоп, но можно ли как нибудь приспособить данный скрипт для системы magneto? ибо скрипт очень понравился)

Автор: PSIX 23.11.2009, 18:22

Было бы не плохо если бы этот скрипт перевести на форум тоесть чтобы народ мог смотреть какие поивились на винки на свое лольном форуме или инет ! А скрипт и правду очень интересный спасибо автору этого скрипта !

Автор: serrrios 26.11.2009, 0:02

Хороший скрипт, быстро переправил под свой трекер и добавил перекодировку из утф-8 =)

Автор: EW ХАБЫЧ 26.11.2009, 0:58

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

Код
sAddr = {"http://10.128.162.28/dc.magneto/rss/","http://10.128.162.28/dc.magneto/rss/index.php",} -- Основной адрес сайта, адрес ленты новостей.
скажите плиз в чём ошибка?

Автор: serrrios 26.11.2009, 21:21

Поблема в том что скрипт заточен под трекер Kinozal. И одной подменой адреса рсс проблему не решить.

Автор: Артём 26.11.2009, 21:49

Цитата(serrrios @ 26.11.2009, 20:21) *
И одной подменой адреса рсс проблему не решить.

У меня решена .... вот пример одной из переделок  ______.lua ( 4.4 килобайт ) : 132

Автор: Setuper 26.11.2009, 22:06

Если структура одинакова, то использование возможно, в противном случае нужно парсить под нужный формат.

Автор: serrrios 15.2.2010, 14:25

Народ, не подскажите как сделать что бы инфа (в пм) отправлялась кроме как по запросу еще и при конекте к хабу?

Автор: Tsd 2.3.2010, 23:43

Цитата(serrrios @ 15.2.2010, 13:25) *
Народ, не подскажите как сделать что бы инфа (в пм) отправлялась кроме как по запросу еще и при конекте к хабу?


Дописать в конец фунции UserConnected = function(user)

table.insert(tUserPm, user)
pm = 1
GetInfo()
pm = 0
tUserPm = {}
sMsg = ""

Автор: Greeck 5.3.2010, 11:39

Подскажите, что изменить надо, чтобы посылал инфу не в ПМ, а в общий чат...

Автор: Tsd 5.3.2010, 13:01

Изменить строку 77 на
Core.SendToUser(user, "<"..sBot..">\t\tНовости с трекера "..(sAddr[1])..sMsg)

Автор: Cjay 23.3.2010, 7:17

скрипт не плох...
до того как не наткнешься на рсс ленту с utf-8, это раз
или на сайт где в рсс решили все новости месяца запихать порядке тыщи штук, это два (ибо при попытке вывести новости с него просто вешается хаб)
если с первой проблемой с помощью функций Utf8ToAnsi попытался справится, пока правда безуспешно, не разобрался как применить её для данного скрипта, то со второй проблемой даже и не знаю что делать

upd: перекодировку сделал, спасибо другу за помощь. но вот вопрос касательно "многобукаФ" в рсс ленте остается открытым, кто какие варианты может предложить?
В общем ситуация такая:
допустим, есть какой-то сайт, на котором в рсс выводится список новостей да хотя бы за текущий месяц, которых уже перевалило за 1000, так вот страница рсс вести примерно 20мб, и естественно при обращении к нему хаб вешается.
Так вот что можно сделать, что бы, допустим, с сайта бралось к примеру 30 новостей последних и на этом парсить заканчивало и результат выдавало.

Автор: Nickolya 23.3.2010, 16:39

Скрипт конечно по логике туповат т.к. не кеширует запросы юзеров. Я переделал в своем видении немного скрипт, убрал пережитки прошлого апи, и теперь он хранит кеш запроса, за это отвечает настройка

Код
iExpired = 30    -- время в минутах на хранение в кеше ответа от сервера
Попробуйте его, уверен что останетесь довольны big_smile.gif

 Kinozal_tv.lua ( 3.52 килобайт ) : 102
 

Автор: Cjay 24.3.2010, 13:30

спасибо, переделал под свои рсс ленты, и добавил проверку на юникод (ну и соот-но перекодировку)
так вот не нужно ли RepChars() переместить ниже:

Код
    sMsg = table.concat(tData)
        RepChars()
ну или поменять там sMsg на tData
а то ведь не работает оно)
ну и всё-таки неплохо добавить в RepChars = function() строки
sMsg = string.gsub (sMsg, "&apos;", "'")
sMsg = string.gsub (sMsg, "&amp;", "&")
ну и кажется логичнее будет в chatarrival при проверке:
if os.time() > iLastTime + iExpired * 60 then
а в getinfo
iLastTime = os.time()
так как получается хранится не время последнего запроса, а то когда можно будет сделать следующий.

Автор: Nickolya 24.3.2010, 13:44

С RepChars косяк, согласен, поправил. Замены символов добавил. По поводу iLastTime: так сделано чтобы каждый раз не производить лишние математические вычисления, подсчет идет 1 раз и потом уже только сравнение, по-моему так правильней. Скрипт в пост выше перезалил.
Скажи как он ведет себя с БОЛЬШИМИ лентами, не зависает хаб?

Автор: Cjay 24.3.2010, 17:02

Nickolya, на больших лентах еще не тестил, честно скажу он и на маленьких на пару секунд подвисает иногда.. на большой боюсь тестить) Там под 25 мб лента, я думаю зависнет всё равно, да и не нужна бы лента полностью, брать с нее бы просто н-ное кол-во новостей, а остальное отбрасывать и не загружать до конца ленту.
по поводу iLastTime не так уж много расходов будет на сложение и умножение, а вот если с помощью команды смену параметра сделать, то придется поменять на хранение предыдущего запроса, да и тогда можно будет изменять параметр и не ждать окончания срока чтобы он изменился или перестартовывать скрипт.
так же можно при неудачном запросе не сохранять время запроса, а в следующий раз пытаться снова
в общем у меня GetInfo именно для кинозала выглядит так:

Раскрывающийся текст
Код
GetInfo = function()
    local tData = {"        Новости с трекера "..(sAddr[1])}
    local Title,Description,Link
    local fd,sz,hd = h.request(sAddr[2])
    if fd and sz == 200 then
    local enc = string.match(fd, "<%?xml%s+[^>]+encoding=\"([^>]+)\"[^>]*%?>")
         if enc == "UTF-8" or enc == "utf8" then
         fd = Utf8ToAnsi(fd)
         end
        table.insert(tData, "\n")
        while string.find(fd,"<title>") do
            _,_,Title,Description,Link,fd=string.find(fd, "<item>.-<title>(.-)</title>.-<description>(.-)</description>.-<link>(.-)</link>.-</item>(.*)")
            table.insert(tData, "\n"..sRep.."\t"..Title.."\tСсылка: "..Link.."\r\n"..Description.."\n")
        end
    iLastTime = os.time()
    else
        table.insert(tData, "\tСайт временно не работает или перегружен, попробуйте позже...")
    end
    sMsg = table.concat(tData)
    RepChars()
    MemCleaner()
end



P.S. сейчас проверил на БОЛЬШОЙ ленте, получил то что и ожидал) разве что во второй раз решил подождать, может само развиснет, минут через 15 и правда развисло и написало, что сайт временно перегружен, попробуйте позже

Автор: Nickolya 25.3.2010, 11:35

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

Автор: Tsd 15.4.2010, 18:04

Шикарная задумка

Автор: serrrios 20.4.2010, 9:51

Tsd, спасиб за вывод в лс..
Терь бы еще так же сделать в скрипте Nickolya =)

Автор: serrrios 17.5.2010, 21:44

Народко, ну помогите со скриптиком =) Деньгами не обижу, на пивас подкину =)

Автор: Nickolya 17.5.2010, 22:58

Добавь после

Код
UserConnected = function(user)
следующий код:
Код
    if os.time() > iLastTime then
        GetInfo()
    end
    Core.SendPmToUser(user, sBot, sMsg)
Проще некуда и никаких финансовых вложений big_smile.gif

Автор: Greeck 15.7.2010, 11:55

2 Tsd: как убрать бота из списка пользователей?

Автор: Артём 15.7.2010, 14:56

Цитата(Greeck @ 15.7.2010, 11:55) *
2 Tsd: как убрать бота из списка пользователей?

закомментируйте строку
Код
Core.RegBot(sBot, "Бот новостей с трекера "..(sAddr[1]), "", true)
( перед кодом поставить -- )

Автор: MIKHAIL 1.1.2012, 6:25

В скрипте из http://mydc.ru/topic2547.html?view=findpost&p=28635:

Код
s = require("socket")
assert(s,"Ошибка загрузки библиотеки socket. Проверьте наличие файлов необходимых библиотек.")
h = require("socket.http")
assert(h,"Ошибка загрузки библиотеки socket.http. Проверьте наличие файлов необходимых библиотек.")

когда или при каких условиях работает(ют) "assert"?
Ради интереса пробовал запускать скрипт без файлов "socket.lua" и "http.lua" поочереди. Хоть убей – нигде не видел вышеуказанных сообщений об ошибках, которые определены в "assert".
Подскажите, пожалуйста, для каких целей были добавлены в скрипт эти "утверждения"?

Автор: Ksan 1.1.2012, 9:01

MIKHAIL, эти файлы у тебя могут лежать и в другом месте.
Проверь, нет ли у тебя в папке с Птокой где-нибудь ещё одной папки libs..

Автор: Enyby 1.1.2012, 11:57

Assert:

Цитата
assert (v [, message])
Issues an error when the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments. message is an error message; when absent, it defaults to "assertion failed!"

http://mydc.ru/r/?http://www.lua.org/manual/5.1/manual.html#pdf-assert

Require:
Цитата
require (modname)

Loads the given module. The function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module.

To find a loader, require is guided by the package.loaders array. By changing this array, we can change how require looks for a module. The following explanation is based on the default configuration for package.loaders.

First require queries package.preload[modname]. If it has a value, this value (which should be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.loaders).

Once a loader is found, require calls the loader with a single argument, modname. If the loader returns any value, require assigns the returned value to package.loaded[modname]. If the loader returns no value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname].

If there is any error loading or running the module, or if it cannot find any loader for the module, then require signals an error.

http://mydc.ru/r/?http://www.lua.org/manual/5.1/manual.html#pdf-require

Судя по условиям, assert вылетит тогда, когда библиотека будет состоять их нескольких модулей, причем тот модуль, который указан в качестве параметра require будет, а другого не будет. Тогда require из загрузчика вернет false и assert выдаст сообщение.

Автор: ramzes 16.1.2012, 12:39

[13:35] Синтаксис G:\Ptoka 0.4.1.1 Final full\scripts\Kinozal_tv.lua:69: attempt to concatenate local 'Description' (a nil value)
Niсkolya, подскажи, в чём может быть проблема (использовал твой скриптик)? Пробовал выше\ниже скрипт ставить - не помогло, одна и та же ошибка. Может рсс-лента уже у кинозала не работает?

Код
69: table.insert(tData, "\n"..sRep.."\t"..Title.."\tСсылка: "..Link.."\r\n"..Description.."\n")

В чате видна надпись +novinki

Автор: Enyby 16.1.2012, 12:50

Цитата
assert(nil, "Эта версия скрипта пердназначена для 2 API!!!")
waaaht.gif

По поводу RSS - лавочку прикрыли. Желающие могут попробовать сделать парсинг главной страницы. Правда тут будет хуже чем было, поскольку любая смена дизайна потребует переписывание скрипта.

Автор: ramzes 16.1.2012, 13:04

у меня API2, значит проблема в том, что нет ленты? А скрипт сможет читать не с xml, а с index.php, планирую переделать под magneto.

Автор: Enyby 16.1.2012, 13:08

Ну то опечатка забавная, не более того. Скрипт может читать откуда угодно, главное чтобы паттерн был правильный написан. Он в 68 строке. Адрес странички в начале скрипта. Открываете код странички, находите нужное и пишите паттерн. Как-то так. Или просите кого-то.