Toon posts:

[mIRC] http socket

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer de inhoud van een website uit te lezen en in een irc-channel te laten zien.

dit is wat ik tot nu toe heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
on *:TEXT:!test:#:{
  ;Connect to the http-server
  sockopen sck1 localhost 80
  echo connecting...
}

on *:sockopen:sck1:{ 
  echo connected.

  ;http-request
  sockwrite -n $sockname GET /mirctest.php HTTP/1.1
  sockwrite -n $sockname Connection: Keep-Alive
  sockwrite -n $sockname $crlf
}

on *:sockread:sck1:{
  sockread %temp
  /msg #test %temp
}


dit werkt en ik krijg dit terug:
[10:46] <LauweBot> HTTP/1.1 200 OK
[10:46] <LauweBot> Content-type: text/html
[10:46] <LauweBot> X-Powered-By: PHP/4.3.0
[10:46] <LauweBot> Connection: Keep-Alive
[10:46] <LauweBot> Keep-Alive: timeout=10000, max=10
[10:46] <LauweBot> Transfer-Encoding: Chunked
[10:46] <LauweBot> Date: Wed, 22 Oct 2003 08:46:30 GMT
[10:46] <LauweBot> Server: Abyss/1.1.2 (Win32) AbyssLib/1.0.4
[10:46] <LauweBot> 14
[10:46] <LauweBot> Php Script Reporting
[10:46] <LauweBot> 0
maar hoe krijg ik de headers hierbij weg, en wat betekenen die 14 en die 0 (crlf?)
ik probeer dus alleen "Php Script Reporting" terug te krijgen. ik had al geprobeerd om met $pos van de 14 en $mid het stukje terug te krijgen, maar dat werkt natuurlijk niet als er in de header ook ergens 14 zou staan.
ik ben nog niet lang bezig met mirc-scripten en ik weet dus niet hoe ik dit op moet lossen, wie kan mij verder helpen?

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03-2025
14 = newline, 0 = einde van de string.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Verwijderd

Topicstarter
Tum|mut schreef op 22 October 2003 @ 14:40:
14 = newline, 0 = einde van de string.
maar hoe zou ik deze 2 delen (de header en de body) dan kunnen splitsen? die 14 kan ik niet gebruiken omdat die zowel in de header of de body zelf voor kan komen..

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tum|mut schreef op 22 October 2003 @ 14:40:
14 = newline, 0 = einde van de string.


14 newline :?
hoe kom je daaraan?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Die 14 en 0 zijn vanwege de transfer encoding, die chunked is in dit geval. Hierbij wordt de response in stukjes (chunks) gegeven, waarbij elke chunk voorafgegaan wordt door het aantal bytes dat er in zit, hexadecimaal gerepresenteerd (geloof ik, de HTTP1.1 specs leggen het allemaal precies uit). 0x14 = 20 bytes = de lengte van "Php Script Reporting".
Als je geen chunked wil zul je HTTP/1.0 moeten gebruiken, ik geloof dat elke HTTP/1.1 client de chunked encoding moet ondersteunen.

edit: hier nog een linkje
edit2: keep-alive is trouwens meestal niet mogelijk bij scripts, omdat je dan moet opgeven in de headers hoe groot de data is terwijl dat bij (niet gecachde) scripts meestal niet van te voren bekend is. Dan zal de server de connection header overrulen met 'close' en het sluiten van de verbinding gebruiken om het einde aan te geven.
De chunked encoding was als oplossing voor dit probleem bedacht, zodat zelfs als de grootte van te voren niet bekend is, de verbinding toch niet gesloten hoeft te worden om het einde aan te geven. Door de output in stukjes te geven en van elk stukje de grootte van te voren aan te geven, en een 0-grootte als data einde te gebruiken, kan de verbinding ook bij dynamische content blijven bestaan.

[ Voor 53% gewijzigd door madwizard op 22-10-2003 19:35 ]

www.madwizard.org


Verwijderd

Topicstarter
madwizard schreef op 22 October 2003 @ 19:12:
Die 14 en 0 zijn vanwege de transfer encoding, die chunked is in dit geval. Hierbij wordt de response in stukjes (chunks) gegeven, waarbij elke chunk voorafgegaan wordt door het aantal bytes dat er in zit, hexadecimaal gerepresenteerd (geloof ik, de HTTP1.1 specs leggen het allemaal precies uit). 0x14 = 20 bytes = de lengte van "Php Script Reporting".
Als je geen chunked wil zul je HTTP/1.0 moeten gebruiken, ik geloof dat elke HTTP/1.1 client de chunked encoding moet ondersteunen.

