#エラー概要
IRCとの通信ができない。
詳細
こちらのチュートリアルを基にPythonを用いてのIRCとの通信接続を試みようとしていますが、型違反?と思われるエラーが発生してうまくいきません。
irc
1import socket 2import sys 3 4class IRC: 5 irc = socket.socket() 6 7 def __init__(self): 8 self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 10 def send(self, chan, msg): 11 self.irc.send("PRIVMSG" + chan + " " + msg + "n") 12 13 def connect(self, server, channel, botnick): 14 # defines the socket 15 print("connecting to:" + server) 16 self.irc.connect((server, 6667)) # connects to the server 17 self.irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot!n") # user authentication 18 self.irc.send("NICK " + botnick + "n") 19 self.irc.send("JOIN " + channel + "n") # join the channel 20 21 def get_text(self): 22 text=self.irc.recv(2040) # receive the text 23 24 if text.find('PING') != -1: 25 self.irc.find('PONG' + text.split()[1] + 'rn') 26 return text
bot
1from irc import * 2import os 3import random 4 5channel = "#testit" 6server = "irc.freenode.net" 7botnick = "reddity" 8 9irc = IRC() 10irc.connect(server, channel, botnick) 11 12while 1: 13 text = irc.get_text() 14 print(text) 15 16 if "PRIVMSG" in text and channel in text and "hello" in text: 17 irc.send(channel, "HEllo!")
bot.pyを実行した所、以下のエラーが発生しました。
Python
1/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/venv/bin/python /home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py 2connecting to:irc.freenode.net 3Traceback (most recent call last): 4 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py", line 10, in <module> 5 irc.connect(server, channel, botnick) 6 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/irc.py", line 17, in connect 7 self.irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot!n") # user authentication 8TypeError: a bytes-like object is required, not 'str' 9 10Process finished with exit code 1
TypeError: a bytes-like object is required, not 'str'
↑はbyte型で指定しないといけないという意味はなんとなくわかるのですが、具体的にどこを修正すればよろしいのかイマイチ理解できておりません。
わかる人がいましたらご教授お願いいたします。
2020/4/26追記
指摘点を基に修正しましたが新たなエラーが出ました。
irc
1import socket 2import sys 3 4class IRC: 5 irc = socket.socket() 6 7 def __init__(self): 8 self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 10 def send(self, chan, msg): 11 self.irc.send("PRIVMSG " + chan + " " + msg + "\n") 12 13 def _send_raw(self, line, encoding="utf-8"): 14 self.irc.send(line.encode(encoding) + b"\r\n") 15 16 def connect(self, server, channel, botnick): 17 # defines the socket 18 print("connecting to:" + server) 19 self.irc.connect((server, 6667)) # connects to the server 20 self.irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot!\n") # user authentication 21 self.irc.send("NICK " + botnick + "\n") 22 self.irc.send("JOIN " + channel + "\n") # join the channel 23 24 def get_text(self): 25 text=self.irc.recv(2040) # receive the text 26 27 if text.find(b'PING') != -1: 28 self._send_raw('PONG' + text.split()[1]) 29 return text
bot
1from irc import * 2import os 3import random 4 5channel = "#testit" 6server = "irc.freenode.net" 7botnick = "reddity" 8 9irc = IRC() 10irc.connect(server, channel, botnick) 11 12while 1: 13 text = irc.get_text() 14 print(text) 15 16 if "PRIVMSG " in text and channel in text and "hello" in text: 17 irc.send(channel, "HEllo!")
Python
1/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/venv/bin/python /home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py 2Traceback (most recent call last): 3 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py", line 10, in <module> 4 irc.connect(server, channel, botnick) 5AttributeError: 'IRC' object has no attribute 'connect' 6 7Process finished with exit code 1 8
connect属性を持っていないとエラーがでました。
irc.pyの該当属性を入れ子にしてタブをずらしたことで属性を見つけられなくなったと推測できたのですが、この場合botの呼び出しの引数をどのようにirc.pyの方へ渡せば良いのでしょうか?
わかる方がいらしたらぜひアドバイスをお願い致します。
2020/04/16追記
指摘を基に修正したところ新たなエラーがでました。
irc
1import socket 2import sys 3 4class IRC: 5 irc = socket.socket() 6 7 def __init__(self): 8 self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 10 def send(self, chan, msg): 11 self.irc._send_raw("PRIVMSG " + chan + " " + msg + "\n") 12 13 def _send_raw(self, line, encoding="utf-8"): 14 self.irc._send_raw(line.encode(encoding) + b"\r\n") 15 16 def connect(self, server, channel, botnick): 17 # defines the socket 18 print("connecting to:" + server) 19 self.irc.connect((server, 6667)) # connects to the server 20 self.irc._send_raw("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot!\n") # user authentication 21 self.irc._send_raw("NICK " + botnick + "\n") 22 self.irc._send_raw("JOIN " + channel + "\n") # join the channel 23 24 def get_text(self): 25 text=self.irc.recv(2040) # receive the text 26 27 if text.find(b'PING') != -1: 28 self._send_raw('PONG' + text.split()[1]) 29 return text
Python
1/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/venv/bin/python /home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py 2connecting to:irc.freenode.net 3Traceback (most recent call last): 4 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py", line 10, in <module> 5 irc.connect(server, channel, botnick) 6 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/irc.py", line 20, in connect 7 self.irc._send_raw("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot!\n") # user authentication 8AttributeError: 'socket' object has no attribute '_send_raw' 9 10Process finished with exit code 1 11
クラスsocketが_send_raw属性を持たないとエラーが出ていますが、なぜクラスsocketがここで出てくるのかよくわかりません。
IRCクラス内の属性だと思ったのですが、この辺の仕組みがよく理解できていないように思います。
エラーの原因がわかりましたらご教授お願いいたします。
2020/4/17追記
Python
1/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/venv/bin/python /home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py 2connecting to:irc.freenode.net 3b':barjavel.freenode.net NOTICE * :*** Looking up your hostname...\r\n' 4Traceback (most recent call last): 5 File "/home/yuta/Desktop/work/python/PycharmProjects/TestPJ/networking/bot.py", line 16, in <module> 6 if "PRIVMSG " in text and channel in text and "hello" in text: 7TypeError: a bytes-like object is required, not 'str' 8 9Process finished with exit code 1
bot
1from irc import * 2import os 3import random 4 5channel = "#testit" 6server = "irc.freenode.net" 7botnick = "reddity" 8 9irc = IRC() 10irc.connect(server, channel, botnick) 11 12while 1: 13 text = irc.get_text() 14 print(text) 15 16 if "PRIVMSG " in text and channel in text and "hello" in text: 17 irc.send(channel, "HEllo!")
呼び出す側のbotで型エラーがおきました。
strをbyteに直す必要がありますが、どこを指しているのか不明です。
自分では全然検討もつかなくものすごく申し訳ないですが、わかる人がいましたらご教授お願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/16 23:10
2020/04/16 23:22
2020/04/16 23:27
2020/04/17 04:24