py-ipfs-http-client

by ipfs-shipyard

ipfs-shipyard / py-ipfs-http-client

A python client library for the IPFS API

460 Stars 118 Forks Last release: about 2 months ago (0.6.1) MIT License 508 Commits 20 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

py-ipfs-http-client

Made by the IPFS Community IRC #py-ipfs on chat.freenode.net Matrix #py-ipfs:ninetailed.ninja Standard README Compliant PyPI Package ipfshttpclient Build Status

Python IPFS HTTP Client Library

Check out the HTTP Client reference for the full command reference.

Note: The

ipfsapi
PIP package and Python module have both been renamed to
ipfshttpclient
! See the relevant section of the CHANGELOG for details. There is also a
ipfsApi
library from which this library originated that is completely unmaintained and does not work with any recent go-IPFS version.

Note: This library occasionally has to change to stay compatible with the IPFS HTTP API. Currently, this library is tested against go-ipfs v0.6.0. We strive to support the last 5 releases of go-IPFS at any given time; go-IPFS v0.4.22 therefore being to oldest supported version at this time.

Table of Contents

Install

Install with pip:

pip install ipfshttpclient

Development install from Source

# Clone the source repository
git clone https://github.com/ipfs/py-ipfs-http-client.git
cd py-ipfs-http-client

Link ipfs-api-client into your Python Path

flit install --pth-file

Usage

Basic use-case (requires a running instance of IPFS daemon):

>>> import ipfshttpclient
>>> client = ipfshttpclient.connect()  # Connects to: /dns/localhost/tcp/5001/http
>>> res = client.add('test.txt')
>>> res
{'Hash': 'QmWxS5aNTFEc9XbMX1ASvLET1zrqEaTssqt33rVZQCQb22', 'Name': 'test.txt'}
>>> client.cat(res['Hash'])
'fdsafkljdskafjaksdjf\n'

Please note: You should specify the address for an IPFS API server, using the address of a gateway (such as the public

ipfs.io
one at
/dns/ipfs.io/tcp/443/https
) will only give you extremely limited access and may not work at all. If you are only interested in downloading IPFS content through public gateway servers then this library is unlikely of being of much help.

For real-world scripts you can reuse TCP connections using a context manager or manually closing the session after use:

import ipfshttpclient

Share TCP connections using a context manager

with ipfshttpclient.connect() as client: hash = client.add('test.txt')['Hash'] print(client.stat(hash))

Share TCP connections until the client session is closed

class SomeObject: def init(self): self._client = ipfshttpclient.connect(session=True)

def do_something(self):
    hash = self._client.add('test.txt')['Hash']
    print(self._client.stat(hash))

def close(self):  # Call this when your done
    self._client.close()

Administrative functions:

>>> client.id()
{'Addresses': ['/ip4/127.0.0.1/tcp/4001/ipfs/QmS2C4MjZsv2iP1UDMMLCYqJ4WeJw8n3vXx1VKxW1UbqHS',
               '/ip6/::1/tcp/4001/ipfs/QmS2C4MjZsv2iP1UDMMLCYqJ4WeJw8n3vXx1VKxW1UbqHS'],
 'AgentVersion': 'go-ipfs/0.4.10',
 'ID': 'QmS2C4MjZsv2iP1UDMMLCYqJ4WeJw8n3vXx1VKxW1UbqHS',
 'ProtocolVersion': 'ipfs/0.1.0',
 'PublicKey': 'CAASpgIwgg ... 3FcjAgMBAAE='}

Pass in API options:

>>> client.pin.ls(type='all')
{'Keys': {'QmNMELyizsfFdNZW3yKTi1SE2pErifwDTXx6vvQBfwcJbU': {'Count': 1,
                                                             'Type': 'indirect'},
          'QmNQ1h6o1xJARvYzwmySPsuv9L5XfzS4WTvJSTAWwYRSd8': {'Count': 1,
                                                             'Type': 'indirect'},
          …

Add a directory and match against a filename pattern:

>>> client.add('photos', pattern='*.jpg')
[{'Hash': 'QmcqBstfu5AWpXUqbucwimmWdJbu89qqYmE3WXVktvaXhX',
  'Name': 'photos/photo1.jpg'},
 {'Hash': 'QmSbmgg7kYwkSNzGLvWELnw1KthvTAMszN5TNg3XQ799Fu',
  'Name': 'photos/photo2.jpg'},
 {'Hash': 'Qma6K85PJ8dN3qWjxgsDNaMjWjTNy8ygUWXH2kfoq9bVxH',
  'Name': 'photos/photo3.jpg'}]

Or add a directory recursively:

>>> client.add('fake_dir', recursive=True)
[{'Hash': 'QmQcCtMgLVwvMQGu6mvsRYLjwqrZJcYtH4mboM9urWW9vX',
  'Name': 'fake_dir/fsdfgh'},
 {'Hash': 'QmNuvmuFeeWWpxjCQwLkHshr8iqhGLWXFzSGzafBeawTTZ',
  'Name': 'fake_dir/test2/llllg'},
 {'Hash': 'QmX1dd5DtkgoiYRKaPQPTCtXArUu4jEZ62rJBUcd5WhxAZ',
  'Name': 'fake_dir/test2'},
 {'Hash': 'Qmenzb5J4fR9c69BbpbBhPTSp2Snjthu2hKPWGPPJUHb9M',
  'Name': 'fake_dir'}]

This module also contains some helper functions for adding strings and JSON to IPFS:

>>> lst = [1, 77, 'lol']
>>> client.add_json(lst)
'QmQ4R5cCUYBWiJpNL7mFe4LDrwD6qBr5Re17BoRAY9VNpd'
>>> client.get_json(_)
[1, 77, 'lol']

Use an IPFS server with basic auth (replace username and password with real creds):

>>> import ipfshttpclient
>>> client = ipfshttpclient.connect('/dns/ipfs-api.example.com/tcp/443/https', auth=("username", "password"))

Pass custom headers to the IPFS daemon with each request: ```py

import ipfshttpclient headers = {"CustomHeader": "foobar"} client = ipfshttpclient.connect('/dns/ipfs-api.example.com/tcp/443/https', headers=headers) ```

Connect to the IPFS daemon using a Unix domain socket (plain HTTP only): ```py

import ipfshttpclient client = ipfshttpclient.connect("/unix/run/ipfs/ipfs.sock") ```

Documentation

Documentation (currently mostly API documentation unfortunately) is available on IPFS:

https://ipfs.io/ipns/12D3KooWEqnTdgqHnkkwarSrJjeMP2ZJiADWLYADaNvUb6SQNyPF/docs/

The

ipfs
command-line Client documentation may also be useful in some cases.

Migrating from
0.4.x
to
0.6.0

Please see the CHANGELOG for the minor breaking changes between these releases.

Featured Projects

Projects that currently use py-ipfs-http-client. If your project isn't here, feel free to submit a PR to add it!

Contributing

Easy Tasks

Over time many smaller day-to-day tasks have piled up (mostly supporting some newer APIs). If want to help out without getting too involved picking up one of tasks of our help wanted issue list would go a long way towards making this library more feature-complete. πŸ‘

Bug reports

You can submit bug reports using the GitHub issue tracker.

Pull requests

Pull requests are welcome. Before submitting a new pull request, please make sure that your code passes both the code formatting (PEP-8 with tab indentation) and typing (PEP-484 using mypy) checks:

$ tox -e styleck -e typeck

As well as the unit tests:

$ tox -e py3 -e py3-httpx

If you are unsure, don't hasitate to just submit your code and a human will take a look. πŸ™‚

If you can, Please make sure to include new unit tests for new features or changes in behavior. We aim to bring coverage to 100% at some point.

Installing the pre-commit Hook

You can arrange for the code style and typing tests to be run automatically before each commit by installing the GIT

pre-commit
hook:
$ ./tools/pre-commit --install

Chat with Us (IRC/Matrix)

You can find us on #py-ipfs on chat.freenode.org or in our Matrix chat room. Join us if you have any suggestions, questions or if you just want to discuss IPFS and Python in general.

Please note that the channel is not monitored all the time and hence you may only receive a reply to your message later that day. Using Matrix makes it easier to stay connected in the background, so please prefer the Matrix option or use an IRC bouncer.

License

This code is distributed under the terms of the MIT license. Details can be found in the file LICENSE in this repository.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.