Python で irc クライアントを作成する。

シェアする

ちょっとIRCボット欲しいなって思ったので調べて作ってみた。どうせなので socket を使用したり RFC をみたりしながらやってみた。とはいっても一番参考にしたのはぐぐって上にでてきた、Python でシンプルな IRC クライアントを作成する というページです。

楽に作るのであれば ネットワークプログラミングフレームワークである Twisted や Python で IRC を扱うライブラリの PyIRC , pyirclib などを使ったほうが良いと思います。

大体の解説は上記URLで分かりやすく書いてあるのでそっちを見たほうが良いと思います。というかソレを元にクラス作っただけです。あとは日本語の処理を追加したぐらいですね。

以下ソース mode とかテストしてないや。

# -*- coding: utf-8 -*-
import socket
import string

class PyIrc():
	def __init__(self, server, port, nickname, channel='', encode='unicode'):
		self.encode = encode
		self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self.irc.connect((server,port))
		self.login(nickname)
		if len(channel) > 0 :
			self.join(channel)

	def send_data(self, command):
		self.irc.send(command + '\n')

	def login(self, nickname, username='user', password=None, realname='Real', hostname='Hostname', servername='Servername'):
		self.send_data("USER %s %s %s %s" % (username, hostname, servername, realname))
		self.nick(nickname)

	def join(self, channel):
		self.send_data("JOIN %s" % channel)

	def nick(self, nickname):
		self.send_data("NICK %s" % nickname)

	def privmsg(self, channel, message):
		if self.encode != 'unicode' :
			message = message.encode(self.encode)
		self.send_data("PRIVMSG %s :%s" % (channel, message))

	def notice(self, channel, message):
		if self.encode != 'unicode' :
			message = message.encode(self.encode)
		self.send_data("NOTICE %s :%s" % (channel, message))

	def mode(self, channel, mode, nickname):
		self.send_data("MODE %s %s %s" % (channel, mode, nickname))

	def recv(self, size=4096):
		msg = self.irc.recv(size)
		if msg[0:4] == 'PING':
			self.send_data("PONG %s" % msg[5:])
		if self.encode != 'unicode' :
			try:
				msg = msg.decode(self.encode)
			except UnicodeError:
				pass
		return msg

if __name__ == '__main__':
	SERVER = 'irc.friend-chat.jp'
	PORT = 6667
	NICKNAME = 'ryomatsu_bot'
	CHANNEL = '#ryomatsu'
	ENCODE = 'iso-2022-jp-ext'
	irc = PyIrc(SERVER, PORT, NICKNAME, CHANNEL, ENCODE)

	while (1):
		msg = irc.recv()

		# タイミング次第では msg で2行以上受け取るため分けています。
		for i in msg.strip().split('\n'):
			msg_array = i.strip().split()

			if len(msg_array) > 3 and msg_array[1] == 'PRIVMSG' and msg_array[3] == ':hi':
				irc.notice(CHANNEL, u'hi')
Sponsored Link

シェアする

フォローする