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

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

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

Автор: rus.region78 29.6.2008, 3:34

Плохо что работает по таймеру, и делает либо в главный чат, либо в ПМ всем! :angry: а так весело когда анекдоты или погода выскакивают, лучше конечно чтоб было по желанию пользователя...
файл под (API2)

 FeedWatch.lua ( 7.26 килобайт ) : 743
 

Автор: ghostjoker 3.7.2008, 8:57

А под API1 нету у тебя?

Автор: Gangster 4.7.2008, 4:30

а этот скриптик под API2 можете переделать?big_smile.gif

 RSS.ZIP ( 59.57 килобайт ) : 159
 

Автор: Strannik 9.7.2008, 18:52

Цитата(Gangster @ 4.7.2008, 4:30) *
а этот скриптик под API2 можете переделать?big_smile.gif


Отличный скриптик, но хотелось бы и под API 2

Автор: Strannik 9.7.2008, 20:20

Цитата(Gangster @ 4.7.2008, 4:30) *
а этот скриптик под API2 можете переделать?big_smile.gif


Перевел под API 2 но выводит ошибку C:\PtokaX\scripts\b_RSSFeed.lua:493: attempt to index field '?' (a nil value)

 b_RSSFeed.lua ( 76.32 килобайт ) : 164
 

Автор: brigadir 10.7.2008, 2:19

Цитата(Strannik @ 10.7.2008, 4:20) *
Перевел под API 2 но выводит ошибку C:\PtokaX\scripts\b_RSSFeed.lua:493: attempt to index field '?' (a nil value)

У тебя просто нет нужных библиотек для скрипта...

Автор: derschaman 10.7.2008, 11:53

Цитата(Strannik @ 9.7.2008, 20:20) *
Перевел под API 2 но выводит ошибку C:\PtokaX\scripts\b_RSSFeed.lua:493: attempt to index field '?' (a nil value)


..хмм... если мне не изменяет память, то для версий ptokax 4.1.x.x в коде скрипта необходимо использовать абсолютные пути к папкам и файлам, а не относительные, как было ранее...

...в переведённом - пути остались прежние, будет сыпать ошибками или тупо не работать, если не исправить...

Автор: Infernus-pro 10.7.2008, 15:27

Цитата
если мне не изменяет память, то для версий ptokax 4.1.x.x в коде скрипта необходимо использовать абсолютные пути к папкам и файлам, а не относительные, как было ранее...

я проверял скрипт на версии PtokaX 0.4.1.0RC1 (абсолютные пути не требуются) - та же ошибка.

Автор: Strannik 10.7.2008, 17:18

Цитата(brigadir @ 10.7.2008, 2:19) *
У тебя просто нет нужных библиотек для скрипта...


Под PtokaX 3.6.0.0 все прекрасно работает полный скрипт у Gangster
А нужно для PtokaX 4.1.1.0

Автор: rus.region78 10.7.2008, 20:01

К этому скрипту нужна библиотека: PxWSA Socket Library, которая с новой PtokaX не работает.... :P

Автор: Strannik 10.7.2008, 21:16

Цитата(rus.region78 @ 10.7.2008, 20:01) *
К этому скрипту нужна библиотека: PxWSA Socket Library, которая с новой PtokaX не работает.... :P


А найти ее где можно

Автор: rus.region78 10.7.2008, 23:34

 WSA.RAR ( 322.92 килобайт ) : 177

Цитата(Strannik @ 10.7.2008, 22:16) *
А найти ее где можно

Кажется это оно... feel_good.gif

Автор: Strannik 10.7.2008, 23:58

Цитата(rus.region78 @ 10.7.2008, 23:34) *
 WSA.RAR ( 322.92 килобайт ) : 177

Кажется это оно... feel_good.gif


Эти файлы есть, видать в самом скрипте ошибка какая то

Автор: KauH 11.7.2008, 13:14

http://mydc.ru/r/?http://mutor.no-ip.com:6803/files/FeedWatch%201.0c%20L5.1.lua