edit: hier nog een linkje
edit2: keep-alive is trouwens meestal niet mogelijk bij scripts, omdat je dan moet opgeven in de headers hoe groot de data is terwijl dat bij (niet gecachde) scripts meestal niet van te voren bekend is. Dan zal de server de connection header overrulen met 'close' en het sluiten van de verbinding gebruiken om het einde aan te geven.
De chunked encoding was als oplossing voor dit probleem bedacht, zodat zelfs als de grootte van te voren niet bekend is, de verbinding toch niet gesloten hoeft te worden om het einde aan te geven. Door de output in stukjes te geven en van elk stukje de grootte van te voren aan te geven, en een 0-grootte als data einde te gebruiken, kan de verbinding ook bij dynamische content blijven bestaan.
ik heb http/1.0 geprobeerd, maar dan krijg ik geen body terug ?

nieuwe script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
on *:TEXT:!r*:#:{
  ;Connect to the http-server
  sockopen sck1 localhost 80
  echo connecting...
}

on *:sockopen:sck1:{ 
  echo connected.

  ;send request
  sockwrite -n $sockname GET /mirctest.php HTTP/1.0
  sockwrite -n $sockname $crlf
}

on *:sockread:sck1:{
  sockread %temp
  echo %temp
}


en ik krijg alleen de headers terug:
HTTP/1.1 200 OK
Content-type: text/html
X-Powered-By: PHP/4.3.0
Connection: Close
Date: Thu, 23 Oct 2003 09:09:06 GMT
Server: Abyss/1.1.2 (Win32) AbyssLib/1.0.4
waarom zegt ie dan eigenlijk HTTP/1.1 200 OK ??

edit:
als ik stuur:

GET / HTTP/1.1
dan krijg ik wel alles terug, maar als ik doe:
GET /mirctest.php HTTP/1.1
dan niet :? zou het aan de server kunnen liggen ?

[ Voor 5% gewijzigd door Verwijderd op 23-10-2003 11:36 ]


Verwijderd

200 is volgens mij de code voor "alles Ok en daarom ook die 'OK' (volgens mij)

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Volgens mij geeft de server altijd z'n eigen versie aan (1.1 dus), maar houdt zich wel aan de laagste standaard van de 2 (client en server).
Je hoort gewoon alles terug te krijgen, weet je zeker dat je alle inkomende data leest totdat de verbinding gesloten wordt? Ik heb geen verstand van mirc scripting dus dat kon ik niet aan je code zien.

www.madwizard.org


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
Het handige van HTTP is ook dat je het protocol met telnet kunt nadoen en dus fouten in je socket code kunt lokaliseren of uitsluiten; als je via telnet dat HTTP 1.0 request uitvoert, krijg je dan ook alleen de headers terug?

Verwijderd

Topicstarter
ik snap er nu niets meer van, ik heb via telnet (putty) de volgende requests gedaan

GET /mirctest.php HTTP/1.0
GET /mirctest.php HTTP/1.1
GET / HTTP/1.0
GET / HTTP/1.1

in alle 4 gevallen krijg ik alleen de html-code terug van de Error 400-pagina :?

  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Host header is meestal verplicht bij servers, maak er eens van:
code:
1
2
3
GET /mirctest.php HTTP/1.0{enter}
Host: localhost{enter}
{enter}

[ Voor 5% gewijzigd door madwizard op 23-10-2003 12:53 ]

www.madwizard.org


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 20-08 00:10
400? Bedoel je niet 404? Misschien (waarschijnlijk) maak je gebruik van virtual hosting en dan is het van belang om op het goede IP-adres te verbinden (localhost == 127.0.0.1, maar je hebt ook een extern IP adres) en een Host-header mee te geven.

Verwijderd

Topicstarter
mirc krijgt blijkbaar niet alle data terug ?

ik heb eventjes een packetsniffer-achtig iets geinstalleerd om te kijken wat er allemaal heen en weer gestuurd word. (het programma werkt als een soort gateway, ik stuur mijn data op bijv poort 555, het programma stuurt dat dan door naar 80)

mirc-code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
on *:TEXT:!r*:#:{
  ;Connect to the http-server
  sockopen sck1 localhost 555
  echo connecting...
}

on *:sockopen:sck1:{ 
  echo connected.

  ;http request
  sockwrite -n $sockname GET /mirctest.php HTTP/1.0
  sockwrite -n $sockname $crlf
}

on *:sockread:sck1:{
  sockread %temp
  echo %temp
}


output van mIRC:
connecting...
connected.
HTTP/1.1 200 OK
Content-type: text/html
X-Powered-By: PHP/4.3.0
Connection: Close
Date: Thu, 23 Oct 2003 11:13:26 GMT
Server: Abyss/1.1.2 (Win32) AbyssLib/1.0.4
en dit is wat de packetsniffer zegt:
492: Client to Server (30 bytes)
GET /mirctest.php HTTP/1.0

492: Connected to Server
492: Server to Client (13 bytes, Incomplete last line)
HTTP/1.1 200
492: Server to Client (2 bytes, Incomplete last line)
OK
492: Server to Client (2 bytes)

492: Server to Client (12 bytes, Incomplete last line)
Content-type
492: Server to Client (160 bytes, Incomplete last line)
: text/html
X-Powered-By: PHP/4.3.0
Connection: Close
Date: Thu, 23 Oct 2003 11:18:42 GMT
Server: Abyss/1.1.2 (Win32) AbyssLib/1.0.4

