IRC僵尸网络日记(一)

知道了原理以后,就可以着手来写了。

服务器暂时用现有的程序,只需要自己写客户端即可。打算用python来写。

需要涉及的技术:

(1)python的socket模块

(2)IRC命令(用send发送)

刚开始就遇到了问题:可以连接到服务器上,但是无法加入频道中。不就应该是send('join #ircchannel \r\n')吗?

后来发现,这句以后服务器会发来ping命令,你必须回答一个pong,才可以连接到频道中。(后来的后来才发现,只是USER被服务器接收的太慢了,只用sleep一下,再JOIN,就可以加入频道了)

import socket
import time
network = 'irc.insert.a.network.here'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
irc.send ( 'NICK PyIRC\r\n' )
irc.send ( 'USER PyIRC PyIRCPyIRC :Python IRC\r\n' )
time.sleep(1)
irc.send ( 'JOIN #pyirc\r\n' )
time.sleep(1)
irc.send ( 'PRIVMSG #pyirc:Can you hear me?\r\n' )
time.sleep(1)
irc.send ( 'PART #pyirc\r\n' )
irc.send ( 'QUIT\r\n' )
irc.close()

 

只不过ping的有点慢,但还是可以通信的。
不过,这个代码也太丑了,简单粗暴,就不能美化一下吗?

做了一点改变,总比原来的好,最讨厌给类和函数起名字了……

这个程序增加了一个功能,接收其他用户发来的消息。

import socket

class IRCControl(object):
    def __init__(self,nickname,network,port,channel):
        self.nickname=nickname
        self.network=network
        self.port=port
        self.channel=channel
    def interact(self):
        irc = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
        irc.connect((self.network,self.port))
        irc.send('nick  %s\r\n '%self.nickname)
        irc.send ( 'USER %s %s %s : %s \r\n'% (self.nickname,self.network,self.network,self.nickname))
        while True:
            data = irc.recv ( 4096 )
            print data
            if data.find ( 'PING' ) != -1:
                irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' )
                irc.send ( 'JOIN %s\r\n'%self.channel)
                irc.send('privmsg %s : canyouhearme\r\n'%self.channel)
            elif data.find ( 'PRIVMSG' ) != -1:
                nick = data.split ( '!' ) [ 0 ].replace ( ':', '' )
                message = ':'.join ( data.split ( ':' ) [ 2: ] )
                print nick + ':', message

def main():
    nickname='lily'
    network = '172.30.41.104'
    port = 6667
    channel='#abs'
    control=IRCControl(nickname,network,port,channel)
    control.interact()
    

if __name__=='__main__':
    main()

 

posted @ 2014-12-23 18:51  云裳诉  阅读(547)  评论(0编辑  收藏  举报