YQL查询服务已经关闭,现在有哪些替代方案?

19
现在雅虎关闭了query.yahooapis.com,如下信息所示,有没有人知道一个免费替代品?需要更换"//query.yahooapis.com/v1/public/yql?q="才能让我的RSS抓取器正常工作。重要的EOL通知:从2019年1月3日星期四开始,query.yahooapis.com上的YQL服务将被停用。这将影响到datatables.org的用户以及使用此YQL服务创建功能的开发人员。要继续使用我们的免费Yahoo Weather API,请将https://weather-ydn-yql.media.yahoo.com/forecastrss用作您的新API端点。联系yahoo-weather-ydn-api@oath.com获取凭据,以便接入这个免费的Yahoo Weather API服务。那些使用query.yahooapis.com的基于YQL的其他服务将不再运行。
function yql(a, b) {
        return (
          "**//query.yahooapis.com/v1/public/yql?q=**" +
          encodeURIComponent(
            "select * from " +
              b +
              ' where url="' +
              a +
              '" limit ' +
              params.feedcount
          ) +
          "&format=json"
        );
      }

2
我的小应用也受到了影响,显然整个YQL服务都将停止。 - enorl76
3个回答

6

我发现了这个网站,对于我来说非常好用。 https://api.rss2json.com 它有免费的服务层,相比于使用YQL进行RSS转JSONP转换,更加简单明了。


这只支持 RSS,对吧?不支持 HTML? - Zaki Aziz

3
我开发了CloudQuery,它能够将大多数网站转换为API,并且具有简单易用的Web界面来创建API。而且它在github上是开源的。

1
该网站出现错误:"内部服务器错误"。 - fekiri malek

-3

这里为您提供一种可能的解决方案。

a) 您需要某种代理来允许从不同来源加载带有ajax的内容。建议白名单和添加CORS头等以防止利用您的代理。例如,在您的服务器上创建一个具有此功能的php文件:

$valid_url_regex = '/.*(rss|feed|atom).*/';
$url = $_GET['url'];
if ( !preg_match( $valid_url_regex, $url ) ) exit;

$feeds = file_get_contents($url);
//this is some workaround to get special namespaces into the json
$feeds = str_replace("<content:encoded>","<contentEncoded>",$feeds);
$feeds = str_replace("</content:encoded>","</contentEncoded>",$feeds);
$feeds = str_replace("<media:content ","<mediaContent ",$feeds);
$feeds = str_replace("</media:content>","</mediaContent>",$feeds);

$simpleXml = simplexml_load_string($feeds, "SimpleXMLElement", LIBXML_NOCDATA);//this is for CDATA
$json = json_encode($simpleXml);
header("Access-Control-Allow-Origin: http://yourdomainnamehere");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400'); 
print $json;
b) 对代理脚本执行异步ajax调用并处理数据:
function loadRss(url)
{
    $.ajax({
        url: 'yourserverurl/rssproxy.php?url='+url,
        type: 'GET',          
        success: function(response) {
            handleResponse(JSON.parse(response));
        }
    });
}


function handleResponse(response) { 
    var entries; 

    if(response.entry) //ATOM
        entries = response.entry;
    else if(response.channel.item) //RSS 1/2
        entries = response.channel.item;

    var feedTitle="";

    if(response.title)
        feedTitle = response.title;
    else if(response.channel.title)
        feedTitle = response.channel.title;

    //iterate all news entries
    $.each(entries, function (i, e) {
            console.log("Entry #"+i);
            console.log(e);
            //access the data as necessary like e.content, e.summary, e.contentEncoded etc....
    }
    );

}

我几年前将我的Google RSS API更改为YQL,现在我今天又不得不这样做了,花了几个小时,但这次你不会依赖于第三方供应商,希望你可以使用你的新阅读器代码,直到RSS消失,人类更喜欢著名的过滤气泡。

上面的代码只是一个提示,当然,如果您想将响应映射到通用的YQL结构,您需要投入一些时间。我没有选择这种方式,而是根据需要访问响应的属性。


谢谢您的帮助,我会仔细查看并尝试实现您的解决方案。 - Purp1eOne

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