Markdown自动链接服务问题返回无效网址

时间:2013-12-27 12:12:27

标签: ruby markdown

我正在使用Brett Terpstra's Markdown Services,而自动链接网络搜索服务无法提供有效链接。

任何人都可以找出可能导致问题的原因吗?

require 'net/https'

def e_url(string)
    string.gsub(/([^a-zA-Z0-9_.-]+)/n) do
        '%' + $1.unpack('H2' * $1.size).join('%').upcase
    end
end

ARGF.each do |input|
    http = Net::HTTP.new('duckduckgo.com',443)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    response = http.get("/?q=%5C#{e_url(input)}%2F")

    if response.code.to_i == 200 && !response.body.nil?
        match = response.body.strip.match(/url=(.*?)'/i)
        unless match.nil?
            print %Q{[#{input.strip}](#{match[1].strip})}
        else
            print input
        end
    else
        print input
    end
end

以上脚本在字符串 Google 上运行时返回以下内容:

[Google](/l/?kh=-1&uddg=https%3A%2F%2Fencrypted.google.com%2F)

我期望得到什么:

[Google](https://encrypted.google.com/)

该脚本是使用duckduckgo中的第一个结果在markdown文本中创建链接的快捷方式。

2 个答案:

答案 0 :(得分:0)

好吧,DDG表现得有些奇怪。回复:

http = Net::HTTP.new('duckduckgo.com',443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

response = http.get("/?q=%5C#{e_url(input)}%2F")

是同一个域内的一些url。如果您确实要求它,那么:

match = response.body.strip.match(/url=(.*?)'/i)
response = http.get(match[1].strip) unless match.nil?

您会惊讶地得到以下request.body

<html>
  <head>
    <meta name='referrer' content='origin'>
  </head>
  <body>
  <script language='JavaScript'>
    window.parent.location.replace("https://encrypted.google.com/");
  </script>
  <noscript>
    <META http-equiv='refresh' content="0;URL='https://encrypted.google.com/'">
  </noscript>
  </body>
</html>

因此,我建议您执行以下操作(省略错误处理):

response = http.get("/?q=%5C#{e_url(input)}%2F")
match = response.body.strip.match(/url=(.*?)'/i)
response = http.get(match[1].strip)
match = response.body.strip.match(/URL='(.*?)'/i)
puts %Q{[#{input.strip}](#{match[1].strip})}

# ⇒ [google](https://encrypted.google.com/)

希望它有所帮助。

答案 1 :(得分:0)

你应该联系开发者。该服务实际上已经被弃用,因为他厌倦了跟上他正在抓的结果的变化。它已被SearchLink取代(很快就会更清楚)。