PythonのICQボット

こんにちは%habrauser% ! これは私の最初のhabrotopikです。 pythoneでICQボットを作成する方法を説明します。 ボットはネットワーク上にあり、ユーザーのリクエストに応じて最近の記事のリストを送信します

ボットを実装するには、 Twistedライブラリを使用します。 もちろん、PythonでICQを操作するための専用のライブラリが既にあります。 py-icqnanoicqなど 。 しかし、私はすでに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 .



  1. # 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 .



  2. # 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 .



  3. # 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 .



  4. # 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 .



  5. # 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 .



  6. # 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 .



  7. # 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 .







ここで最初の部分は私たちで終わります。 必要なライブラリをダウンロードします。







  1. twisted.words.protocols からオスカーをインポート
  2. twisted.internetインポートプロトコル、reactorから
  3. フィードパーサーをインポートする
  4. import urllib2#まだ気にしないでください。 それは何のためですか、少し後で説明します
*このソースコードは、 ソースコードハイライターで強調表示されました。




Feedparserを使用して、ハブのrssテープを取り出して解析する必要があります。 今、ボット自体。 ここでは、小さな変更を除いて、例からのほとんどすべて...







  1. #クラスボット
  2. クラス Bot(oscar.BOSConnection):
  3. 機能= [oscar.CAP_CHAT]
  4. def initDone(自己):
  5. 「Connect」 、UIN、 「to server」 、ホスト[0]、ホスト[1]を出力します
  6. self.requestSelfInfo()。addCallback(self.gotSelfInfo)
  7. self.requestSSI()。addCallback(self.gotBuddyList)
  8. self.setAway(AMSG)
  9. def gotSelfInfo(自己、ユーザー):
  10. 印刷ユーザー.__ dict__
  11. self.name = user.name
  12. def gotBuddyList(self、l):
  13. プリントl
  14. self.activateSSI()
  15. self.setProfile( "" "ICQBot" ""
  16. self.setIdleTime(0)
  17. self.clientReady()
  18. def gotAway(self、away、user):
  19. 離れている場合
  20. 「User」「user」「:」 、離れて印刷
*このソースコードは、 ソースコードハイライターで強調表示されました。




ここに一番美味しい部分があります。 着信メッセージ処理:







  1. def receiveMessage(self、user、multiparts、flags):
  2. print "\ n <From:" 、user.name
  3. print "<Message:" 、multiparts [0] [0] .decode( 'cp1251'
  4. command = multiparts [0] [0] .lower()。split( '' )#メッセージをスペースに分割する
  5. PREF_C = "!" #私たちと一緒にチームを始めましょう!
*このソースコードは、 ソースコードハイライターで強調表示されました。




最初のチームになります!Habr、しかし小さな例外があります。 構文コマンドが!Habr nの場合、最後のn個の投稿が表示されます。 構文コマンドが!Habr n1 n2の場合、n1からn2までの投稿(私の小さな気まぐれ)。 もちろん、結論は20投稿に制限されています。 xmlページには正確に20個あります。







  1. ifコマンド[0] ==(PREF_C + "habr" ):
  2. rss = feedparser.parse( 'http://habrahabr.ru/rss')#xmlページとparsimを取得
  3. feeds = [0,20]#これは追加機能用です)
  4. len(コマンド)== 2:
  5. 試してください
  6. feeds [1] = int (コマンド[1])
  7. を除く:
  8. フィード[1] = 0
  9. フィード[1] <1:フィード[1] = 1の場合
  10. フィード[1]> 20の場合:フィード[1] = 20
  11. elif len(コマンド)== 3:
  12. 試してください
  13. フィード[0] = int (コマンド[1])-1
  14. フィード[1] = int (コマンド[2])
  15. を除く:
  16. フィード[0] = 0
  17. フィード[1] = 19
  18. フィード[0] <0:フィード[0] = 0
  19. フィード[0]> 19の場合:フィード[0] = 19
  20. フィード[1] <1:フィード[1] = 1の場合
  21. フィード[1]> 20の場合:フィード[1] = 20
  22. mes = ''
  23. 範囲内のフィードの場合(フィード[0]、フィード[1]):
  24. mes + = rss.entries [feed] .title + '\ n'
  25. self.sendMessage(user.name、mes)
*このソースコードは、 ソースコードハイライターで強調表示されました。




!Habrn nコマンドは、フィールドnの説明フィールドの内容を表示します







  1. elifコマンド[0] ==(PREF_C + "habrn" ):
  2. rss = feedparser.parse( 'http://habrahabr.ru/rss'
  3. 試してください
  4. feedn = int (コマンド[1])-1
  5. を除く:
  6. feedn = 0
  7. feedn <0の場合 :feedn = 0
  8. feedn> 19の場合 :feedn = 19
  9. self.sendMessage(user.name、rss.entries [feedn] .title + '\ n' + rss.entries [feedn] .description)
*このソースコードは、 ソースコードハイライターで強調表示されました。




次に、冒頭で入力したimport urllib2について説明します。 時々、ssh経由でアクセスするために、ホームサーバーのIPを調べる必要があります。 そしてもちろん、私は彼の住所を他人に知られたくありません。







  1. elifコマンド[0] ==(PREF_C + "ip" )およびuser.name == '368576236'
  2. file_s = urllib2.urlopen(urllib2.Request( 'http://api.wipmania.com/' ))
  3. 応答= file_s.read()
  4. self.sendMessage(user.name、response.split( "<br>" )[0])
  5. f.close()
*このソースコードは、 ソースコードハイライターで強調表示されました。




http://api.wipmania.com/を見ると、外部IPがあるかなり単純なhtmlページを見つけることができます。



さて、最後の部分:







  1. クラス BotAuth(oscar.OscarAuthenticator):
  2. BOSClass =ボット
  3. protocol.ClientCreator(リアクター、BotAuth、UIN、PASS、icq = icqMode).connectTCP(*ホスト)
  4. reactor.run()
*このソースコードは、 ソースコードハイライターで強調表示されました。


以上です。 最後のコマンドのIPを取得してくれた人に感謝します。



コード全体は次のとおりです。







  1. #-*-コーディング:utf-8-*-
  2. #ICQボット
  3. #UIN
  4. UIN = "123456"
  5. PASS = "パス"
  6. #サーバー
  7. host =( "login.icq.com" 、5238)
  8. icqMode = 1
  9. #ステータスメッセージ
  10. AMSG = 「私はここにいます+)」
  11. twisted.words.protocols からオスカーをインポート
  12. twisted.internetインポートプロトコル、reactorから
  13. フィードパーサーをインポートする
  14. urllib2をインポート
  15. #クラスボット
  16. クラス Bot(oscar.BOSConnection):
  17. 機能= [oscar.CAP_CHAT]
  18. def initDone(自己):
  19. 「Connect」 、UIN、 「to server」 、ホスト[0]、ホスト[1]を出力します
  20. self.requestSelfInfo()。addCallback(self.gotSelfInfo)
  21. self.requestSSI()。addCallback(self.gotBuddyList)
  22. self.setAway(AMSG)
  23. def gotSelfInfo(自己、ユーザー):
  24. 印刷ユーザー.__ dict__
  25. self.name = user.name
  26. def gotBuddyList(self、l):
  27. プリントl
  28. self.activateSSI()
  29. self.setProfile( "" "ICQBot" ""
  30. self.setIdleTime(0)
  31. self.clientReady()
  32. def gotAway(self、away、user):
  33. 離れている場合
  34. 「User」「user」「:」 、離れて印刷
  35. def receiveMessage(self、user、multiparts、flags):
  36. print "\ n <From:" 、user.name
  37. print "<Message:" 、multiparts [0] [0] .decode( 'cp1251'
  38. command = multiparts [0] [0] .lower()。split( ''
  39. PREF_C = "!"
  40. ifコマンド[0] ==(PREF_C + "habr" ):
  41. rss = feedparser.parse( 'http://habrahabr.ru/rss'
  42. フィード= [0.20]
  43. len(コマンド)== 2:
  44. 試してください
  45. feeds [1] = int (コマンド[1])
  46. を除く:
  47. フィード[1] = 0
  48. フィード[1] <1:フィード[1] = 1の場合
  49. フィード[1]> 20の場合:フィード[1] = 20
  50. elif len(コマンド)== 3:
  51. 試してください
  52. フィード[0] = int (コマンド[1])-1
  53. フィード[1] = int (コマンド[2])
  54. を除く:
  55. フィード[0] = 0
  56. フィード[1] = 19
  57. フィード[0] <0:フィード[0] = 0
  58. フィード[0]> 19の場合:フィード[0] = 19
  59. フィード[1] <1:フィード[1] = 1の場合
  60. フィード[1]> 20の場合:フィード[1] = 20
  61. mes = ''
  62. 範囲内のフィードの場合(フィード[0]、フィード[1]):
  63. mes + = rss.entries [feed] .title + '\ n'
  64. self.sendMessage(user.name、mes)
  65. elifコマンド[0] ==(PREF_C + "habrn" ):
  66. rss = feedparser.parse( 'http://habrahabr.ru/rss'
  67. 試してください
  68. feedn = int (コマンド[1])-1
  69. を除く:
  70. feedn = 0
  71. feedn <0の場合 :feedn = 0
  72. feedn> 19の場合 :feedn = 19
  73. self.sendMessage(user.name、rss.entries [feedn] .title + '\ n' + rss.entries [feedn] .description)
  74. elifコマンド[0] ==(PREF_C + "ip" )およびuser.name == '123456'
  75. file_s = urllib2.urlopen(urllib2.Request( 'http://api.wipmania.com/' ))
  76. 応答= file_s.read()
  77. self.sendMessage(user.name、response.split( " <br> " )[0])
  78. f.close()
  79. クラス BotAuth(oscar.OscarAuthenticator):
  80. BOSClass =ボット
  81. protocol.ClientCreator(リアクター、BotAuth、UIN、PASS、icq = icqMode).connectTCP(*ホスト)
  82. reactor.run()
*このソースコードは、 ソースコードハイライターで強調表示されました。




ご清聴ありがとうございました!



All Articles