• Hey AutoIt Community,
    heute bin ich endlich mit meinem Projekt in die Alphaphase (alle wesentlichen Funktionen) aufgebrochen.
    Im Forum gibt es genug UDFs für Chats über TCP, jedoch haben die wenigsten einen 24/7 TCP Server gemietet / irgendwo zu stehen, geschweige denn Lust ihren PC 24/7 laufen zu lassen, oder bekommen es nicht hin die Ports zu öffnen.
    Da ich aktuell PHP lerne tat sich mir die Idee auf, einen Chat zu schreiben, den man über alles ansteuern kann.
    Das System ist einfach:
    Nutzer mit Name & PW erstellen (SQL Datenbank wird benötigt).
    Einloggen mit PW & Name - Token wird an Clienten gegeben, im Chat erscheint die Nachricht dass XYZ angekommen ist, Token wird erstellt und Online Status auf 1 gesetzt.
    Senden der Nachricht: Name & Token mitsenden. Bei Erfolg kommt 1 zurück, Fehler gibt -1 aus.
    Empfangen: Kann man von überall auch ohne Account usw (wird später noch mit Token-System geändert)
    Zum ausloggen: Name & Token -> Im Chat erscheint die Nachricht dass XYZ raus gegangen ist, Online Status wird auf 0 gesetzt und Token verfällt.

    Vorraussetzungen:
    - 1 MySQL Datenbank
    - Eine Tabelle in der Datenbank "Accounts" (später noch änderbar, jetzt aktuell auch aber umständlich), einfach mit folgender SQL_Query erstellen: CREATE TABLE Accounts(Name TEXT, Password TEXT, OnlineStatus INT, Token TEXT)
    - Einen Hoster mit Datenbank, reicht ein Freehoster, meine Empfehlung: 000webhost.com / php-friends.de , wobei ich php-friends vorziehe.

    So, nach der Rede um den heißen Brei noch kurz ein paar Einblicke und eine kurze Übersicht in die Funktionen:

    [autoit]


    $PHPChat_ServerURL = ""; Die URL zum server mit chat.php unter folgendem Format: http://server.endung/.../chat.php?
    $PHPChat_Token = -1; Token wird automatisch bei Connect gesetzt
    $PHPChat_UserName = ""; Wird für SendMessage und Disconnect genutzt

    [/autoit][autoit][/autoit][autoit]

    _PHPChat_Register($Name, $Password); Erstellt einen Benutzer in der Datenbank, sofern Nutzer nicht existiert wird 1 zurückgegeben, andernfalls -1.
    _PHPChat_Connect($Name, $Password); Sofern PW und Nutzer übereinstimmen wird Token zurückgegeben, andernfalls -1. Ebenso -1 wenn Nutzer nicht vorhanden, Nutzer wird auf Server angemeldet.
    _PHPChat_SendMessage($Message); Nachricht wird gesendet.
    _PHPChat_GetChat(); liefert den Chat zurück
    _PHPChat_Disconnect(); Leert den Token und Nutzer wird auf Server abgemeldet

    [/autoit]

    So könnte der Chat aussehen:

    Quellcodes für chat.php und AutoIt SRC

    Spoiler anzeigen
    PHPChat.au3
    [autoit]

    #include <INet.au3>
    Global $PHPChat_ServerURL = "http://server.endung/.../chat.php?"
    Global $PHPChat_Token = -1
    Global $PHPChat_UserName = ""
    Func _PHPChat_Register($User, $Password)
    Return _INetGetSource($PHPChat_ServerURL & "Action=Register&User=" & $User & "&Password=" & $Password)
    EndFunc ;==>_PHPChat_Register
    Func _PHPChat_Connect($User, $Password)
    $PHPChat_Token = _INetGetSource($PHPChat_ServerURL & "Action=Connect&User=" & $User & "&Password=" & $Password)
    $PHPChat_UserName = $User
    Return $PHPChat_Token
    EndFunc ;==>_PHPChat_Connect
    Func _PHPChat_Disconnect()
    Return _InetGetSource($PHPChat_ServerURL & "Action=Disconnect&User=" & $PHPChat_UserName & "&Token=" & $PHPChat_Token)
    EndFunc ;==>_PHPChat_Disconnect
    Func _PHPChat_SendMessage($Message)
    Return _INetGetSource($PHPChat_ServerURL & "Action=SendMessage&Message=" & $Message & "&Token=" & $PHPChat_Token & "&User=" & $PHPChat_UserName)
    EndFunc ;==>_PHPChat_SendMessage
    Func _PHPChat_GetChat()
    Return _INetGetSource($PHPChat_ServerURL & "Action=GetMessage")
    EndFunc ;==>_PHPChat_GetChat

    [/autoit]
    chat.php

    Vielleicht nützt es ja dem ein oder anderen etwas - Würde mich auf jedenfall freuen :)
    Als Test-Chat habe ich es auf meinem FTP laufen: http://xorianator.pf-control.de/PHP_Chat_AutoIt/chat.php
    €: Diesen Link müsst ihr über die UDF aufrufen, oder manuell alles eintippen, Client folgt nachher.
    Um zu testen ob alles läuft folgendes kleines Script:

    [autoit]

    MsgBox(0, "PHP Chat Debugger", _
    "Register: " & _PHPChat_Register("Xorianator", "TEST") &@CRLF& _
    "Connect: " & _PHPChat_Connect("Xorianator", "TEST") &@CRLF& _
    "SendMessage: " & _PHPChat_SendMessage("AsdfMovie :D") &@CRLF& _
    "Disconnect: " & _PHPChat_Disconnect())

    [/autoit]

    Mit freundlichen Grüßen - Xorianator

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

    Einmal editiert, zuletzt von Xorianator (7. Juli 2012 um 14:00)

  • Hi,

    Schöne Idee :), nur am PHP-Quellcode würde Ich noch feilen:

    • Schadcode in Variablen via mysql_real_escape_string schützen
    • Überlegen, welche Variable welche Werte annehmen kann (Integer, String) und nur Werte dieser Typen annehmen
    • Eine config.php anlegen und die vom User einstellbaren Werte dort reinschieben, damit auch Leute ohne PHP-Kenntnisse nicht vom Quellcode erschlagen werden
    • Eventuell ein kleines Administrations-Panel, wo man die config.php online via. Formular bearbeiten kann.
    • Auch eventuell die Funktionen die du programmiert hast, in eine Klasse packen (dies hat den Vorteil wenn du neue Funktionen brauchst, wechsle einfach die Klasse aus und die neuen Funktionen sind da) (OOP-Struktur)

    Ich denke das sollte erstmal reichen
    mfg :)

  • Hey Blume, danke für die Antwort von dir als PHP-Kenner :)
    Die Funktion mysql_real_escape_string wird nützlich sein und ich werde sie direkt einbauen.
    Mit den Variablen welchen Wert - Ich denke man kann nur Text-Variablen setzen (als Client), von daher sehe ich da (im Augenblick) keine Relevanz.
    Die Config.PHP & ein Formular werde ich sicherlich umsetzen, das scheint mir tatsächlich sinnig zu sein :)
    Mit OOP in PHP hab ich mich noch nicht auseinandergesetzt *grins*, dass erscheint mir aber auch sinnig und ich werde es selbstverständlich in einer der nächsten Versionen releasen.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Mach es einfach über PDO (http://www.php.net/manual/de/intro.pdo.php) und du brauchst dir keine Gedanken um escapen usw. machen. mysql_connect ist eh veraltet und wird wohl bald in einer zukünftigen Version von PHP komplett verschwinden. Sprich dein PHP-Script ins nur sehr eingeschränkt in der Zukunft nutzbar.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Mach es einfach über PDO (http://www.php.net/manual/de/intro.pdo.php) und du brauchst dir keine Gedanken um escapen usw. machen.


    Das ist so nicht ganz korrekt. Wenn man UTF-8 verwenden will, sollte man nicht SET NAMES verwenden, denn das könnte zu Sicherheitslücken führen. Man sollte im Verbindungstring ;charset=utf8 anhängen (geht aber erst ab php 5.3.6)

    mysql_connect ist eh veraltet und wird wohl bald in einer zukünftigen Version von PHP komplett verschwinden. Sprich dein PHP-Script ins nur sehr eingeschränkt in der Zukunft nutzbar.


    Die mysql-Funktionen sind veraltet, aber mysqli nicht. Dieses bietet eine sehr ähnliche Schnittstelle an, die sowohl wie mysql als auch über Pseudo-Objekte verwendet werden kann.

    Einmal editiert, zuletzt von progandy (7. Juli 2012 um 17:43)

  • Sind alle Funktionen der mysqli exakt zur mysql Funktion ?
    Dann tipp ich einfach i darein und feddisch :D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Sind alle Funktionen der mysqli exakt zur mysql Funktion ?
    Dann tipp ich einfach i darein und feddisch :D


    Nein, da MySQLi eine OOP-Klasse ist und die Funktionen die du derzeit nutzt, prozeduale Funktionen sind.
    MySQLi wird zum Beispiel so benutzt:

    PHP
    $MySQLi = new MySQLi("server", "username", "password", "database");
    if ($MySQLi->connect_errno) {
        echo "Fehler bei der Verbindung zum MySQL-Server: (" . $MySQLi->connect_errno . ") " . $MySQLi->connect_error;
    }
    
    
    $Result = $MySQLi->query("SELECT * FROM Tabelle WHERE Spalte = 'Wert'"); // Non prepared Query
    var_dump($Result->fetch_all()); // Rückgabe-Werte dumpen


    Mal ebend dreißt aus der PHP-Manual (MySQLi) zitiert.


  • Das ist so nicht ganz korrekt. Wenn man UTF-8 verwenden will, sollte man nicht SET NAMES verwenden, denn das könnte zu Sicherheitslücken führen. Man sollte im Verbindungstring ;charset=utf8 anhängen (geht aber erst ab php 5.3.6)

    Das machen uns sich freuen ;):

    PHP
    $pdo = new PDO(
        'mysql:host=mysql.example.com;dbname=example_db',
        "username",
        "password",
        array(PDO::MYSQL\_ATTR\_INIT\_COMMAND => "SET NAMES utf8"));

    Es gibt keinen nenneswerten Vorteil von mysqli gegenüber PDO, umgekehrt schon ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich mag die Idee auch sehr.

    Cheater Dieter die autoit.de-Shoutbox kann man ja auch als Gast sehen...

    @Matthias Allerdings würde ich am Anfang vom Skript noch folgenden Header senden (dann werden die Daten auch im Browser gut angezeigt):

    Code
    Content-Type: text/plain

    MfG, James

  • Ja hatte ich auch noch vor @Dieter, dann müsste man aber .HTACCESS Files setzen und ach naja - Ich schau mal ;D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Doch müsste man weil sonst jeder das .txt lesen kann ;)
    Dass mit dem Token is mir klar ;D

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal