经常来这里的读者会知道我对随机性有点着迷。作为几个例子,我已经建立了依赖生成文本的演示。@TBSHoroscope和@MonsterConflict。我还建立了从现有数据集中随机选择的演示,包括@RandomComicBook和@NPSBot。当我看到这些账户出现在我的时间轴上时,所有这些账户都让我微笑,而且它们也提供了很多信息。@RandomComicBook账户真的让我感到惊讶,因为几十年来漫威的艺术风格发生了很大的变化,以及一些角色有多老。
我是Spotify的忠实粉丝,我最喜欢的功能之一是让它播放一首歌曲,然后看看Spotify是如何从它身上提取并播放类似的音乐。这让我想到了使用Spotify的API,通过获取完全随机的曲目来真正地扯淡。虽然我有自己喜欢的流派,但我喜欢一般的音乐,并愿意给任何东西试一次。考虑到这一点,我建立了一个Pipedream工作流程,每天早上给我发送一个随机曲目。
到目前为止,我已经得到了。
我以前听说过Slipknot,但从未真正听过他们的任何音乐。你猜怎么着--我不喜欢他们!但我真的很喜欢播放这首曲子(以及之后的其他几首)。
我听说过Pharrell,但没有听说过Lil Uzi Vert。同样,这不是我的主要风格,但我喜欢这首曲子,比Slipknot的曲子好。
还有一个完全不同的风格,就是有多个作曲家的曲目。我以前听说过Hans ZImmer和Ramin Djawadi,但没有听说过其他的。这是一群人中我最喜欢的。
那么,它是如何建立的呢?
获得一个随机的Spotify曲目
Spotify有一个丰富的开发者生态系统。我第一次报道它是在2月份(测试新的Pipedream以获得Trance发布),我对它的易用性印象深刻。不幸的是,没有API来获取随机曲目。然而,我遇到了一个关于如何伪造它的伟大教程。使用Spotify的API获得随机曲目。
他的技术基本上归结为使用随机搜索字符串和随机偏移量。他的方法很有效,除了在发表时,Spotify允许的偏移量最高为一万。目前,最大是一千。我决定在Pipedream上建立我的版本,并尽可能地利用Python。
我从一个生成随机搜索字符串的步骤开始。这是通过选择一个随机的字母(a-z,技术上是a-zA-Z),然后返回它,在最后加上百分号,或者在前面和最后加上百分号。下面是我使用的Python:
def handler(pd: "pipedream"):
# Credit: https://stackoverflow.com/a/2823331/52160
import random
import string
letter = random.choice(string.ascii_letters).lower()
if(random.choice([True,False])):
search = letter + '%'
else:
search = '%' + letter + '%'
return search
接下来,我选择了一个偏移量。
def handler(pd: "pipedream"):
import random
return random.randint(0,1000)
顺便说一下,我把上述两个Python脚本放在独特的步骤中,很好地命名为(create_search_string 和select_offeset)。当使用Pipedream时,我尽量使每个步骤都是唯一的和原子的。Pipedream并不关心我是否在一个步骤中做两件或更多的事情,但我觉得这样的架构更好。
下一步是对Spotify进行搜索。我添加了一个新的Spotify步骤,并使用Python将我的随机搜索和偏移量打到API上:
import requests
def handler(pd: "pipedream"):
token = f'{pd.inputs["spotify"]["$auth"]["oauth_access_token"]}'
authorization = f'Bearer {token}'
headers = {"Authorization": authorization}
params = {
"type":"track",
"q": pd.steps["create_search_string"]["$return_value"],
"offset":pd.steps["select_offset"]["$return_value"]
}
r = requests.get('https://api.spotify.com/v1/search', params=params, headers=headers)
return r.json()
重要的一点是params ,在这里我访问了先前的步骤。这样做的结果是一个基于搜索的 "页面",即一个数组的曲目。下面是在Pipedream中呈现的情况。
我们现在需要做的就是从该步骤中获得一个随机的轨道。在做这个的时候,Zalman Lew在Pipedream Slack上让我知道其实有一个Pipedream步骤,可以让你指向一个数据数组,并返回一个随机的数据。因此,虽然我可以用几行Python语言完成,但我还是选择了内置步骤。
在这一点上,我已经有了一个可以使用的随机选择的轨道值。我是如何使用它的呢?
发送电子邮件
我决定保持简单,让Pipedream给我发一封电子邮件。你看到上面的截图了,是的,它当然可以看起来更漂亮。我首先创建了一个Python步骤来生成一个HTML电子邮件字符串:
def handler(pd: "pipedream"):
track = pd.steps["select_random_track"]["$return_value"]
print(track["external_urls"]["spotify"])
artists = ""
for artist in track["artists"]:
if artists == "":
artists = artist["name"]
else:
artists = artists + ", " + artist["name"]
html = f"""
<a href="{ track["external_urls"]["spotify"] }"><img src="{ track["album"]["images"][1]["url"] }"></a>
<h2>Your Random Spotify Track</h2>
<p>
Your random Spotify track for today is <strong>{track["name"]}</strong> by
{artists}. It appears on the album "{ track["album"]["name"] }" released on
{ track["album"]["release_date"]}.
Listen to it here: { track["external_urls"]["spotify"] }
"""
return html
Spotify的API会返回很多关于曲目的信息,但我想标题、艺术家和专辑封面已经足够了。随着我的HTML字符串的完成,然后我只是添加了一个内置的Pipedream "向账户所有者发送电子邮件 "的步骤,像往常一样,我使用HTML值作为文本值,正如我总是说,不要在生产中这样做,但对于我的测试,它工作得很好。