Search code examples
pythontwitteroauth-2.0twitter-oauth

oauth2 POST - twitter


i created a script that will get the users friend list (GET request) and i was successful. Now i am attempting to make a script that will follow a particular user (POST request) and i've been unsuccessful.

here is my oauth function (where the problem lies):

def augment_POST(url,**kwargs) :
    secrets = hidden.oauth()
    consumer = oauth2.Consumer(secrets['consumer_key'], secrets['consumer_secret'])
    token = oauth2.Token(secrets['token_key'],secrets['token_secret'])

    oauth_request = oauth2.Request.from_consumer_and_token(consumer, token= token, http_method='POST', http_url=url, parameters=kwargs)
    oauth_request.to_postdata() # this returns post data, where should i put it?
    oauth_request.sign_request(oauth2.SignatureMethod_HMAC_SHA1(), consumer, token)
    return oauth_request.to_url()

my augment_GET function is the exact same thing except http_mehtod='GET'

for clarity:

def follow_user(id):
    seedurl="https://api.twitter.com/1.1/friendships/create.json"
    print 'Attempting to follow: %d' % (id,)
    url = augment_POST(seedurl,user_id=id)
    connection = urllib.urlopen(url)
    data = connection.read()
    headers = connection.info().dict

any help will be greatly appreciated.


Solution

  • First it seems you need to import urllib2 to make a POST request.
    You have to send the POST data that you get from the to_postdata method using the data argument of urlopen:

    def augment_POST(url, **kwargs) :
        secrets = hidden.oauth()
        consumer = oauth2.Consumer(secrets['consumer_key'],
                                   secrets['consumer_secret'])
        token = oauth2.Token(secrets['token_key'],
                             secrets['token_secret'])
    
        oauth_request = oauth2.Request.from_consumer_and_token(
            consumer,
            token= token,
            http_method='POST',
            http_url=url,
            parameters=kwargs
        )
    
        oauth_request.sign_request(oauth2.SignatureMethod_HMAC_SHA1(),
                                   consumer, token)
    
        # this is the data that must be sent with you POST request
        return oauth_request.to_postdata()
    
    
    def follow_user(id):
        url = "https://api.twitter.com/1.1/friendships/create.json"
        print 'Attempting to follow: %d' % id
        postdata = augment(url, method='GET', user_id=id)
    
        # Send the POST request with the data argument
        # The url is the same as the data is sent in the body of the request
        connection = urllib2.urlopen(url, data=postdata)
    
        data = connection.read()
        headers = connection.info().dict
    

    I would recommend to use the requests_oauthlib module which makes all this really easy:

    from requests_oauthlib import OAuth1Session
    
    tokens = hidden.oauth()
    client = OAuth1Session(tokens['consumer_key'],
                           tokens['consumer_secret'],
                           tokens['token_key'],
                           tokens['token_secret'])
    
    
    def follow_user(id):
        url = "https://api.twitter.com/1.1/friendships/create.json"
        print 'Attempting to follow: %d' % id
    
        # for GET requests use client.get and the `params` argument
        # instead of the `data` argument
        response = client.post(url, data={'user_id': id})
    
        data = response.text
        # or even `data = response.json()` to decode the data
        headers = response.headers