MSN-bot in PHP
Een tijdje geleden dacht ik erover een MSN bot te maken. Nou, daar ben ik vandaag aan begonnen, alleen snap ik niet helemaal precies welke commando's je nou naar de server moet sturen en hoe je moet inloggen. Ik hoopte dat jullie mij konden helpen...
Hier is overigens de 'code' waarmee ik contact mee maak (probeer te maken).
Code (php)
1
2
3
4
2
3
4
<?php
// Maak contact met de server:
fsockopen($this->_msnserver, $this->_msnpoort, $errno=0, $errstr='', 60);
?>
// Maak contact met de server:
fsockopen($this->_msnserver, $this->_msnpoort, $errno=0, $errstr='', 60);
?>
Volg de link van je code (klik dus op fsockopen) en je ziet een voorbeeld
Ja, maar dat is niet wat ik zoek... Ik moet bepaalde commando's versturen, die ik inmiddels half weet, maar ik weet alleen niet met welke functie...
In het voorbeeld op php.net werken ze met fwrite()
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
class msn_bot {
var $_msnserver = 'messenger.hotmail.com';
var $_msnpoort = 1863;
function msn_bot() {
$this->msn_connect();
}
function msn_connect($username, $password) {
// Maak contact met de server:
fsockopen($this->_msnserver, $this->_msnpoort, $errno=0, $errstr='', 60);
}
function msn_login() {
// Verstuur autentificatie
}
function send_command($commando) {
}
}
?>
class msn_bot {
var $_msnserver = 'messenger.hotmail.com';
var $_msnpoort = 1863;
function msn_bot() {
$this->msn_connect();
}
function msn_connect($username, $password) {
// Maak contact met de server:
fsockopen($this->_msnserver, $this->_msnpoort, $errno=0, $errstr='', 60);
}
function msn_login() {
// Verstuur autentificatie
}
function send_command($commando) {
}
}
?>
Ethereal. Echt een heerlijk programma. Even doorhebben hoe het werkt, maar je hebt wel precies door wat er allemaal gebeurt en hoe het wordt verzonden.
fsockopen() geeft een resource handle terug, die weer kan worden gebruikt door fgets(), fwrite(), fputs(), fclose() enzovoord. Daarmee kan je dus de berichten naar de server sturen. Met fgets() kan je je antwoorden binnenhalen. met feof() kan je het einde aan zien komen, ik weet niet of dat hier van toepassing is. Ik denk het niet.
Maar weet waar je aan begint. MSN(v8?) is niet bepaald een goed gedocumenteerd protocol. Ik zal even kijken of ik er nog een goede bron voor kan vinden.
edit: Gaim(.sf.net) wordt veel gebruikt in programma's om verbinding te maken via MSN. Enige probleem is dat Gaim niet al te best gedocumenteerd is, iig hun protocolbeschrijvingen niet. Misschien dat je nog wat uit hun broncode kan pluizen. deze website verwezen zij naar.
Commandoos achterhalen kan mooi met fsockopen() geeft een resource handle terug, die weer kan worden gebruikt door fgets(), fwrite(), fputs(), fclose() enzovoord. Daarmee kan je dus de berichten naar de server sturen. Met fgets() kan je je antwoorden binnenhalen. met feof() kan je het einde aan zien komen, ik weet niet of dat hier van toepassing is. Ik denk het niet.
Maar weet waar je aan begint. MSN(v8?) is niet bepaald een goed gedocumenteerd protocol. Ik zal even kijken of ik er nog een goede bron voor kan vinden.
edit: Gaim(.sf.net) wordt veel gebruikt in programma's om verbinding te maken via MSN. Enige probleem is dat Gaim niet al te best gedocumenteerd is, iig hun protocolbeschrijvingen niet. Misschien dat je nog wat uit hun broncode kan pluizen. deze website verwezen zij naar.
Gewijzigd op 08/03/2006 19:08:00 door Jelmer -
@Webmakerij: Ik heb even snel gekeken, maar de class die ik bekeken heb, heeft een Chinese documentatie :s
Zoek op MSNP8 (weet niet of dat het meest recente is, wellicht MSNP9?) en dan komt het protocol naar boven met commando's.
Ik kon me inderdaad herinneren dat ze een tijdje terug al bij MSNP12 waren, maar dat was voor mobiele telefoons of iets dergelijks. In ieder geval een ander protocol dan de anderen.
Hoe kan ik die commands vanaf de MSN-server uitlezen; wat voor parameter(s) moet ik meegeven?
En daarnaast is het niet makkelijk om zo'n bot te maken; ik raad je aan eerst meer met sockets te doen, voordat je aan de slag gaat met MSNPxx.
Begin bijvoorbeeld met een IRC botje, die zijn relatief simpel in vergelijking met een MSN bot.
Misschien gaat het allemaal wel wat te snel, ik begin eerst wel met een IRC-bot... Alleen, waar kan je een IRC-kanaal openen, zodat ik mijn bot kan testen?
tada...
Kan dat ook gewoon via Chatzilla (firefox extensie?)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
class irc {
var $_botnaam = 'Jip-bot';
var $_host = 'http://www.babaluji.nl/';
var $_irchost = 'irc://irc.chat4all.com';
var $_poort = '80';
var $_kanaal = '#jipchannel';
var $_verbinding;
var $_data;
function irc() {
// Contact maken met IRC-server:
$this->connect();
$this->ping();
}
function connect() {
// Verbinding met IRC-server openen:
if ($this->_verbinding = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) == false)
die('De verbinding (socket) kon niet gemaakt worden');
// De IRC-verbinding een naam geven:
if (socket_bind($this->_verbinding, $this->_host) == false)
die('De verbinding (socket) kon niet gekoppeld worden aan' .$this->_host);
// Uiteindelijke verbinding maken:
if (socket_connect($this->_verbinding, $this->_irchost, $this->_poort) == false)
die('Het is niet mogelijk om een verbinding (socket) met ' .$this->_irchost. ' te maken');
}
function write($data) {
// Data wegschrijven:
socket_write($this->_verbinding, $data);
}
function ping() {
$kanaal = 0; // 0 = geen kanaal
// 1 = wel kanaal
while ($data = socket_read($this->_verbinding, 65000, PHP_NORMAL_READ)) {
// Zoek regeleinde: (?)
if ($data == "\n")
continue;
// Binnengekregen data opsplitsen:
$_this->data = explode(' ', $data);
// Whitespaces aan begin en einde verwijderen:
for ($i = 0; isset($edata[$i]); $i++)
$edata[$i] = trim($edata[$i]);
// Controleren of bot al in een channel zit:
if ($kanaal == 0) {
$this->write('/join ' .$this->_kanaal);
$channel = 1;
}
// Controleren of er een ping is ontvangen:
if ($edata[0] == 'PING')
$this->_write('PONG ' .$edata[1]);
}
}
}
?>
class irc {
var $_botnaam = 'Jip-bot';
var $_host = 'http://www.babaluji.nl/';
var $_irchost = 'irc://irc.chat4all.com';
var $_poort = '80';
var $_kanaal = '#jipchannel';
var $_verbinding;
var $_data;
function irc() {
// Contact maken met IRC-server:
$this->connect();
$this->ping();
}
function connect() {
// Verbinding met IRC-server openen:
if ($this->_verbinding = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) == false)
die('De verbinding (socket) kon niet gemaakt worden');
// De IRC-verbinding een naam geven:
if (socket_bind($this->_verbinding, $this->_host) == false)
die('De verbinding (socket) kon niet gekoppeld worden aan' .$this->_host);
// Uiteindelijke verbinding maken:
if (socket_connect($this->_verbinding, $this->_irchost, $this->_poort) == false)
die('Het is niet mogelijk om een verbinding (socket) met ' .$this->_irchost. ' te maken');
}
function write($data) {
// Data wegschrijven:
socket_write($this->_verbinding, $data);
}
function ping() {
$kanaal = 0; // 0 = geen kanaal
// 1 = wel kanaal
while ($data = socket_read($this->_verbinding, 65000, PHP_NORMAL_READ)) {
// Zoek regeleinde: (?)
if ($data == "\n")
continue;
// Binnengekregen data opsplitsen:
$_this->data = explode(' ', $data);
// Whitespaces aan begin en einde verwijderen:
for ($i = 0; isset($edata[$i]); $i++)
$edata[$i] = trim($edata[$i]);
// Controleren of bot al in een channel zit:
if ($kanaal == 0) {
$this->write('/join ' .$this->_kanaal);
$channel = 1;
}
// Controleren of er een ping is ontvangen:
if ($edata[0] == 'PING')
$this->_write('PONG ' .$edata[1]);
}
}
}
?>
Gewijzigd op 09/03/2006 20:06:00 door Eric Cartman
Dan isie al bezig ;)
Je ziet niks in die PHP pagina, maar wel in IRC ;)
Daarnaast moet je continu controleren of de server jou PING't, zodat jij kan antwoorden met PONG. Ik denk dat je dat nu maar één keer doet, waardoor je de verbinding zal verliezen.
En ik krijg een foutmelding van socket_bind, maar ik kan zo gauw niet zien waar de fout zit.
Mmm, ik krijg geen foutmelding voor socket_bind...