1

グルーヴシャークに接続しようとしています。このPythonは、私の選択した言語です。しかし、私はレンガの壁にぶつかりました。グルーヴシャークが最近プロトコルの一部を変更したように見えるか、Pythonの制限に達した可能性があります。

私はgithubのJackTheRipper51と「一緒に」作業しています。彼は、grooveshark用にこのライブラリを作成しました。https://github.com/jacktheripper51/groove-dl 実際にはライブラリではありませんが、すぐにライブラリに再コーディングしました。

今週の初めにそれはうまくいきました、そして私はそれを私のプロジェクトに使うことができました。しかし、2日前にgetToken関数で失敗し始め、httplibが戻り始めましたhttplib.BadStatusLine: ''。これは、私の調査によると、サーバーが接続を早期に閉じたことを意味します。

この調査から、groovesharkのjavascriptとflashソースを調べ始めましたが、それでも価値のあるものは何も返されませんでした。だから私は、逆コンパイルされたアクションスクリプトを5時間かけて、以前に行をコーディングしたことがないという正気の人なら誰でもできることをして、groovesharksサーバーのせいにしました。

具体的には、groovesharkがConnection: closeヘッダーを特徴とする接続を拒否する可能性があると考えました。REST Consoleそのため、Chromeの拡張機能でテストすることにしました。

Pythonスクリプトにエンコードしていたjsonをダンプさせ、それをRest Consoleに貼り付け、POSTを押すと、期待どおりのデータで正常に返されました。私は今、自分が正しいことは不可能ではないと確信していました。

私の次のステップは、私が持っているhttplib2(サポートしているConnection: keep-alive)でコーディングすることでしたが、問題は解決しません。

私はwiresharkでテストしました(httpsでSSLを削除すると、送信されますConnection: keep-alive。これにより、groovesharkが応答しますが、https required

コードのごく一部のみを変更しました。

完全に変更されたgetToken()

def getToken():
    global staticHeader, _token
    post = {}
    post["parameters"] = {}
    post["parameters"]["secretKey"] = hashlib.md5(staticHeader["session"]).hexdigest()
    post["method"] = "getCommunicationToken"
    post["header"] = staticHeader
    post["header"]["client"] = "htmlshark"
    post["header"]["clientRevision"] = "20120312"
    header = {"User-Agent": _useragent, "Referer": _referer, "Content-Type":"application/json", "Cookie":"PHPSESSID=" + staticHeader["session"], "Connection":"keep-alive"}
    response, content = http.request("https://grooveshark.com/more.php?getCommunicationToken", "POST" ,body = json.JSONEncoder().encode(post), headers = header)
    print response
    #_token = json.JSONDecoder().decode(gzip.GzipFile(fileobj=(StringIO.StringIO(conn.getresponse().read()))).read())["result"]
    #print _token

httplib2が初期化するものを追加しました:

http = httplib2.Http()

httplib2をインポートしました:

import httplib, httplib2

また、jsonコンストラクターの名前を変更しました。これは、より説明的なものが必要だったためです。

完全なトレースバックは次のとおりです。

Traceback (most recent call last):
  File "C:\Users\Delusional Logic\Documents\GitHub\groove-dl\python\groove.py", line 141, in <module>
    getToken()
  File "C:\Users\Delusional Logic\Documents\GitHub\groove-dl\python\groove.py", line 51, in getToken
    response, content = http.request("https://grooveshark.com/more.php?getCommunicationToken", "POST" ,body = json.JSONEncoder().encode(post), headers = header)
  File "C:\Python27\lib\site-packages\httplib2-0.7.4-py2.7.egg\httplib2\__init__.py", line 1544, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "C:\Python27\lib\site-packages\httplib2-0.7.4-py2.7.egg\httplib2\__init__.py", line 1294, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "C:\Python27\lib\site-packages\httplib2-0.7.4-py2.7.egg\httplib2\__init__.py", line 1264, in _conn_request
    response = conn.getresponse()
  File "C:\Python27\lib\httplib.py", line 1027, in getresponse
    response.begin()
  File "C:\Python27\lib\httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "C:\Python27\lib\httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine: ''

BadStatusLineの原因と、それを修正するにはどうすればよいですか。

PS私は、これが壊れる前日に彼らが8時間の会議を行ったことを知っています、私はあなたにこれが議題にあったに違いありません。

更新:JackTheRipper51は、送信内容に関係なく、grooveshark.com/more.phpへのすべてのSSLリクエストでこれが発生することを通知しました。これは、Pythonが私たちにトリックをプレイしていることを信じさせます。

更新2:

JackTheRipper51は、それが確かにpythonであることを私に知らせました。これが彼の投稿です:

私はCをまったく必要としませんでした。憤慨する準備をしなさい。シンプルな

curl -H "Content-Type: text/plain" -d "@jsontest" "https://grooveshark.com/more.php?getCommunicationToken" -v on a linux

ボックスは私にトークンを手に入れました...jsontestはここにあります

{"header":{"client":"mobileshark","clientRevision":"20120227","privacy":0,"country":{"ID":63,"CC1":4611686018427388000,"CC2":0,"CC3":0,"CC4":0,"DMA":0,"IPR":0},"uuid":"BF5D03EE-91BB-40C9-BE7B-11FD43CAF0F0","session":"1d9989644c5eba85958d675b421fb0ac"},"method":"getCommunicationToken","parameters":{"secretKey":"230147db390cf31fc3b8008e85f8a7f1"}}

jsonが構文的に正しくない場合でも、常に少なくともいくつかのヘッダーを返します。それはずっとPythonでした...

残っている唯一の質問は、なぜpythonがこれを行っているのかということです。

4

1 に答える 1

1

問題が「解決」されたか、原因が判明しました。

JackTheRipperはエラーをpythonに送信しました。そこで、接続がタイムアウトする原因となったのは、実際にssl、より具体的にはopenssl0.9.8の問題であることが確認されました。

バグレポート: http: //bugs.python.org/issue15082

于 2012-06-16T10:34:53.367 に答える