multiple values as parameters to POST command.. - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: multiple values as parameters to POST command.. (/thread-8414.html) Pages:
1
2
|
multiple values as parameters to POST command.. - onenessboy - Feb-19-2018 Hi Experts, I need some help. What I actually need is to post some server status to slack channel with python The below is the example code i am trying import json import requests # Set the webhook_url to the one provided by Slack when you create the webhook at https://my.slack.com/services/new/incoming-webhook/ webhook_url = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' slack_data = {'text': "Hello from python"} response = requests.post( webhook_url, data=json.dumps(slack_data), headers={'Content-Type': 'application/json'} ) if response.status_code != 200: raise ValueError( 'Request to slack returned an error %s, the response is:\n%s' % (response.status_code, response.text) )Though above code is working fine. But I want to pass multiple values in slack_data as above example is having only one data value is being posted on slack. But I want to mention multiple values at line no 6 I tried different methods and ended up with some errors like " too many values to unpack, Json not serializable etc Can you some one guide me or assist me to get multiple values to be posted on slack channel Thank you very munch in advance best regards ASP RE: multiple values as parameters to POST command.. - buran - Feb-19-2018 (Feb-19-2018, 09:20 AM)onenessboy Wrote: But I want to pass multiple values in slack_data as above example is having only one data value is being posted on slack. But I want to mention multiple values at line no 6 Please, post the exact code you tried and full traceback of errors you get (in error tags). It looks like you are not able to 'produce' valid json, i.e. the problem is not slack/POST related RE: multiple values as parameters to POST command.. - onenessboy - Feb-20-2018 Hi Thanks for your reply, sorry, i am replying bit late and trying to put out various methods and failing :( The actual context is i am trying to get some linux server status and posting to slack channel In original post I have given the sample which is base code which i am trying to build correct code for my context This is original code from __future__ import print_function import boto3 import json import logging import os logging.basicConfig() from urllib2 import Request, urlopen, URLError, HTTPError # configuration # The Slack channel to send a message to stored in the slackChannel environment variable SLACK_CHANNEL = "#XXXXXXXXXX" # Add the webhook URL from Slack below HOOK_URL = "https://hooks.slack.com/services/xxxxx/xxxx/xxxxx" response = conn.get_all_instances() MESSAGE = response # Setting up logging logger = logging.getLogger() logger.setLevel(logging.INFO) slack_message = { 'channel': SLACK_CHANNEL, 'text': MESSAGE} req = Request(HOOK_URL, json.dumps(slack_message)) try: response = urlopen(req) response.read() logger.info("Message posted to %s", slack_message['channel']) except HTTPError as e: logger.error("Request failed: %d %s", e.code, e.reason) except URLError as e: logger.error("Server connection failed: %s", e.reason)So in above code line number 18 the variable "response" actually returns in below format { "Reservations": [ { "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "StateReason": { "Message": "Client.UserInitiatedShutdown: User initiated shutdown", "Code": "Client.UserInitiatedShutdown" }, "State": { "Code": 80, "Name": "stopped" }, "EbsOptimized": false, "LaunchTime": "2018-02-08T10:37:36.000Z", "PrivateIpAddress": "xx.xx.xx.xxx", "ProductCodes": [], "VpcId": "xxxxxx", "StateTransitionReason": "User initiated (2018-02-08 11:13:34 GMT)", "InstanceId": "xxxxxxx", "EnaSupport": true, "ImageId": "xxxxx", "PrivateDnsName": "xxxxxxxx", "KeyName": "xxxxxx", "SecurityGroups": [ { "GroupName": "xxxxxxxx", "GroupId": "xx-xxxx" } ], "ClientToken": "", "SubnetId": "xxxx-xxxxx", "InstanceType": "xx.xxx", "NetworkInterfaces": [so i want to post this information to slack channel in under stable way for readers Hope I am giving right info.. can you please help..where i am doing it wrong... The above code says json is not serializable error Regargs ASP RE: multiple values as parameters to POST command.. - buran - Feb-20-2018 are you sure this is full response? It is json, but not full, are you sure you receive the full response? also what is conn? finally better use requests module, not urllib2 RE: multiple values as parameters to POST command.. - buran - Feb-20-2018 I'm looking at boto.ec2.connection.get_all_instances() documentation It says it returns a list of Reservations, while what you post looks like dict/json RE: multiple values as parameters to POST command.. - onenessboy - Feb-20-2018 sorry i did not post entire response.. While conn is environment variable which is having connecting details here it is { "Reservations": [ { "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "StateReason": { "Message": "Client.UserInitiatedShutdown: User initiated shutdown", "Code": "Client.UserInitiatedShutdown" }, "State": { "Code": 80, "Name": "stopped" }, "EbsOptimized": false, "LaunchTime": "2018-02-08T10:37:36.000Z", "PrivateIpAddress": "xx.xx.x.xxx", "ProductCodes": [], "VpcId": "xx-xxxx", "StateTransitionReason": "User initiated (2018-02-08 11:13:34 GMT)", "InstanceId": "xxxxxxxx", "EnaSupport": true, "ImageId": "xx-xxxxx", "PrivateDnsName": "xxxxxxx", "KeyName": "xxxxx", "SecurityGroups": [ { "GroupName": "xxxxxx", "GroupId": "xxxxxxx" } ], "ClientToken": "", "SubnetId": "xxxx-xxxx", "InstanceType": "t2.micro", "NetworkInterfaces": [ { "Status": "in-use", "MacAddress": "xxxxxxx", "SourceDestCheck": true, "VpcId": "xxxxx", "Description": "Primary network interface", "NetworkInterfaceId": "xxxx", "PrivateIpAddresses": [ { "PrivateDnsName": "xxxxxxx", "Primary": true, "PrivateIpAddress": "xx.xx.xx.xxx" } ], "PrivateDnsName": "xxxxxx", "Attachment": { "Status": "xxx", "DeviceIndex": 0, "DeleteOnTermination": true, "AttachmentId": "xxxxxx", "AttachTime": "2017-12-28T17:24:50.000Z" }, "Groups": [ { "GroupName": "xx", "GroupId": "xx-xxxx" } ], "Ipv6Addresses": [], "OwnerId": "xxxxxxx", "SubnetId": "subnet-xxxxx", "PrivateIpAddress": "xx.xx.x.x" } ], "SourceDestCheck": true, "Placement": { "Tenancy": "default", "GroupName": "", "AvailabilityZone": "xx-xx-xx" }, "Hypervisor": "xen", "BlockDeviceMappings": [ { "DeviceName": "/xx/xx", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-xxxxxxxx", "AttachTime": "2017-12-28T17:24:51.000Z" } } ], "Architecture": "x86_64", "RootDeviceType": "ebs", "RootDeviceName": "/dev/xvda", "VirtualizationType": "hvm", "Tags": [ { "Value": "xxxx", "Key": "Name" } ], "AmiLaunchIndex": 0 } ], "ReservationId": "00000f4510a2551", "Groups": [], "OwnerId": "xxxxxxxx" } }This is the traceback Traceback (most recent call last): File "/home/user/script/ABSlack1.py", line 43, in <module> req = Request(HOOK_URL, json.dumps(response)) File "/usr/lib64/python2.7/json/__init__.py", line 244, in dumps return _default_encoder.encode(obj) File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode return _iterencode(o, 0) File "/usr/lib64/python2.7/json/encoder.py", line 184, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: Reservation:r-00000f4510a2551 "not JSON serializable RE: multiple values as parameters to POST command.. - buran - Feb-20-2018 note that: 1) I think you miss ] on line 1082) I assume resp is string try resp = """{ "Reservations": [ { "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "StateReason": { "Message": "Client.UserInitiatedShutdown: User initiated shutdown", "Code": "Client.UserInitiatedShutdown" }, "State": { "Code": 80, "Name": "stopped" }, "EbsOptimized": false, "LaunchTime": "2018-02-08T10:37:36.000Z", "PrivateIpAddress": "xx.xx.x.xxx", "ProductCodes": [], "VpcId": "xx-xxxx", "StateTransitionReason": "User initiated (2018-02-08 11:13:34 GMT)", "InstanceId": "xxxxxxxx", "EnaSupport": true, "ImageId": "xx-xxxxx", "PrivateDnsName": "xxxxxxx", "KeyName": "xxxxx", "SecurityGroups": [ { "GroupName": "xxxxxx", "GroupId": "xxxxxxx" } ], "ClientToken": "", "SubnetId": "xxxx-xxxx", "InstanceType": "t2.micro", "NetworkInterfaces": [ { "Status": "in-use", "MacAddress": "xxxxxxx", "SourceDestCheck": true, "VpcId": "xxxxx", "Description": "Primary network interface", "NetworkInterfaceId": "xxxx", "PrivateIpAddresses": [ { "PrivateDnsName": "xxxxxxx", "Primary": true, "PrivateIpAddress": "xx.xx.xx.xxx" } ], "PrivateDnsName": "xxxxxx", "Attachment": { "Status": "xxx", "DeviceIndex": 0, "DeleteOnTermination": true, "AttachmentId": "xxxxxx", "AttachTime": "2017-12-28T17:24:50.000Z" }, "Groups": [ { "GroupName": "xx", "GroupId": "xx-xxxx" } ], "Ipv6Addresses": [], "OwnerId": "xxxxxxx", "SubnetId": "subnet-xxxxx", "PrivateIpAddress": "xx.xx.x.x" } ], "SourceDestCheck": true, "Placement": { "Tenancy": "default", "GroupName": "", "AvailabilityZone": "xx-xx-xx" }, "Hypervisor": "xen", "BlockDeviceMappings": [ { "DeviceName": "/xx/xx", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-xxxxxxxx", "AttachTime": "2017-12-28T17:24:51.000Z" } } ], "Architecture": "x86_64", "RootDeviceType": "ebs", "RootDeviceName": "/dev/xvda", "VirtualizationType": "hvm", "Tags": [ { "Value": "xxxx", "Key": "Name" } ], "AmiLaunchIndex": 0 } ], "ReservationId": "00000f4510a2551", "Groups": [], "OwnerId": "xxxxxxxx" } ] }""" import json slack_msg = json.loads(resp) slack_msg['channel'] = SLACK_CHANNEL slack_json = json.dumps(slack_msg) req = Request(HOOK_URL, slack_json)again better use requests, instead of urllib2 RE: multiple values as parameters to POST command.. - onenessboy - Feb-20-2018 Hi, tried as you suggested with requests.post instead of urllib2. following is the tracebak and sorry while pasting i missed that ] which you have mentioned.. Traceback (most recent call last): File "/home/user/script/ABSlack1.py", line 39, in <module> slack_msg = json.loads(response) File "/usr/lib64/python2.7/json/__init__.py", line 339, in loads return _default_decoder.decode(s) File "/usr/lib64/python2.7/json/decoder.py", line 364, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) TypeError: expected string or buffer This is what code change which i tried as per you suggestions slack_msg = json.loads(response) slack_msg['channel'] = SLACK_CHANNEL slack_json = json.dumps(slack_msg) #req = Request(HOOK_URL, slack_json) response = requests.post( webhook_url, data=slack_json, headers={'Content-Type': 'application/json'}) RE: multiple values as parameters to POST command.. - buran - Feb-20-2018 can you check the type of response? print(type(response)) RE: multiple values as parameters to POST command.. - onenessboy - Feb-20-2018 (Feb-20-2018, 02:03 PM)buran Wrote: can you check the type of response? Hi Buran, just checked the type of response. below is the response <class 'boto.resultset.ResultSet'> |