判断一条推文是否为转发?

13

我正在使用Twitter API从特定用户那里获取推文。我已经实现了我想要的功能,除了无法确定特定推文是用户原创还是转发。

我正在使用以下调用: https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=philiprucker&count=1

当查看结果时,似乎我可以从结果中提取retweeted,并且它应该返回true或false。然而,这只返回字符串retweet

$url = "http://api.twitter.com/1/statuses/user_timeline.xml?include_entities=true&include_rts=true&screen_name=$screen_name&count=200" ;
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
$xml = curl_exec ($ch);
curl_close ($ch);

$twelement = new SimpleXMLElement($xml);
foreach ($twelement->status as $status) {
    $text = dbEscape(trim($status->text));
    $time = strtotime($status->created_at);
    $id = $status->id;
    $num_retweets = $status->retweet_count;
    $retweet = $status->retweeted;
    dbQuery("INSERT INTO `twitter` (`id`,`screen_name`,`time`,`text`,`hidden`, `numRetweets`, `retweet`) VALUES ('$id','$screen_name','$time','$text','n','$num_retweets','retweet')");
    // dbQuery("INSERT INTO `twitter` (`id`,`screen_name`,`time`,`text`,`hidden`) VALUES ('$id','$screen_name','$time','$text','n')");
}

这是执行我描述的操作的代码。我相信所有相关的代码都在那里。任何帮助将不胜感激!

4个回答

10

您要将字符串retweet直接放入表格中,而不是$retweet的值。


还请注意@Taylor下面的好问题,关于您真正想要存储什么...我只是指出您的打字错误。 :) - jcmeloni
4
哇,我感觉自己很蠢。简直太惊人了,谢谢。在看同一段代码几个小时后会错过一些小细节。 - mitchellwright

7

快速澄清一下:您是想存储某个推文是否被转发过,还是想存储请求者是否转发了该推文?

与状态相关的“retweeted”布尔字段是相对于发出请求的用户而言的 - 它表示当前用户是否转发了推文,而不是推文是否被转发。非零的retweet_count更能说明该推文是否被转发。


1
我正在尝试存储用户发的推文是不是他自己原创的内容,还是转发了别人的。 - mitchellwright
这个问题非常有价值,你问得很正确,因为这实际上不是我试图捕捉的内容。谢谢!如果我有足够的声望,我会点赞的。 - mitchellwright

2
使用简单的GET请求和Yahoo Query Language (YQL)来访问retweeted节点,可以像下面这样实现:

jsFiddle DEMO: YQL Rest Query for Twitter Retweeted Status via JSON

回调json结果如下:
cbfunc({
 "query": {
  "count": 1,
  "created": "2012-12-31T09:51:58Z",
  "lang": "en-US",
  "results": {
   "json": {
    "retweeted": "false"
   }
  }
 }
});

你还可以让它作为xml返回:

<?xml version="1.0" encoding="UTF-8"?>
<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng"
    yahoo:count="1" yahoo:created="2012-12-31T09:54:49Z" yahoo:lang="en-US">
    <results>
        <json>
            <retweeted>false</retweeted>
        </json>
    </results>
</query>

以下是如何使用 YQL语句 来返回 retweeted 节点,其结果为 truefalse

SELECT retweeted FROM json WHERE url="https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=philiprucker&count=1"

这个简单的GET请求只是一个带有成功函数的ajax();请求,例如这样

// The YQL Statement used below is shown next, starting with the word SELECT:
//
// SELECT retweeted FROM json WHERE url="https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=philiprucker&count=1"
//
// View the above YQL Statement using Yahoo Console at: 
// http://developer.yahoo.com/yql/console/?q=SELECT%20retweeted%20FROM%20json%20WHERE%20url%3D%22https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fuser_timeline.json%3Finclude_entities%3Dtrue%26include_rts%3Dtrue%26screen_name%3Dphiliprucker%26count%3D1%22&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
//
// The variable 'q' below is the Yahoo Rest Query. That is provided after creating the above Yahoo Statement.
// It's provided at the bottom of that web page.

var q = 'http://query.yahooapis.com/v1/public/yql?q=SELECT%20retweeted%20FROM%20json%20WHERE%20url%3D%22https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fuser_timeline.json%3Finclude_entities%3Dtrue%26include_rts%3Dtrue%26screen_name%3Dphiliprucker%26count%3D1%22&format=json';

// Use simple jQuery .ajax along with the above YQL Rest Statement.
// The benefit of YQL rest statement is we can select the desired node, in this case "retweeted"
$.ajax({
    url: q,
    dataType: "json",
    success: function(data) {

        // Enable to show the jQuery data Object received in the browsers console.
        //console.log(data);

        // If we have data, continue.
        if (data) {

            // Display retweeted value of 'true' or 'false' via browser alert.
            alert('The retweeted status is: ' +  data.query.results.json.retweeted );

        }

    }
});

编辑2:检索全球转发值。

参考:带有可查看转发计数的原始推文

jsFiddle演示:通过HTML检索Twitter全球转发状态的YQL Rest查询

这次,该推文的总转发全球计数将直接从带有该推文的Twitter页面中进行数据抓取。该方法不需要访问原始推文,因为任何转发都会显示此全局计数。

要验证jsFiddle是否显示实际转发计数,请使用上面提供的链接引用OP的推文页面。

该过程与上述描述类似,只是这次我们的.ajax() dataTypehtml,而YQL语句如下:

SELECT * FROM html WHERE url="https://twitter.com/PostBaron/status/286544211556319233" AND xpath="//a[@class='request-retweeted-popup']"

请注意上述YQL语句中使用了XPATH来访问所需的特定数据。这样可以避免下载整个HTML网页,只需访问全球推文数的特定数据即可。这是因为该值在网页锚点中具有唯一的类名request-retweeted-popup。为了快速发现该类名,我使用浏览器上的检查元素工具,在网页上悬停在该值上。一旦知道了类名,我就微调响应,返回<strong>标签中的值,这是我们想要知道的数字。
自然地,0的值意味着该推文从未被转发,但更重要的是表明这是原始推文本身。
最终结果是不需要Twitter API,因为您正在数据爬取实际的公共网页,以获取全球推文数
$.ajax({
    url: q,
    dataType: "html",
    success: function(data) {

        // If we have data, continue.
        if ( $(data).find('.request-retweeted-popup') ) {

            // Store the value of total retweets in this variable.
            var totalRetweets = $(data).find('strong').text();

            // Show browser alert of the totalRetweets value. Change alert() to console.log() for console log browser responses.
            alert('The following Tweet has been retweeted: ' + totalRetweets +  ' times');

        }

    }
});

Hank Gay:请在您的赏金期间对我的答案提供反馈。谢谢! - arttronics
我相信这个问题涉及到@TaylorSingletary的回答中提到的问题:retweeted字段告诉你当前用户是否转发了相关的推文。我想知道的是,相关的推文本身是否是别人的推文。 - Hank Gay
谢谢澄清。请查看EDIT 2:检索全局转发值以获取您的答案。干杯! - arttronics
1
有没有办法只使用API来完成这个任务?我可以退而求其次使用页面抓取,但我强烈希望有一个基于API的解决方案,这也是悬赏的初衷(如果最终发现API内部无法完成,我仍然会授予您悬赏,但我开始怀疑是否有这样的方法)。 - Hank Gay
我查看了新的API v1.1中的Tweets部分,但并没有像你所说的那样提供API选项。与此同时,如果一条推文是一个“完全转发”,则可以使用我回答中显示的最后一种方法进行数据抓取,但需要检测发布的推文中唯一的单词“Retweeted by”。请参见OP的推文在此处被转发; 大约13个推文 HERE。查看该推文的HTML代码,有3个唯一的data属性可供数据抓取和比较:data-retweet-iddata-item-iddata-tweet-id - arttronics
显示剩余3条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接