Posting pictures to Hive and Snaps using Python

in #python4 days ago

Screenshot by Dropbox Capture.png

Previously I showed how you can automate some Snaps posting.

You can see that tutorial here.

One thing missing from that code was the ability to post photographs.

Pictures are a big use of Snaps, it lends itself well to that purpose, and especially due to the fact a lot of Hive folks are not happy when you post just an image and a caption as an actual post.

Lots of dapps have come and gone that were Instagram replacements, I quite like photos as social media, so I am happy we have Snaps now for this.

To keep things simple your photo needs to already exist in the local directory. I am not including any code for taking a photo or selecting the image using a finder!

Beem Image Upload Library

Beem includes the feature for us, so it is a simple case of importing the appropriate classes with from beem.imageuploader import ImageUploader

You could of course use Imgur or whatever, but this keeps things "on the chain" as it were.

Uploading the Photo

Next we create our object

image_uploader = ImageUploader(hive_instance=hive)

You will note you have to authenticate first.

Don't worry, the full code will be shared at the end of the article, just trying to keep to what is different.

Now we can do the upload:

uploaded_image = image_uploader.upload(image_filename, account.name, image_name=image_filename)
image_url = uploaded_image["url"]
print("Uploaded your image as", image_url)

We get the URL back from the uploaded image in the ['url'] value, and for ease of sharing I just use that twice when I create the markdown text string:

picture_markdown = f"![{image_url}]({image_url})"

Really we should have proper alt text here but I am sure you can add that without my help.

Full Code for Posting Image Snaps

Here is a full script for posting images to Snaps from your command line using Python:


# imports
from beem import Hive
from beem.discussions import Query, Discussions_by_blog as Discussions
from beem.comment import Comment
from beem.account import Account
from beem.imageuploader import ImageUploader

# Log in
wif = input("Enter your posting key: ")
hive = Hive(keys=wif)
account = Account("makerhacks", blockchain_instance=hive)

# Upload the pic
image_uploader = ImageUploader(hive_instance=hive)
image_filename = input("Enter the image filename")
uploaded_image = image_uploader.upload(image_filename, account.name, image_name=image_filename)
image_url = uploaded_image["url"]
print("Uploaded your image as", image_url)


# Snap container
q = Query(limit=1, tag="peak.snaps")
posts = Discussions(q)
details = Comment(posts[0])


# Post our snap!
perm = details['authorperm']
comment = Comment(perm, hive_instance=hive)
picture_markdown = f"![{image_url}]({image_url})"
comment.reply(picture_markdown + "This picture was posted via Python using the Beem library!", author=account.name)
Sort:  

I've not tried uploading images. My bot script uses Wikimedia images, so just needs the links. Back in the early days of this thing we had to find places to host the images. I used Keybase that lets you host files. Of course the images are not on the blockchain, so we have to consider if they will be available in the long run.

Most of what I used to do pulled from hive so was more about converting markdown to html :)

Thanks for your contribution to the STEMsocial community. Feel free to join us on discord to get to know the rest of us!

Please consider delegating to the @stemsocial account (85% of the curation rewards are returned).

You may also include @stemsocial as a beneficiary of the rewards of this post to get a stronger support.