開発したアプリなど一覧

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

コメント

タイトルとURLをコピーしました