you need:
a p.jpg picture file
the shell file
the .py file
the mhtm file for any descriptive text in the BM
edit the keys.dat file beforehand!
to post a BM from the dolphin filemanager:
launch .sh from dolphin while BM is running!
.sh file pic.sh :
-------
#!/bin/bash # # python2.7 ./pic-master-5.py -h # Usage: pic-master-5.py [options] [message] --help -h for CLI params -- open .py file for details ;-) # # Options: # -h, --help show this help message and exit # -a HOST Api host (default 'localhost') # -i PORT Api port (default 8442) # -u USERNAME Api username (default 'username') # -p PASSWORD Api password (default 'password') # -f FROMADDR 'From' address (default 'BM- # 2cW67GEKkHGonXKZLCzouLLxnLym3azS8r') # -t TOADDR 'To' address (default 'BM- # 2cW67GEKkHGonXKZLCzouLLxnLym3azS8r') # -s SUBJECT Message subject # -e IMGFILE Embed an image # --se Append embedded filename to the subject # -m MSGFILE Append the file content # -n Allow empty message # -l TTL Message TTL in hours (default 96) # -w Wait until the message is sent out # -c ACKDATA Check message status # # use htm file or use plain text: -m mfile # uses ./p.jpg by default , html placed below pic in the final bitmessage # python2.7 ./pic-master-5.py -s 'BM subject line in here' -m mhtm python2.7 ./pic-master-5.py -s 'cool pics and stuff' -m mhtm
.py file picmaster.py
#!/usr/bin/env python
# usage: python2.7 ./pic-master-5.py -e ./pic1.jpg
# xterm CLI only, no launch from dolphin poss. :-( ... except run with pythonw (wine version) does work here for some weird reason
# yields: No JSON object could be decoded -- check all params! usually this py does work.
# make sure port# 8442 is active
# watch ~/.config/PyBitmessage/keys.dat
# keys.dat must include:
# apienabled = true
# apiport = 8442
# apiinterface = 127.0.0.1
# apiusername = Picmaster
# apipassword = Masterpic
# see also https://bitmessage.org/wiki/API_Reference
import xmlrpclib, json, sys, os, time
from optparse import OptionParser
parser = OptionParser(usage = "Usage: %prog [options] [message] --help -h for CLI params -- open .py file for details ;-) ")
parser.add_option("-a", dest = "host", default = "localhost", help = "Api host (default 'localhost')")
parser.add_option("-i", dest = "port", default = 8442, type = "int", help = "Api port (default 8442)")
parser.add_option("-u", dest = "username", default = "Picmaster", help = "Api username (default 'username')")
parser.add_option("-p", dest = "password", default = "Masterpic", help = "Api password (default 'password')")
parser.add_option("-f", dest = "fromaddr", default = "BM-2cW67GEKkHGonXKZLCzouLLxnLym3azS8r", help = "'From' address (default 'BM-2cW67GEKkHGonXKZLCzouLLxnLym3azS8r')")
parser.add_option("-t", dest = "toaddr", default = "BM-2cW67GEKkHGonXKZLCzouLLxnLym3azS8r", help = "'To' address (default 'BM-2cW67GEKkHGonXKZLCzouLLxnLym3azS8r')")
parser.add_option("-s", dest = "subject", default = "pic inside", help = "Message subject")
parser.add_option("-e", dest = "imgfile", default = "./p.jpg", help = "Embed an image")
## actual filename e.g. pic1.jpg
parser.add_option("--se", dest = "imgname", default = False, action = "store_true", help = "Append embedded filename to the subject")
parser.add_option("-m", dest = "msgfile", default = "", help = "Append the file content")
parser.add_option("-n", dest = "empty", default = False, action = "store_true", help = "Allow empty message")
parser.add_option("-l", dest = "ttl", default = 4, type = "int", help = "Message TTL in hours (default 96)")
parser.add_option("-w", dest = "wait", default = False, action = "store_true", help = "Wait until the message is sent out")
parser.add_option("-c", dest = "ackdata", default = "", help = "Check message status")
(options, args) = parser.parse_args()
api = xmlrpclib.ServerProxy('http://%s:%s@%s:%d/' % (options.username, options.password, options.host, options.port))
if len(options.ackdata):
try: print api.getStatus(options.ackdata); sys.exit()
except Exception as e: print str(e); sys.exit(1)
if not len(options.fromaddr)*len(options.toaddr): parser.print_help(); sys.exit()
try: jsonAddresses = json.loads(api.listAddresses())
except Exception as e: print str(e); sys.exit(2)
lookup = next((item for item in jsonAddresses['addresses'] if item['address'] == options.fromaddr), False)
if not lookup: print "Error: The 'From' address %s does not exist" % options.fromaddr; sys.exit(3)
if not lookup['enabled']: print "Error: The 'From' address %s exists but isn't enabled" % options.fromaddr; sys.exit(4)
msg = ''
if len(args): msg += args[0]
subj = options.subject
if len(options.imgfile):
try:
with open(options.imgfile, 'rb') as f:
if len(msg): msg += '\n<br/>'
msg += '<img src="data:image/%s;base64,%s">' % (os.path.splitext(options.imgfile)[1][1:].lower(), f.read().encode('base64').replace('\n', ''))
if options.imgname: subj += os.path.basename(options.imgfile)
except Exception as e: print str(e); sys.exit(5)
if len(options.msgfile):
try:
with open(options.msgfile, 'rb') as f:
if len(options.imgfile): msg += '<br/>\n'
msg += f.read()
except Exception as e: print str(e); sys.exit(6)
if not options.empty and not len(subj+msg): print "Error: Empty message not allowed"; sys.exit(7)
try: ackData = api.sendMessage(options.toaddr, options.fromaddr, subj.encode('base64'), msg.encode('base64'), 2, options.ttl*60*60)
except Exception as e: print str(e); sys.exit(8)
print ackData
while options.wait and api.getStatus(ackData).find('msgsent'): time.sleep(1)