Цитата
Dependencies:
PxLuaSocket 2.0.2, download here:
http://mydc.ru/r/?http://www.czdc.org/PtokaX/Libs-0.4.0.0RC6/PXLuaSocket-2.0.2.7z
Extract to PtokaX\scripts\libs

http://mydc.ru/r/?http://board.ptokax.ch/index.php?board=38.0

Автор: Strannik 11.7.2008, 23:45

RSS под API 2 частично работает видется менюха добавляются ленты
дальше не работает подправте кто сможит

 b_RSSFeed.lua ( 76.39 килобайт ) : 110
 

Автор: Инкогнито 16.7.2008, 22:13

выдает такое
Синтаксис C:\0.4.1.1\scripts\FeedWatch.lua:62: module 'socket.http' not found:
no field package.preload['socket.http']
no file 'C:\0.4.1.1\socket\http.lua'
no file 'C:\0.4.1.1\libs\socket\http.lua'
no file 'C:\0.4.1.1\scripts\libs\socket\http.lua'
no file 'C:\0.4.1.1\socket\http.dll'
no file 'C:\0.4.1.1\libs\socket\http.dll'
no file 'C:\0.4.1.1\scripts\libs\socket\http.dll'
no file 'C:\0.4.1.1\socket.dll'
no file 'C:\0.4.1.1\libs\socket.dll'
no file 'C:\0.4.1.1\scripts\libs\socket.dll'
как понял не хватает дллок и еще чего-то, подскажите где взять и куда их потом положить

Автор: Инкогнито 17.7.2008, 0:03

поставил дополнительные библиотееки отсюда http://mydc.ru/topic43.html в итоге все заработало, только шрифт нечитабльный, где можно изменить кодировку? Скриптик с первого поста FeedWatch.lua

Автор: Инкогнито 17.7.2008, 22:46

еще вопросик, как убрать бота от этого самого РСС из списка юзеров

Автор: dimetrius 18.7.2008, 1:12

По идее в строке:

Цитата
sBot = "Ленты_новостей", ---- Имя бота

удлить полностью Ленты_новостей, т.е. чтоб между кавычками ничего не осталось!

Или ещё есть выражение для определения имени бота основного! не помню..

Автор: Infernus-pro 18.7.2008, 14:34

Цитата
еще вопросик, как убрать бота от этого самого РСС из списка юзеров

Цитата
Или ещё есть выражение для определения имени бота основного! не помню..

Вроде так:
Цитата
sBot = SetMan.GetString(21)

Автор: Инкогнито 18.7.2008, 23:34

да имя бота я сразу убрал, просто когда настраиваешь рсс, в списке появляется юзер с названием это ленты, т.е. откуда он взят. У меня лента с хайтека, появляется юзер в списке "Hi-Tech Zone"

Автор: rus.region78 20.7.2008, 16:26

Цитата(Инкогнито @ 19.7.2008, 0:34) *
да имя бота я сразу убрал, просто когда настраиваешь рсс, в списке появляется юзер с названием это ленты, т.е. откуда он взят. У меня лента с хайтека, появляется юзер в списке "Hi-Tech Zone"

Код
ParseFeed = function(xml)
    New = {}
    if not FeedNick then
        local _,_,title = xml:find("<title>([^<]-)</title>")
        title = "(bot)Спиридон" or title

я дал имя титулам бота хаба, теперь он не регистрируется в списке юзеров... baffle.gif

Автор: Инкогнито 21.7.2008, 1:25

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

Код
ParseFeed = function(xml)
    New = {}
    if not FeedNick then
        local _,_,title = xml:find("<title>([^<]-)</title>")
        title = title or "N/A"
        FeedNick = title:gsub("[ %c]",string.char(160))
        Core.RegBot(FeedNick,"RSS Feed Bot",Feed,true)

в это части кода убрал последнюю строку и все, больше он не отображается в списке юзеров. Пока работает, ошибок не обнаружено.

Автор: Gangster 17.8.2008, 15:37

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

Автор: Fodin 22.8.2008, 2:12

Все это здорово и замечательно. Пока кодировочка у RSS - 1251. А если будет UTF-8, то тут-то и будет "приплыли". А таких лент - до черта. В Луа нет функции перекодировки. Лично мне пришлось dll писать под это дело.

