mIRC sockets

Tags:    diverse
Skrevet af Bruger #2416 @ 24.04.2003

Indledning


I denne artikel vil vi kikke nærmere på mIRC sockets del. mIRC sockets kan bl.a. bruges til at hente information fra websider, sende mails, hente information fra forskellige spilservere og meget meget mere. Vi vil i denne artikel kikke nærmere på hvordan man henter information fra en webside, til dette skal vi bruge HTTP protokollen. Vi vil tage udgangspunkt i det meget kendte google script, scriptet henter simpelt den side som man ville få, hvis man gik ind på google, indtastede et ord, og trykkede "Jeg føler mig heldig".

Jeg vil anbefale at man har et godt kendskab med programmering i mIRC i forvejen, hvis du ikke har det synes jeg du skulle læse noget om det, f.eks. findes der nogle artikler her på siden om emnet.

Hvordan fungere det?


Når man vil hente information fra en webside, gøres det nærmest ligesom i browseren. Man forbinder sig til en side, f.eks. "www.google.com" en sådan forbindelse i mIRC, ville blive til:

Fold kodeboks ind/udKode 
Også en lille forklaring på "sockopen":

Fold kodeboks ind/udKode 
Socket navn, skal bruges til senere at kunne benytte socketen.
Host, er hosten på socketen.
Port, er porten på socketen. Port 80 er den normale port, når vi snakker om hjemmesider.

Vi har nu bedt om en forbindelse til serveren, men først nå triggeren "on sockopen" kører er socketten klar. Her er så lige hvordan den virker:

Fold kodeboks ind/udKode 
Også forklaringen:

Fold kodeboks ind/udKode 
Den eneste ting man skal rette her, er socketens navn, som vi før angav da vi lavede forbindelsen.

Vi har nu fået en forbindelse til server, men hvad skal der så ske??
Jo, for nu at få noget ud af serveren, skal vi spørge den om noget. Det er her HTTP protokollen kommer ind i billedet. For at modtage en bestemt side fra serveren, kunne følgende bruges:

Fold kodeboks ind/udKode 
Vi vil starte med at forklare hvordan selve HTTP kommandoerne virker, derefter vil vi kikke på selv "sockwrite" dimsen.

Fold kodeboks ind/udKode 
GET/POST, er ligesom når man sender en form fra en HTML side, altså GET er hvis man vil sende variabler gennem URL'en, og POST hvis man nærmest vil sende det uden det lige kan ses. I denne artikel vil vi kun benytte os af GET.
Fil path, her skal pathen til filen skrives. F.eks. "/" for at få default siden eller "/EnMappe/EntilMappe/EtFil.Navn". Altså, du skal ikke have hosten med her!
Host, her skal vi have hosten til serveren.

Så lige en hurtig forklaring på de meste brugte ting i sockwrite:

Fold kodeboks ind/udKode 
-n, betyder at den sætter et CRLF i enden af linjen.
Socket navn, Her skal sockettens navn indsættet. Som du måske har lagt mærke til, bruger vi i eks. oven over $sockname, som retunere den socket der kørte triggeren.

Vi har nu opret forbindelse, og sendt en forspørgelse om at få fat i en side. Nu skal vi så have fat i alt den data serveren smider tilbage i hovedet på os. Til dette skal vi bruge "on sockread", som køre når mIRC får noget tilbage fra serveren.

Vi kan bruge følgende kode, til at køre hele svaret igennem og udskrive det med "echo":

Fold kodeboks ind/udKode 
Først tjekker vi om der er sket nogle fejl med "$sockerr", hvis den er over 0 er der sket en fejl, forbindelsen bliver automatisk lukket, derfor skal vi sørge for at gå ud af scriptet med det samme, det gør vi med "return".

Så bruger vi kommandoen "sockread" og putter det ind i %temp, sockread giver kun en linje, derfor skal vi kører indtil der ikke er flere linjer igen. Som tjekker om $sockbr eller $sock($sockname).rq er over nul.
Indtil loopet så er færdig, hentes data'en til variablen %temp, hvorefter den udskrives.
Til sidst lukker vi så forbindelsen til serveren, da vi har fået det info vi skulle bruge. Så husk altid at lukke dine forbindelser!, alle aktive forbindelse kan ses med "socklist".

Lige lidt om hvordan sockread og sockclose skal skrives:

Fold kodeboks ind/udKode 
-f, gør så at den læser en uvilkårlig længde af socketten, selvom den ikke slutter med CRLF. Hvis man ikke sætter den, læser den kun indtil CRLF.
%var, her indtastes den variabel linjen skal ind i.

Fold kodeboks ind/udKode 
Socket navn, her indtastes navnet på den socket vi ønsker lukket.

Du skulle nu have en nogenlunde forståelse af hvordan det virker, nu vil vi gå til et rigtigt eksempel, så hvis du ikke helt er med endnu, så kommer det nok med, når du kan se det i google scriptet :)

Google scriptet


