ボットを実装するには、 Twistedライブラリを使用します。 もちろん、PythonでICQを操作するための専用のライブラリが既にあります。 py-icqやnanoicqなど 。 しかし、私はすでにTwistedに精通していたので、選択は彼にかかっていました。
車輪を再発明しないために、 例からプログラムの大部分を取ります :
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
# UIN UIN = "" # PASS = "" # host = ( "login.icq.com" , 5238) # / icqMode = 1 # Status message AMSG = "I'm here +)" * This source code was highlighted with Source Code Highlighter .
ここで最初の部分は私たちで終わります。 必要なライブラリをダウンロードします。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- twisted.words.protocols からオスカーをインポート
- twisted.internetインポートプロトコル、reactorから
- フィードパーサーをインポートする
- import urllib2#まだ気にしないでください。 それは何のためですか、少し後で説明します
Feedparserを使用して、ハブのrssテープを取り出して解析する必要があります。 今、ボット自体。 ここでは、小さな変更を除いて、例からのほとんどすべて...
*このソースコードは、 ソースコードハイライターで強調表示されました。
- #クラスボット
- クラス Bot(oscar.BOSConnection):
- 機能= [oscar.CAP_CHAT]
- def initDone(自己):
- 「Connect」 、UIN、 「to server」 、ホスト[0]、ホスト[1]を出力します
- self.requestSelfInfo()。addCallback(self.gotSelfInfo)
- self.requestSSI()。addCallback(self.gotBuddyList)
- self.setAway(AMSG)
- def gotSelfInfo(自己、ユーザー):
- 印刷ユーザー.__ dict__
- self.name = user.name
- def gotBuddyList(self、l):
- プリントl
- self.activateSSI()
- self.setProfile( "" "ICQBot" "" )
- self.setIdleTime(0)
- self.clientReady()
- def gotAway(self、away、user):
- 離れている場合 :
- 「User」 、 「user」 、 「:」 、離れて印刷
ここに一番美味しい部分があります。 着信メッセージ処理:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- def receiveMessage(self、user、multiparts、flags):
- print "\ n <From:" 、user.name
- print "<Message:" 、multiparts [0] [0] .decode( 'cp1251' )
- command = multiparts [0] [0] .lower()。split( '' )#メッセージをスペースに分割する
- PREF_C = "!" #私たちと一緒にチームを始めましょう!
最初のチームになります!Habr、しかし小さな例外があります。 構文コマンドが!Habr nの場合、最後のn個の投稿が表示されます。 構文コマンドが!Habr n1 n2の場合、n1からn2までの投稿(私の小さな気まぐれ)。 もちろん、結論は20投稿に制限されています。 xmlページには正確に20個あります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- ifコマンド[0] ==(PREF_C + "habr" ):
- rss = feedparser.parse( 'http://habrahabr.ru/rss')#xmlページとparsimを取得
- feeds = [0,20]#これは追加機能用です)
- len(コマンド)== 2:
- 試してください :
- feeds [1] = int (コマンド[1])
- を除く:
- フィード[1] = 0
- フィード[1] <1:フィード[1] = 1の場合
- フィード[1]> 20の場合:フィード[1] = 20
- elif len(コマンド)== 3:
- 試してください :
- フィード[0] = int (コマンド[1])-1
- フィード[1] = int (コマンド[2])
- を除く:
- フィード[0] = 0
- フィード[1] = 19
- フィード[0] <0:フィード[0] = 0
- フィード[0]> 19の場合:フィード[0] = 19
- フィード[1] <1:フィード[1] = 1の場合
- フィード[1]> 20の場合:フィード[1] = 20
- mes = ''
- 範囲内のフィードの場合(フィード[0]、フィード[1]):
- mes + = rss.entries [feed] .title + '\ n'
- self.sendMessage(user.name、mes)
!Habrn nコマンドは、フィールドnの説明フィールドの内容を表示します
*このソースコードは、 ソースコードハイライターで強調表示されました。
- elifコマンド[0] ==(PREF_C + "habrn" ):
- rss = feedparser.parse( 'http://habrahabr.ru/rss' )
- 試してください :
- feedn = int (コマンド[1])-1
- を除く:
- feedn = 0
- feedn <0の場合 :feedn = 0
- feedn> 19の場合 :feedn = 19
- self.sendMessage(user.name、rss.entries [feedn] .title + '\ n' + rss.entries [feedn] .description)
次に、冒頭で入力したimport urllib2について説明します。 時々、ssh経由でアクセスするために、ホームサーバーのIPを調べる必要があります。 そしてもちろん、私は彼の住所を他人に知られたくありません。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- elifコマンド[0] ==(PREF_C + "ip" )およびuser.name == '368576236' :
- file_s = urllib2.urlopen(urllib2.Request( 'http://api.wipmania.com/' ))
- 応答= file_s.read()
- self.sendMessage(user.name、response.split( "<br>" )[0])
- f.close()
http://api.wipmania.com/を見ると、外部IPがあるかなり単純なhtmlページを見つけることができます。
さて、最後の部分:
*このソースコードは、 ソースコードハイライターで強調表示されました。
- クラス BotAuth(oscar.OscarAuthenticator):
- BOSClass =ボット
- protocol.ClientCreator(リアクター、BotAuth、UIN、PASS、icq = icqMode).connectTCP(*ホスト)
- reactor.run()
以上です。 最後のコマンドのIPを取得してくれた人に感謝します。
コード全体は次のとおりです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- #-*-コーディング:utf-8-*-
- #ICQボット
- #UIN
- UIN = "123456"
- PASS = "パス"
- #サーバー
- host =( "login.icq.com" 、5238)
- icqMode = 1
- #ステータスメッセージ
- AMSG = 「私はここにいます+)」
- twisted.words.protocols からオスカーをインポート
- twisted.internetインポートプロトコル、reactorから
- フィードパーサーをインポートする
- urllib2をインポート
- #クラスボット
- クラス Bot(oscar.BOSConnection):
- 機能= [oscar.CAP_CHAT]
- def initDone(自己):
- 「Connect」 、UIN、 「to server」 、ホスト[0]、ホスト[1]を出力します
- self.requestSelfInfo()。addCallback(self.gotSelfInfo)
- self.requestSSI()。addCallback(self.gotBuddyList)
- self.setAway(AMSG)
- def gotSelfInfo(自己、ユーザー):
- 印刷ユーザー.__ dict__
- self.name = user.name
- def gotBuddyList(self、l):
- プリントl
- self.activateSSI()
- self.setProfile( "" "ICQBot" "" )
- self.setIdleTime(0)
- self.clientReady()
- def gotAway(self、away、user):
- 離れている場合 :
- 「User」 、 「user」 、 「:」 、離れて印刷
- def receiveMessage(self、user、multiparts、flags):
- print "\ n <From:" 、user.name
- print "<Message:" 、multiparts [0] [0] .decode( 'cp1251' )
- command = multiparts [0] [0] .lower()。split( '' )
- PREF_C = "!"
- ifコマンド[0] ==(PREF_C + "habr" ):
- rss = feedparser.parse( 'http://habrahabr.ru/rss' )
- フィード= [0.20]
- len(コマンド)== 2:
- 試してください :
- feeds [1] = int (コマンド[1])
- を除く:
- フィード[1] = 0
- フィード[1] <1:フィード[1] = 1の場合
- フィード[1]> 20の場合:フィード[1] = 20
- elif len(コマンド)== 3:
- 試してください :
- フィード[0] = int (コマンド[1])-1
- フィード[1] = int (コマンド[2])
- を除く:
- フィード[0] = 0
- フィード[1] = 19
- フィード[0] <0:フィード[0] = 0
- フィード[0]> 19の場合:フィード[0] = 19
- フィード[1] <1:フィード[1] = 1の場合
- フィード[1]> 20の場合:フィード[1] = 20
- mes = ''
- 範囲内のフィードの場合(フィード[0]、フィード[1]):
- mes + = rss.entries [feed] .title + '\ n'
- self.sendMessage(user.name、mes)
- elifコマンド[0] ==(PREF_C + "habrn" ):
- rss = feedparser.parse( 'http://habrahabr.ru/rss' )
- 試してください :
- feedn = int (コマンド[1])-1
- を除く:
- feedn = 0
- feedn <0の場合 :feedn = 0
- feedn> 19の場合 :feedn = 19
- self.sendMessage(user.name、rss.entries [feedn] .title + '\ n' + rss.entries [feedn] .description)
- elifコマンド[0] ==(PREF_C + "ip" )およびuser.name == '123456' :
- file_s = urllib2.urlopen(urllib2.Request( 'http://api.wipmania.com/' ))
- 応答= file_s.read()
- self.sendMessage(user.name、response.split( " <br> " )[0])
- f.close()
- クラス BotAuth(oscar.OscarAuthenticator):
- BOSClass =ボット
- protocol.ClientCreator(リアクター、BotAuth、UIN、PASS、icq = icqMode).connectTCP(*ホスト)
- reactor.run()
ご清聴ありがとうございました!