- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试连接到groovyshark。因为 python 是我选择的语言。但我已经碰壁了。看来groveshark最近改变了他们的协议(protocol)的一部分,或者我可能遇到了python的限制。
我正在与来自github的JackTheRipper51“一起”工作,他为groveshark制作了这个库:https://github.com/jacktheripper51/groove-dl它实际上不是一个库,但我很快就重新编码为一个库。
本周早些时候,它运行良好,我能够将它用于我的项目。但两天前,它开始在 getToken 函数上失败,httplib 开始返回 httplib.BadStatusLine: ''
根据我的研究,这意味着服务器提前关闭了连接。
通过这项研究,我开始研究groveshark的javascript和flash源代码,但这并没有返回任何有值(value)的东西。所以我做了任何一个理智的人花了 5 个小时查看反编译的 ActionScript 而之前从未在其中编写过一行代码的人都会做的事情,并将其归咎于grovesharks服务器。
具体来说,我认为groveshark可能会拒绝具有Connection: close
header 的连接。因此,我决定在 Chrome 的 REST Console
扩展中测试它。
我让 python 脚本转储它正在编码的 json,然后将其粘贴到 Rest 控制台中,点击 POST,它返回正常,并带有预期的数据。我现在确信我是对的并非不可能。
我的下一步是在 httplib2 中进行编码(因为它支持 Connection: keep-alive
),但问题仍然存在。
我已经在wireshark中进行了测试(删除https中的SSL,它确实发送Connection: keep-alive
,这会导致groveshark响应,但需要https
)
我只修改了一小部分代码。
完全改变了 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 小时的 session ,我敢打赌这已列入议程。
更新:JackTheRipper51 告诉我,无论您发送什么内容,向grooveshark.com/more.php 发出的所有 ssl 请求都会发生这种情况。这让我相信这是Python在捉弄我们。
更新2:
JackTheRipper51 刚刚告诉我它确实是 python。这是他的帖子:
I didn't need C at all. Prepare to be outraged. A simple
curl -H "Content-Type: text/plain" -d "@jsontest" "https://grooveshark.com/more.php?getCommunicationToken" -v on a linux
box got me a token... jsontest here being
{"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"}}
Even when the json is not syntactically correct, it always returns at least some headers! It's been Python all along...
剩下的唯一问题是为什么 python 这样做?
最佳答案
问题已“解决”,或已找到原因。
JackTheRipper 将错误提交给 python,他们确认这确实是 ssl 的问题,更具体地说是 openssl 0.9.8,导致连接超时。
关于python - Grooveshark 提前关闭连接 (httplib.BadStatusLine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11059229/
“AAaarg”!请帮忙!!! 这是我正在尝试做的... 我有一个 Django 站点 site1,它需要访问另一个服务 site2 的 API。然而,为了做到这一点,site1 需要使用它自己的登录
以下代码引发错误“socket.gaierror: [Errno -2] Name or service not known”。 import httplib, urllib attrs = urll
我正在尝试获取似乎重定向不止一次的页面的最终 URL。在您的浏览器中尝试这个示例 URL,并将其与我的代码片段底部的最终 URL 进行比较: Link that redirects more than
我有一个在端口 6868 上运行的本地服务器。从技术上讲,它是使用 Express 构建的由 Node.js 驱动的微型站点。它实际上有一个“/push” Controller 读取一些数据并写入控制
我使用带有私钥的httplib.HTTPSConnection: h = httplib.HTTPSConnection(url, key_file='../cert/priv.pem', cert_
我有以下代码要使用: def createCon(host,auth): con = httplib.HTTPSConnection(host) return con def _rea
我有一个脚本,它使用 Python 中的 httplib 获取互联网上很多页面的 HTTP header 。 我的问题是关于 specific domain (可能还有其他人),httplib 引发异
我正在尝试使用 httplib 将信用卡信息发送到 authorize.net。当我尝试发布请求时,我得到以下回溯: File "./lib/cgi_app.py", line 139, in run
我正在尝试弄清楚如何通过代理将数据发送到服务器。我希望这可以通过 tor 实现,但是因为 tor 使用 SOCKS,所以使用 httplib 显然不可能(如果我错了请纠正我) 这是我现在拥有的 imp
我正在使用 python 为 elgg 编写一个 REST 客户端,即使请求成功,我也会得到以下响应: Traceback (most recent call last): File "testc
我正在实现一个从各种服务器获取网页的小服务。我需要能够配置不同类型的超时。我尝试过使用套接字的 settimeout 方法,但它并不完全符合我的要求。这是问题所在。 我需要指定初始 DNS 查找的超时
我正在使用 httplib 向服务器发布帖子。我正在拿回 303 See Other。我如何查看重定向消息“303 See Other”并没有真正帮助。 谢谢 conn1 = httplib.HTTP
问题是这样的: 我有一个 Django 网站。 我正在尝试使用 httplib 向站点发送 POST 请求。 当我尝试发送 POST 请求时,Django 需要 CSRF token 。 如何才能毫无
我想编写一个 python 脚本,它将请求 reddit 帖子 url,转到页面,使用指定帐户登录并为帖子点赞和注销。 A) 这可以用 python 完成吗? B) 我该怎么做?如果您可以提供很棒的代
我想使用 HTTPS 协议(protocol)从 python 的 httplib 库发送 Get 请求。 我已经浏览了多个答案,建议如何在使用 http 协议(protocol)时执行此操作,但它们
我正在使用 suds 0.3.6。创建 suds 客户端时,随机出现错误: httplib.py,_read_status(),第 355 行,类 httplib.BadStatusLine' 这是用
我发现 httplib.HTTPSConnection 不执行自动服务器证书检查。据我了解的问题,我需要手动添加该功能,例如通过按照描述对此类进行子类化 here . 由于我使用的是 Python2.
默认情况下,httplib 调试发送、 header 和回复信息作为 logger.info 返回, 如何将发送、 header 和重播显示为调试信息的一部分? import requests imp
我想通过 HTTP GET 请求将数据发送到我的服务器,每 1-2 秒一次。 我应该每次都创建一个新连接,还是应该保持连接打开并继续通过同一连接发送请求?如果我采用后一种方法,httplib 会保持连
httplib.HTTPException 是否有错误代码?如果是这样,我如何从异常实例中获取它们?感谢您的帮助。 最佳答案 httplib 模块不使用异常来传达 HTTP 响应,只是真正的错误(无效
我是一名优秀的程序员,十分优秀!