Jeg vil ligge hårdt ud med scriptet, så du lige kan kikke det lidt igennem, og prøve at sætte det sammen med det du lige har læst. Bagefter vil jeg så forklare lidt om hvordan det fungere, men ikke gå i dybden med selve koden, da det kan ses oven over.

Fold kodeboks ind/udKode 
Prøv nu at putte koden ind i remote (der hvor der står alias foran, skal ikke ind i alias, men som alt andet i remote). Derefter skulle du kunne skrive /google <noget søge tekst>, hvorefter den meget gerne skulle komme med et svar.

Forklaring


- Først har vi en alias der hedder "google", som opretter en forbindelse til www.google.com, og sætter variablen %search, som indeholder søge strengen.

- Når så forbindelsen er lavet, skal vi jo sende en forespørgelse om en side. Her skal vi så sætte os lidt ind i hvordan google virker. Da jeg kikkede på deres side, fandt jeg ud af søgestrengen skulle kaldes med "q=<søge streng>", derefter fandt jeg ud af, at hvis det skulle være som man havde trykket på knappen "Jeg føler mig heldig", skulle der sættes "&btnI=true" ind. Samlet med side navn, blev det til:

Fold kodeboks ind/udKode 
Men vi kan ikke bare putte søgestrengen ind, da en adresse ikke kan indeholde mellemrum, og på google bliver mellemrum lavet om til + tegn, så det må vi også gøre. Dette gøres med $replace funktionen, som kommer til at se sådan her ud:

Fold kodeboks ind/udKode 
Det skulle ikke være så besværligt, kort og godt betyder det at mellemrum (ASCII værdi 32), bliver lavet om til + tegnet.
Bortset fra det ligner den del jo sig selv. Nu er vi så noget til håndteringen af svaret.

- Håndtering af svaret:
Først tjekker vi om der er sket fejl i socketten, hvis der er stopper vi scriptet, ellers forsætter vi bare. Herefter sætter vi nogle variabler, bl.a. %res som kommer til at indeholde URL'en med svaret. Så hvis der ikke findes nogen side, så skriver den bare "No result".
Derefter gå vi svaret igennem, indtil vi finder en linje der starter med "Location:", som indeholder resultatet af søgningen. Nu skal vi så have svaret ud, som gøres med en $right. Så putter vi det ind i %res.
Grunden til vi skal finde "Location:" er at en søgning efter udvikleren.dk, f.eks. ville give:

Fold kodeboks ind/udKode 
Som du kan se starter linjen med "http://www.udvikleren.dk" med "Location:". (Som du kan se har jeg erstat cockie teksten med ***, fordi at vi ellers ville få en meget lang linje, og det alligevel er helt ligegyldigt her)

Til sidst udskriver vi så svaret med en "echo", og derefter unsetter søgestrengen, og lukker forbindelsen til serveren.

Var det alt?


Ja, længere er det faktisk ikke at lave et simpelt google script.

Afslutning


Jeg håber du fik noget ud af artiklen, de steder hvor der har været nogle kommandoer du ikke forstår anbefaler jeg dig du bruger /help ellers må du benytte et forum. Hvis du i forvejen har læst noget om sockets, vil du måske ligge mærke til at jeg ikke har skrevet alt information om det enkelte kommandoer, jeg har valgt kun at skrive det jeg synes der var mest vigtigt, vil du have den fulde information om hver kommando, kan du kikke under "/help sockets". Der findes også flere kommandoer, end dem vi benytter os af her, endnu engang vil jeg foreslå du kikker i help.

Hvis du har fået mod på at lave flere sjove ting, har jeg lige et par ide'er til dig. Du kunne f.eks. lave et script der fandt aktuelt tv på fjernsynes, til det har jeg fundet en side på tv2.dk som måske kan hjælpe dig: http://tv.tv2.dk/tv/listning.php?Region=1&KanalID=0&Soegeord=&Dato=0&Periode=.
Den anden ting kunne være at man skrev /udvinfo <udv id>, hvorefter du så ville få noget info om det valgte id.
URL'en til dette: http://www.udvikleren.dk/vis_ui.php?id=<udv id>.

Held & lykke :)

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (5)

User
Bruger #2775 @ 10.06.03 16:11
Lækkert skrevet indeed.
User
Bruger #5199 @ 25.05.04 19:45
sys det forklarede en del, så 5 fra min side
User
Bruger #5956 @ 10.06.04 19:20
Top nice artikel, Det er en af de rigtig gode, Keep up the good work :) Og skrive gerne nogle flere Om IRC Scripting :)
User
Bruger #7280 @ 25.02.05 19:21
du kommer med nogen gode oplysninger
User
Bruger #11914 @ 01.07.08 00:23
Super lækker artikel! Hvad med at udvide med en forklaring på hvordan man arbejder med sessions i sockets, så man eksempelvis kan logge ind på en hjemmeside og så hente noget info?
Du skal være logget ind for at skrive en kommentar.
t