25

几年前我写了一个小的 JavaScript,它抓取了用户(我的)最近的推文,然后将其解析出来以显示,包括链接、日期等。

它使用这个 json 调用来检索推文,但它不再有效。

http://twitter.com/statuses/user_timeline/radfan.json

它现在返回错误:

{"errors":[{"message":"Sorry, that page does not exist","code":34}]}

我已经研究过使用 api 版本(下面的代码),但这需要身份验证,我宁愿避免这样做,因为它只是为了在我的网站上显示我的最新推文,无论如何在我的个人资料页面上都是公开的:

http://api.twitter.com/1/statuses/radfan.json

我没有跟上 Twitter 的 API 更改,因为我不再真正使用它,有没有办法解决这个问题,还是不再可能?

4

8 回答 8

17

以前,搜索 API是唯一不需要某种形式的OAuth的 Twitter API 。现在它确实需要身份验证。

Twitter 的搜索 API是通过第三方收购获得的——他们很少支持它,而且似乎对它的存在不感兴趣。最重要的是,有效负载存在许多限制,包括但不限于您返回的JSONXML文件中的一组键:值对严重减少。

听到这话,我惊呆了。我花了很长时间弄清楚如何使用最少的代码来执行简单的GET请求(例如显示时间线)。

我决定采用OAuth路线来确保相关的有效负载。您需要一种服务器端语言来执行此操作。JavaScript对最终用户可见,因此在 .js 文件中包含必要的密钥机密是一个坏主意。

我不想使用一个大图书馆,所以我的答案是PHP和 @Rivers 的答案在这里的帮助。@lackovic10 下面的答案描述了如何在身份验证中包含查询。

我希望这可以帮助其他人节省思考如何将 Twitter 的 API 与新的OAuth要求一起使用的时间。

于 2013-04-22T04:21:57.000 回答
12

您无需登录即可通过高级搜索访问和抓取 Twitter:

获取请求

执行基本搜索请求时,您会得到:

https://twitter.com/search?q=Babylon%205&src=typd
  • q(我们的查询编码)
  • src(假设是查询的来源,即键入)

默认情况下,Twitter 返回前 25 条结果,但如果你点击 all你可以获得实时推文:

https://twitter.com/search?f=realtime&q=Babylon%205&src=typd

JSON 内容

更多推文通过 AJAX 加载到页面上:

https://twitter.com/i/search/timeline?f=realtime&q=Babylon%205&src=typd&include_available_features=1&include_entities=1&last_note_ts=85&max_position=TWEET-553069642609344512-553159310448918528-BD1UO2FFu9QAAAAAAAAETAAAAAcAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

用于max_position请求下一条推文

以下 json 数组返回抓取内容所需的所有内容:

https://twitter.com/i/search/timeline?f=realtime&q=Babylon%205&src=typd
  • has_more_items (bool)
  • items_html (html)
  • 最大位置(键)
  • refresh_cursor(键)

DOM 元素

这里有一个DOM elements你可以用来提取的列表

作者推特句柄

div.original-tweet[data-tweet-id]   

作者姓名

div.original-tweet[data-name]

作者的用户ID

div.original-tweet[data-user-id]    

帖子的时间戳

span._timestamp[data-time]  

帖子的时间戳,以毫秒为单位

span._timestamp[data-time-ms]

推文文本

p.tweet-text
 

转推数

span.ProfileTweet-action–retweet > span.ProfileTweet-actionCount[data-tweet-stat-count] 

收藏数量

span.ProfileTweet-action–favorite > span.ProfileTweet-actionCount[data-tweet-stat-count]    

资源

于 2015-05-18T18:19:50.990 回答
6

如果您仍在寻找 JSON 中未经身份验证的推文,这应该可以工作: https ://github.com/cosmocatalano/tweet-2-json

于 2013-08-08T13:04:16.143 回答
0

您可以使用 twitter api v1 获取推文,而无需使用 OAuth。例如:这个链接会变成@jack 的最后 100 条推文。

时间线文档在这里

于 2012-12-05T18:42:50.697 回答
0

这是一个快速的 hack(真的是一个 hack,应该谨慎使用,因为它不是未来的证明),它使用http://anyorigin.com来抓取 twitter 站点以获取最新的推文。

http://codepen.io/JonOlick/pen/XJaXBd

它通过使用 anyorigin(您必须付费才能使用它)来获取 HTML 来工作。然后它使用 jquery 解析 HTML 以提取相关的推文。

移动网站上的推文使用 .tweet-text 类的 div,所以这很轻松。

相关代码如下所示:

$.getJSON('http://anyorigin.com/get?url=mobile.twitter.com/JonOlick&callback=?', function(data){

  // Remap ... utf8 encoding to ascii. 
  var bar = data.contents;
  bar = bar.replace(/…/g, '...');

  var el = $( '<div></div>' );
  el.html(bar);

  // Change all links to point back at twitter
  $('.twitter-atreply', el).each(function(i){
    $(this).attr('href', "https://twitter.com" + $(this).attr('href'))
  });

  // For all tweets
  $('.tweet-text', el).each(function(i){
    // We only care about the first 4 tweets
    if(i < 4) {
      var foo = $(this).html();
      $('#test').html($('#test').html() + "<div class=ProfileTweet><div class=ProfileTweet-contents>" + foo + "</div></div><br>");
    }
  });

});
于 2015-02-03T18:11:01.770 回答
0

正如您在文档中看到的那样,使用 REST API 您需要OAuth 令牌才能执行此操作。幸运的是,我们可以使用搜索(不使用 OAuth)并使用from:[USERNAME]运算符

示例: http
://search.twitter.com/search.json?q=from:marcofolio 将为您提供一个 JSON 对象,其中包含来自该用户的推文,其中

object.results[0]

会给你最后一条推文。

于 2012-11-19T13:03:42.373 回答
0

您可以使用 Twitter API 包装器,例如TweetJS.com,它提供一组有限的 Twitter API 功能,但不需要身份验证。它是这样称呼的;

TweetJs.ListTweetsOnUserTimeline("PetrucciMusic",
function (data) {
    console.log(data);
});
于 2019-08-01T15:22:31.057 回答
-4

方法“GET statuses/user_timeline”需要用户身份验证,如您在官方文档中看到的:

您可以使用不需要身份验证的搜索方法“GET 搜索”。

你有一个从这里开始的代码:http: //jsfiddle.net/73L4c/6/

function searchTwitter(query) {
    $.ajax({
        url: 'http://search.twitter.com/search.json?' + jQuery.param(query),
        dataType: 'jsonp',
        success: function(data) {
            var tweets = $('#tweets');
            tweets.html('');
            for (res in data['results']) {
                tweets.append('<div>' + data['results'][res]['from_user'] + ' wrote: <p>' + data['results'][res]['text'] + '</p></div><br />');
            }
        }
    });
}

$(document).ready(function() {
    $('#submit').click(function() {
        var params = {
            q: $('#query').val(),
            rpp: 5
        };
        // alert(jQuery.param(params));
        searchTwitter(params);
    });
})
于 2013-05-06T17:20:38.340 回答