Я только что изучил основы Python, и я пытаюсь сделать несколько проектов, чтобы я мог расширить свои знания языка программирования.

Поскольку я довольно параноик, я создал скрипт, который использует PycURL для получения моего текущего IP-адреса каждые x секунд для безопасности VPN. Вот мой код [отредактировано]:

import requests

enterIP = str(input("What is your current IP address?"))

def getIP():
    while True:
        try:
             result = requests.get("http://ipinfo.io/ip")
             print(result.text)
        except KeyboardInterrupt:
             print("\nProccess terminated by user")
    return result.text

def checkIP():
    while True:
        if enterIP == result.text:
            pass
         else:
            print("IP has changed!")

getIP()
checkIP()

Теперь я хотел бы расширить эту идею, чтобы скрипт просил пользователя ввести свой текущий IP-адрес, сохраняет этот октет в виде строки, а затем использует цикл, чтобы продолжать запускать его с функцией PycURL, чтобы убедиться, что его IP-адрес не имеет изменилось? Единственная проблема в том, что я полностью озадачен, я не могу придумать функцию, которая бы брала вывод PycURL и сравнивала его со строкой. Как я мог этого достичь?

0
user8075674 28 Май 2017 в 00:15

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

Основная функция вызывается ниже, когда к скрипту обращаются напрямую (не путем импорта).

Сначала он вызывает get_ip для получения начального IP-адреса, а затем запускает цикл while, который проверяет, изменился ли IP-адрес, и дает вам знать, если это так.

< Сильный > EDIT : Поскольку вы изменили свой вопрос, вот ваш новый код в рабочем примере:

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()

Как я уже упоминал в комментариях выше, вам не нужно две петли. Одного достаточно. Вам даже не нужно две функции, но лучше сделать. Один для получения данных и один для цикла. В дальнейшем сначала получите начальное значение, а затем запустите цикл, внутри которого вы проверяете, изменилось ли значение или нет.

2
ruuter 27 Май 2017 в 22:40

Похоже, что прочитав документацию pycurl, вы решите эту проблему проще, используя библиотека requests. Curl больше связан с передачей файлов, поэтому библиотека ожидает, что вы предоставите файлоподобный объект, в который она записывает содержимое. Это сильно усложнит вашу логику.

requests позволяет напрямую получить доступ к тексту ответа сервера:

>>> import requests
>>> result = requests.get("http://ipinfo.io/ip")
>>> result.text
'151.231.192.8\n'

Как предположил @PeterWood, функция будет более подходящей для этого, чем класс - или, если сценарий будет работать непрерывно, просто простой цикл в качестве тела программы.

1
holdenweb 27 Май 2017 в 21:37