Автор: Инкогнито 26.8.2008, 1:53

Цитата(Fodin @ 22.8.2008, 5:12) *
Все это здорово и замечательно. Пока кодировочка у RSS - 1251. А если будет UTF-8, то тут-то и будет "приплыли". А таких лент - до черта. В Луа нет функции перекодировки. Лично мне пришлось dll писать под это дело.

угу, верно сказал про кодировочку, поделись dll-кой пожалуйста если не трудно

Автор: Nickolya 26.8.2008, 18:31

Вот функция перевода из утф в коир, пришлось как-то сворганить, причем из функции которая переделывала коир в утф big_smile.gif, из-за неумения создания библиотек, изобретаем велосипеды... Вот код:

Код
s208 = string.char(208)
s209 = string.char(209)

function utf8towinru(text)
    text = text:gsub(s208.."(.)", function(sch)
        if (string.byte(sch)>=144 and string.byte(sch)<=191) then
            return string.char(string.byte(sch)+48)
        end
        if (string.byte(sch)==129) then
            return "Ё"
        end
        return s208..sch
       end)
    text = text:gsub(s209.."(.)", function(sch)
        if (string.byte(sch)>=128 and string.byte(sch)<=143) then
            return string.char(string.byte(sch)+112)
        end
        if (string.byte(sch)==145) then
            return "ё"
        end
        return s209..sch
    end)
    return text
end

Автор: Setuper 26.8.2008, 18:47

2Fodin: поделитесь опытом создания dll, а именно конфигурацией def файлов, и компиляцией dll для sqlite под апи2 (исходники предоставлю).

Автор: viktor6 3.1.2009, 15:38

Так что нет рабочего скрипта??

Автор: MEXAHuK 6.1.2009, 5:56

оч. прошу спецов доделать этот скрипт.
народу: или вы выложте поласта норм раб. скрипт

Автор: MEXAHuK 27.1.2009, 13:33

Цитата(Nickolya @ 26.8.2008, 20:31) *
Вот функция перевода из утф в коир, пришлось как-то сворганить, причем из функции которая переделывала коир в утф big_smile.gif , из-за неумения создания библиотек, изобретаем велосипеды... Вот код:

Код
s208 = string.char(208)
s209 = string.char(209)

function utf8towinru(text)
     text = text:gsub(s208.."(.)", function(sch)
         if (string.byte(sch)>=144 and string.byte(sch)<=191) then
             return string.char(string.byte(sch)+48)
         end
         if (string.byte(sch)==129) then
             return "Ё"
         end
         return s208..sch
        end)
     text = text:gsub(s209.."(.)", function(sch)
         if (string.byte(sch)>=128 and string.byte(sch)<=143) then
             return string.char(string.byte(sch)+112)
         end
         if (string.byte(sch)==145) then
             return "ё"
         end
         return s209..sch
     end)
     return text
end


как применить это к конкретному скрипту из первого поста? выложи файл который может читать утф8 кодированные хмльки поласта

Автор: serrrios 8.2.2009, 13:54

Для подключения УТФ8 в скрипте на первом посте:

1) Найти:

Код
local msg = ParseFeed(Decode(fd))

Заменить на:
Код
local msg = ParseFeed(utf8towinru(fd))


2) В конце файла добавить:
Код
s208 = string.char(208)
s209 = string.char(209)

utf8towinru = function(text)
     text = text:gsub(s208.."(.)", function(sch)
         if (string.byte(sch)>=144 and string.byte(sch)<=191) then
             return string.char(string.byte(sch)+48)
         end
         if (string.byte(sch)==129) then
             return "Ё"
         end
         return s208..sch
        end)
     text = text:gsub(s209.."(.)", function(sch)
         if (string.byte(sch)>=128 and string.byte(sch)<=143) then
             return string.char(string.byte(sch)+112)
         end
         if (string.byte(sch)==145) then
             return "ё"
         end
         return s209..sch
     end)
     return text
end


3) Сказать спасибо big_smile.gif

Автор: li4nost 8.3.2009, 4:19

скажите, какую рабочую версии (или наиболее стабильную) поставить на апи2?

