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
_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
So könnte der Chat aussehen:
ZitatAlles anzeigen
*** Xorianator joined the Server
[06.07.2012|01:33:07]Xorianator: PHP Chat Test
[06.07.2012|01:34:30]Xorianator: Cool es geht
[06.07.2012|01:34:32]Xorianator: asdfmovie
[06.07.2012|01:34:33]Xorianator: asdfmovie
[06.07.2012|01:34:34]Xorianator: asdfmovie
*** Xorianator disconnected from the Server.
Quellcodes für chat.php und AutoIt SRC
Spoiler anzeigen
PHPChat.au3
#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
chat.php
<?php
function CryptPassword($Password){
return hash("sha256", $Password . "_UndSicherheitsToken");
}
function FileRead($Filename, $Type){
$fHandle = fopen($Filename, "r");
$fText = fread($fHandle, filesize($Filename));
fclose($fHandle);
if ($Type == 1){
return nl2br($fText);
}
else if ($Type == 2){
return $fText;
}
}
function FileWrite($Filename, $Text, $Type){
if ($Type == 1){
$fHandle = fopen($Filename, "a");
fwrite($fHandle, "\n" . $Text);
fclose($fHandle);
return "1";
}
else if ($Type == 2){
$fHandle = fopen($Filename, "w");
fwrite($fHandle, $Text);
fclose($fHandle);
return "1";
}
}
function DirCreate($DirPath){
mkdir($DirPath);
}
function PHPChat_CheckUserExist($Username){
$Counter = 0;
$UserCheck = mysql_query("SELECT * FROM Accounts WHERE Name= '" . $Username . "'");
while ($Check = mysql_fetch_array($UserCheck)){
$Counter = $Counter + 1;
}
return $Counter;
}
function PHPChat_CheckPassword($Username, $Password){
$Counter = 0;
$PassCheck = mysql_query("SELECT * FROM Accounts WHERE Name='" . $Username . "' AND Password = '" . CryptPassword($Password) . "'");
while ($Check = mysql_fetch_array($PassCheck)){
$Counter = $Counter + 1;
}
return $Counter;
}
function PHPChat_GetOnlineList(){
}
function PHPChat_CreateToken($User, $Pass){
$TokenTemp = "";
$randToken = rand(1000000, 9999999);
$TokenTemp = $TokenTemp . hash("sha256", $randToken);
$randToken = rand(8, 64);
$TokenTamp = $TokenTemp . hash("sha256", $User . $randToken . $Password);
return $TokenTamp;
}
function PHPChat_CheckToken($Username, $Token){
$Counter = 0;
$TokenCheck = mysql_query("SELECT * FROM Accounts WHERE Name='" . $Username . "' AND Token='" . $Token . "'");
while ($Check = mysql_fetch_array($TokenCheck)){
$Counter = $Counter + 1;
}
return $Counter;
}
?>
<?php
Global $PHPChat_DatabaseServer;
$PHPChat_DatabaseServer = "localhost";
Global $PHPChat_DatabaseName;
$PHPChat_DatabaseName = "*";
Global $PHPChat_DatabaseUser;
$PHPChat_DatabaseUser = "*";
Global $PHPChat_DatabasePassword;
$PHPChat_DatabasePassword = "*";
mysql_connect($PHPChat_DatabaseServer, $PHPChat_DatabaseUser, $PHPChat_DatabasePassword) or die(mysql_error());
mysql_select_db($PHPChat_DatabaseName);
switch ($_GET["Action"]){
case "Register":
if (PHPChat_CheckUserExist($_GET["User"]) == 0){
mysql_query("INSERT INTO Accounts(Name, Password, OnlineStatus, Token) VALUES('" . $_GET["User"] . "', '" . CryptPassword($_GET["Password"]) . "', 0, '')");
echo "1";
}
else{echo "-1";}
break;
case "Connect":
if (PHPChat_CheckPassword($_GET["User"], $_GET["Password"]) == 1){
FileWrite("ChatVerlauf.txt", "*** ". $_GET["User"] . " joined the Server", 1);
$PHPChat_Token = PHPChat_CreateToken($_GET["User"], $_GET["Password"]);
echo $PHPChat_Token;
mysql_query("UPDATE Accounts SET OnlineStatus=1 , Token = '" . $PHPChat_Token . "' WHERE Name = '" . $_GET["User"] . "'");
}
break;
case "Disconnect":
if (PHPChat_CheckToken($_GET["User"], $_GET["Token"]) == 1){
mysql_query("UPDATE Accounts SET OnlineStatus=0 , Token='' WHERE Name = '" . $_GET["User"] . "'");
FileWrite("ChatVerlauf.txt", "*** ". $_GET["User"] . " disconnected from the Server.", 1);
echo "1";
}
else {echo "-1";}
break;
case "SendMessage":
if ((strlen($_GET["Message"]) <= 250) and (PHPChat_CheckToken($_GET["User"], $_GET["Token"]) == 1)){
FileWrite("ChatVerlauf.txt",
"[" . date('d') . "." . date('m') . "." . date('o') . "|" . date('H') . ":" . date('i') . ":" . date('s') . "]" . $_GET["User"] . ": " . $_GET["Message"], 1);
echo "1";
}
else{echo "-1";}
break;
case "GetMessage":
echo FileRead("ChatVerlauf.txt", 2);
break;
}
?>
Alles anzeigen
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:
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())
Mit freundlichen Grüßen - Xorianator