在床单的引擎盖下
发表在<!---->2月16日
在这篇文章中,我们将深入了解Sheet Tweetr的基本原理。本文比介绍文章“API Sample App: Sheet Tweetr”更深入。的Sheet Tweetr的源代码可以在GitHub上找到。
Sheet Tweetr是一个简单的应用程序,可以从Smartsheet发送推文,并作为一个示例应用程序使用Smartsheet JavaScript SDK.Sheet Tweetr读取一个表,检查每一行以查看推文计划何时发出,并在合适的时间发布推文。根据用户设置的频率,推文可以发出多次。
Smartsheet和Sheet Tweetr
Sheet Tweetr使用Smartsheet的API来检索推文列表,并在推文发布后对其行进行更新。Smartsheet在Sheet tweet中扮演着另一个重要角色——作为输入和存储tweet的接口。
要设置Sheet Tweetr,用户需要一个Smartsheet访问令牌和Smartsheet JavaScript SDK.如果您是Smartsheet API的新手,那么本文开始使用Smartsheet API是一个很好的开始。当你有问题的时候Smartsheet API常见问题解答是一个很好的资源。
Tweetr→getListOfItems()
进入Sheet Tweetr代码的入口点是getListOfItems()
函数,该函数调用getSheet()方法Smartsheet的JavaScript SDK。在收到表的数据响应后,进行以下步骤:
循环遍历工作表中的每一行。
在每次迭代期间,每行各自的数据都用于创建scheduledItem对象。
检查每个scheduledItem的详细信息,以确定它是否有效(意味着准备发布)。
如果有效,scheduledItem将被推入名为itemsWithValidDates的数组。
在检查了每一行之后,itemsWithValidDates被传递给postTweet()。
函数getListOfItems(){smartsheetClient.表.getSheet(选项,(错误,数据)= >{如果(错误){控制台.日志(错误);返回错误;}为(让我=0;我<数据.行.长度;我++){让行=数据.行[我];让simpleRow=createSimpleRow(行);让scheduledItem={tweetText:simpleRow[COLUMN_MAP.tweetTextCID],tweetImage:simpleRow[COLUMN_MAP.tweetImageCID],tweetStartDate:日期.解析(simpleRow[COLUMN_MAP.tweetStartCID]),tweetEndDate:日期.解析(simpleRow[COLUMN_MAP.tweetEndCID]),lastRan:simpleRow[COLUMN_MAP.tweetLastRanCID],频率:simpleRow[COLUMN_MAP.tweetFreqCID],freqType:simpleRow[COLUMN_MAP.tweetFreqTypeCID],tweetTime:simpleRow[COLUMN_MAP.tweetTimeCID],rowId:行.id,};让结果=validateItem(scheduledItem);如果(结果= = =真正的){itemsWithValidDates.推(scheduledItem);继续;}}postTweet(itemsWithValidDates);});}
在上面的代码中,您将看到
createSimpleRow()
函数。它从一行中的每个单元格获取列id和值,从而在手动将每行组装到scheduledItem时更容易引用这些值。scheduledItem被传递给validateItem(),该函数负责检查每条tweet以确定其是否有效,并应将其发送到Twitter。然后,在Sheet Tweetr循环遍历每一行之后,将有效的tweet推入到postTweet()数组中。
确定要发布哪些推文→validateItem() & examineCriteria()
当validateItem()
函数被调用时,scheduledItem的属性被传递给examineCriteria()
.如果返回的标志与firstPost、specificPostTime或validPost匹配,则validateItem()
返回true-tellinggetListOfItems()
功能,各自的推文是有效的。
函数validateItem(scheduledItem){scheduledItem.tweetTime= = =未定义的?scheduledItem.tweetTime=“上午12:00:scheduledItem.tweetTime;常量isValidItem=examineCriteria(scheduledItem.tweetStartDate,scheduledItem.tweetEndDate,scheduledItem.tweetTime,scheduledItem.lastRan,scheduledItem.频率,scheduledItem.freqType,日期.现在());如果(isValidItem.firstPost||isValidItem.validPost){返回真正的;}}
也许一开始并不明显examineCriteria()
是在做,但实际上它的本质很简单。下面的代码包含了确定一条tweet是否可以发布的逻辑。
函数examineCriteria(tweetStartDate,tweetEndDate,tweetTime,lastRan,频率,freqType,comparedTo){//用例1:日期不在给定范围内如果(tweetStartDate> =comparedTo||tweetEndDate< =comparedTo){控制台.日志(“无效的日期范围”);返回{invalidDate:真正的};}//用例2:预定的项目有有效日期,但还没有发布如果(lastRan= = =未定义的){让postTime=specificTime(tweetTime,tweetStartDate).取得时间();常量oneHour=3.6 e6;常量oneHourBefore=comparedTo-oneHour;常量oneHourAfter=comparedTo+oneHour;如果(postTime< =oneHourAfter& &postTime> =oneHourBefore){控制台.日志(“足够接近……”);返回{firstPost:真正的};}}//用例3:推文有有效日期,应该再次发布让nextTweetDate=frequencyCheck(lastRan,频率,freqType);如果(nextTweetDate.取得时间()<comparedTo){返回{validPost:真正的};}返回{};}
让我们更深入地了解每个用例。
用例1。)推文的compardto日期位于工作表的开始日期和结束日期之外。
如果(tweetStartDate> =comparedTo||tweetEndDate< =comparedTo)
第一个条件:开始日期大于compare to意味着现在发布推文还为时过早。当前日期还没有到推文的开始日期。
第二个条件:结束日期小于compare to意味着已经来不及发布推文了。当前日期已经超过了推文的结束日期。
用例2。)这条推特还没有发布。
如果(lastRan= = =未定义的)
这个条件抓取所有第一次发布的推文。
用例3。)这条推文已经发布了,如果时间足够长,应该会再发布一次。
让nextTweetDate=frequencyCheck(lastRan,频率,freqType);
frequencyCheck()函数接受lastRan,即twitter最后发布的时间,并添加frequency -返回twitter可以发布的未来时间。
如果(nextTweetDate.取得时间()<comparedTo)
如果nextTweetDate小于compardto,那么已经有足够的时间让推文再次发出,并且推文是有效的。
发送推文到Twitter→postTweet() & tweet()
的postTweet()
function接受一个名为validItems的tweet数组。如果数组为空,则没有有效的tweet, Sheet Tweetr可以终止。如果数组有条目,则转变()
返回第一个条目,并在调用之前将其从数组中移除tweetTheRow()
.
函数postTweet(validItems){如果(!validItems.长度){控制台.日志(“没有有效的推文可用”);返回cb();}如果(validItems.长度>0){让nextItem=validItems.转变();tweetTheRow(nextItem);}}
Sheet Tweetr使用了一个良好的文档名为“Twit”的节点模块它集成了Twitter和Node.js。第一步是创建一个Twit实例,它是Twit方法的入口点,通过提供用于格式化发送到Twitter API的请求的属性。
常量推特=新笨蛋({consumer_key:ctx.秘密.TWITTER_CONSUMER_KEY,consumer_secret:ctx.秘密.TWITTER_CONSUMER_SECRET,access_token:ctx.秘密.TWITTER_ACCESS_TOKEN,access_token_secret:ctx.秘密.TWITTER_ACCESS_SECRET,timeout_ms:60*1000,//可选的HTTP请求超时。});
Twit的使用非常简单。大多数方法接受描述要发送到Twitter的数据的参数,以及在获得结果(成功或失败)时调用的回调。每次使用Twit的方法时,我们都需要提供一个回调,该回调使用API调用的结果进行调用。
每条tweet都使用这个函数发送:
函数推特(状态,rowId){推特.帖子(“状态/更新”,状态,(犯错,数据,响应)= >{如果(犯错){控制台.日志(的错误$ {犯错}`);postTweet(itemsWithValidDates);返回犯错;}控制台.日志(“成功推”);updateSheetRow(rowId);返回cb();});}
的推特()
function接受两个参数:status、tweet的文本和/或图像以及rowId。如果一条推文成功发布,那么Sheet Tweetr将更新该推文在工作表中的行updateSheetRow()
应用程序终止。但是,如果抛出错误,则postTweet()
函数再次被调用。
更新Smartsheet中的Tweet行→updateSheetRow()
的updateSheetRow()
方法允许Sheet Tweetr根据需要更新特定的行。在与sheet Tweetr连接的工作表中,名为LastRan的列用于保存发布tweet的特定时间的时间戳。这个时间戳很重要,可以作为检查频率的参考点。每发一条推特,LastRan都必须更新。
函数updateSheetRow(rowId){常量rowUpdate=[{id:rowId,细胞:[{columnId:COLUMN_MAP[“tweetLastRanCID”],价值:日期.现在(),},],},];常量选项={身体:rowUpdate,sheetId:ctx.秘密.SMARTSHEET_SHEET_ID,};smartsheetClient.表.updateRow(选项,(错误,数据)= >{如果(错误){控制台.日志(错误);返回错误;}控制台.日志(成功更新的);});}
从Smartsheet传递图像到Twitter
包含图像的tweet需要与只包含文本的tweet进行不同的处理。
函数tweetWithImg(文本,image64,rowId){推特.帖子(“媒体/上传”,{media_data:image64},(犯错,媒体,响应)= >{如果(犯错){控制台.日志(的错误$ {犯错}`);返回犯错;}常量状态={状态:文本,media_ids:媒体.media_id_string,};推特(状态,rowId);});}
两者的主要区别tweetWithImg()
而且推特()
是一个不同的端点(将媒体上传到Twitter)、状态对象中的一个额外属性(media_ids)和一个名为image64的新参数。image64参数需要是一个base64编码的图像。
让我们来看看getImgData()
函数。图像从Smartsheet返回后立即被base64编码。此base64字符串可用于将图像上传到Twitter。
注意:下面的Smartsheet API调用看起来与其他调用略有不同。这是因为在撰写本文时,Smartsheet JavaScript SDK中还没有下载图像的方法。
函数getImgData(imageId,imageReturn){常量选项={方法:“职位”,url:“https://api.smartsheet.com/2.0/imageurls”,头:{授权:“持票人”+ctx.秘密.SMARTSHEET_ACCESS_TOKEN,},身体:[{imageId:imageId}],json:真正的,};请求(选项,(错误,响应,身体)= >{如果(错误){控制台.日志(错误);返回错误;}其他的{常量tempImgUrl=身体.imageUrls[0].url;常量临时={字符串:真正的};base64.编码(tempImgUrl,临时,(犯错,image64)= >{如果(犯错){控制台.日志(犯错);返回犯错;}返回imageReturn(image64);});}});}
将图像从Smartsheet传递到Twitter具有挑战性,因为Smartsheet生成的图像url是临时的。目前的解决方案是将Twitter与Smartsheet结合在一起。未来改进的一个想法是,在解析完tweet的行后,检索图像并保存base64编码的字符串。
自动Sheet Tweetr
Sheet Tweetr的另一个挑战是自动化。Smartsheet DevRel需要Sheet Tweetr需要在循环的基础上自动运行。应用程序需要启动,从Smartsheet中提取数据,查看推文列表,发布它找到的第一条“有效”推文,然后停止运行。我们使用无服务器架构实现了这一点。你可以把“无服务器”想象成“功能即服务”。在下一篇文章中,我们将讨论如何自动使用Sheet TweetrWebtask,这是一款来自Auth0的出色的无服务器工具。
Sheet Tweetr概述
理解Sheet Tweetr背后发生的事情的关键是跟踪信息流。的getListOfItems()
函数应用获取推文列表所需的逻辑,确定哪些推文是“有效的”,并将它们传递给postTweet()
.控制Sheet Tweetr如何与Twitter交互的逻辑分布在多个函数中,但是postTweet()
允许Sheet Tweetr持续存在,直到成功发布一条推文或没有更多有效的推文存在。
现在我们已经了解了Sheet Tweetr的底层,您已经看到了使用Smartsheet API检索的图像和使用Smartsheet的JavaScript SDK读取/写入到表中的数据。希望看到在应用程序上下文中使用的API和SDK能使它们更容易理解。看一看在GitHub上的Sheet Tweetr欢迎在推特上联系我,@SmartsheetDev,或使用smartsheet-api标签.