Автор: Cramac 10.7.2009, 16:44

Выложите рабочую версию, а то некоторые ссылки уже не работают :(

Автор: STRELOK 10.7.2009, 17:58

Полностью рабочий скрипт. Не отправляет сообщения в ПМ юзерам(убрал это, т.к. считаю что это не нужно). Добавил команду, меню, отправка результата только при вводе команды в чат

UPD: аттач загрузить не удалось :( , поэтому скачиваем отсюда: http://mydc.ru/r/?http://core454.hut1.ru/RSS_Feed.lua

Автор: Cramac 11.7.2009, 9:43

запустил этот скрипт, при вводе !rss или выбор через меню пишет :
Неизвестная команда.
что не так?

Автор: district 11.7.2009, 10:34

Может быть, это репорт другого скрипта, который перехватывает команду и сверяет ее со списком известных ему команд? Нужно попробовать поместить Rss-ленты в верх списка скриптов.

Автор: Cramac 11.7.2009, 11:05

Спасибо, как то сразу не подумал про это...

А как узнать список команд доступных?
Как добавить источник?

Автор: Wariner 11.7.2009, 11:28

всё зависит от того каким скриптом это делается!!!!

Автор: district 11.7.2009, 12:35

Буквально на днях щупал один многофункциональный бот известный... там была такая сверка. Убей не вспомню название, память что решето ... :inv:
Думаю надо смотреть начиная с мультиботов, установленных на хабе, потом по степени убывания размеров самого бота.

Автор: xRayNeo 11.7.2009, 17:31

STRELOK,

Код
function ChatArrival(tUser,sData)
    sData = string.sub(sData,1,-2)
    local _,_,cmd = string.find(sData, "%b<>%s+(%S+)")
    if cmd == "!"..sCmd.."" then
        if tProfile[tUser.iProfile] == 1 then
                Core.SendPmToUser(tUser,Bot,GetFeed())
        end    
return true
    end
end


Сложно придумать большую дыру для ддоса =)
Ты не думал, что при таком использовании хаб можно запросто уронить? Скачивание и обработка фида должны проводиться периодически, а не по запросу юзера. Подумай, что будет, если ленту одновременно запросят несколько человек. ИМХО надо оставить обработку по таймеру и хранить ленту в виде строки или таблицы, а по запросу юзера выдавать ее в ЛС.

Автор: STRELOK 11.7.2009, 18:33

Тогда качайте скрипт из первого поста big_smile.gif

Автор: xRayNeo 12.7.2009, 0:39

Цитата(STRELOK @ 11.7.2009, 19:33) *
Тогда качайте скрипт из первого поста big_smile.gif


Нет, я сам делал скрипт по вашему примеру big_smile.gif Просто кое-что желательно сделать иначе. Могу выложить свой вариант, если кому нужно.

У меня обновление фида и его парсинг производится по таймеру (как в оригинале), а по запросу юзера (как в варианте STRELOK) выдается уже обработанная лента, хранящаяся в памяти в виде строки. Да, памяти кушает скрипт больше, зато надежнее. big_smile.gif

Автор: Setuper 12.7.2009, 2:08

Ддосить не удастся из-за антифлуда. Другое дело если он отключен. Да и вообще мало кто знает как это делается. Некоторые админы вообще отключают защиту от ддоса на хабе (ддос по средствам отсылки в dc-команде ip адреса жертвы).

Хотя соглашусь, что экономичнее запрашивать периодически и хранить в памяти. А то дёргать сайт и парсить при каждой команде слишком нагрузочно.

Автор: DemoN 22.7.2009, 0:18

Поставил это дело на хаб, не пашет, ругается на библиотеку (она есть) и кроме того пишет это:

[01:16] Синтакс F:\******\scripts\b_RSSFeed.lua:493: attempt to call global 'libinit' (a nil value)


Как исправить? Спасибо!

Автор: Lesh™ 15.10.2009, 23:03

Поделитесь более мение рабочей версией, плиз...

Автор: 12345 15.11.2009, 13:25

А под php можна его както переделать?

Автор: Uncle_Dif 17.12.2009, 16:53

Почитал-с-ума-сошел.

Так есть он, этот скрипт, готовый - не самододелываемый?

Ну угостите... плизз.

Автор: ART8150 17.12.2009, 23:20

У кого она рабочая не глучит выложите пожалуйста

Автор: Uncle_Dif 18.12.2009, 11:29

....ждёмсъ....

Автор: STRELOK 18.12.2009, 11:48

 FeedWatch.lua ( 7.29 килобайт ) : 130

Оффтоп
Цитата(12345 @ 15.11.2009, 15:25) *
А под php можна его както переделать?

CODE
<?php function GetXMLFirstVal($r,$t) {
if(preg_match_all('/<('.$t.')>(.*)<\/\\1>/Usi',$r,$o)) return $o[2][0];
return false;
}

function GetXMLAllVal($r,$t) {
if(preg_match_all('/<('.$t.')>(.*)<\/\\1>/Usi',$r,$o)) return $o[2];
return array();
}

function GetStream($URL,$mode=0) {


switch($mode) {

// php
case 0:
$results = file_get_contents($URL);
break;

// CURL
case 1:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $URL); // Destination URL
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // Output to a variable
curl_setopt ($ch, CURLOPT_POST, 0); // Use HTTP POST
curl_setopt ($ch, CURLOPT_TIMEOUT, 20); // Default Timeout

$results = curl_exec($ch);
if(curl_error($ch)) {
print_r(curl_getinfo($ch));
exit();
}

break;

// SOCKETS
case 2:

$info = parse_url($URL);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
exit();
}
$result = socket_connect($socket, $info['host'], 80);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
}

