10

Google App Engineでデータストアを構築して、多数の企業のStockTwitsからストリームデータを収集しようとしています。基本的にTwitterで行ったものを複製していますが、HTTPExceptionが発生しています。URLの1つでSSL証明書が無効または欠落しています。別の会社を見るためにURLを変更しましたが、同じ結果が得られました。

データをプルするコードは次のとおりです。

class StreamHandler(webapp2.RequestHandler):

def get(self):

    tickers = ['AAPL','GOOG', 'IBM', 'BAC', 'INTC',
               'DELL', 'C', 'JPM', 'WFM', 'WMT', 
               'AMZN', 'HOT', 'SPG', 'SWY', 'HTSI', 
               'DUK', 'CEG', 'XOM', 'F', 'WFC', 
               'CSCO', 'UAL', 'LUV', 'DAL', 'COST', 'YUM',
               'TLT', 'HYG', 'JNK', 'LQD', 'MSFT',
               'GE', 'LVS', 'MGM', 'TWX', 'DIS', 'CMCSA',
               'TWC', 'ORCL', 'WPO', 'NYT', 'GM', 'JCP', 
               'LNKD', 'OPEN', 'NFLX', 'SBUX', 'GMCR', 
               'SPLS', 'BBY', 'BBBY', 'YHOO', 'MAR', 
               'L', 'LOW', 'HD', 'HOV', 'TOL', 'NVR', 'RYL', 
               'GIS', 'K', 'POST', 'KRFT', 'CHK', 'GGP', 
               'RSE', 'RWT', 'AIG', 'CB', 'BRK.A', 'CAT']

    for i in set(tickers):

        urlst = 'https://api.stocktwits.com/api/2/streams/symbol/'
        tickerstringst = urlst + i + '.json'
        tickurlst = urllib2.Request(tickerstringst)
        sttweets = urllib2.urlopen(tickurlst)
        stcode = sttweets.getcode()

        if stcode == 200:
            stresults = json.load(sttweets, 'utf-8')
            if "messages" in stresults:
                stentries = stresults["messages"]
                for stentry in stentries:
                    sttweet = streamdata()
                    stcreated = stentry['created_at']
                    sttweetid = str(stentry['id'])
                    sttweettxt = stentry['body']
                    sttweet.ticker = i
                    sttweet.created_at = stcreated
                    sttweet.tweet_id = sttweetid
                    sttweet.text = sttweettxt
                    sttweet.source = "StockTwits"
                    sttweet.put()

そして、これがエラーを示すログファイルです。私はこれをローカルのPython開発サーバーで実行しています。

WARNING  2012-12-06 23:20:12,993 dev_appserver.py:3655] Could not initialize images API; you are likely missing the Python "PIL" module. ImportError: No module named _imaging
INFO     2012-12-06 23:20:13,017 dev_appserver_multiprocess.py:655] Running application dev~jibdantestv2 on port 8088: http://localhost:8088
INFO     2012-12-06 23:20:13,017 dev_appserver_multiprocess.py:657] Admin console is available at: http://localhost:8088/_ah/admin   
INFO     2012-12-06 23:20:54,776 dev_appserver.py:3092] "GET /_ah/admin HTTP/1.1" 302 -
INFO     2012-12-06 23:20:54,953 dev_appserver.py:3092] "GET /_ah/admin/datastore HTTP/1.1" 200 -
INFO     2012-12-06 23:20:55,280 dev_appserver.py:3092] "GET /_ah/admin/images/google.gif HTTP/1.1" 200 -
INFO     2012-12-06 23:21:04,617 dev_appserver.py:3092] "GET /_ah/admin/cron HTTP/1.1" 200 -
INFO     2012-12-06 23:21:04,815 dev_appserver.py:3092] "GET /_ah/admin/images/google.gif HTTP/1.1" 200 -
WARNING  2012-12-06 23:21:07,392 urlfetch_stub.py:448] Stripped prohibited headers from URLFetch request: ['Host']
ERROR    2012-12-06 23:21:09,921 webapp2.py:1553] Invalid and/or missing SSL certificate for URL: https://api.stocktwits.com/api/2/streams/symbol/GIS.json
Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__
rv = self.handle_exception(request, response, e)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__
rv = self.router.dispatch(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__
return handler.dispatch()
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
  File "C:\Users\Tank\Documents\Aptana Studio 3 Workspace\jibdantestv2\main.py", line 38, in get
sttweets = urllib2.urlopen(tickurlst)
  File "C:\Python27\lib\urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 400, in open
response = self._open(req, data)
  File "C:\Python27\lib\urllib2.py", line 418, in _open
'_open', req)
  File "C:\Python27\lib\urllib2.py", line 378, in _call_chain
