您的位置:首页 > 理论基础 > 计算机网络

IRC僵尸网络日记(一)

2014-12-23 18:51 232 查看
知道了原理以后,就可以着手来写了。

服务器暂时用现有的程序,只需要自己写客户端即可。打算用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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: