我正在使用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文本中创建链接的快捷方式。
答案 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取代(很快就会更清楚)。