Как получить файл JSON из API поиска Twiter с помощью CURL, используя библиотеку urllib - PullRequest
1 голос
/ 01 июля 2019

Я только что узнал, как получить доступ к данным через API приложения, и столкнулся с проблемой.В настоящее время я пытаюсь получить файл JSON из API поиска Twitter.В документации API говорится, что CURL используется для доступа к данным через HTTP GET.Ниже приведен формат curl:

curl  "https://api.twitter.com/1.1/tweets/search/:product/:label.json?query=TwitterDev%20%5C%22search%20api%5C%22&maxResults=500&fromDate=<yyyymmddhhmm>&toDate=<yyyymmddhhmm>" -H "Authorization: Bearer TOKEN" 

- формат curl api

Я уже пытался получить к нему доступ с помощью urllib, но все еще получал сообщение об ошибке во время выполнения.

Ниже приведен код, который я использовал.

import urllib.request, urllib.parse, urllib.error
import twurl
import ssl
import json

#TWITTER_URL = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
TWITTER_URL = 'https://api.twitter.com/1.1/tweets/search/30day/data1.json'

# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

while True:
    #acct = input('Enter Twitter Account: ')    
    #if (len(acct) < 1): break
    parameters = {
            #'screen_name': acct, 
            #'COunT': '3',
            'query': 'inline skate',
            'fromDate': '201906010000',
            'toDate': '201906102359',
            'maxResults': '20',
            }

    url = twurl.augment(TWITTER_URL, parameters)
    print('\nRetrieving', url, '\n')

    connection = urllib.request.urlopen(url, context=ctx)
    data = connection.read().decode()
    js = json.loads(data)
    jsdmp = json.dumps(js, indent=2)
    print(jsdmp, '\n')

    #for data in js:
        #print(data['text'])

    headers = dict(connection.getheaders())
    print('\nRemaining', headers['x-rate-limit-remaining'], '\n')
    break

Вот сообщение об ошибке, которое я продолжаю получать:

File "C:\ProgramData\Anaconda3\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)

HTTPError: Unprocessable Entity

Это работает, когда я пытаюсь получить доступ к извлечению твитов user_timeline выше

TWITTER_URL = 'https://api.twitter.com/1.1/statuses/user_timeline.json'

Но это не так с API поиска, я думаю, это из-за CURL.Я уже проверил, что параметр, который я использую, необходим, так как документы говорят об этом.

Кроме того, библиотека twurl , используемая для доступа к токену и одновременной обработки URL-адреса и параметров для получения окончательного URL-адреса.(насколько я понимаю)

Ниже код twurl:

import urllib.request, urllib.parse, urllib.error
import oauth
import hidden

# https://apps.twitter.com/
# Create App and get the four strings, put them in hidden.py

def augment(url, parameters):
    secrets = hidden.oauth()
    consumer = oauth.OAuthConsumer(secrets['consumer_key'], secrets['consumer_secret'])
    token = oauth.OAuthToken(secrets['token_key'], secrets['token_secret'])

    oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer,
                    token, http_method='GET', http_url=url,
                    parameters=parameters)
    #below is the main function galls!!
    oauth_request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(),
                               consumer, token)
    return oauth_request.to_url()

Ниже скрыт, где хранятся все ключ и токен:

def oauth():
    return {"consumer_key": "2HZq407wF.................",
            "consumer_secret": "OsemLubDmCcQq5Y3q............",
            "token_key": "75230340-2SGPJWWn..............",
            "token_secret": "NZcII332Y3EI.............."}

Я искал решение, и большинство из них, кажется, используют urllib2 для CURL, который, я не думаю, совместим с python 3?Есть ли у вас предложения?Я как бы застрял на этом шаге и никуда не ухожу.

Спасибо, yall

...