J'essaie d'utiliser l'API de cgminer
en utilisant Python. Je suis particulièrement intéressé par l'utilisation de la bibliothèque requests
.
Je comprends comment faire les choses de base dans requests
, mais cgminer
veut être un peu plus précis. J'aimerais rétrécir
import socket
import json
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 4028))
sock.send(json.dumps({'command': 'summary'}))
en utilisant requests
à la place.
Comment spécifier le port en utilisant cette bibliothèque, et comment envoyer une telle requête json et attendre qu'une réponse soit stockée dans une variable?
En tant que quelqu'un qui a appris certains des pièges courants du python mise en réseau à la dure, j'ajoute cette réponse pour souligner un point important mais facile à gâcher à propos du - 1er argument de requests.get()
:
localhost
est un alias que votre ordinateur résout en 127.0.0.1
, l'adresse IP de son propre adaptateur de bouclage. foo.com
est également un alias, juste un qui est résolu plus loin de l'hôte.
requests.get('foo.com:4028') #<--fails
requests.get('http://foo.com:4028') #<--works usually
& pour les bouclages:
requests.get('http://127.0.0.1:4028') #<--works
requests.get('http://localhost:4028') #<--works
celui-ci nécessite import socket
& vous donne l'adresse IP locale de votre hôte (aka, votre adresse dans votre propre LAN); cela va un peu plus loin de l'hôte que d'appeler simplement localhost
, mais pas tout le chemin vers l'open-internet:
requests.get('http://{}:4028'.format(socket.gethostbyname(socket.gethostname()))) #<--works
Vous pouvez spécifier le port de la demande avec deux points comme vous le feriez dans un navigateur, tel que r = requests.get('http://localhost:4028')
. Cela se bloquera jusqu'à ce qu'une réponse soit reçue, ou jusqu'à ce que la demande expire, vous n'avez donc pas à vous soucier d'attendre une réponse.
Vous pouvez envoyer des données JSON en tant que demande POST en utilisant la méthode requests.post
Avec le paramètre data
, comme
import json, requests
payload = {'command': 'summary'}
r = requests.post('http://localhost:4028', data=json.dumps(payload))
L'accès à la réponse est alors possible avec r.text
Ou r.json()
.
Notez que les demandes sont une bibliothèque HTTP - si ce n'est pas HTTP que vous voulez, je ne pense pas qu'il soit possible d'utiliser des demandes.