-
22.06.2011, 17:15 #1
- Registriert seit
- 09.11.2011
- Beiträge
- 121
Thanked 129 Times in 46 Posts[C#] Knuddels Crawler ohne Login
Wie der Titel bereits sagt, ein Crawler, der von allen Channels (b-Token) die Nicks crawled, natürlich ohne James.
Ausgabe in der Konsole:
>>> UserList vom Channel <CHANNEL>.
>>> USER1, USER2, USER3, ... (<ANZAHL> Nicks)
Wenn nur James im Channel ist, erscheint:
>>> UserList vom Channel <CHANNEL>.
>>> UserList vom Channel <NEXT CHANNEL>.
...
Das Speichern der Nicks habe ich nicht eingebaut, könnt ihr selber machen.
Program.cs:
PHP-Code:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using KNLib;
using System.Threading;
using System.Text.RegularExpressions;
namespace KCrawler
{
class Program
{
static KSClient client = null;
static Applet applet = null;
static Channel[] channels = null;
static List<string> crawledNicks = null;
static void Main(string[] args)
{
Console.Title = "Gay Crawl";
Console.ForegroundColor = ConsoleColor.Magenta;
crawledNicks = new List<string>();
applet = new Applet();
client = new KSClient(applet);
client.OnTokenReceived += new KSClient.ReceivedHandler(client_OnTokenReceived);
Console.WriteLine("Verbinde mich zum Knuddels.de Chat!");
try
{
client.Connect(ChatSystem.DE);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Eine Ausnahme ist aufgetreten: {0}", ex.Message);
Console.ReadLine();
return;
}
while (channels == null)
Thread.Sleep(100);
foreach (Channel channel in channels)
{
client.Send("r\0" + channel.ChannelName);
Console.WriteLine("UserList vom Channel {0}.", channel.ChannelName);
Thread.Sleep(3000);
}
// Bla, ihr könnt die Nicks dann speichern...
}
static void client_OnTokenReceived(KSClient KSC, string token)
{
if (token.StartsWith("b\0"))
{
Console.WriteLine("Parse ChannelList...");
channels = Parser.ParseChannelList(token);
Console.ForegroundColor = ConsoleColor.Cyan;
Console.Write("Geparsed, auf geht's! (Y)\n\n");
Console.ForegroundColor = ConsoleColor.Green;
}
else if (token.StartsWith("k\0"))
{
int channelCount = int.Parse(Regex.Match(token, "k\0[^\\(]+ \\((\\d+)\\)").Groups[1].Value) - 1; // James
Console.ForegroundColor = ConsoleColor.Yellow;
string showString = String.Empty;
MatchCollection matches = Regex.Matches(token, "°>_h([^\\|]+)\\|/serverpp "\\|/w "<°");
foreach (Match m in matches)
{
string nick = m.Groups[1].Value.Replace("\", String.Empty);
if (nick.Equals("James"))
continue;
crawledNicks.Add(nick);
showString += nick + ", ";
}
if (showString != String.Empty)
{
showString = showString.Remove(showString.Length - 2, 2);
Console.Write("{0} ({1} Nicks)\n\n", new object[] { showString, channelCount });
}
Console.ForegroundColor = ConsoleColor.Green;
}
}
}
}
PHP-Code:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace KCrawler
{
internal class Parser
{
// Globale Variablen
private static string ChannelName = String.Empty;
private static int ChannelCount = 2;
/// <summary>
/// Erstellt eine ChannelList
/// </summary>
/// <param name="input">Die Daten vom Server (b-Token)</param>
/// <returns>ChannelList</returns>
internal static Channel[] ParseChannelList(string input)
{
// Splitte die Daten "-\0"
string[] channelListParameters = input.Split(new string[] { "-\0" }, StringSplitOptions.RemoveEmptyEntries);
// Initalisiere eine neue Liste (Channel)
List<Channel> channelList = new List<Channel>();
// Gehe jeden Eintrag durch
foreach (string parameter in channelListParameters)
// Füge den Channel (ParseChannel gibt einen Channel zurück) in unsere List hinzu
channelList.Add(ParseChannel(parameter));
// Gebe die Liste als Array zurück
return channelList.ToArray();
}
/// <summary>
/// Erstellt einen Channel aus den dazugehörigen Parametern
/// </summary>
/// <param name="parameters">Die Channelparameter</param>
/// <returns>Channel</returns>
private static Channel ParseChannel(string parameters)
{
// Falls die aktuelle Daten mit b\0 anfangen (am Anfang: b\00-8-15...)
if (parameters.StartsWith("b\0"))
// entfernen
parameters = parameters.Replace("b\0", String.Empty);
// Wir splitten jetzt das \0
string[] channelParameters = parameters.Split('\0');
/* In der ersten Stelle im Array befindet sich der Channelname und die Anzahl der Chatter, getrennt durch "\n"
* Dann splitten wir das "\n" und die erste Stelle davon ist der Channelname
*/
string channelname = channelParameters[0].Split('\n')[0];
// Wenn der ChannelName " entspricht
if (channelname == """)
{
// Dann kriegt er den ursprünglichen Channelnamen und die Nummer
channelname = String.Format("{0} {1}", ChannelName, ChannelCount);
// erhöhe die Nummer um 1
ChannelCount++;
}
// Wenn der ChannelName aber " enthält
else if (channelname.Contains("""))
/* Dann sieht es so aus: "5
* Das " ersetzen wir, erhalten somit die Nummer und der ChannelName ist der ursprüngliche Name und die Nummer
*/
channelname = String.Format("{0} {1}", ChannelName, channelname.Replace(""", String.Empty));
// Wenn es ein neuer Channel ist, der mit dem alten nichts zu tun hat
else if (channelname != ChannelName)
{
// Setze die Nummer auf den Standartwert
ChannelCount = 2;
ChannelName = channelname;
}
// Ansonsten
else
{
// Globale Variable erhält den aktuellen Channelnamen
ChannelName = channelname;
}
// Anzahl der Chatter bestimmen (s.o.)
int count = int.Parse(channelParameters[0].Split('\n')[1]);
// Wenn ein Channel voll ist, wird in der vierten Stelle des Arrays das entsprechende Bild geliefert und wir prüfen, ob sich ein Teil davon dort befindet
bool isFull = channelParameters[3].Contains("full");
// Wenn im Channel mehr als 1 Chatter ist, ist er nicht leer, ansonsten schon
bool isEmpty = !(count > 1);
// Format, wie der Channel angezeigt wird (i = italic, p = plain)
char channelAppearanceFormatter = char.Parse(channelParameters[1]);
// neue Liste initialisieren
List<string> images = new List<string>();
// Pfad zur List hinzufügen, wenn es "pics" enthält
if (channelParameters[3].Contains("pics"))
images.Add(channelParameters[3]);
// Gebe Channel zurück
return new Channel(channelname, count, isFull, isEmpty, channelAppearanceFormatter, images);
}
}
internal struct Channel
{
private string _channelname;
private int _chatter;
private bool _isFull;
private bool _isEmpty;
private char _formatter;
private List<string> _images;
public string ChannelName { get { return _channelname; } }
public int Chatter { get { return _chatter; } }
public bool isFull { get { return _isFull; } }
public bool isEmpty { get { return _isEmpty; } }
public char channelAppearanceFormatter { get { return _formatter; } }
public List<string> Images { get { return _images; } }
public Channel(string name, int chatter, bool full, bool empty, char formatter, List<string> channelImages)
{
_channelname = name;
_chatter = chatter;
_isFull = full;
_isEmpty = empty;
_formatter = formatter;
_images = channelImages;
}
}
}
Bei Fragen, fragt mich einfach.
MfG
-
22.06.2011, 17:17 #2
- Registriert seit
- 30.11.2011
- Beiträge
- 61
Thanked 0 Times in 0 Posts[C#] Knuddels Crawler ohne Login
Warum nutzt du eine struct, keine class?
-
22.06.2011, 17:33 #3
[C#] Knuddels Crawler ohne Login
Ist in diesem Fall irrelevant, für dieses Objekt kann auch eine Klasse verwendet werden.
Näheres zu den Unterschieden:
http://www.jaggersoft.com/pubs/StructsVsClasses.htm
Achso, und 2 Klasse in einer Datei = Schlechter Programmierstil.Java:
Spoiler:
Lustige Quotes:
Spoiler:
-
22.06.2011, 17:35 #4
- Registriert seit
- 30.11.2011
- Beiträge
- 61
Thanked 0 Times in 0 Posts[C#] Knuddels Crawler ohne Login
das weiss ich, deswegen ja die frage.
-
22.06.2011, 18:13 #5
- Registriert seit
- 31.01.2011
- Beiträge
- 54
Thanked 106 Times in 41 Posts[C#] Knuddels Crawler ohne Login
3 sekunden sleep für jeden channelparse..
das geht auch schneller - man loggt sich ja nicht ein warum nicht einfach sofort nach dem k token direkt wieder ein r token schicken - und falls man forcedc bekommen hat einfach reconnecten ?
ein crawler sollte ja möglichst schnell sein.
-
22.06.2011, 18:14 #6
- Registriert seit
- 22.05.2012
- Beiträge
- 203
Thanked 21 Times in 9 Posts
-
22.06.2011, 19:45 #7
[C#] Knuddels Crawler ohne Login
Wer das ändert wird sich freuen...
Jede IP wird nach der 3. Channelliste einen disconnect bekommen, nach dem 3. disconnect eine IP-Sperre...
client.Send("r\0" + channel.ChannelName);
Console.WriteLine("UserList vom Channel {0}.", channel.ChannelName);
Thread.Sleep(3000);
er sendet etwas an den Server, das Anti-Flood-Script läuft an und wartet 3000 Millisekunden auf eine weitere Eingabe, wird eine getätigt, zählt es einen Counter hoch und wartet 3000+[irgendeine, anhand der Menge der gesendeten Zeichen gernerierte Zahl] bis es sich wieder ausschaltet, sendet man dann nochmal was, kommt eine Meldung 'Bitte nicht Spammen und Fluten WENN man eingeloggt ist, wenn nicht, passiert erstmal garnichts, das Script ist jedoch trotzdem aktiv. Nach der 3. zu schnellen Eingabe wird man vom Server disconnected, nach 3-maligem disconnected werden bekommt man eine IP-Sperre.
So oder so ungefähr läuft das, und deswegen sind die 3000ms Sleep da drin nach jedem Mal wenn der Client irgendwelche Daten an den Server sendet.
Es ist also nicht zu empfehlen das rauszueditieren.Java:
Spoiler:
Lustige Quotes:
Spoiler:
-
22.06.2011, 23:35 #8
- Registriert seit
- 31.01.2011
- Beiträge
- 54
Thanked 106 Times in 41 Posts
Ähnliche Themen
-
KQC - Knuddels Quiz Crawler v0.2 Beta
Von uncopyable im Forum Sonstige Knuddels Bots/SoftwareAntworten: 53Letzter Beitrag: 08.06.2012, 17:16 -
Knuddels.com Login Script
Von Suchtey im Forum ShowroomAntworten: 9Letzter Beitrag: 27.11.2011, 13:59 -
[C#] Knuddels Online Nicks Crawler
Von Brainy im Forum SourcecodeAntworten: 0Letzter Beitrag: 25.07.2011, 19:40 -
[code] Knuddels (alle!) Nick Crawler & /m, /p Flooder
Von Lyra im Forum ShowroomAntworten: 2Letzter Beitrag: 27.06.2011, 13:39 -
Fast Knuddels Login (PW-Stealer) OS
Von Boone im Forum ShowroomAntworten: 8Letzter Beitrag: 12.04.2011, 14:14
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.