Народ, кто знает какие хаблисты, акромя знаменитого dchublist.ru?
Какие функции нужны публичному хаблисту?
Что если нам сделать свой хаблист?
Как думаете, это трудно?
Кто поможет?))
Я совсем спятил?
Автор: *FoxMalder* 6.10.2008, 22:10
я выбираю 6
Автор: Nickolya 6.10.2008, 22:16
Это не варианты ответов, а вопросы на которые я хотел бы почитать Ваши ответы
Автор: Setuper 6.10.2008, 22:21
В принципе можно сделать, но не думаю, что он будет популярнее, чем dchublist
Автор: mariner 6.10.2008, 22:29
ну а софтина на перле мною замечена
Автор: Nickolya 6.10.2008, 23:10
Отлично, не бросили наши программеры На хостинге есть перл, так что выкладывай, но в нем я просто нуп. :(
Есть еще такая идея: как-то было дело, я делал еще на 0352 на библиотеке сокетов что-то вроде клиента при помощи луа, может заставить хаб обрабатывать хаблист отдельно дабы не нагружать серв на хостинге, потом загружать данные на сервер (можно либо по фтп, либо запросом к пхп скрипту, а можно совместить, главное - придумать КАК сделать). Скрипт спокойно заходил на хаб, мог даже выдавать пароль, получал файл-лист и прочее, был даже тестовый вариант хаблинка на луа... Как вам такая идея? (на луа я такое быстро сделаю)))
Потом что касается функционала хаблиста: объединяем с базой зарегистрированных ползователей хаба, чтобы каждый мог добавлять, а затем изменять свой хаб(ы), добавление требует ручного подтверждения адином; различные выводы списка хабов: по шаре, юзерам, хабу, дате добавления и т.п., комментарии или обсуждение каждого хаба, вот что хотелось бы мне для начала Конечно не всё сразу...
Насчет дизайна надеюсь поможет нам наш любимый Svyat, который куда-то далеко-далеко пропал, но я попробую потревожить...
расскажи как он работает как его подключить и как это все выглядит в конечном варианте
Автор: BIMMER71 7.10.2008, 20:05
Если честно сам незнаю) Просто нашел в недрах жёсткого диска=)
Автор: *FoxMalder* 8.10.2008, 3:35
ну так что некто не в курсе как его ставить или хотя бы где про это можно почитать?
Автор: mariner 9.10.2008, 0:16
ставить это под линукс, с апачем с пыхой и мускулем в придачу. Выполнять по крону ;) в принципе можно такое и в винде замутить..... Но тож нужен перл + апач + пых + мускул
Автор: sintesis 9.10.2008, 14:38
Цитата(Nickolya @ 6.10.2008, 21:55)
Что если нам сделать свой хаблист?
А какой смысл? Только распылять силы. Лучше попинать хаблист.ру, чтобы они приделали нужное.
Автор: Nickolya 9.10.2008, 16:26
Очень жаль что тема не разворачивается полноценно, задано 6 вопросов, а обсуждаем максимум 2... Про смысл: во-первых меня не очень устраивает функционал этого хаблиста, даже элементарного поиска по хабам нет, во-вторых уже бы давно сделали всё это, сайту же уже не 1 год, но почему-то этого нет, еще меня не особо устраивает время обнолвения хабов, раз в 4 часа - не особо актуально, хотя может и нормально, откуда мне знать?)
Что касается ставить: не знаю откуда у меня руки растут, но при попытке запуска этого творения на хостинге, он выдал критическую ошибку скрипта, можно поподробней куда что там совать и чем крутить? На хостинге линукс, все что надо есть.
Автор: mariner 9.10.2008, 19:12
ребят, я ж всетаки на асс никсов не похож :( надо сначало маны почитать по этой приблуде
Автор: Delion 20.10.2008, 9:46
Цитата
Народ, кто знает какие хаблисты, акромя знаменитого dchublist.ru?
Открою вам небольшой секрет - сейчас больше половины мировых хаблистов просто сдохло. Catalin собирается вроде как свой хаблист по GPL распространять,только вряд ли чё хорошего выйдет,он кривущий,вместе с пингером.
Автор: Nickolya 20.10.2008, 22:27
А что по поводу идеи собственного хаблиста? Тема со ссылками не очень, имхо. Вот вам еще вопрос: как лучше, сделать отдельно, на поддомене или в отдельной директории с собственным дизайном, или же вписать в форум, как модуль, хаблист? Второе на порядок сложнее, нужно разбираться уже в готовом скрипте форума, но можно попробовать использовать его функции: поиск, дизайн...
Автор: Delion 20.10.2008, 22:56
Цитата
как лучше, сделать отдельно, на поддомене или в отдельной директории с собственным дизайном, или же вписать в форум, как модуль, хаблист? Второе на порядок сложнее, нужно разбираться уже в готовом скрипте форума, но можно попробовать использовать его функции: поиск, дизайн...
Лучше отдельно,с форумом скрещивать не надо. Ты бы лучше задумался не над рисованием,а как сделать его реально работающим. За первую попавшуюся софтину хвататься не стоит,зуб даю,что она кривая. В любом случае,нужно всё сначала продумать. Интерфейс изначально хрен с ним. Тип регистрации (пингер\регсервер\оба),протоколы,количество читаемой инфы,прямота пингеров (с этим проблема может быть)? *свалил всё в одну кучу*
Автор: Nickolya 20.10.2008, 23:47
Ладно, хрен с интерфейсом, по протоколам могу сказать что с адц не работал вообще, хотя где-то на харде есть файл с ним, думаю и его подключим. Софт будет весь свой, пингер заходит на хаб как полноценный клиент, разве что качать с него нельзя, хотя наверно я об этом просто не задумывался, так что инфу можно собирать любую, вплоть до полного списка юзеров. Так что вот вам еще один вопрос: какой инфы будет достаточно, может стоит разбить ее на анонс и полную версию. Про "Тип регистрации" не особо понял, можно поподробнее, извиняю, тут я дилетант. Что касается этого пингера, то это скрипт на луа, да, до си я еще не дорос, а на пхп такое делать - тоже не мой уровень, да и хз как это будет работать, так что пингер - отдельный сервер с птокой и скриптом. Было бы идеально найди площадку, лучше в наших столицах, где связь получше, может тут кто подсобит?!) Про сайтовый движок тоже стоит подумать, может кто тут в php+MySQL шарит и поможет, думаю это не особо сложно. И отдельно - взаимодействие сиго чуда, надо тут тоже выбрать самый правильный вариант. ИМХО: пингер сохраняет на фтп файл с информацией, лучше сразу в массиве пхп, делает запрос на сервер (либо данные автоматически обрабатываются каждые n минут), который уже обрабатывает эту информацию, заносит ее в бд и т.д. Есть еще вариант с запросом определенной запароленной страницы сервера в режиме POST и передачей всех данных через него, но тут придется серверу (сайту) самому парсить инфу.
Автор: Delion 21.10.2008, 1:24
Цитата
инфу можно собирать любую, вплоть до полного списка юзеров.
Если впоследствии делать поиск по юзерам,то и никлист пригодится. Полезно,но не обязательно.
Цитата
какой инфы будет достаточно, может стоит разбить ее на анонс и полную версию.
Тут можно быть солидарными с dchublist.ru ;)
Цитата
Про "Тип регистрации" не особо понял, можно поподробнее, извиняю, тут я дилетант.
Я имел в виду кто будет собирать инфу - регистрационный сервер (у тебя,я так понял,его нет),пингер или они оба. По уму,последний вариант самый предпочтительный,ибо можно было бы пингер лишний раз не гонять,хабов-то много будет...
Цитата
пингер - отдельный сервер с птокой и скриптом.
Смело!
Цитата
площадку, лучше в наших столицах, где связь получше
Нынче везде плохая,истинно. Ну а по сайту дилетант уже я
Простейший пингер на php. По сути полноценный ДС клиент, обрезаный не хило. Интересует специфиакация общения хабпингер - хаб. Ибо после $BotINFO мне рвут соединение без какого-либо ответа.
Автор: alex82 5.11.2009, 11:15
Цитата
Ибо после $BotINFO мне рвут соединение без какого-либо ответа.
Так и должно быть. Только перед отключением хаб должен отправить команду $HubInfo с информацией о хабе, но только в том случае, если ты не забыл указать в $Supports поддержку $BotInfo/$HubInfo.
Автор: Setuper 5.11.2009, 12:30
Кстати, это зависит от хаба. Некоторые закрывают соединение, а некоторые нет))
Автор: Enyby 5.11.2009, 14:04
Спасибо, помогло. Неплохо бы указать это в теме описания протокола, ибо там я ничего про эту характеристику не нашел.
Автор: Setuper 5.11.2009, 18:56
Добавил в описание протокола.
Автор: HackFresse 6.11.2009, 10:49
Цитата
Вопросы по порядку:
1. Народ, кто знает какие хаблисты, акромя знаменитого dchublist.ru? 2. Какие функции нужны публичному хаблисту? 3. Что если нам сделать свой хаблист? 4. Как думаете, это трудно? big_smile.gif 5. Кто поможет?)) 6. Я совсем спятил?
1. не знаю, да и не искал особо. 2. тут надо пофантазировать на тему "а круто бы было, если бы..", а потом к этому списку применить "а надо ли оно вообще такое" 3. можно. или кто-то запретил? ) 4. мне кажется, тут придумать и продумать функции - основная задача.. 5. чем смогу- помогу. а могу немного MySql, php, jQuery, ajax. 6. ммм... не знаю
Автор: Enyby 6.11.2009, 14:06
Мне кажется, HackFresse, что ты не читал пост http://mydc.ru/topic404.html?view=findpost&p=22601. Там написан код PHP, который обеспечивает получение с хаба его названия, топика и количество народа, на нем присутствующего. После небольших изменений можно считать и шару, только это будет достаточно медленно. Поэтому ответы на вопросы 3 и 4 уже есть.
Автор: PomanoB 6.11.2009, 21:36
Помойму делать отдельно пингер смысла нету, так как он получает не самую важную информацию, пользователям важнее какая сейчас на хабе шара и сколько там народу, надо сразу делать обходчик как клиента, что бы он считал шару и пользователей, и делать его на php - не самый лучший вариант
Автор: Enyby 6.11.2009, 23:22
Отлично. Мне вот только интересно на чем, и как ты это забросишь на хостинг?
PS Приведенный выше код позволяет считать пользователей, получать общую шару, мотд топик и т. д. возможности практически безграничные.
PPS Пробовал реализовать на неблокирующих сокетах, но ничего хорошоего не вышло, да и, в добавок, грузит процеесор под самую завязку.
Автор: mariner 6.11.2009, 23:47
perl & python?
Автор: Enyby 6.11.2009, 23:49
Тогда в чем проблема? Я вроде видел где-то тут на перле такого рода чудо.
Автор: Setuper 7.11.2009, 0:10
Согласен с Романовым, а забрасывается на хостинг по средствам бд. Пишем программу, которая делает обход серваков со скидывание инфы в бд, а из бд уже можно хоть куда эту инфу поместить или использовать в каких-либо других целях. В итоге, не ограниченные возможности, достаточно быстро и не нагрузочно.
По поводу неблокирующих сокетов, то процессор грузится на 100% вероятнее всего из-за того, что стоит маленькая задержка между циклами. Когда нагрузки на сервер нет никакой, он концентрируется на обрабатывании огромного числа циклов, что и приводит к загрузке процессора.
Автор: Enyby 7.11.2009, 0:14
Тогда вообще можно не корячится. Где-то постоянно работает грейлинк или другой дс в поддержкой LUA, на нем крутится скрипт который по таймеру в MySQL складывает информацию и все.
Автор: Setuper 7.11.2009, 0:18
Думаю использование клиента с различными прибамбасами тоже не лучший вариант, тем более за эту работу опять же отвечает скрипт, что опять же не есть хорошо в смысле нагрузок, да и вообще стабильной работы.
Автор: Enyby 7.11.2009, 1:09
По-моему это лучше чем писать свой DC. Тем более от скрипта зависят совсем не критичные данные, так что не вижу тут проблемы.
Автор: Enyby 8.11.2009, 13:06
Цитата(Setuper @ 6.11.2009, 23:10)
По поводу неблокирующих сокетов, то процессор грузится на 100% вероятнее всего из-за того, что стоит маленькая задержка между циклами. Когда нагрузки на сервер нет никакой, он концентрируется на обрабатывании огромного числа циклов, что и приводит к загрузке процессора.
Спасибо. Разобрался, теперь все работает раз в 15 быстрее.
Автор: STRELOK 20.4.2010, 16:10
Цитата(Enyby @ 4.11.2009, 18:18)
Спасибо за пингер! Но есть парочка вопросов: как к нему добавить определение на какой программе работает хаб(Например: PtokaX) и кол-во текущей шары на указанном хабе?
Автор: Enyby 20.4.2010, 17:11
Вариантов два. Первый - использовать через некоторое время функцию пингера (смотри функцию протокола $BotINFO), второй - неявный, программу смотреть по ключу присылаемому для проверки, в большинстве случаев он специфичный для каждого хаба, а общую шару считать вручную через получение всех $MyINFO пользователей через $GetNickList и последующего сложения. Сразу скажу, что совсем не обязательно что на одного пользователя придет одно $MyINFO, есть скрипты пытающиеся переопределить какие-то значения, поэтому приходят несколько $MyINFO на одного пользователя. Я использовал для этого map массив.
Автор: STRELOK 20.4.2010, 17:28
Уже пробывал это делать самостоятельно, никак не могу это всё вытянуть :( . Можешь код кинуть, если не жалко?
Автор: Enyby 20.4.2010, 17:34
Полный код я давать не буду. Дам часть, только боюсь что он вырван из контекста и многое не будет понятно. К слову программу я определяю именно через $BotInfo, а шару через получение списка.
Я уже и не помню, но похоже на то, что частей, разделенных знаком $ в строке MyINFO может быть не одинаковое число. Сделай вывод переменной tmp и проверь, чтобы на 6 индексе была шара, а не что попало.
BotINFO нужно включать только если собираешся сделать пинг ($BotINFO/$HubINFO) и сразу выйти. Попробуй убрать его и снова зайти.
Если вывода нет, то это говорит о том, что участок с подсчетом числа пользователей вообще не выполняется. Вставь операторы
Код
echo '1';
По всей программе, заменяя номера последовательно - узнаешь где у тебя выполняется код, а где, нет - так и поймешь где ошибка.
Автор: STRELOK 20.4.2010, 18:53
Проблему решил . Добавил в case '$Look': process($socket, '$Supports NoGetINFO NoHello UserIP2 '); и всё стало нормально
Автор: Setuper 20.4.2010, 19:06
Это как раз таки птоха не придерживается протокола, отсылая всегда список пользователей при помощи MyINFO команд.
По протоколу же дело обстоит так:
При отсутствии у клиента характеристики NoHello и при наличии характеристики NoGetINFO хаб должен отсылать клиенту список пользователей при помощи команд $MyINFO и $NickList одновременно. При отсутствии обеих характеристик список пользователей отсылается по средствам команды $NickList, а список пользователей с участием команд $MyINFO можно будет получить только после отсылки на хаб команды $GetINFO.
Мде. Я что-то думал что STRELOK привел мне лог общения своего пингера с хабом, а не лог CDM отладчика. Поэтому думал что $Supports установлен.
Автор: Enyby 28.7.2010, 14:40
Вывел свою реализацию хаблиста в инет. http://mydc.ru/r/?http://inethub.olvi.net.ua/dc/ Если интересно, то можете посмотреть. Обновление раз в 5 минут.
Основан на том коде, что я в 21 сообщении темы приводил, правда потом был переточен под многопоточность. Сейчас все хабы пингуются одновременно и общее время пинга не превышает 5 минут. Обычно порядка 1-3 минут.
Полностью написан на php, для связи с хабами используються сокеты.
А как у вас успехи, товарищи-писатели? :-)
Автор: Saymon 29.7.2010, 1:12
успехи.... Ждём вашего релиза
Автор: Снегов 29.7.2010, 19:57
когда релиз хаблиста?
Автор: Enyby 30.7.2010, 0:18
Релиза пока не будет. Может быть когда-нибудь.
И вообще, насколько я понял, насчет релиза это была шутка.
Автор: Снегов 30.7.2010, 9:38
Цитата(Enyby @ 30.7.2010, 2:18)
Релиза пока не будет. Может быть когда-нибудь.
И вообще, насколько я понял, насчет релиза это была шутка.
да полностью готовый скрипт хаблиста и не просим. хотябы файлом пинга. который одновременно пингует все хабы.
Автор: Enyby 30.7.2010, 11:17
Хм. может я слишком скептично настроен, но мне что-то кажется, что Вам нужно готовое решение. В сообщении №21 находится скрипт, который достаточен, для выполнения последовательных запросов. Если я увижу, что Вы на его основе что-то сделали, но он не удовлетворяет каким-то требованиям (нагрузки, времени и пр.), то тогда может идти речь о скрипте с параллельным пингованием. А пока что это все очень похоже на "пусть будет".
Тем более, что предоставленного скрипта более чем достаточно для выполнения пингования раз в час, разумного количества хабов. Я уже не помню, но по-моему он позволял обработать около 60 хабов за 15 минут.
Автор: Снегов 30.7.2010, 15:03
готовое решение у мну есть. но пингование очень долго происходит.
и как я понял за основУ вы взяли скрипт выложенный помойму saymon ом. hublist night knight. сам его использую. но неустраивает время опроса. для опроса 10 хабов уходит 7-8 минут.
Автор: Enyby 30.7.2010, 15:30
За основу я действительно брал какой-то кривой клиент на php. Но находил его я не здесь, и большую часть просто выкинул. Он мне только помог разобраться с тем, как нужно в принципе работать. ОСтальное пришлось писать с нуля.
Теперь по поводу Вашего решения. Какой там пингер, мой или это еще чья-то разработка?
В $Supports ты определяешь BotInfo, если хаб его не поддерживает (не разрешает "пинг с хаблистов"), то он выкидывает клиента. http://mydc.ru/index.html?showtopic=915&view=findpost&p=6846
Автор: Setuper 16.8.2010, 16:58
Лучше сюда смотреть: http://mydc.ru/index.html?showtopic=915&view=findpost&p=7384
Автор: dro 16.8.2010, 20:03
Тогда я не понимаю каким образом можно снять пар-ры хаба? топик,максимум юзеров. админа.
Автор: Setuper 16.8.2010, 20:16
Можно только войдя на хаб. Пингеры так и делают.
Автор: dro 16.8.2010, 21:25
Дак это получает после $ValidateNick ?
Автор: Enyby 16.8.2010, 22:06
Да. Тебе сюда: http://mydc.ru/topic915.html Спойлер под темой "Общая (обязательная) последовательность входа на хаб. "Рукопожатие" между клиентом и хабом."
Автор: dro 17.8.2010, 9:24
хоть убейте но не дает мне хаб о себе информации
Код
Хаб ---> Клиент ($HubINFO)
Описание:
Данная команда нужна для получения более полной информации о хабе.
[Описание_бота] - может быть любой строкой, обычно это информация об адресе или хаб-листе. [Имя_хаба], [Адрес_хаба] и [Описание_хаба] - это пункты, которые будут показаны в хаб-листе (некоторые хабы имеют несколько адресов это помогает определит главный адрес). Описание хабов меняется часто, поэтому требует частого обновления. [Макс_юзеров], [Мин_шара], [Мин_слотов], [Макс_хабов] - соответственно максимально допустимое число пользователей, минимально допустимая шара на хабе, минимальное число слотов, максимальное число подключенных хабов. [Тип] - этот параметр даёт информацию о программе, под управлением которой работает хаб. [Владелец] - владелец хаба или email адрес владельца хаба
Автор: Setuper 17.8.2010, 12:06
Раз не даёт, значит тому 2 причины: 1) ты не правильно запрашиваешь 2) хаб не подерживает пинги или они просто отключены.
Автор: dro 17.8.2010, 12:07
Видимо 1. Потому как хаб держит пинги 100%
Автор: Enyby 17.8.2010, 21:31
Сделай вывод куда-нибудь, всего что отправляешь и что получаешь от хаба, а потом смотри формат протокола.
Автор: dro 18.8.2010, 22:19
Теперь все отлично летает, нашел пару изъянов. Enyby вы в сокетах какое максимальное количество байтов используете?
Да и кстати бывает так что хаб вроде бы онлайн, но данные не отдает т.к. хаб занят и не пустил бота, думаю что в этом случае делать
Автор: Ksan 18.8.2010, 23:35
Если стоит галочка в настройках хаба - "Не разрешать пинг с хаблиста", то вряд ли ты что-то придумаешь..
Автор: Enyby 18.8.2010, 23:56
Цитата(dro @ 18.8.2010, 21:19)
Enyby вы в сокетах какое максимальное количество байтов используете?
Это вы о чем? Если о буфере для чтения - 2048 байт. Буфер записи - строка, которая не имеет никаких особых ограничений.
Цитата(dro @ 18.8.2010, 21:19)
Да и кстати бывает так что хаб вроде бы онлайн, но данные не отдает т.к. хаб занят и не пустил бота, думаю что в этом случае делать
Бывает разное. Бывает что соединение плохое или хаб сильно занят, тут вы ничего не сделаете. Бывает что пингер запрещен, тогда нужно заходить как обычным клиентом. Бывает что заполнен лимит юзеров, тогда надо сделать аккаунт и использовать авторизацию, поскольку обычно зарегистрированные пользователи могут входить на заполненный хаб. И т. д.
Автор: dro 19.8.2010, 8:27
Цитата(Enyby @ 19.8.2010, 0:56)
Это вы о чем? Если о буфере для чтения - 2048 байт. Буфер записи - строка, которая не имеет никаких особых ограничений.
Бывает разное. Бывает что соединение плохое или хаб сильно занят, тут вы ничего не сделаете. Бывает что пингер запрещен, тогда нужно заходить как обычным клиентом. Бывает что заполнен лимит юзеров, тогда надо сделать аккаунт и использовать авторизацию, поскольку обычно зарегистрированные пользователи могут входить на заполненный хаб. И т. д.
А Вы каким образом обходите хаб? просто по времени как я понял обойти пингом хаб быстрее нежели клиентом, или я ошибаюсь?
Да и наткнулся на такую вещь, есть хабы с ограничением по открытым хабам, меня на такие тоже не пускает(
Кому интересно вот мой пингер ( завязан с БД) Хотелось бы услышать критику по коду и недочеты.Спасибо
$mysql = mysql_connect($host, $user, $userpass) or die("<font color='red'>Ошибка соединения с MySQL!</font><br>"); mysql_select_db($bd, $mysql) or die("<font color='red'>Ошибка базы данных MySQL!</font><br>");
$result = @mysql_query("SELECT * FROM `".$dbtable."` ORDER BY `".$dbtable."`.`ID` ASC LIMIT 0 , 30"); while ($data = @mysql_fetch_assoc($result)) {
$useri = 0; $share = 0; $infoyes = 1;
if ($fp=@fsockopen($data['Adres'],$data['Port'],$ERROR_NO,$ERROR_STR,5)) { fclose($fp); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!socket_connect($socket, $data['Adres'], $data['Port'])) { echo 'Error..'; return; }
while ($buffer = socket_read($socket, 2048, PHP_BINARY_READ)) {
if ($infoyes == "1") { mysql_query("UPDATE `".$dbtable."` SET Name = '".$hubinfo[1]."', Descr = '".$hubinfo[3]."', Maxusers = '".$hubinfo[4]."', MinShare = '".$hubinfo[5]."', MinSlots = '".$hubinfo[6]."', MaxHubs = '".$hubinfo[7]."', Soft = '".$hubinfo[8]."' WHERE id = ".$data['ID'].""); } #$infoyes = "0";
mysql_query("UPDATE `".$dbtable."` SET Users = ".$useri.", Status = 'Online', Share = ".floatval($share)." WHERE id = ".$data['ID']."");
if ($useri > $data['Userspeak']){ mysql_query("UPDATE `".$dbtable."` SET Userspeak = ".$useri." WHERE id = ".$data['ID'].""); }
if ($share > $data['Sharepeak']){ mysql_query("UPDATE `".$dbtable."` SET Sharepeak = ".floatval($share)." WHERE id = ".$data['ID'].""); }
}else{ mysql_query("UPDATE `".$dbtable."` SET Status = 'Offline' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Users = '0' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Share = '0' WHERE id = ".$data['ID'].""); } } mysql_close($mysql); ########end timer $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo 'This page was created in ' .$totaltime. ' seconds.';
?>
Автор: Enyby 20.8.2010, 1:38
Пингом - быстрей, но пинг предоставляет недостаточно информации. С другой стороны, он виден админу, и если часто пинговать, то вас попросту забанят. Поэтому у меня раз в 5 минут хаблист заходит как клиент и раз в час - как пингер, т. е. каждый 12 раз из тех, что по 5 минут.
В целом пингер неплох. Критика по коду:
Соблюдайте отступы, намного приятнее будет читать. Для этих целей лучше пользоваться IDE с автоформатированием кода, например, Eclipse.
Лучше не использовать принудительное подавление @, а писать так, чтобы никаких ошибок не было.
Не тот алгоритм. Этот алгоритм для захода ХАБА на хаблист, а вам нужен обычный, в котором не порта. Да и порт вы не тот указали, вы указали порт подключения, а в этом алгоритме нужно указать локальный порт.
Чтобы бота пускали на все хабы, не нужно передавать специфический тэг клиента. Да и число хабов онлайн можно не 21 ставить. "H:21/0/1" - 21 хаб 1 и на одном админ.
UPD: И да, я тут увидел зачатки работы как клиента (Подсчет MyINFO). Вам предстоит нетривиальная задача определения когда заканчивается процесс инициализации хаба. Также вам необходимо отсевать свой собственный MyINFO, так как он вносит погрешность в ваши измерения. В дополнение к этому есть скрипты манипулирующие MyINFO, из-за них оно может приходить несколько раз для одного пользователя, что вызовет искажение размера шары и числа пользователей.
Так что работы тут еще много.
Автор: PomanoB 20.8.2010, 9:03
Можно считать, что процесс инициализации закончился, если команды MyINFO уже были, и пришла первая не MyINFO команда
Автор: dro 20.8.2010, 12:13
2Enyby Спасибо за критику и советы. Lock поправил
По поводу MyINFO можно поидеи себя отсеять сделав -1 (+- 2 чел не сыграют роли) Так же можно сделать и с шарой. Но вот Вы правильно заметили что может придти несколько раз MyINFO, на этот счет я думаю загонять все данные в массив и потом массив проверять на одинакове эл-ты, а далее уже из этого массива и будем считать шару и число юзеров за вычетом моих данных. Верно ли это?
Бывает такое что хаб после MyINFO рвет соединение и скрипт отработал впустую, например dc.cifracom.ru
Собственно по какому принципу лучше смотреть когда заканчивается процесс инициализации хаба?
Автор: Enyby 20.8.2010, 13:00
Итак, по порядку.
Как было справделиво замеченно, можно отсекать по команде не MyINFO, после MyINFO, но не все тут гладко. Можно довольно долго висеть на хабе из 5 человек ожидая другой команды.
Вообще говоря, по протоколу, список MyINFO, должен заканчиваться MyINFO хаблиста, но, к сожалению, так поступают не все хабы.
Дальше. Есть такое расширение протокола как Zon. Которое предполагает сжатие gzip дл передаваемых данных. проблема состоит в том, что некоторые хабы в любом случае включат это сжатие не смотря поддерживается оно клиентом или нет. Эта команда может появляться где угодно и, обычно, список пользователей передается в сжатом виде, что означает, что ее нужно игнорировать и не разрывать соединение, так как процесс входа на хаб может быть не завершен.
Также следует отслеживать команды ValidateDenide и ForceMove. Первая означает что ник занят или не является допустимым, а вторая - дает редирект, при переполнении или других причинах. Четкой команды, свидетельствующей о бане не существует, обычно это сообщение от бота со словом ban, но не обязательно.
100% алгоритма определения окончания инициализации не существует или мне он не известен. Пользуюсь набором правил следующего вида:
Если получены команды Quit или Search - вход завершен.
Если получена команда OpList и перед этим была получена хоть одна команда MyINFO - вход завершен. Некоторые хабы, отсылают список операторов ранее списка пользователей, хотя это и не соответствует протоколу.
Если было зафиксировано получение команд MyINFO, а после этого пришла команда не Zon и не MyINFO - вход завершен.
Как вариант, можно еще пытаться отлавливать MOTD, но оно может отсылаться в ЛС.
По поводу дубликатов, проблема решается просто, все это дело заноситься в ассциативный массив по ключу ника, а потом из массива и считается шара и число пользователей. Также необходимо отслеживать свой ник и его игнорировать.
Еще. Хаб может не поддерживать BotINFO/HubINFO, тогда с текущим алгоритмом вы будете ждать вечность команды HubINFO. Чтобы этого не произошло, необходимо, после указания поддержки данных команд в отсылаемом Supports, проверить наличие поддержи в полученном Supports.
Автор: dro 20.8.2010, 13:38
С шарой и ассоциативным массивом я так и сделал. А насчет остального буду думать и дописывать спасибо!!!!!
Автор: Alexey 20.8.2010, 15:44
Цитата(Enyby @ 20.8.2010, 14:00)
[*]Если получена команда OpList и перед этим была получена хоть одна команда MyINFO - вход завершен. Некоторые хабы, отсылают список операторов ранее списка пользователей, хотя это и не соответствует протоколу.
В одном хабе с самописным сервером выполнение этого условия вызовет преждевременный разрыв, поскольку отсылается такая порнография:
Спасибо за замечание. Мне оно правда не грозит, так как хаблист локальный, но буду знать. Вообще говоря, самописные хабы это страшная сила, наподобие IE 6 при верстке. У меня были проблемы с dcworlds, но он уже не локальный, да и давно уже это было, не помню сути. Помню только что нарушался протокол и хаб был самописным.
Автор: dro 29.8.2010, 15:25
А подскажите такой момент. У меня кол-во пользователей с действительным расходится примерно на 100. Где искать косяк? Или это из-за того что не все клиенты сразу отвечают на MyInfo? И как быть тогда?
Автор: Enyby 29.8.2010, 16:08
1. Включаешь вывод всех входящих/отправленных команд и получаешь лог файл. 2. В отладчике ДС клиента заходишь на тот же хаб - получаешь второй лог. 3. Ищешь отличия. Чтобы не делать это руками, организуй вывод со своего хаблиста в формат аналогичный отладчику, а потом пользуйся утилитами сравнения файлов, например, тем же тоталом коммандером. 4. Если отличия есть, то причина в том что ты рано закрыл соединение. 5. Если нет, то причина в обработке внутри пингера - начинаешь во всю использовать print_r и var_dump.
UPD: И да, на майинфо отвечает не клиент а хаб. И отсылает он сразу все, вот только иногда он это криво делает.
Автор: PomanoB 29.8.2010, 17:23
Причина может быть в том, что у тебя в цикле читаются данные из сокета, потом эти данные разбиваются по |. Когда данных пришло меньше, чем 2048, все хорошо. Но когда хаб большой, все MyINFO за одно чтение получить не удается, и выходит, что из сокета прочиталось часть MyINFO, то есть конец буфера выглядит так: "... |$MyINF". И остальная часть MyINFO прочитается только при следующем чтении. Но увеличиваться счетчик юзеров не будет, так как первая часть MyINFO не распознается как MyINFO.
Автор: Enyby 29.8.2010, 18:30
PomanoB прав. Чтобы подобного не возникало, нужно последний элемент всегда приплюсовывать к новому буферу, например так:
Если элемент последний, то он заносится в переменную $end, которая затем приписывается спереди к новому буферу.
UPD: На самом деле не важно где прервалсь команда, на ключевом слове или где-то еще, в любом случае дальнейшая обработка фрагмента будет ошибочной.
Автор: Nickolya 29.8.2010, 19:01
Да, но прибавлять последний элемент массива надо лишь при условии что он не заканчивается |, иначе получится дубляж некоторых команд, что конечно может и не быть критичным, но все-таки неверно. Хотя как я тут вижу, если команды были полными, то приплюсуется лишь пустая строка
Автор: Enyby 29.8.2010, 19:05
Последний элемент не может заканчиваться символом "|", так как функция explode разбивает по нему на элементы массива. Если же "|" будет последним символом в строке, то в массиве последний элемент будет пустой строкой.
Автор: dro 29.8.2010, 21:02
Частично понял о чем речь! Спасибо буду дальше разбираться
З.Ы. А если размер буффера поставить больше?
UPD: Вроде бы все стало считать отдично!!! Благодарю Вас!
Автор: Enyby 29.8.2010, 22:04
Цитата(dro @ 29.8.2010, 20:02)
А если размер буффера поставить больше?
Возврат из функции socket_read происходит по двум причинам:
заполнился буфер;
превышено время ожидания заполнения буфера;
Если буфер слишком мал, то скрипт будет частенько бегать в цикле, не обрабатывая команды, а лишь инкрементно приращая переменную $end. Если же буфер слишком велик, то большую часть времени скрипт будет ждать таймаута заполнения буфера, в результате чего, хаб имеет право разорвать соединение, как слишком медленное, но даже если этого не произойдет, все равно будет существенное падение скорости работы пингера.
$mysql = mysql_connect($host, $user, $userpass) or die("<font color='red'>Ошибка соединения с MySQL!</font><br>"); mysql_select_db($bd, $mysql) or die("<font color='red'>Ошибка базы данных MySQL!</font><br>");
mysql_query("SET NAMES 'cp1251'"); mysql_query("SET CHARACTER SET 'cp1251'");
$result = @mysql_query("SELECT * FROM `".$dbtable."` ORDER BY `".$dbtable."`.`ID` ASC LIMIT 0 , 30"); while ($data = @mysql_fetch_assoc($result)) {
foreach($info as $share){ $total_share=$share+$total_share; } $total_share=$total_share - $myshare; }else{ $hubinfo[1] = $data['Adres']; $hubinfo[3] = "Возможно хаб не поддерживает пинги"; } #print_r($info); unset($info);
if ($infoyes == "1") { // mysql_query("UPDATE `".$dbtable."` SET Name = '".$hubinfo[1]."', Descr = '".$hubinfo[3]."', // Maxusers = '".$hubinfo[4]."', MinShare = '".$hubinfo[5]."', MinSlots = '".$hubinfo[6]."', // MaxHubs = '".$hubinfo[7]."', Soft = '".$hubinfo[8]."' WHERE id = ".$data['ID']."");
mysql_query("UPDATE `".$dbtable."` SET Name = '".$hubinfo[1]."',Descr = '".$hubinfo[3]."', Maxusers = '".$hubinfo[4]."', MinShare = '".$hubinfo[5]."', MinSlots = '".$hubinfo[6]."', MaxHubs = '".$hubinfo[7]."', Soft = '".$hubinfo[8]."' WHERE id = ".$data['ID'].""); } #$infoyes = "0";
mysql_query("UPDATE `".$dbtable."` SET Users = ".$useri.", Status = 'Online', Share = ".floatval($total_share)." WHERE id = ".$data['ID']."");
if ($useri > $data['Userspeak']){ mysql_query("UPDATE `".$dbtable."` SET Userspeak = ".$useri." WHERE id = ".$data['ID'].""); }
if ($total_share > $data['Sharepeak']){ mysql_query("UPDATE `".$dbtable."` SET Sharepeak = ".floatval($total_share)." WHERE id = ".$data['ID'].""); }
}else{ mysql_query("UPDATE `".$dbtable."` SET Status = 'Offline' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Users = '0' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Share = '0' WHERE id = ".$data['ID'].""); } } mysql_query("UPDATE `lastupdate` set `time` = now()"); mysql_close($mysql); ########end timer $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); echo 'This page was created in ' .$totaltime. ' seconds.';
?>
Автор: Enyby 30.8.2010, 7:50
Код
if(preg_match('#не поддерживает пинга#',$linie[$i])){
Стоит добавить и англоязычный вариант, хотя в своем пингере это никак не отслеживаю, так как каждый хаб выдает сообщения такие какие ему заблагорассудится. У меня это выглядит как таймаут.
Код
$user = explode(' ', $linie[$i]);
$user - совершенно не информативное название переменной для данного случая, возможно стоит заменить на что-то более понятное. Но это больше относиться к стилю написания кода, чем к его работе.
Некорректное решение в общем случае, так как заменяет везде ".px." на пробел. Хаб PtokaX дописывает данную строку лишь в самый конец, т. е. вам стоит проверять последние 4 символа на предмет соответствия и извлекать подстроку, если это так.
Код
$hubinfo[1] = $hubname;
Опять же, инициализация переменной не гарантирована. Следите за этим. Ничего страшного в PHP не происходит, только warning'и, которые замедляют работу скрипта, вызывая обращения к логам, но если бы вы писали на C, то все может закончиться куда плачевнее. Помните, что когда вы пишете код, вы порождаете свой стиль, с которым потом будет трудно бороться, если вы смените язык программирования.
Код
array_unique($info);
Вы делаете ошибку вызывая эту функцию. Ознакомтесь с ее действием. Пример ошибки: У двух пользователей размер шары одинаковый до байта, например равне 0 - вы подсчитаете лишь одного из них.
Старайтесь, где это возможно, использовать операторы "+=" и "-=".
Код
mysql_query("UPDATE `".$dbtable."` SET Name = '".$hubinfo[1]."',Descr = '".$hubinfo[3]."', Maxusers = '".$hubinfo[4]."', MinShare = '".$hubinfo[5]."', MinSlots = '".$hubinfo[6]."', MaxHubs = '".$hubinfo[7]."', Soft = '".$hubinfo[8]."' WHERE id = ".$data['ID']."");
Типичный пример включения не проверенных данных в SQL запрос, может приводит к SQL иньекции, со всеми отсюда вытекающими последствиями. Необходимо все строковые значения пропускать через функцию mysql_real_escape_string, все целочисленные - через intval, а дробные через floatval. Это касается всех MySQL запросов.
Код
mysql_query("UPDATE `".$dbtable."` SET Users = ".$useri.", Status = 'Online', Share = ".floatval($total_share)." WHERE id = ".$data['ID']."");
Чтобы не терять часть значащих знаков, я предпочитаю с $total_share работать, как со строкой. Преобразование к дробному числу может перевести к потери нескольких значащих знаков. Соответственно для MySQL таблицы нужно указать BIGINT поле для хранения таких чисел, ну или VARCHAR, хотя это и не очень хорошо.
Код
if ($useri > $data['Userspeak']){
Замечание по стилю именования: "Userspeak" имеет две расшифровки, "user speak" и "users peak", для большей понятности кода такую двойственность лучше не создавать. Например, "usersPeak" или "users_peak".
Код
mysql_query("UPDATE `".$dbtable."` SET Status = 'Offline' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Users = '0' WHERE id = ".$data['ID'].""); mysql_query("UPDATE `".$dbtable."` SET Share = '0' WHERE id = ".$data['ID']."");
В данном случае следует выполнять один запрос к БД, а не три. Также, если используется InnoDB в качества движка таблиц, то рекомендуется использовать явно задание транзакций, если число запросов на изменение, составляющих атомарную цепочку, более одного.
Автор: dro 30.8.2010, 9:06
Спасибо большое, щас буду исправлять.
Насчет
Код
array_unique($info);
В $info содержиться не только шара но и ник юзера типа Вася - 123123123 и я не думаю что может быть на хабе 2 одинковых юзера.
Цитата
Или часть кода прошла преформатирование при выводе на форум или тут вы делаете что-то не то.
Форум преформатировал.
Не совсем понял про то, что если у нас не выполниться if ($user[1] == $nick) {
т.е. проверка не нужна?
Ладно пойду налью кофе и буду фиксить все. По поводу SQL inj вы правы, лень матушка меня на такое подвела. Исправлюсь.
Автор: Enyby 30.8.2010, 10:34
Цитата
array_unique — Removes duplicate values from an array
values, в данном случае, это размер шары пользователей. Зачем вам оставлять только пользователей с уникальным размером шары? Это значение, если отлично от нуля, то вероятность его совпадения у разных пользователей очень мала, но если оно равно нулю, или один пользователь сидит два раза на одном хабе, то вы попросту отсеете его. Вы и так уже заносите в массив по никнейму как ключу, а одному ключу может соответствовать лишь одно значение массива, так что эта команда совершенно лишняя.
case '$Hello': if ($user[1] == $nick) { execute($socket, '$Version 1,0091'); execute($socket, '$GetNickList'); execute($socket, '$MyINFO $ALL '.$nick.' Bot by dro <++ V:0.674,M:A,H:1/0/1,S:20>$ $LAN(T3).$alexandr@drozdin.ru$'.$myshare.'$'); #execute($socket, '$MyINFO $ALL '.$nick.' Bot by dro <FlylinkDC++ V:(r386),M:P,H:1/0/1,S:15>$ $100 $alexandr@drozdin.ru$670969607454$'); execute($socket, '$BotINFO {HubListPinger} hublist pinger'); } else { // some code }
Просто если ники не совпадут, то вы не отошлете кучу команд, грубо говоря, вы проигнорируете команду хаба и будете ждать у моря погоды. Необходимо делать обработчики всех возможных событий. Если вы делаете if, то он может как выполниться, так и не выполниться. Нужно учитывать оба варианта.
Автор: Enyby 30.11.2010, 1:51
Много релевантных слов. Конкретного хаблиста тут нет, так что добавлять некуда.