Python socketIO-client 运行这段关于 socket client 的代码为甚么不会返回信息,已经困扰了好多天。

2017-05-25 13:47:15 +08:00
 longzhixin
""" An example for Python Socket.io Client
    Requires: six,socketIO_client    
""" 
from socketIO_client import SocketIO, BaseNamespace
import json
import time
import re
import hmac
import hashlib
import base64

import logging
logging.getLogger('socketIO-client').setLevel(logging.DEBUG)
logging.basicConfig()

access_key = ""
secret_key = “"

def get_tonce():
        return int(time.time() * 1000000)

def get_postdata():
        post_data = {}
        tonce = get_tonce()
        post_data['tonce'] = tonce
        post_data['accesskey'] = access_key
        post_data['requestmethod'] = 'post'

        if 'id' not in post_data:
                post_data['id'] = tonce

        #modefy here to meet your requirement
        post_data['method'] = 'subscribe'
        post_data['params'] = ['order_cnybtc', 'order_cnyltc', 'account_info']
        return post_data

def get_sign(pdict):
        pstring = ''
        fields = ['tonce', 'accesskey', 'requestmethod', 'id', 'method', 'params']
        for f in fields:
                if pdict[f]:
                        if f == 'params':
                                param_string=str(pdict[f])
                                param_string=param_string.replace('None', '')
                                param_string=re.sub("[\[\] ]","",param_string)
                                param_string=re.sub("'",'',param_string)
                                pstring+=f+'='+param_string+'&'
                        else:
                                pstring+=f+'='+str(pdict[f])+'&'
                else:
                        pstring+=f+'=&'
        pstring=pstring.strip('&')
        phash = hmac.new(secret_key, pstring, hashlib.sha1).hexdigest()

        return base64.b64encode(access_key + ':' + phash)

class Namespace(BaseNamespace):

    def on_connect(self):
        print('[Connected]')

    def on_disconnect(self):
        print('[Disconnect]')

    def on_ticker(self, *args):
        print('ticker', args)

    def on_trade(self, *args):
        print('trade', args)

    def on_grouporder(self, *args):
        print('grouporder', args)

    def on_order(self, *args):
        print('order', args)

    def on_account_info(self, *args):
        print('account_info', args)

    def on_message(self, *args):
        print('message', args)

    def on_error(self, data):
        print(data)

socketIO = SocketIO('https://websocket.btcchina.com')
namespace = socketIO.define(Namespace)
namespace.emit('subscribe', 'marketdata_cnybtc')
namespace.emit('subscribe', 'marketdata_cnyltc')
namespace.emit('subscribe', 'grouporder_cnybtc')
namespace.emit('subscribe', 'grouporder_cnyltc')

payload = get_postdata()
arg = [json.dumps(payload), get_sign(payload)]
namespace.emit('private', arg)

socketIO.wait(seconds=1)
namespace.disconnect()

当我运行 namespace.emit('subscribe', 'marketdata_cnybtc')
namespace.emit('subscribe', 'marketdata_cnyltc')
namespace.emit('subscribe', 'grouporder_cnybtc')
namespace.emit('subscribe', 'grouporder_cnyltc')
这个后,发现根本没有返回东西
/home/daneel/anaconda3/envs/btchina/bin/python /home/daneel/PycharmProjects/btchina/WebsocketClient.py
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [engine.io transport selected] websocket
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [engine.io heartbeat reset]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet sent] 2["subscribe", "marketdata_cnybtc"]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet sent] 2["subscribe", "marketdata_cnyltc"]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet sent] 2["subscribe", "grouporder_cnybtc"]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet sent] 2["subscribe", "grouporder_cnyltc"]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet sent] 2["private", ["{\"accesskey\": \"safadfasafa\", \"id\": 1495691413689407, \"requestmethod\": \"post\", \"tonce\": 1495691413689407, \"params\": [\"order_cnybtc\", \"order_cnyltc\", \"account_info\"], \"method\": \"subscribe\"}", "fdsafdsdafdfafdasfsafasdfas="]]
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io packet received] 0
DEBUG:socketIO-client:websocket.btcchina.com:443/socket.io [socket.io connected]
('message', ('0',))
[Connected]
[Disconnect]

6910 次点击
所在节点    Python
25 条回复
longzhixin
2017-05-27 17:21:01 +08:00
@wwqgtxx 是他服务器的事情么?那段 html 昨天还能运行,然后我在 console 里面能接收数据,结果今天一试啥都不行了。你能告诉我怎么确定服务器没事么?
longzhixin
2017-05-27 17:24:12 +08:00
https://www.btcchina.com/apidocs/spot-exchange-market-data-websocket-api-zh.html 不同版本的代码都在这里,这是比特币中国给的 api,我按照他给的 github 代码,直接运行,就不行。我是想把这个实时数据抓下来,做一些分析。结果就卡在这第一步了。
wwqgtxx
2017-05-27 17:25:03 +08:00
也有可能是他换接口之类的了
另外 socket.io 支持使用 http session 来做登录验证,而我这里并没有登录,你那里过了一天,可能 session 失效了,可能是必须要先登录才能拿到信息吧
longzhixin
2017-05-27 17:28:47 +08:00
@wwqgtxx 我们订阅的公开的市场信息,那个不需要登录。![]( )
guyigenius
2017-09-04 08:30:16 +08:00
楼主你好,我用比特币中国开发者平台上提供的 WebSocket 市场数据 API ( https://www.btcchina.com/apidocs/spot-exchange-market-data-websocket-api-zh.html )上面提供的 Python 版本 Socket.io 客户端示例源代码( https://github.com/BTCChina/btcchina-websocket-api-python )是可以正确运行并且获得返回结果的。我的运行环境是 Python 2.7.13 ( README.md 里面说了 compiled in python 2.7.x ),socket.io client library 使用的是 socketIO-client 0.7.2 ( https://pypi.python.org/pypi/socketIO-client/0.7.2 )。
至于你的代码,我觉得除了 secret_key = “"这行双引号的 Typo 以外,其他地方没有什么问题,和 socketIO.wait(seconds=1)关系不大,并不是“只调用一次他只会处理一个请求就退出了”,只是运行多久的差别。我的运行结果如下:

考虑到是三个多月前的帖子,我估计上去应该是那段时间服务器的问题,所以你肯定已经解决了问题,但是我还是回帖希望可以给你或者以后看到这贴的朋友们提供一些参考和帮助。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/363712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX