py3-pinterest
Unofficial Pinterest API implemented in python 3 that can do all Pinterest tasks like comment, pin, repin, follow, unfollow, and more.
It is implemented by directly calling the pinterest servers, mimicking an actual browser, so you don't need pinterest API key.
If you see any issues, or find bugs feel free to report them here on the github repo.
Community guides
Get started with pinterest automation
Automated posting to Pinterest (in Russian)
Install using pip
pip install py3-pinterest
NOTE: for each of the functionalities listed below there is a working example under the project root.
Create new instance of the API
pinterest = Pinterest(email='your email goes here', password='password goes here', username='look in pinterest url', cred_root='cred root dir')
cred_root is the dir (automatically created if missing) that will store some cookies and sessions, so you don't need to login before each request. Make sure you specify a path with read/write permissions.
Proxies example:
proxies = {"http":"http://username:password@proxy_ip:proxy_port"}
Pinterest(email='emai', password='pass', username='name', cred_root='cred_root', proxies=proxies)
The following features are currently supported
Login/Logout
NOTE: Pinterest integrated google recaptcha. This means we have to use web driver to login. For that reason you must have chrome installed on you computer, in order for the login to work.
If you want to use many accounts, you should associate proxy with each one of them and login only with that proxy
pinterest.login(proxy='ip_address:port')
Login will store auth cookies for later use. These cookies are usually valid for ~15 days, then you will start getting 403 and 401 errors, which means you need to call login again.
Login
Login is required to permit actions to the Pinterest servers. Login will store auth cookies for later use. These cookies are usually valid for ~15 days, then you will start getting 403 and 401 errors, which means you need to call login again.
pinterest.login()
pinterest.logout()
Load profile
You can load profile for currently logged in user or any user specified by username.
user_profile = pinterest.get_user_overview()
Board and pin management
Get all boards of user:
boards = pinterest.boards(username='username')
List all pins in board
pins = pinterest.board_feed(board_id=board_id)
If username is left blank, current logged in user will be used.
Delete pin
pinterest.delete_pin(pin_id='pin_id')
Repin
pinterest.repin(board_id='board_id', pin_id='pin_id')
Get ID of created pin, section, or board
All functions return the post/get data from the request. If you dig a little deeper by going myrequest.content you get the actual HTML response, which can then be turned into a dict by using JSON.
Example:
import json
pin_response = upload_pin(board_id='',
image_path='test.png',
description='TESTING PIN FUNCTIONALITY WITH ID FETCHING',
title='Foobar Barfood',
section_id=None,
link='')
response_data = json.loads(pin_response.content)
Some helpful notes on the response: Everything is stored inside the "resource_response" key. You can use that and grab all sorts of data like so:
# This is how you would access this information when creating a pin
id = response_data["resource_response"]["data"]["id"]
board_id = response_data["resource_response"]["data"]["board"]["id"]
section_id = response_data["resource_response"]["data"]["section"]["id"]
pinner_username = response_data["resource_response"]["data"]["pinner"]["username"]
pinner_id = response_data["resource_response"]["data"]["pinner"]["id"]
# If you wanted to access this information in a different circumstance,
# keep in mind that whatever you are creating should be the first level under "data"
# I.e, I created a board, and I want to get the board ID. It would now be:
board_id = response_data["resource_response"]["data"]["id"]
Get pinnable images
A pinterest feature they use to pin from websites
pinterest.get_pinnable_images(url='https://www.tumblr.com/search/food')
Pin
Pin image by web url:
pinterest.pin(board_id=board_id, image_url=image_url, description=description, title=title)
Pin image from local file:
pinterest.upload_pin(board_id=board_id, section_id=section_id, image_file=image_path, description=description, title=title, link=link)
Get home feed pins
home_feed_batch = pinterest.home_feed()
Get board recommendations (this is the 'more ideas' api)
rec_batch = pinterest.board_recommendations(board_id=board_id)
Get pin information by id
pinterest.load_pin(pin_id='pin_id')
Board Section support
pinterest.create_board_section(board_id=board_id, section_name=section_name)
pinterest.delete_board_section(section_id=section_id)
pinterest.get_board_sections(board_id=board_id)
You can also pin and repin to sections.
Follow/Unfollow
Follow
pinterest.follow_user(user_id='target_user_id', username='target_username')
Follow limit is 300 per day, after that they might place you on a watch list
Unfollow
pinterest.unfollow_user(user_id='target_user_id', username='target_username')
Unfollow limit is 350 per day, after that they might place you on a watch list
Get following
following_batch = pinterest.get_following(username='some_user')
If username is not provided current user will be used
Get followers
followers_batch=pinterest.get_user_followers(username='some_user')
If username is not provided current user will be used
Follow board
pinterest.follow_board(board_id=board_id)
Unfollow board
pinterest.unfollow_board(board_id=board_id)
Search
search_batch = pinterest.search(scope='boards', query='food')
Current pinterest scopes are: pins, buyable_pins, my_pins, videos, boards
Visual Search
pin_data = pinterest.load_pin(pin_id='pin_id')
search_batch = pinterest.visual_search(pin_data, x=10, y=50, w=100, h=100)
User interactions
Invite to board
pinterest.invite(board_id=board_id, user_id=target_user_id)
Delete board invite
pinterest.delete_invite(board_id=board_id, invited_user_id=target_user_id)
Get board invites
invites_batch = pinterest.get_board_invites(board_id=board_id)
Comment
pinterest.comment(pin_id=pin_id, text=comment_text)
Delete comment
pinterest.delete_comment(pin_id=pin_id, comment_id=comment_id)
Get Pin comments
pinterest.get_comments(pin_id='pin_id')
Send personal message
pinterest.send_message(conversation_id=conversation_id, pin_id="(pin_id)", message="hey")
Access to type suggestions you see in the search input
pinterest.type_ahead(term='apple')
Metadata
Release files for py3-pinterest 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| py3_pinterest-2.0.0.tar.gz | 22.0 kB | Without provenance | Details for py3_pinterest-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| py3_pinterest-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for py3_pinterest-2.0.0-py3-none-any.whl |
Total release size: 40.3 kB
Release files / py3_pinterest-2.0.0.tar.gz
| Download URL | py3_pinterest-2.0.0.tar.gz |
|---|---|
| Size | 22.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
245d52afa0a1ddc1a2f46c6dc8407403c333007d58c54ac33a16a73c0757f786
|
|
BLAKE2b-256 checksum How to use checksums |
5e5e0dc126d47fe8ce16cb7b956be4b31cf976b3f6202b8ef88ee1dcc0ae220b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Release files / py3_pinterest-2.0.0-py3-none-any.whl
| Download URL | py3_pinterest-2.0.0-py3-none-any.whl |
|---|---|
| Size | 18.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
69f186233f7e4961098222b0ee51a6a4578e522d377c9735b565927af5123ca4
|
|
BLAKE2b-256 checksum How to use checksums |
1913628d273f4a9f2203b046504854c1e955a650608ef1449c957444a1c7eb09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Security for py3-pinterest 2.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.