2016-03-16 2 views
0

Я пытаюсь повторить следующую CURL команды в Python (я пытаюсь сделать POST запрос с некоторыми данными по конкретному IP):Simulate завиток команда, используя URLLIB в Python - httplib.InvalidURL: нечисленный порт:

curl -k --data "phonenr=a_number&smstxt=Test&Submit=SendSms" https://admin:[email protected]/txsms.cgi 

где ip является IP удаленного сервера и admin:pass являются учетными данными, необходимыми.

Эта команда CURL выполняется правильно, а ответ - 200.

С помощью следующего кода Python, я получаю:

httplib.InvalidURL: nonnumeric port: '[email protected]'

Может кто-нибудь сказать мне, что я делаю неправильно?

import urllib2 as urllib 
from os.path import join as joinPath 
from urllib import urlencode 

# constant 
APPLICATION_PATH = '/srv/sms_alert/' 
ALERT_POINT_PATH = joinPath(APPLICATION_PATH, 'alert_contact') 
URL_REQUEST_TIMEOUT = 42 

SMS_BOX_URL = 'https://admin:[email protected]/txsms.cgi' 

with open(ALERT_POINT_PATH, 'r') as alertContactFile: 
    for line in alertContactFile: 
     line = line.strip('\n') 
     data = { 
      'phonenr': line, 
      'smstext': 'Test', 
      'Submit': 'SendSms' 
     } 
     url_data = urlencode(data) 
     url_data = url_data.encode('UTF-8') 
     req = urllib.Request(SMS_BOX_URL, url_data) 
     with urllib.urlopen(req) as response: 
      print(response.read()) 

ответ

0

Хорошо, взгляните на свой импорт, код должен работать нормально. Проблема в том, что сначала вы импортируете urllib2 в качестве urllib и импортируете urlencode из urllib, чтобы не получить нужную функцию.

Посмотрите на следующий код извлекается из urlib2 документы:

Ссылка: URLLIB2 documentation

import urllib 
import urllib2 

url = 'http://www.someserver.com/cgi-bin/register.cgi' 
values = {'name' : 'Michael Foord', 
      'location' : 'Northampton', 
      'language' : 'Python' } 

data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
the_page = response.read() 

Успехов!

0

Проблема заключается в том, что аутентификация (мы будем предполагать, что это базовая аутентификация) не может быть отправлена ​​как команда curl, urllib будет рассматривать пользователя как имя хоста и что после «:» в качестве порта, поэтому вы эта ошибка,

Вы должны попытаться установить в URLLIB нож с учетными данными, как это:

import urllib2 as urllib 
SMS_BOX_URL = 'https://hostname/txsms.cgi' 
# Prepare an authentication handler 
auth_handler = urllib.HTTPBasicAuthHandler() 
# Set your authentication Handler (catch the realm by parsing the authentication request with your navigator 
auth_handler.add_password('realm', 'the realm of the authent', 'admin', 'pass') 
opener = urllib.build_opener(auth_handler) 
# Install your opener for later use 
urllib.install_opener(opener) 

# use it 
url_data = urlencode(data) 
url_data = url_data.encode('UTF-8') 
req = urllib.Request(SMS_BOX_URL, url_data) 
with urllib.urlopen(req) as response: 
    print(response.read()) 

Это должно работать,
нож необходимо только один раз инстанциирован

ref

+0

Что я должен писать вместо: «царство», «царство аутентичности»? –

+0

вы должны увидеть это при разборе заголовка запроса сервера, например: '' WWW-Authenticate: Basic realm = "WallyWorld" ''. вы можете попробовать None (без кавычек) – doctori