0
votes

I'm new in using twitter API, I've successfully called:

https://api.twitter.com/1.1/statuses/user_timeline.json

api.twitter.com/1.1/followers/list.json

but when I call:

https://api.twitter.com/1.1/geo/search.json?query=Pakistan

I get Forbidden access.

Following is my request:

Method: GET, RequestUri: 'https://api.twitter.com/1.1/geo/search.json?query=Pakistan', Version: 1.1, Content: , Headers:
{
Authorization: Bearer xxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzzzzzzzzzzz%aaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb
}

And the response that I get is:

StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
strict-transport-security: max-age=631138519
x-connection-hash: 3a7f405036803861a700cef30f7b1e7f
x-response-time: 107
Date: Fri, 05 May 2017 03:18:15 GMT
Set-Cookie: guest_id=v1%3A149395429589966721; Domain=.twitter.com; Path=/; Expires=Sun, 05-May-2019 03:18:15 UTC
Server: tsa_o
Content-Length: 91
Content-Type: application/json; charset=utf-8
}

If you're interested in looking at my C# code that I'm using, here you go:

    public async Task<IEnumerable<string>> GetTweetsByLatLong(double latitude, double longitude, int count, string accessToken = null)
    {
        if (accessToken == null)
        {
            accessToken = await GetAccessToken();
        }

        var requestUserTimeline = new HttpRequestMessage(HttpMethod.Get, string.Format("https://api.twitter.com/1.1/geo/search.json?query=Pakistan"));
        requestUserTimeline.Headers.Add("Authorization", "Bearer " + accessToken);
        var httpClient = new HttpClient();
        HttpResponseMessage responseUserTimeLine = await httpClient.SendAsync(requestUserTimeline);
        if (responseUserTimeLine.IsSuccessStatusCode)
        {
            var serializer = new JavaScriptSerializer();
            dynamic json = ((serializer.Deserialize<object>(await responseUserTimeLine.Content.ReadAsStringAsync())) as Dictionary<string, object>).Values.ElementAt(0);
            //new System.Collections.Generic.Mscorlib_DictionaryValueCollectionDebugView<string, object>((json as Dictionary<string, object>).Values).Items[0]
            var enumerableTwitts = (json as IEnumerable<dynamic>);

            if (enumerableTwitts == null)
            {
                return null;
            }
            return enumerableTwitts.Select(t => (string)(t["name"].ToString()));
        }
        else
        {
            return new string[] { responseUserTimeLine.ToString() };
        }
    }
   
   public async Task<string> GetAccessToken()
    {
        var httpClient = new HttpClient();
        var request = new HttpRequestMessage(HttpMethod.Post, "https://api.twitter.com/oauth2/token ");
        var customerInfo = Convert.ToBase64String(new UTF8Encoding().GetBytes(OAuthConsumerKey + ":" + OAuthConsumerSecret));
        request.Headers.Add("Authorization", "Basic " + customerInfo);
        request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");

        HttpResponseMessage response = await httpClient.SendAsync(request);

        string json = await response.Content.ReadAsStringAsync();
        var serializer = new JavaScriptSerializer();
        dynamic item = serializer.Deserialize<object>(json);
        return item["access_token"];
    }
1
Its not a good idea to post your API key, if its personal - remove it as quickly as possible, if it is your private API key.J.N.
Thanks @J.N. I'm confused whether my header isn't correct I need some special permissions or whatMuhammad Rehan Qadri

1 Answers

0
votes

I believe it is because you are using Application-only authentication by providing a Bearer token.

See "Requires Authentication" in both

https://dev.twitter.com/rest/reference/get/geo/search and https://dev.twitter.com/rest/reference/get/statuses/user_timeline

And read https://dev.twitter.com/oauth