【问题标题】:Getting a "TypeError: an integer is required" in my script在我的脚本中获取“TypeError:需要整数”
【发布时间】:2014-05-10 22:19:35
【问题描述】:

出于教育原因,我正在尝试使用 Python 制作僵尸网络,但我不断收到以下错误:

TypeError:需要一个整数

这是我的脚本:

import os
import socket
import random
import string

# string.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
a = random.choice(string.letters) 
b = random.choice(string.letters)
c = random.choice(string.letters)
d = random.choice(string.letters)   
e = random.choice(string.letters)
name = 'bot' + a + b + c + d + e

network = 'chat.freenode.net'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
print irc.recv ( 4096 )

irc.send ('NICK', name + '\r\n')
irc.send ( 'USER', name, name, name, ':Python IRC\r\n' )
irc.send ( 'JOIN #occult_hand\r\n' )
irc.send ( 'PRIVMSG #occult_hand :Hello World.\r\n' )

while True:
    data = irc.recv ( 4096 )
    if data.find ( 'PING' ) != -1:
        irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' )
    if data.find ( '!shutdown' ) != -1:
        irc.send ( "PRIVMSG #occult_hand :Fine, if you don't want me\r\n" )
        irc.send ( 'QUIT\r\n' )
    if data.find ( '!list' ) != -1:
        irc.send ( 'PRIVMSG #occult_hand :' + name, 'ONLINE\r\n' )
    if data.find ( '!ddos' ) != -1:
        irc.send ( 'PRIVMSG #occult_hand :Enter a target\r\n' )
    if data.find ( 'KICK' ) != -1:
        irc.send ( 'JOIN #occult_hand\r\n' )
    if data.find ('cheese') != -1:
        irc.send ( 'PRIVMSG #occult_hand :WHERE!!!!!!\r\n' )
    print data

【问题讨论】:

  • 请格式化您的代码并发布完整的回溯
  • 哪一行报错?

标签: python string sockets python-2.7 irc


【解决方案1】:

第 21 行的脚本错误,irc.send('NICK', name + '\r\n'):

回溯(最近一次通话最后): 文件“botnet.py”,第 21 行,在 irc.send('NICK', name + '\r\n') TypeError:需要一个整数

这是因为socket.send 方法具有以下签名,根据docs

socket.send(string[, flags])

string 参数是要发送的数据。 flags 参数是可选标志,与 Unix man 2 recv 中描述的相同。详情请见http://man7.org/linux/man-pages/man2/recv.2.html

基本上,flags 参数是一个整数值,默认为0。如 Unix 手册页所述,标志值在 socket 模块中作为常量提供,您可以通过使用 OR 逻辑运算组合所需的标志值来获得该值,例如:

socket.send(data, flags=socket.MSG_OOB | socket.MSG_DONTROUTE)

要修复您的脚本,您必须将要发送的所有数据连接成一个字符串,并将其作为第一个参数传递给 socket.send 方法:

irc.send('NICK' + name + '\r\n')
irc.send('USER' + name + name + name + ':Python IRC\r\n')
# ...

【讨论】:

    【解决方案2】:

    请发布实际的错误消息。 现在我能说的是你应该再看看你的发送方法。例如,用

    irc.send ('NICK', name + '\r\n')
    

    您将两个字符串传递给send。根据 https://docs.python.org/2/library/socket.html

    man 2 recv
    

    标志参数必须是整数。

    【讨论】:

      【解决方案3】:

      我查找了这个问题,似乎你应该在那里放一个整数(UNIX套接字常量)让它工作,但是从你以后的代码中,我假设你只想提供消息但是这个可选参数,所以你可以改变

      irc.send ('NICK', name + '\r\n')
      irc.send ( 'USER', name, name, name, ':Python IRC\r\n' )
      

      irc.send ('NICK' + name + '\r\n')
      irc.send ( 'USER' + name + name + name + ':Python IRC\r\n' )
      

      我猜你正在将python 的字符串连接运算符+ 与来自其他一些语言的, 混合使用:) 我在我的盒子里测试了更改后的版本,它不会再导致错误了,虽然我仍然不知道这段代码是做什么的,请你解释一下:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        相关资源
        最近更新 更多