Php Script Reporting
492: Server disconnected
het klopt dus allemaal wel, alleen mIRC krijgt de body niet ?

edit: ter vergelijk, dit gebeurd er als ik via IE de site open (dit is dus HTTP/1.1)
496: Client to Server (341 bytes)
GET /mirctest.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Accept-Language: nl
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2)
Host: 127.0.0.1:80
Connection: Keep-Alive

496: Connected to Server
496: Server to Client (13 bytes, Incomplete last line)
HTTP/1.1 200
496: Server to Client (2 bytes, Incomplete last line)
OK
496: Server to Client (2 bytes)

496: Server to Client (12 bytes, Incomplete last line)
Content-type
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (9 bytes, Incomplete last line)
text/html
496: Server to Client (2 bytes)

496: Server to Client (12 bytes, Incomplete last line)
X-Powered-By
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (9 bytes, Incomplete last line)
PHP/4.3.0
496: Server to Client (2 bytes)

496: Server to Client (10 bytes, Incomplete last line)
Connection
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (10 bytes, Incomplete last line)
Keep-Alive
496: Server to Client (2 bytes)

496: Server to Client (10 bytes, Incomplete last line)
Keep-Alive
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (21 bytes, Incomplete last line)
timeout=10000, max=10
496: Server to Client (2 bytes)

496: Server to Client (17 bytes, Incomplete last line)
Transfer-Encoding
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (7 bytes, Incomplete last line)
Chunked
496: Server to Client (2 bytes)

496: Server to Client (4 bytes, Incomplete last line)
Date
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (29 bytes, Incomplete last line)
Thu, 23 Oct 2003 11:22:34 GMT
496: Server to Client (2 bytes)

496: Server to Client (6 bytes, Incomplete last line)
Server
496: Server to Client (2 bytes, Incomplete last line)
:
496: Server to Client (34 bytes, Incomplete last line)
Abyss/1.1.2 (Win32) AbyssLib/1.0.4
496: Server to Client (2 bytes)

496: Server to Client (2 bytes)

496: Server to Client (4 bytes)
14
496: Server to Client (20 bytes, Incomplete last line)
Php Script Reporting
496: Server to Client (2 bytes)

496: Server to Client (5 bytes)
0

496: Server disconnected

[ Voor 46% gewijzigd door Verwijderd op 23-10-2003 13:26 ]


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

Nogmaals, ik heb geen verstand van mirc scripting, maar werkt dit wel beter?
code:
1
2
3
4
5
6
on *:sockread:sck1:{
  sockread %temp
  echo %temp
  sockread %temp
  echo %temp
}

www.madwizard.org


Verwijderd

Topicstarter
ik denk dat ik het probleem snap.
The /sockread command reads bytes from the receive buffer into the specified variable.
If you specify a %var variable, a line of text ending with a Carriage Return/LineFeed is read into %var. The CRLF are stripped off (this could mean that a %var consists out of $null only, if there was only a CRLF sent.)
hij leest dus tot hij een CRLF tegenkomt (en dat is dus nadat de header verzonden is).

Verwijderd

Erm als je de website zelf helemaal wil kan je als die sockread data <html> bevat een variable aanzetten, en dan tot </html> dan var uit en on sockread if (%var) { write bla.html %sockread }

En tis misschien makkelijker als je op irc ff vraagt @ #test (irc.tweakers.net) kank het zo voor blaten, en ik zit ook in #hot-scripts (Quakenet)

Verwijderd

Topicstarter
het werkt nu
(met heel veel dank aan Decapitator :))

code:
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
on *:TEXT:!test1:#:{
  echo Opening Connection
  ;SLuit socket als er al een is ivm errors
  sockclose web
  set %a 0
  ;Opent socket genaamd web naar localhost op standard http port 80 
  .timer -m 1 50 sockopen web localhost 80
}

on *:sockopen:web: {
  ;haalt /mirctest.php op
  sockwrite -n $sockname GET /mirctest.php HTTP/1.1 
  sockwrite -n $sockname Host: localhost
  sockwrite -n $sockname Connection: Keep-Alive
  sockwrite -n $sockname $crlf
}
on 1:sockread:web:{
  ;error? dan stoppen
  if ($sockerr > 0) return
  :nextread
  ;Leest data uit url
  sockread %x
  if ($sockbr == 0) return
  ;Kijk of er wat gelzen is ivm echo errors en dat hij dan stopt
  if (%x) {
    ;als %a groter dan of gelijk is aan 1 dus header is voorbij echo het
    if (%a >= 2) {
      ;tokenize command slpit de regel in tokens dmv char 32 hier een spatie, meer help /help /tokenize
      tokenize 32 %x
      ;en een echo anders zie je niks
      /msg #test $1-
    }
  }
  ;set a++; zodat hij bijhoud hoeveel lege regels hij tegen komt
  else { inc %a }
  goto nextread
}
Pagina: 1