请帮忙。我有一个 Telegram 机器人,当我从 Bash 控制台启动他时,它每 60 秒 ping 一次静态 IP - 它工作正常,但每天停止工作一次。 我尝试使用“始终开启任务”,但在日志文件中收到“ping:套接字:不允许操作”。我有 5 美元帐户,我能做什么?
从 Bash 控制台运行时我看到的内容:
--- 176.102.48.100 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 176.102.48.100 (176.102.48.100) 56(84) bytes of data.
--- 176.102.48.100 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms PING 176.102.48.100 (176.102.48.100) 56(84) bytes of data. --- 176.102.48.100 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms
我在 Always On 任务日志中看到的内容:
2023-01-12 08:55:34 - Task preparing to start
Jan 12 09:00:58 ping: socket: Operation not permitted
Jan 12 09:01:58 ping: socket: Operation not permitted
Jan 12 09:02:58 ping: socket: Operation not permitted
Jan 12 09:03:58 ping: socket: Operation not permitted
Jan 12 09:04:58 ping: socket: Operation not permitted
我的 Ping 脚本
def check_ip_available() -> bool:
hostname = "IP HERE"
response = os.system("ping -c 1 " + hostname)
if response == 0:
return True
return False
我可以解决这个问题吗?谢谢
我尝试了两种方法来启动我的机器人,但它只能从 Bash 控制台运行。但控制台每 24 小时重置一次,我需要始终执行任务
在 PythonAnywhere 上使用“始终开启”任务时,在运行
ping
命令时遇到“套接字:不允许操作”错误,这是因为在 PythonAnywhere 的 Web 服务器上出于安全原因,ICMP 协议(ping 使用的协议)被阻止了。
解决方案:
不能直接从 PythonAnywhere 的“始终开启”任务中使用
ping
命令。 为了实现的目标,可以考虑以下替代方案:
1. 使用 TCP 连接检查端口可用性:
可以尝试打开到目标 IP 地址和端口的 TCP 连接,而不是使用
ping
。 如果连接成功,则主机处于活动状态并侦听该端口。
以下是一个使用
socket
模块的示例:
import socket
def check_port_open(hostname, port):
"""
检查主机上的端口是否打开。
"""
try:
with socket.create_connection((hostname, port), 2):
return True
except OSError:
pass
return False
def check_ip_available():
hostname = "IP HERE"
if check_port_open(hostname, 80): # 检查端口 80(HTTP)
return True
return False
2. 使用外部 Ping 服务:
可以使用外部 ping 服务,例如
https://ping.apility.io/
。 可以使用 Python 的
requests
库发送 HTTP 请求到该服务,并解析响应以检查 IP 地址的可用性。
以下是一个示例:
import requests
def check_ip_available():
hostname = "IP HERE"
url = f"https://ping.apility.io/api/v1/ping/{hostname}"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
if data["success"] and data["results"][0]["status"] == "reachable":
return True
except requests.exceptions.RequestException:
pass
return False
请记住,外部服务可能会有限制或收费。
修改的代码:
将的
check_ip_available()
函数替换为选择的方法。 然后,可以在“始终开启”任务中使用此函数。
其他建议:
-
记录错误:
在的代码中添加错误处理,以记录
ping
命令失败的原因,这有助于调试问题。 - 联系 PythonAnywhere 支持: 如果需要有关其平台上网络限制的更多信息,请随时联系 PythonAnywhere 支持团队。
希望这些解决方案能帮到!
标签:python,ping,pythonanywhere From: 75094117