Pythonを使用してcgminer
のAPIを利用しようとしています。 requests
ライブラリーの利用に特に興味があります。
requests
で基本的なことを行う方法は理解していますが、cgminer
はもう少し具体的にしたいです。縮小したい
import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 4028))
sock.send(json.dumps({'command': 'summary'}))
代わりにrequests
を使用します。
そのライブラリを使用してポートを指定する方法、およびそのようなjson要求を送信し、変数に格納される応答を待機する方法を教えてください。
リクエスト はHTTPライブラリです。
URLでポートを指定できます http://example.com:4028/ ....
しかし、私は急いで読むことができるものから ここcgminer
は [〜#〜] rpc [〜#〜] API(または JSON RPC ?)notan [〜#〜] http [〜#〜] インターフェイス。
python難しい方法でネットワーク化するという一般的な落とし穴のいくつかを学んだ人として、私はこの答えを追加して、混乱についての重要だが簡単な点を強調しています- requests.get()
の最初の引数:
localhost
は、コンピューターが127.0.0.1
(独自のループバックアダプターのIPアドレス)に解決するエイリアスです。 foo.com
もエイリアスであり、ホストからさらに離れて解決されるものです。
requests.get('foo.com:4028') #<--fails
requests.get('http://foo.com:4028') #<--works usually
&ループバックの場合:
requests.get('http://127.0.0.1:4028') #<--works
requests.get('http://localhost:4028') #<--works
これにはimport socket
が必要で、ホストのローカルIP(別名、独自のLAN内のアドレス)を提供します。ホストからlocalhost
を呼び出すよりも少し遠くに行きますが、オープンインターネットに至るわけではありません。
requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname()))) #<--works
r = requests.get('http://localhost:4028')
など、ブラウザーでの場合と同様に、コロンを使用して要求のポートを指定できます。これは、応答が受信されるまで、または要求がタイムアウトするまでブロックされるため、応答を待つことを心配する必要はありません。
JSONデータをPOSTリクエストとして _requests.post
_メソッドとdata
パラメーター を使用して送信できます。
_import json, requests
payload = {'command': 'summary'}
r = requests.post('http://localhost:4028', data=json.dumps(payload))
_
応答にアクセスするには、_r.text
_またはr.json()
を使用します。
リクエストはHTTPライブラリであることに注意してください-必要なHTTPではない場合、リクエストを使用することはできないと思います。