| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

18-08-2009, 21:29
|
|
pascal007
Registrierter Benutzer
|
|
Registriert seit: Jul 2006
Beiträge: 255
|
|
msnp9.class.php: Nachricht versenden
Hallo ihr PHP-Gurus
Ich habe mich mal ein bisschen umgeschaut, wie man wohl MSN über ein PHP-Script verwenden kann und bin auf die zwei Klassen hier gestossen: PHP MSN Messenger Class : flumpCakes
Da ist auch ein sample dabei, allerdings beinhaltet dies nur das einloggen (msnp9.class.php). Für das senden der Message braucht mann dann die andere Klasse (msn_sb.class.php).
Ich habe jedoch keine Ahnung, wie ich nun eine Nachricht senden kann, da ich irgendwie noch die Daten der anderen Klasse brauch, nur welche?
Ich kann OO und auch PHP, aber mit den klassen komme ich nicht zurecht.
Kann vielleicht jemand ein ganz kleines Beispiel machen, wie man da erfolgreich eine Nachricht senden kann  ?
Das wäre super  !
sample.php (Verbindung aufbauen, funktioniert)
PHP-Code:
<?php error_reporting(E_ALL); ob_implicit_flush(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>MSN Protocol 9 Class Example Usage</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"></script> <style type="text/css" media="screen" title="default"> body { font: 76%/1.4 tahoma, verdana, arial, helvetica, sans-serif; } .r { color: red; } .g { color: green; } </style> </head> <body>
<?php
require_once('msnp9.class.php'); require_once('msn_sb.class.php');
$msn = new msn;
if ($msn->connect('mail', 'xxx')) { // we're connected // run rx_data function to 'idle' on the network // rx_state will loop until the connection is dropped
$msn->rx_data();
echo '<p>Connection dropped</p>'; } else { // wrong username and password? echo '<p>Error Connecting to the MSN Network</p>'; } ?> </body> </html>
msn_sb.class.php (hier wird wohl die Methode tx_im() gebraucht... nur wie?)
PHP-Code:
<?php
class switchboard { // font colours/styles var $font_fn = 'Arial'; var $font_co = '333333'; var $font_ef = '';
// other var $debug = 1; var $trID = 1; var $email = '';
function switchboard() { $this->session_start_time = time(); }
/** * * desc : send IM message * * in : $ns = notification server connection * $msg = message to send * $passport = current logged in user * $email = user to send message to * * out : true on success else return false * */
function tx_im($ns, $msg, $passport, $email) { $message = "MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\nX-MMS-IM-Format: FN=$this->font_fn; EF=$this->font_ef; CO=$this->font_co; CS=0; PF=22\r\n\r\n$msg"; $message = "MSG 20 N ".strlen($message)."\r\n$message";
if (@is_resource($this->sb)) { // switchboard session already open $this->_put($message);
return true; } else { // open switchboard session through NS fputs($ns, "XFR $this->trID SB\r\n");
$ns_data = fgets($ns, 4096);
@list($xfr,,, $server,, $as) = explode(' ', $ns_data);
if ($xfr != 'XFR') { echo 'unable to read NS info. last message: '; echo $ns_data;
return false; }
list($server, $port) = explode(':', $server);
if ($this->sb = @fsockopen($server, $port, $errno, $errstr, 5)) { $this->_put("USR $this->trID $passport $as\r\n"); $this->_get();
if (is_array($email)) { foreach($email as $key => $value) { $this->_put("CAL $this->trID $value\r\n");
if (strstr($this->_get(), 'CAL')) { $this->_get(); // should be JOI... } } } else { $this->_put("CAL $this->trID $email\r\n");
if (strstr($this->_get(), 'CAL')) { $this->_get(); // should be JOI... } }
$this->_put($message);
return true; } }
return false; }
/** * * desc : recieve an IM from the switchboard * * in : none * out : a. null on fail/no message * b. message string * */
function rx_im() { $message = null; $msglen = null;
stream_set_timeout($this->sb, 1);
while (!feof($this->sb)) { $data = ($msglen) ? $this->_get($msglen) : $this->_get();
switch (substr($data, 0, 3)) { default: //if (empty($msglen)) continue;
$message.= $data;
if (strlen($message) >= $msglen && !empty($msglen)) { $mesg = explode("\n", trim($message));
$last = end($mesg);
//if (@substr($last, 0, 10) != 'TypingUser') if (!strstr($message, 'TypingUser')) { // this isn't a notification that the user is typing a message return $last; }
$msglen = null; $message = null; }
if ($this->session_start_time + 10 < time()) { // looks like we've been idle for a while echo 'IM timed out'; $this->im_close(); return null; } break; case 'MSG': list(,,, $msglen) = explode (' ', $data); break; case 'BYE': return null; break; } }
return null; }
/** * * desc : authorise with switchboard from an IM invitation * * in : $server = switchboard server ip * $port = switchboard server port * $passport = logged in users passport email * $sID = session id * $as = auth string * * out : true on success else return false * */
function auth($server, $port, $passport, $sID, $as) { if ($this->sb = @fsockopen($server, $port, $errno, $errstr, 5)) { $this->_put("ANS $this->trID $passport $as $sID\r\n");
if (!$this->rx_iro()) return false;
return true; }
return false; }
/** * * desc : recieve IRO commands from IM session * * in : none * out : true on success else return false * */
function rx_iro() { if ($data = $this->_get()) { @list($iro, , $cur_num, $tot, $email, $name) = explode(' ', $data);
$sbsess->email = $email;
if ($iro != 'IRO') { echo "** BAD data in rx_iro(): see line above **\n"; return false; }
// recieve names/list of others connected for ($i=1; $i<$tot; $i++) { if (!$data = $this->_get()) { echo "** BAD data in rx_iro(): see line above **\n"; return false; }
}
@list($ans) = explode(' ', $this->_get());
if ($ans != 'ANS') return false;
return true; }
return false; }
/** * * desc : close switchboard connection * * in : none * out : none * */
function im_close() { $this->_put("OUT\r\n"); @fclose($this->sb); }
[...] }
?>
Geändert von pascal007 (18-08-2009 um 22:24 Uhr)
|

18-08-2009, 22:08
|
Kropff
  Administrator
|
|
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.310
|
|
Habs nur mal kurz überflogen, außerdem ist das uraltes PHP4. Da bin ich schon ein wenig draussen. Die Methode tx_im wird übrigens in der msnp9.class.php initialisiert. Wie sieht es mit deinem error_reporting aus?
Peter
Btw: das solltest du sofort unkenntlich machen, ich tue es nicht mehr
PHP-Code:
if ($msn->connect('xxx', 'xxx'))
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
|

18-08-2009, 22:32
|
|
pascal007
Registrierter Benutzer
|
|
Registriert seit: Jul 2006
Beiträge: 255
|
|
Danke für den Hinweis  Ja das error_reporting spuckt nix aus. Das interesante passiert eben in der msnp9.class.php (hab ich nun herausgefunden):
PHP-Code:
function rx_data() { $this->_put("SYN $this->trID 0\r\n"); $this->_put("CHG $this->trID NLN\r\n");
while (! feof($this->fp)) { $data = $this->_get();
if ($data) { //echo $data.'<br />';
switch($code = substr($data, 0, 3)) { default: // uncommenting this line here would probably give a load of "error code not found" messages. //echo $this->_get_error($code); break; case 'RNG': // someone's trying to talk to us list(, $sid, $server, , $as, $email, $name) = explode(' ', $data); list($sb_ip, $sb_port) = explode(':', $server);
$sbsess = new switchboard;
if ($sbsess->auth($sb_ip, $sb_port, $this->passport, $sid, $as)) { // sb session opened // recieve users message if ($msg = $sbsess->rx_im()) { // send the message straight back! $sbsess->tx_im($this->fp, "KACKEN!", $this->passport, $email);
// close IM sessions $sbsess->im_close(); } else { echo 'No message was received from user.'; } } else { echo 'Unable to authenticate with switchboard.'; } break; } } } }
Hier wird diese Klasse initalisiert und danach wieder geschlossen. Nun diese Methode schickt, sollte jemand schreiben das selbe wieder zrück, wie der Kontakt schreibt (was auch funktioniert  ).
Die Frage ist nur, wie kann ich das nun in ein Formular auslagern, das ich eine Antwort per formualr senden kann, denn:
- das Script darf nicht beendet werden, sonst ist die verbindung futsch
Ich wollte schon was mit AJAX machen, aber da kann ich ja auch nicht das laufende Script aufrufen... auch an SESSIONS habe ich schon gedacht und die wichtigen Daten für auth() und tx_im() in die Session speichern... aber ja... mir würde auch schon ein fertiger Web Messenger für meinen eigenen Webspace reichen, gibts nicht, also muss ich selber ran.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|