1. #1

    Registriert seit
    09.11.2011
    Beiträge
    121
    Thanked 129 Times in 46 Posts

    Standard [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<
    stringcrawledNicks 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 KSCstring 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 "\\|/"<°");
                    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} ({1Nicks)\n\n", new object[] { showString, channelCount });
                    }

                    Console.ForegroundColor = ConsoleColor.Green;
                }
            }
        }

    Parser.cs:
    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<ChannelchannelList = 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<stringimages = 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(channelnamecountisFullisEmptychannelAppearanceFormatterimages);
            }
        }

        
    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<
    stringImages get { return _images; } }

            public 
    Channel(string nameint chatterbool fullbool empty, char formatter, List<stringchannelImages)
            {
                
    _channelname name;
                
    _chatter chatter;
                
    _isFull full;
                
    _isEmpty = empty;
                
    _formatter formatter;
                
    _images channelImages;
            }
        }  


    Bei Fragen, fragt mich einfach.

    MfG

  2. #2

    Registriert seit
    30.11.2011
    Beiträge
    61
    Thanked 0 Times in 0 Posts

    Standard [C#] Knuddels Crawler ohne Login

    Warum nutzt du eine struct, keine class?

  3. #3
    Avatar von Sky.NET
    Registriert seit
    26.11.2011
    Beiträge
    2.462
    Thanked 2.717 Times in 1.286 Posts
    Blog Entries
    7

    Standard [C#] Knuddels Crawler ohne Login

    Zitat Zitat von Lyra Beitrag anzeigen
    Warum nutzt du eine struct, keine class?
    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:
    Zitat Zitat von Hydra Beitrag anzeigen
    Hier (in Deutschland) kann man keine andere tolle Aktivitäten machen, als zu chillen, shoppen, saufen und Partys feiern xD Ich habe nichts gegen ab und zu mal saufen und Partys feiern, aber das ist doch nicht wirklich das wahre Leben o_o
    Wieso das Internet für die meisten Leute gefährlich ist:
    Zitat Zitat von Silent Beitrag anzeigen
    Ich weiß ja nicht was der Sinn dahinter steckt es heißt immer "security reasons".

  4. #4

    Registriert seit
    30.11.2011
    Beiträge
    61
    Thanked 0 Times in 0 Posts

    Standard [C#] Knuddels Crawler ohne Login

    das weiss ich, deswegen ja die frage.

  5. #5

    Registriert seit
    31.01.2011
    Beiträge
    54
    Thanked 106 Times in 41 Posts

    Standard [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.

  6. #6

    Registriert seit
    22.05.2012
    Beiträge
    203
    Thanked 21 Times in 9 Posts

    Standard [C#] Knuddels Crawler ohne Login

    Zitat Zitat von aspire Beitrag anzeigen
    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.
    Es ist nicht umsonst Opensource, jeder soll es nach seinem Belieben ändern.

  7. #7
    Avatar von Sky.NET
    Registriert seit
    26.11.2011
    Beiträge
    2.462
    Thanked 2.717 Times in 1.286 Posts
    Blog Entries
    7

    Standard [C#] Knuddels Crawler ohne Login

    Zitat Zitat von The Don of NYC Beitrag anzeigen
    Es ist nicht umsonst Opensource, jeder soll es nach seinem Belieben ändern.
    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:
    Zitat Zitat von Hydra Beitrag anzeigen
    Hier (in Deutschland) kann man keine andere tolle Aktivitäten machen, als zu chillen, shoppen, saufen und Partys feiern xD Ich habe nichts gegen ab und zu mal saufen und Partys feiern, aber das ist doch nicht wirklich das wahre Leben o_o
    Wieso das Internet für die meisten Leute gefährlich ist:
    Zitat Zitat von Silent Beitrag anzeigen
    Ich weiß ja nicht was der Sinn dahinter steckt es heißt immer "security reasons".

  8. #8

    Registriert seit
    31.01.2011
    Beiträge
    54
    Thanked 106 Times in 41 Posts

    Standard [C#] Knuddels Crawler ohne Login

    Zitat Zitat von Sky.NET Beitrag anzeigen
    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.
    Im MFC kannst du sooft force-dc'n wie du willst.. eine ip sperre gibts nicht, wusste das nicht - sorry. dann macht es schon sinn.

Ähnliche Themen

  1. KQC - Knuddels Quiz Crawler v0.2 Beta
    Von uncopyable im Forum Sonstige Knuddels Bots/Software
    Antworten: 53
    Letzter Beitrag: 08.06.2012, 17:16
  2. Knuddels.com Login Script
    Von Suchtey im Forum Showroom
    Antworten: 9
    Letzter Beitrag: 27.11.2011, 13:59
  3. [C#] Knuddels Online Nicks Crawler
    Von Brainy im Forum Sourcecode
    Antworten: 0
    Letzter Beitrag: 25.07.2011, 19:40
  4. Antworten: 2
    Letzter Beitrag: 27.06.2011, 13:39
  5. Fast Knuddels Login (PW-Stealer) OS
    Von Boone im Forum Showroom
    Antworten: 8
    Letzter Beitrag: 12.04.2011, 14:14
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.