result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
  File "C:\Python27\lib\urllib2.py", line 1180, in do_open
r = h.getresponse(buffering=True)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\dist27\httplib.py", line 502, in getresponse
raise HTTPException(str(e))
HTTPException: Invalid and/or missing SSL certificate for URL: https://api.stocktwits.com/api/2/streams/symbol/GIS.json
INFO     2012-12-06 23:21:09,937 dev_appserver.py:3092] "GET /add_data HTTP/1.1" 500 -
4

3 に答える 3

11

GAEで問題が発生している理由はわかりませんが、api.stocktwits.comから返される証明書が、サブジェクトの共通名(ssl2361.cloudflare.com)のサーバー名と一致しないことに気付きました。サブジェクト代替名の1つ(「DNS名= *。stocktwits.com」)。サブジェクトの代替名がサポートされていないか、ここで使用されているワイルドカード名では機能しない可能性があります。(これはGoogleのバグ/不足している機能になります。)

GAE urlfetch.fetch APIを呼び出すことで、問題を再現し、回避策を見つけることができました。(ご存知かもしれませんが、GAEではurllib2はurlfetchのラッパーとして実装されています。)

urllib2.Requestあなたからあなたまでの行から始めて、次のようjason.loadに置き換えます:

sttweets = urlfetch.fetch(tickerstringst, validate_certificate=False)
stcode = sttweets.status_code

if stcode == 200:
    stresults = json.loads(sttweets.content, 'utf-8')

そして、実際のサイトで実際に取っている保証とともに、エラーはなくなります(ただし、トラフィックは暗号化されている必要があります)。

現在、urlfetch.fetchGAEAPIドキュメントには次のように書かれています。

validate_certificate 基盤となる実装は現在デフォルトでFalseになっていますが、近い将来デフォルトでTrueになります。

さて、validate_certificateがデフォルトでになっているように見えるので、将来へようこそTrue

これはおそらくGAEurlfetch.fetchのバグ(または親切にしたい場合は不足している機能)であり、そのようにGoogleに報告することをお勧めします。

于 2012-12-07T21:26:06.700 に答える
-1

私はGAEにあまり詳しくないので、APIエンドポイントへのアクセスで問題になる可能性があります。また、SSLリクエストを実行するために適切なPythonライブラリを使用していない可能性もありますが、Twitterリクエストに同じコードを使用していると言ったので、そうではない可能性があります。

同じコードをローカルで使用するか、GAEではなく別のサーバーで使用してみてください。

于 2012-12-07T18:57:30.433 に答える
-1

同じ問題が発生し、関数でvalidate_certificateパラメーターをに設定しました。Falseurlfetch.fetch()

    urlfetch.fetch(url, validate_certificate=false) #validates certificate

validate_certificateこれはうまくいきませんでした。パラメータを処理する方法の内部バグであることがわかりました。に設定されている場合は検証し、設定されている場合Falseは証明書を検証しませんTrue。少なくとも、これが実行しているように見えます。

    urlfetch.fetch(url, validate_certificate=true) #does not validate certificate 
于 2014-07-05T03:21:48.303 に答える