我刚刚学习了Python的基础知识,并且我正在尝试创建一些项目,这样我就可以增加对编程语言的了解。
由于我很偏执,我创建了一个脚本,使用PycURL每隔x秒获取一个当前的IP地址,用于VPN安全性。这是我的代码[已编辑]:
(g x)
现在我想扩展这个想法,以便脚本要求用户输入他们当前的IP,将该八位字节保存为字符串,然后使用循环继续针对PycURL函数运行它以确保他们的IP还没改变?唯一的问题是我完全难倒,我无法想出一个能够获取PycURL输出并将其与字符串进行比较的函数。我怎么能做到这一点?
答案 0 :(得分:2)
正如@holdenweb解释的那样,你不需要pycurl
这么简单的任务,但是,这是一个有效的例子:
import pycurl
import time
from StringIO import StringIO
def get_ip():
buffer = StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, "http://ipinfo.io/ip")
c.setopt(c.WRITEDATA, buffer)
c.perform()
c.close()
return buffer.getvalue()
def main():
initial = get_ip()
print 'Initial IP: %s' % initial
try:
while True:
current = get_ip()
if current != initial:
print 'IP has changed to: %s' % current
time.sleep(300)
except KeyboardInterrupt:
print("\nProccess terminated by user")
if __name__ == '__main__':
main()
正如您所看到的,我将获取IP的逻辑移到了单独的函数:get_ip
并添加了一些遗漏的东西,比如将缓冲区捕获到字符串并返回它。否则它与pycurl quickstart
当直接访问脚本(而非导入)时,将调用main函数。
首先关闭它调用get_ip
获取初始IP,然后运行while循环,检查IP是否已更改,如果是,则告诉您。
修改强> 由于您更改了问题,因此以下是您在工作示例中的新代码:
import requests
def getIP():
result = requests.get("http://ipinfo.io/ip")
return result.text
def checkIP():
initial = getIP()
print("Initial IP: {}".format(initial))
while True:
current = getIP()
if initial == current:
pass
else:
print("IP has changed!")
checkIP()
正如我在上面的评论中提到的,你不需要两个循环。一个就够了。你甚至不需要两个功能,但更好。一个用于获取数据,一个用于循环。在后面,首先获取初始值,然后运行循环,在其中检查值是否已更改。
答案 1 :(得分:1)
看来,通过阅读pycurl
文档,您会发现使用the requests
library更容易解决此问题。 Curl更多地与文件传输有关,因此库希望您提供一个类似文件的对象,并将其写入内容。这会使你的逻辑变得非常复杂。
requests
可让您直接访问服务器响应的文本:
>>> import requests
>>> result = requests.get("http://ipinfo.io/ip")
>>> result.text
'151.231.192.8\n'
正如@PeterWood建议的那样,一个函数比一个类更合适 - 或者如果脚本将连续运行,只需要一个简单的循环作为程序的主体。