below is my code for calling the GitHub api via curl with python, how do I stop using curl and use the requests library to make the API calls? I'm just confused on how calling the below api endpoints will look like when using requests.
def api_request(self):
api_key = sys.argv[0]
organization = sys.argv[1]
print("------------------------------------------People with 2FA Disabled-----------------------------------------------")
comm = 'curl -v "https://api.github.com/orgs/"{}"/members?filter=2fa_disabled" -H "Authorization: bearer {}"'.format(organization, api_key)
os.system(comm)
print("-----------------------------------------Collaborators being listed----------------------------------------------")
comm2 = 'curl -v "https://api.github.com/orgs/"{}"/outside_collaborators" -H "Authorization: bearer {}"'.format(organization, api_key)
os.system(comm2)
print("-----------------------------------------Members and data Being listed----------------------------------------------")
comm3 = 'curl -v "https://api.github.com/orgs/"{}"/members" -H "Authorization: bearer {}"'.format(organization, api_key)
os.system(comm3)
import requests
import urllib.request
import io
api_key = sys.argv[0]
organization = sys.argv[1]
url="https://api.github.com/orgs/"{}"/members?filter=2fa_disabled" -H "Authorization: bearer {}".format(organization, api_key)
response = requests.get(url).content
depending of the format of the answer, you can then try
import pandas
df=pandas.read_csv(io.StringIO(response.decode('utf-8')))
I'm just confused on how calling the below api endpoints will look
like when using requests.
Something like:
import requests
import sys
import os
def api_request(self):
api_key = sys.argv[0]
organization = sys.argv[1]
print("------------------------------------------People with 2FA Disabled-----------------------------------------------")
requests.get("https://api.github.com/orgs/{}/members?filter=2fa_disabled".format(organization), auth=('bearer', api_key))
Here is the example which might help you:
responseAPI1 = requests.post('URL',json=data,auth = ('username','password'))
OR
headers = {
'X-ABC-API-ID': 'x-x-x-x-x',
'X-ABC-API-KEY': 'nnnnnnnnnnnnnnnnnnnnnnn',
'X-DE-API-ID': 'x',
'X-DE-API-KEY': 'nnnnnnnnnnnnnnnnnnnnnnnn'
}
r = requests.get('https://www.somecompany.com/api/v2/groups/', headers=headers)
I am attempting to programmatically run a curl command. I have os imported, but I can not seem to get effective results with the following code. (Dummy hackathon API data)
os.system('curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{\"merchant_id\": \"57cf75cea73e494d8675ec49\",\"medium\": \"balance\",\"purchase_date\": \"2017-01-22\",\"amount\": 1,\"description\": \"string\"}" "http://api.reimaginebanking.com/accounts/5883e3351756fc834d8ebe89/purchases?key=b84d3a153e2842b8465bcc4fde3d1839"')
For some odd reason, the above code does not effectively just run a system command.
Method 01:
You can use the subprocess module to execute a shell command from Python.
Example:
>>> import subprocess
>>> cmd = '''curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{\"merchant_id\": \"57cf75cea73e494d8675ec49\",\"medium\": \"balance\",\"purchase_date\": \"2017-01-22\",\"amount\": 1,\"description\": \"string\"}" "http://api.reimaginebanking.com/accounts/5883e3351756fc834d8ebe89/purchases?key=b84d3a153e2842b8465bcc4fde3d1839"'''
>>> args = cmd.split()
>>> subprocess.call(args)
If you can using Python version 3.5(or later), you can use the subprocess.run command instead.
METHOD 02:
Use requests if you:
- Want to write a Pythonic code for the POST request.
- Prefer clean and extensible code!
>>> import requests
>>> headers = {"Content-Type": "application/json", "Accept": "application/json"}
>>> data = {"merchant_id\": "57cf75cea73e494d8675ec49\","medium\": "balance\", "purchase_date\": "2017-01-22\","amount\": 1, "description\": "string\"}
>>> url = "http://api.reimaginebanking.com/accounts/5883e3351756fc834d8ebe89/purchases?key=b84d3a153e2842b8465bcc4fde3d1839"
>>> response = requests.post(url, data=data, headers=headers)
I'm trying to convert the following working request in curl to a python request (using Requests).
curl --data 'query={"tags":["test1","test2"]}' http://www.test.com/match
(I've used a fake url but the command does work with the real url)
The receiving end (ran in Flask) does this:
#app.route("/match", methods=['POST'])
def tagmatch():
query = json.loads(request.form['query'])
tags = query.get('tags')
# ... does stuff ...
return json.dump(stuff)
In curl (7.30), ran on Mac OS X (10.9) the command above properly returns a JSON list that's filtered using the tag query.
My Python script is as follows, it returns a 400 Bad Request error.
import requests
payload = {"tags":["test1", "test2"]}
# also tried payload = 'query={"tags":["test1","test2"]}'
url = 'http://www.test.com/match'
r = requests.post(url, data=payload)
if __name__=='__main__':
print(r.text)
There is an open source cURL to Python Requests conversion helper at https://curlconverter.com/. It isn't perfect, but helps out a lot of the time. Especially for converting Chrome "Copy as cURL" commands. There is also a node library if you need to do the conversions programmatically
Your server is expecting JSON, but you aren't sending it. Try this:
import requests
import json
payload = {'query': json.dumps({"tags":["test1", "test2"]})}
url = 'http://www.test.com/match'
r = requests.post(url, data=payload)
if __name__=='__main__':
print r.text
Save your life
A simpler approach would be:
Open POSTMAN
Click on the "import" tab on the upper left side.
Select the Raw Text option and paste your cURL command.
Hit import and you will have the command in your Postman builder!
Hope this helps!
credit: Onkaar Singh
Try to use uncurl library. It is pretty nice to do its job. I've tried it.
u = uncurl.parse(
"curl -X GET 'https://mytesturl.com/' -H 'accept: application/json' -H 'Authorization: 1234567890'")
print(u)
It prints,
requests.get("https://mytesturl.com/",
headers={
"Authorization": "1234567890",
"accept": "application/json"
},
cookies={},
)
try this:
https://github.com/spulec/uncurl
import uncurl
print uncurl.parse("curl 'https://pypi.python.org/pypi/uncurl' -H
'Accept-Encoding: gzip,deflate,sdch'")
I wrote an HTTP client plugin for Sublime Text called Requester, and one of its features is to convert calls to cURL to Requests, and vice versa.
If you're using Sublime Text this is probably your fastest, easiest option. If not, here's the code that actually handles the conversion from cURL to Requests. It's based uncurl, but with various improvements and bug fixes.
import argparse
import json
try:
from urllib.parse import urlencode, parse_qsl
except ImportError: # works for Python 2 and 3
from urllib import urlencode
from urlparse import parse_qsl
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('command')
parser.add_argument('url')
parser.add_argument('-X', '--request', default=None)
parser.add_argument('-d', '--data', default=None)
parser.add_argument('-G', '--get', action='store_true', default=False)
parser.add_argument('-b', '--cookie', default=None)
parser.add_argument('-H', '--header', action='append', default=[])
parser.add_argument('-A', '--user-agent', default=None)
parser.add_argument('--data-binary', default=None)
parser.add_argument('--compressed', action='store_true')
parsed_args = parser.parse_args()
method = 'get'
if parsed_args.request:
method = parsed_args.request
base_indent = ' ' * 4
post_data = parsed_args.data or parsed_args.data_binary or ''
if post_data:
if not parsed_args.request:
method = 'post'
try:
post_data = json.loads(post_data)
except ValueError:
try:
post_data = dict(parse_qsl(post_data))
except:
pass
cookies_dict = {}
if parsed_args.cookie:
cookies = parsed_args.cookie.split(';')
for cookie in cookies:
key, value = cookie.strip().split('=')
cookies_dict[key] = value
data_arg = 'data'
headers_dict = {}
for header in parsed_args.header:
key, value = header.split(':', 1)
if key.lower().strip() == 'content-type' and value.lower().strip() == 'application/json':
data_arg = 'json'
if key.lower() == 'cookie':
cookies = value.split(';')
for cookie in cookies:
key, value = cookie.strip().split('=')
cookies_dict[key] = value
else:
headers_dict[key] = value.strip()
if parsed_args.user_agent:
headers_dict['User-Agent'] = parsed_args.user_agent
qs = ''
if parsed_args.get:
method = 'get'
try:
qs = '?{}'.format(urlencode(post_data))
except:
qs = '?{}'.format(str(post_data))
print(post_data)
post_data = {}
result = """requests.{method}('{url}{qs}',{data}\n{headers},\n{cookies},\n)""".format(
method=method.lower(),
url=parsed_args.url,
qs=qs,
data='\n{}{}={},'.format(base_indent, data_arg, post_data) if post_data else '',
headers='{}headers={}'.format(base_indent, headers_dict),
cookies='{}cookies={}'.format(base_indent, cookies_dict),
)
print(result)
You could make a script with this code, e.g. curl_to_request.py, and call this script from the command line like so. It will work for both Python 2 and Python 3.
python curl_to_request.py curl -X POST -d 'key2=value2&key1=value1' 'http://httpbin.org/post'
python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '{"key2": "value2", "key1": "value1"}' 'http://httpbin.org/post'
python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '[1, 2, 3]' 'http://httpbin.org/post'
python curl_to_request.py curl -X POST -H 'Content-Type: application/json' -d '{"name": "Jimbo", "age": 35, "married": false, "hobbies": ["wiki", "pedia"]}' 'http://httpbin.org/post'
python curl_to_request.py curl -X GET 'http://httpbin.org/get?key2=value2&key1=value1'
python curl_to_request.py curl -X GET -H 'key1: value1' -H 'key2: value2' 'http://httpbin.org/headers'
python curl_to_request.py curl -X GET -b 'key1=value1;key2=value2' 'http://httpbin.org/cookies'
From your code using requests and in Flask, it seems like you don't post the right data format. The payload should be like this:
payload = {'query': {'tags': ['test1', 'test2']},}
This seems not normal as post data when using requests.post(). So if you have posted the html form here, it may have been more clear to solve the problem.
Here is another similar question: Using Python Requests to pass through a login/password
I want to implement this linux command in my PYTHON script, it returns a JSON file:
curl -k -u username:password -X POST https://servername/wapi/v1.2/network
/fkqjsdlmfjqslmdfsm:11.221.22.0/24/default?_function=next_availabl_ip -H
"Content-Type: application/json" -d '{"exclude": ["11.221.22.1",
"11.221.22.2", "11.221.22.3", "11.221.22.4", "11.221.22.5"], "num": 1}'
If you just want to execute this command using python, you can use
subprocess.call([<curl command>])
otherwise you might want to consider using http://pycurl.sourceforge.net/
I finally solved it with requests:
exclude_data = json.dumps({"exclude": ["11.221.22.1",
"11.221.22.2", "11.221.22.3", "11.221.22.4", "11.221.22.5"], "num": 1})
url = https://servername/wapi/v1.2/network
/fkqjsdlmfjqslmdfsm:11.221.22.0/24/default?_function=next_available_ip
r = requests.post(url, auth=(user, password), verify=False, data=exclude_data)
I have this simple working curl command:
curl -k -d X-User=user -d X-Password=password https://12.12.12.21
This is my example:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('X-User', 'user'),('X-Password', 'password')]
rr = opener.open("https://12.12.12.21")
print rr.read()
It's not working as i expected ( result: wrong password/user name ), can you help me understand why?
Your curl command is using the -d flag which sends the data using POST, not using headers.
If you meant to use headers then you need to use the -H argument:
curl -k -H X-User=user -H X-Password=password https://12.12.12.21
Here is how to do a POST request in case that is what you need:
values = {'X-User' : 'user', 'X-Password' : 'password'}
data = urllib.urlencode(values)
req = urllib2.Request("https://12.12.12.21", data)
rr = urllib2.urlopen(req)