$in = "GET ".$info['path']." HTTP/1.1\r\n";
$in .= "Host: ".$info['host']."\r\n";
$in .= "Connection: Close\r\n\r\n";

socket_write($socket, $in, strlen($in));

$out = '';
$results = '';

while ($out = socket_read($socket, 2048)) {
$results .= $out;
}

socket_close($socket);

break;

default:
$results = '';
}
return $results;
}
if (isset($_GET['rss'])) {
if ($_GET['rss'] == "bash.org.ru") //GET массив
{

$RSSS = array();
$RSSS[] = 'http://bash.org.ru/rss'; //RSS поток
echo '<center><h3>Bash.org.ru</h3></center><br /><br />'; //имя rss потока

foreach($RSSS AS $RSS) {

//print("\n$RSS");

// получаем контент
// 0 - php
// 1- curl
// 2- sock
$XML = GetStream($RSS,0);

if($XML) {

$ITEMS = GetXMLAllVal($XML,'item');
$g=0;

foreach($ITEMS AS $ITEM) {
$g++;

$TITLE = GetXMLFirstVal($ITEM,'title');
$LINK = GetXMLFirstVal($ITEM,'link');
$DESC = GetXMLFirstVal($ITEM,'description');
$DATE = GetXMLFirstVal($ITEM,'pubDate');
$CAT = GetXMLFirstVal($ITEM,'category');

if(!$DATE) {
$DATE = GetXMLFirstVal($ITEM,'dc:date');
}

if($DATE) $DATE = strtotime($DATE);
else $DATE = time();

$TITLE = html_entity_decode($TITLE,ENT_QUOTES);
$DESC = html_entity_decode($DESC,ENT_QUOTES);
$CAT = html_entity_decode($CAT,ENT_QUOTES);

echo '<li><a href="'.$LINK.'" target="_blank">'.$TITLE.'</a></li><br />';

$DESC= str_replace("<![CDATA[","",$DESC);
$DESC= str_replace("]]>","",$DESC);
echo '<ul><p>'.$DESC.'</p></ul>';

if ($g==100) //Количество выводимых результатов
{break;}
}

}
} }

elseif ($_GET['rss'] == "ithappens") //GET массив
{

$RSSS = array();
$RSSS[] = 'http://ithappens.ru/rss/'; //RRS поток

echo '<center><h3>ITHappens</h3></center><br /><br />'; //имя rss потока

foreach($RSSS AS $RSS) {

//print("\n$RSS");

// получаем контент
// 0 - php
// 1- curl
// 2- sock
$XML = GetStream($RSS,0);

if($XML) {

$ITEMS = GetXMLAllVal($XML,'item');
$g=0;

foreach($ITEMS AS $ITEM) {
$g++;

$TITLE = GetXMLFirstVal($ITEM,'title');
$LINK = GetXMLFirstVal($ITEM,'link');
$DESC = GetXMLFirstVal($ITEM,'description');
$DATE = GetXMLFirstVal($ITEM,'pubDate');
$CAT = GetXMLFirstVal($ITEM,'category');


if(!$DATE) {
$DATE = GetXMLFirstVal($ITEM,'dc:date');
}

if($DATE) $DATE = strtotime($DATE);
else $DATE = time();

$TITLE = html_entity_decode($TITLE,ENT_QUOTES);
$DESC = html_entity_decode($DESC,ENT_QUOTES);
$CAT = html_entity_decode($CAT,ENT_QUOTES);

echo '<li><a href="'.$LINK.'" target="_blank">'.$TITLE.'</a></li><br />';

$DESC= str_replace("<![CDATA[","",$DESC);
$DESC= str_replace("]]>","",$DESC);
echo '<ul><p>'.$DESC.'</p></ul>';

if ($g==5) //Количество выводимых результатов
{break;}
}

}
}
}} ?>


