auths
objectreturn
or this.key = 'value'
, pass input data to your code viaparams
, and maintain state across executions with$checkpoint.async
(event, steps) => {
}
const PRIV_KEY = process.env.MARVEL_PRIVATE_KEY;
const API_KEY = process.env.MARVEL_API_KEY;
//const crypto = require('crypto');
import { createHash } from 'crypto';
import fetch from 'node-fetch';
const IMAGE_NOT_AVAIL = "http://i.annihil.us/u/prod/marvel/i/mg/b/40/image_not_available";
const getRandomInt = function(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
//first select a random year
let year = getRandomInt(1960, new Date().getFullYear()-1);
//then a month
let month = getRandomInt(1,12);
let monthStr = month<10?"0"+month:month;
//lame logic for end of month
let eom = month==2?28:30;
let beginDateStr = year + "-" + monthStr + "-01";
let endDateStr = year + "-" + monthStr + "-" + eom;
let url = "http://gateway.marvel.com/v1/public/comics?limit=100&format=comic&formatType=comic&dateRange="+beginDateStr+"%2C"+endDateStr+"&apikey="+API_KEY;
let ts = new Date().getTime();
let hash = createHash('md5').update(ts + PRIV_KEY + API_KEY).digest('hex');
url += "&ts="+ts+"&hash="+hash;
let result = await fetch(url);
let data = (await result.json()).data;
if(!data.results) $end("No results, data was " + data);
let resultData = data.results;
console.log('initial set',resultData.length);
// if(comic.thumbnail && comic.thumbnail.path != IMAGE_NOT_AVAIL) {
let comics = resultData.filter(c => {
return c.thumbnail && c.thumbnail.path !== IMAGE_NOT_AVAIL;
});
console.log('now we have ',comics.length);
let selectedComic = comics[getRandomInt(0, comics.length-1)];
//rewrite simpler
this.image = {};
this.image.title = selectedComic.title;
for(let x=0; x<selectedComic.dates.length;x++) {
if(selectedComic.dates[x].type === 'onsaleDate') {
this.image.date = new Date(selectedComic.dates[x].date);
//rewrite nicer
this.image.date = `${this.image.date.getMonth()+1}/${this.image.date.getFullYear()}`;
}
}
this.image.url = selectedComic.thumbnail.path + "." + selectedComic.thumbnail.extension;
if(selectedComic.urls.length) {
for(let x=0; x<selectedComic.urls.length; x++) {
if(selectedComic.urls[x].type === "detail") {
this.image.link = selectedComic.urls[x].url;
}
}
}
// one more time server, text for tweet
this.image.tweet = `${this.image.title} published ${this.image.date}\n${this.image.link}`;
console.log(this.image);
URL of media to upload to Twitter
The MIME type of the media being uploaded. See https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init
async
(params, auths) => {
}
const axios = require("axios")
const chunk = require("lodash.chunk")
// Data we need to make the Twitter API request
const oauthSignerUri = auths.twitter.oauth_signer_uri
const token = {
key: auths.twitter.oauth_access_token,
secret: auths.twitter.oauth_refresh_token,
}
const signConfig = {
token,
oauthSignerUri
}
// Download image, base64 encode it, then upload the media to Twitter
const imageResponse = await axios({
url: params.url,
method: "GET",
responseType: "arraybuffer"
})
const file = Buffer.from(imageResponse.data, 'binary')
const total_bytes = file.length
const base64EncodedFile = file.toString('base64')
const { media_type } = params
// First, tell Twitter the type of file you're uploading, how big it is, etc.
// https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-init
const mediaUploadInitRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "INIT",
total_bytes,
media_type,
}
}
// Twitter returns a media_id_string that we use to upload the file,
// and to reference it in future steps
this.uploadMediaInitResponse = (await require("@pipedreamhq/platform").axios(this, mediaUploadInitRequest, signConfig))
this.mediaIdString = this.uploadMediaInitResponse.media_id_string
// Split the file into chunks, APPEND each chunk
const splitStringRe = new RegExp('.{1,' + 10000 + '}', 'g');
const chunks = base64EncodedFile.match(splitStringRe);
// Collect all of our requests into an array
const requests = []
for (const [segment_index, media_data] of chunks.entries()) {
// APPEND file content in chunks
// See https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-append
const mediaUploadAppendRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "APPEND",
media_id: this.mediaIdString,
segment_index,
media_data,
}
}
requests.push(require("@pipedreamhq/platform").axios(this, mediaUploadAppendRequest, signConfig))
}
// Send N requests at a time
const requestChunks = chunk(requests, 10)
for (const [i, chunk] of requestChunks.entries()) {
console.log(`Processing chunk ${i}`)
await Promise.all(chunk)
}
// Finally, tell Twitter we're done uploading
// https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload-finalize
const mediaUploadFinalizeRequest = {
method: 'POST',
data: '',
url: "https://upload.twitter.com/1.1/media/upload.json",
params: {
command: "FINALIZE",
media_id: this.mediaIdString,
}
}
await require("@pipedreamhq/platform").axios(this, mediaUploadFinalizeRequest, signConfig)
async
(params, auths) => {
}
const axios = require('axios')
const {status, in_reply_to_status_id, auto_populate_reply_metadata, exclude_reply_user_ids, attachment_url, media_ids, possibly_sensitive, lat, long, place_id, display_coordinates, trim_user, enable_dmcommands, fail_dmcommands, card_uri} = params
const body = {
config: {
url: `https://api.twitter.com/1.1/statuses/update.json`,
method: 'POST',
params,
},
token: {
key: auths.twitter.oauth_access_token,
secret: auths.twitter.oauth_refresh_token,
},
}
const proxy = "https://api.pipedream.com/v1/oauth1/app_13GhY1"
const resp = await axios.post(proxy,body)
const {messages, data} = resp.data
for (const message of messages) {
console.log(message)
}
return data