我制作了一个python脚本,该脚本抓取了'http://spys.one/en/socks-proxy-list/'处的网页并获取了该处的所有IP地址,然后检查它们是否可用,最后返回了所有活动IP地址的列表。然后有第二个脚本连接到电报bot API,并使用第一个脚本向用户显示最近的socks5工作服务器列表。
我是一名业余程序员,并且是Python编程语言的新手。我制作了这些脚本来进行锻炼。随时指出我的错误并展示改进代码的方法。预先感谢!
import requests as req
import re
import socket
def is_open(ip, port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, int(port)))
s.shutdown(2)
return True
except:
return False
# Initial settings:
url = 'http://spys.one/en/socks-proxy-list/'
regex = '\d{1,4}\.\d{1,4}\.\d{1,4}\.\d{1,4}'
# Request URL
response = req.get(url).text
# Extract IP and port from source
p = re.compile(regex)
results = p.findall(response)
# Fetch and check the first 20 IPs
alive = []
for i in range(0, 20):
if is_open(results[i], '1080'):
alive.append(results[i])
def gimmeprox():
links = []
for x in range(0,len(alive)):
links.append('https://t.me/proxy?server=' + alive[int(x)] + '&port=1080')
payload = '\n\n'.join(links)
return payload
当我运行此代码和其他(机器人)脚本时,一切正常,但是一旦将其放到网络上(heroku等),它就会在第30行崩溃:
line 30, in <module>
if is_open(results[i], '1080'):
错误""
。
答案 0 :(得分:1)
简短的回答:“结果”并不总是有20个项目。因此,您基本上是在要求一些不存在的东西。
您应该始终检查长度,然后再进行迭代;或在不需要索引的情况下,只需遍历实际项目而不是索引即可。
答案 1 :(得分:1)
跑步时
for i in range(20):
if is_open(results[i], '1080'):
alive.append(results[i])
并且len(results)
为<20,您最终将尝试访问results[len(results)]
,从而导致IndexError。为防止这种情况,请选择len(results)
和20的较低值作为range
的参数,例如: min(len(results), 20)
。< / p>
另一种方法是循环遍历results
的所有值并在您拥有20时中断。
for r in result:
if is_open(r, '1080'):
alive.append(r)
if len(alive) >= 20: # shouldn't actually get over 20, just a precaution
break