dhampyresa: (Default)
[personal profile] dhampyresa
This is the google appscript to auto publish DW posts based on data from an auction spreadsheet. Hopefully it's as user friendly as possible. It requires: copy-pasting the below code into the appropriate Google sheet's appscrit editor ("Extensions" > "Appscript"), inputting the relevant URL/username/password, running the "makeData()" function (approving the script), editing the data generated and then running the "makePosts()" function.

"makeData()" makes title, post content (including links to auto-generated bidding form and answers sheet) and tag list. "makePosts()" then creates the post and add a link to said to the reference sheet.




function getSpreadsheet() {
var sheetURL = "PUT URL OF THE SPREADSHEET WITH YOUR DATA HERE";

return sheetURL;
}



function makeData() {
var sheetURL = getSpreadsheet();

var data = SpreadsheetApp.openByUrl(sheetURL).getDataRange().getValues();

var DWsheet = SpreadsheetApp.openByUrl(sheetURL).getSheetByName("DW Post data");

if(DWsheet == null)
{
DWsheet = SpreadsheetApp.openByUrl(sheetURL).insertSheet("DW Post data");
}

DWsheet.clearContents();
DWsheet.appendRow(["Post Title", "Post HTML", "Post Taglist", "", "Post URL"]);

for (var a = 1; a < data.length; a++) {
var postTitle = data[a][1] + "'s offer post";

var sheetTitle = data[a][1] + "'s bidding form";

var bidSheet = SpreadsheetApp.create(sheetTitle);
var bidSheetURL = bidSheet.getUrl();

var bidForm = FormApp.create(sheetTitle).setDestination(FormApp.DestinationType.SPREADSHEET, bidSheet.getId());
bidForm.setCollectEmail(true).addTextItem().setTitle("Your bid:");
var bidFormURL = bidForm.getPublishedUrl();

var DWpost = "This is " + data[a][1] + "'s offer post.<br><br><hr><br><br>";

for (var c = 2; c < data[a].length; c++) {
DWpost = DWpost + "<b>" + data[0][c] + ":</b> " + data[a][c].toString().replace(/\n/g, "<br>") + "<br><br>";
}

DWpost = DWpost + "<hr><br><br>You can check current bids <a href='" + bidSheetURL + "'>here</a> and place your own bid <a href='" + bidFormURL + "'>here</a>.<br>"

var baseTags = data[a][4].toString().split(", ");
var taglist = "";

for (var b = 0; b < baseTags.length; b++) {
taglist = taglist + "fandom: " + baseTags[b] + ", ";
}

taglist = taglist + "medium: " + data[a][2].toString();

DWsheet.appendRow([postTitle, DWpost, taglist]);
}
}



function makePosts() {

var sheetURL = getSpreadsheet();
var data = SpreadsheetApp.openByUrl(sheetURL).getSheetByName("DW Post data").getDataRange().getValues();

var username = "INSERT YOUR DREAMWIDTH USRNAME HERE";
var password = "DW PASSWORD GOES HERE";

var date = new Date();

var xmlHeader = "<?xml version='1.0'?><methodCall><methodName>LJ.XMLRPC.postevent</methodName><params><param><value><struct><member><name>username</name><value><string>" + username + "</string></value></member><member><name>password</name><value><string>" + password + "</string></value></member>";

var xmlFooter = "<member><name>lineendings</name><value><string>pc</string></value></member><member><name>year</name><value><int>" + date.getFullYear() + "</int></value></member><member><name>mon</name><value><int>" + date.getMonth() + "</int></value></member><member><name>day</name><value><int>" + date.getDate() + "</int></value></member><member><name>hour</name><value><int>" + date.getHours() + "</int></value></member><member><name>min</name><value><int>" + date.getMinutes() + "</int></value></member></struct></value></param></params></methodCall>";

var url = "https://www.dreamwidth.org/interface/xmlrpc";


for (var a = 1; a < data.length; a++) {
var payload = xmlHeader + '<member><name>subject</name><value><string>' + data[a][0] + '</string></value></member><member><name>event</name><value><string><![CDATA[' + data[a][1] + ']]></string></value></member><member><name>props</name><value><struct><member><name>taglist</name><value><string>' + data[a][2] + '</string></value></member><member><name>opt_backdated</name><value><string>1</string></value></member><member><name>opt_nocomments</name><value><string>1</string></value></member></struct></value></member>' + xmlFooter;

var options =
{
"method": "post",
"payload": payload,
"headers": {
'Content-Type': 'text/xml',
'Cookie': 'ljuniq=82uHIsuEWNOkmCT%3A1649806254'
}
};

var response = UrlFetchApp.fetch(url, options);

if (response.getResponseCode() === 200) {
var postURLstart = response.getContentText().search("https://");
var postURLend = response.getContentText().search("</string>");
SpreadsheetApp.openByUrl(sheetURL).getSheetByName("DW Post data").getRange(a + 1, 5).setValue(response.getContentText().slice(postURLstart, postURLend));
}
else {
var errorMessage = "HTTP error code: " + response.getResponseCode();
SpreadsheetApp.openByUrl(sheetURL).getSheetByName("DW Post data").getRange(a + 1, 5).setValue(errorMessage);
}
}
}



I should probably do a better instruction guide with pictures and things, but rn i am tired. idk, thought it might be of interest to some people. Any feedback welcome!

(no subject)

Date: 2022-04-27 04:07 am (UTC)
ironymaiden: (linux)
From: [personal profile] ironymaiden
Holy shit, I didn’t know there was any kind of functioning API for DW. I like the idea of leveraging the spreadsheet - cool thing is that there are lots of existing utilities to do quick updates to a google sheet, so this is an interesting alternative way to build out something like a linkspam post as you come across things. (I used to have some little IFTTT widgets that would let me make quick posts but it depended on posting via gmail, which changed something in their formatting that hosed both html and markdown.)

And ooooh there’s a python package for xmlrpc, I could make a thing. Need to think through the use case, but this is super-cool.

Profile

dhampyresa: (Default)
dhampyresa

May 2025

S M T W T F S
    123
45678910
11121314 15 1617
181920 2122 2324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags