我如何使用 tumblr tweets.js 文件将我的推文与附加图片一起嵌入?
how do i use the tumblr tweets.js file to embed my tweets with the attached images?
我一点也不擅长 javascript,但我正在编写一个 tumblr 博客 并使用他们的集成 javascript 来显示我的最后一个tweets:tumblr 为我的 twitter acc 自动生成一个脚本,目前可在 https://d-agonet.tumblr.com/tweets.js 获得。我把它放在我的页脚中,并添加了第二个脚本来获取和显示数据:(tumblr 给出了一个示例,我对其进行了一些修改,以便我可以隐藏 RT 和回复,并在推文上添加 class附有图像):
<ul id="tweetcontainer"></ul>
<script type="text/javascript">
function recent_tweets(data) {
document.getElementById("twitterwrapper").style.display = "block";
for(i = 0; i < data.length; i++) {
if(data[i].text.startsWith("@") == false){
if(data[i].text.startsWith("RT @") == false){
if(data[i].text.includes("https://t.co/") == false){
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
else{
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
}
}
}
}
</script>
尽管代码可能看起来很丑陋,它目前按预期工作,但我注意到 tumblr 生成的 .js 文件也存储了 附加到推文的图像的网址,所以我想获取此数据并将其显示在相关推文中。
如您所见,推文的数据基本上是这样构造的:
{
"created_at": "DATE",
"id": SOME ID NUMBER,
"id_str": "SOME ID NUMBER",
"text": "TEXT FROM TWEET",
"truncated": false,
"entities": {
"hashtags": [],
"symbols": [],
"urls": [],
"media": [{
"id": SOME OTHER ID NUMBER,
"id_str": "SOME OTHER ID NUMBER",
"indices": [XX, XX],
"media_url": "THE IMAGE URL",
"media_url_https": "THE IMAGE URL WITH HTTPS",
"type": "photo",
etc
}]
},
etc
}
所以,我明白我想要得到的是我在上面所说的“带有 HTTPS 的图像 URL”,为此我需要在我的脚本末尾添加一些东西,一些东西像这样:
else{
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '">' + data[i].entities.media.media_url_https + '<div class="content">' + data[i].text + '</div></a></li>';
}
不幸的是,它不起作用,现在带有图片的推文根本不显示。 (而通过“data[i].media_url_https”的反复试验,我在推文的文本之前得到了“undefined”,而“data[i].entities”在文本之前给了我“[object Object]”。 )
我遇到了 this previous answer 这让我开始尝试使用“数据[i]。entities.media.media_url_https”并且似乎解释了如何去做,但我真的很努力理解它,我不知道如何将它应用到我的情况:/
我猜我的问题来自于“media”是一个数组,所以它应该类似于“data[i].entities.media[?????].media_url_https”,但我不知道要在 ???? 中输入哪个数字,我尝试了 0 和 1 没有效果:/
我有一个可行的解决方案(它取决于 tumblr 的实现,它可能不适用于旧版浏览器)。
试试这个:
function recent_tweets(data) {
document.getElementById("twitterwrapper").style.display = "block";
for(i = 0; i < data.length; i++) {
if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){
const media = data[i].entities?.media;
if (media?.length) {
const image = media[0].media_url_https;
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '<img src=' + image + ' /></div></a></li>';
} else {
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
}
}
}
这里有几点需要注意。
首先在循环中测试布尔条件,然后在其中嵌套另一个布尔测试:
if(data[i].text.startsWith("@") == false){
if(data[i].text.startsWith("RT @") == false){
相反,您可以将测试添加到一行中,然后像这样检查它们是否为假:
if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){
II
是 OR 运算符。而不是写 if (someVar === false)
我们可以使用逻辑 NOT 运算符 !
。所以if (!someVar)
如果图像确实存在,它总是在第一个索引数组中,所以我们可以这样访问它:media[0].media_url_https;
.
另外需要注意的是,并不是你数据中的每个对象都包含媒体或图像属性,在这种情况下我们需要测试它是否存在然后吐出图像,如果不存在则继续并附加没有图像的 html。
使用可选链接。所以 media?.some_property
首先检查媒体对象是否存在,然后检查它是否有我们正在寻找的道具。这是 JS 中相当新的一点,因此您可能 运行 遇到问题。但我相信这会满足您的需求。
有关详细信息,请参阅此处:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
编辑
还有一点需要注意,它不是超级关键,但它可以更好地分离布局和逻辑,目前您的标记有一个 div,稍后由 javascript 操作,但是 javascript 函数像这样嵌套在 div 中:
<div id="twitterwrapper" style="display: block;">
<h2 class="heading" id="twitter">
Tweets
</h2>
<ul id="tweetcontainer"></ul>
<script type="text/javascript">
function recent_tweets(data) {
...
}
</script>
</div>
通常人们倾向于在文件底部的 <body>
结束标记之前添加他们的 js 脚本。并非总是如此,但在我看来,使用 tumblr 模板是个好主意。
我一点也不擅长 javascript,但我正在编写一个 tumblr 博客 并使用他们的集成 javascript 来显示我的最后一个tweets:tumblr 为我的 twitter acc 自动生成一个脚本,目前可在 https://d-agonet.tumblr.com/tweets.js 获得。我把它放在我的页脚中,并添加了第二个脚本来获取和显示数据:(tumblr 给出了一个示例,我对其进行了一些修改,以便我可以隐藏 RT 和回复,并在推文上添加 class附有图像):
<ul id="tweetcontainer"></ul>
<script type="text/javascript">
function recent_tweets(data) {
document.getElementById("twitterwrapper").style.display = "block";
for(i = 0; i < data.length; i++) {
if(data[i].text.startsWith("@") == false){
if(data[i].text.startsWith("RT @") == false){
if(data[i].text.includes("https://t.co/") == false){
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
else{
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
}
}
}
}
</script>
尽管代码可能看起来很丑陋,它目前按预期工作,但我注意到 tumblr 生成的 .js 文件也存储了 附加到推文的图像的网址,所以我想获取此数据并将其显示在相关推文中。
如您所见,推文的数据基本上是这样构造的:
{
"created_at": "DATE",
"id": SOME ID NUMBER,
"id_str": "SOME ID NUMBER",
"text": "TEXT FROM TWEET",
"truncated": false,
"entities": {
"hashtags": [],
"symbols": [],
"urls": [],
"media": [{
"id": SOME OTHER ID NUMBER,
"id_str": "SOME OTHER ID NUMBER",
"indices": [XX, XX],
"media_url": "THE IMAGE URL",
"media_url_https": "THE IMAGE URL WITH HTTPS",
"type": "photo",
etc
}]
},
etc
}
所以,我明白我想要得到的是我在上面所说的“带有 HTTPS 的图像 URL”,为此我需要在我的脚本末尾添加一些东西,一些东西像这样:
else{
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '">' + data[i].entities.media.media_url_https + '<div class="content">' + data[i].text + '</div></a></li>';
}
不幸的是,它不起作用,现在带有图片的推文根本不显示。 (而通过“data[i].media_url_https”的反复试验,我在推文的文本之前得到了“undefined”,而“data[i].entities”在文本之前给了我“[object Object]”。 )
我遇到了 this previous answer 这让我开始尝试使用“数据[i]。entities.media.media_url_https”并且似乎解释了如何去做,但我真的很努力理解它,我不知道如何将它应用到我的情况:/ 我猜我的问题来自于“media”是一个数组,所以它应该类似于“data[i].entities.media[?????].media_url_https”,但我不知道要在 ???? 中输入哪个数字,我尝试了 0 和 1 没有效果:/
我有一个可行的解决方案(它取决于 tumblr 的实现,它可能不适用于旧版浏览器)。
试试这个:
function recent_tweets(data) {
document.getElementById("twitterwrapper").style.display = "block";
for(i = 0; i < data.length; i++) {
if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){
const media = data[i].entities?.media;
if (media?.length) {
const image = media[0].media_url_https;
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '<img src=' + image + ' /></div></a></li>';
} else {
document.getElementById("tweetcontainer").innerHTML = document.getElementById("tweetcontainer").innerHTML + '<li class="yaimg"><a target="_blank" href="http://twitter.com/{TwitterUsername}/status/' + (data[i].id_str ? data[i].id_str : data[i].id) + '"><div class="content">' + data[i].text + '</div></a></li>';
}
}
}
}
这里有几点需要注意。
首先在循环中测试布尔条件,然后在其中嵌套另一个布尔测试:
if(data[i].text.startsWith("@") == false){
if(data[i].text.startsWith("RT @") == false){
相反,您可以将测试添加到一行中,然后像这样检查它们是否为假:
if(!data[i].text.startsWith("@") || !data[i].text.startsWith("RT @") || !data[i].text.includes("https://t.co/")){
II
是 OR 运算符。而不是写 if (someVar === false)
我们可以使用逻辑 NOT 运算符 !
。所以if (!someVar)
如果图像确实存在,它总是在第一个索引数组中,所以我们可以这样访问它:media[0].media_url_https;
.
另外需要注意的是,并不是你数据中的每个对象都包含媒体或图像属性,在这种情况下我们需要测试它是否存在然后吐出图像,如果不存在则继续并附加没有图像的 html。
使用可选链接。所以 media?.some_property
首先检查媒体对象是否存在,然后检查它是否有我们正在寻找的道具。这是 JS 中相当新的一点,因此您可能 运行 遇到问题。但我相信这会满足您的需求。
有关详细信息,请参阅此处: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
编辑 还有一点需要注意,它不是超级关键,但它可以更好地分离布局和逻辑,目前您的标记有一个 div,稍后由 javascript 操作,但是 javascript 函数像这样嵌套在 div 中:
<div id="twitterwrapper" style="display: block;">
<h2 class="heading" id="twitter">
Tweets
</h2>
<ul id="tweetcontainer"></ul>
<script type="text/javascript">
function recent_tweets(data) {
...
}
</script>
</div>
通常人们倾向于在文件底部的 <body>
结束标记之前添加他们的 js 脚本。并非总是如此,但在我看来,使用 tumblr 模板是个好主意。