Автор: Uncle_Dif 18.12.2009, 14:08

Цитата(STRELOK @ 18.12.2009, 11:48) *
 FeedWatch.lua ( 7.29 килобайт ) : 130


Дождался, качнул самый первый экземпляр, пацталом)))
Робит, имхо как и задумано.
А я думал новостей узнаю)))

Автор: SAG 10.4.2010, 6:35

Что надо сделать, чтобы скрипт отсылал сообщения только определённному IP диапазону?

Автор: GreyDer 14.6.2010, 16:04

Цитата(STRELOK @ 10.7.2009, 17:58) *
Полностью рабочий скрипт. Не отправляет сообщения в ПМ юзерам(убрал это, т.к. считаю что это не нужно). Добавил команду, меню, отправка результата только при вводе команды в чат

UPD: аттач загрузить не удалось :( , поэтому скачиваем отсюда: <span class='inv'><![CDATA[]]></span>http://mydc.ru/r/?http://core454.hut1.ru/RSS_Feed.lua<span class='inv'><![CDATA[]]></span>


можешь скрипт энтот перезалить на др ресурс? а то уже ссыль сдохла..

Автор: Accelerator 14.6.2010, 16:16

Цитата(GreyDer @ 14.6.2010, 19:04) *
можешь скрипт энтот перезалить на др ресурс? а то уже ссыль сдохла..

http://mydc.ru/topic111.html?view=findpost&p=24208 На том адресе такой же когда-то лежал big_smile.gif

Автор: DEN 007 26.7.2010, 10:24

А вот у мя вопрос.. как сделать следующее...
к примеру парсить не с одного новостного канала а с нескольких, Смысл?

Вот к примеру в менюшке: Яндекс новости, новости с кинопоиска, новости с вашего сайта, еще откуда то..
Не совсем удобно для каждого канала создавать отдельный скрипт, да и память грузит...

и еще почему он не кеширует инфу? этож вызывает нагрузку... я про скрипт и з вот http://mydc.ru/index.html?showtopic=111&view=findpost&p=24208 поста

А во нашел.. хеширует он)) тока у меня файлик не создавался... Как исправить? (для freebsd)
Находим

Цитата
local File = "FeedWatch.dat"


Заменяем на
Цитата
local File = Core.GetPtokaXPath().."scripts/FeedWatch.dat"


Кажись Я начинаю понимать этот язык..) boss.gif

Автор: Nickolya 26.7.2010, 12:39

Толкового скрипта нет, но в темах по рсс были поделки, работающие по нескольким каналам в одном скрипте. Толковый скрипт на ранней стадии написания...

Автор: Ksan 24.9.2010, 15:31

Выложена отдельной темой http://mydc.ru/topic3901.html, переведенная из API1 в API2, работает под библиотекой луасокет и нет проблем с UTF-8.