Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.tumblr.newPost
on newPost (title, body, email=nil, password=nil, type=nil, generator=nil, pubDate=nil, flPrivate=nil, tags=nil, format=nil, group=nil, data=nil, caption=nil, clickThroughUrl=nil, flMultipart=false, fData=nil, idPost=nil) {
<<Changes
<<11/23/09; 2:09:23 PM by DW
<<Add idpost optional param, if specified, we're modifying that post.
<<6/9/09; 7:35:58 PM by DW
<<Corrected.
<<http://www.scripting.com/stories/2009/06/09/helpImTrappedInsideTheTumb.html
<<5/14/09; 9:57:51 AM by DW
<<Created.
local (adrdata = tumblr.init (), apiurl = "http://www.tumblr.com/api/write", params);
bundle { //set defaults
if email == nil {
email = adrdata^.prefs.email};
if password == nil {
password = adrdata^.prefs.password};
if type == nil {
type = "regular"};
if generator == nil {
generator = frontier.getprogramname ()}};
bundle { //build params
if flmultipart {
new (tabletype, @params)}
else {
params = ""};
on push (name, value) {
if value != nil {
if flmultipart {
params.[name] = value}
else {
params = params + "&" + name + "=" + string.urlencode (value, flFullEncode:true)}}};
push ("email", email);
push ("password", password);
push ("title", title);
push ("body", body);
push ("type", type);
push ("generator", generator);
push ("post-id", idPost); //11/23/09 by DW
push ("pubDate", date.netstandardstring (pubDate));
if flPrivate != nil {
if flPrivate {
push ("private", 1)}
else {
push ("private", 0)}};
push ("tags", tags);
push ("format", format);
push ("group", group);
if not flmultipart {
push ("data", data)};
push ("caption", caption);
push ("click-through-url", clickThroughUrl);
if not flmultipart {
params = string.delete (params, 1, 1)}}; //pop the first &
local (response, code);
if flmultipart {
local (f, fldelete = false);
if fData != nil {
f = fData}
else {
f = frontier.getSubFolder ("ops/Temp") + "tumblr" + clock.ticks () + ".data";
file.writewholefile (f, data);
fldelete = true};
response = tcp.httpPostMultipart (apiurl, f, adrparams:@params, filePartName:"data", adrCode:@code);
if fldelete {
file.delete (f)}}
else {
local (urllist = string.urlsplit (apiurl));
response = tcp.httpClient ("POST", server:urllist [2], path:urllist [3], data:params, datatype:"application/x-www-form-urlencoded", ctFollowRedirects:3, flMessages:false, debug:false);
<<wp.newtextobject (string (scratchpad.httpcommand), @tumblr.testing.request)
code = tcp.httpGetStatusCode (response);
response = string.httpResultSplit (response)};
<<wp.newtextobject (response, @tumblr.testing.response)
bundle { //throw an error if code != 201
if code == 403 {
scriptError ("Couldn't create the post because the email address or password were incorrect.")};
if code == 400 {
scriptError ("Couldn't create the post because there was at least one error while trying to save your post.")}};
return (response)}
<<bundle //test code
<<bundle //photo
<<local (bits = file.readwholefile ("ohio:test:chumby.jpg"))
<<newPost ("My New Chumby", "", type:"photo", data:bits)
<<return
<<bundle //50 random states
<<local (body = "")
<<for i = 1 to 50
<<body = body + states.nthstate (random (1, 50)) + " "
<<dialog.alert (newPost ("50 random states", body))
<<return
<<bundle //post from an outline
<<local (oldtarget = target.set (@tumblr.testing.postOutline))
<<op.firstsummit ()
<<local (title = op.getlinetext (), bodytext = "")
<<op.expand (infinity)
<<op.go (right, 1)
<<loop
<<bodytext = bodytext + "<p>" + op.getlinetext () + "</p>\r"
<<if not op.go (down, 1)
<<break
<<s = string.replaceall (s, "</p>", "+++++")
<<s = searchengine.stripmarkup (s)
<<s = string.replaceall (s, "+++++ ", "\r\r")
<<s = string.replaceall (s, " ", " ")
<<s = string.replaceall (s, "\";->\"", ":-)")
<<wp.newtextobject (s, @tumblr.testing.s)
<<local (id = newPost (title, bodytext))
<<newPost (title, string.upper (bodytext), idpost:id) //text should now be uppercase
<<target.set (oldtarget)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.