¿Publicar en Facebook OG con HttParty solo funciona desde la consola Rails?
-
28-10-2019 - |
Pregunta
Tengo un problema realmente extraño con mi aplicación Rails y el gráfico abierto de Facebook. Cada vez que publico una acción en un objeto, Facebook devuelve un error que parece indicar que no se puede alcanzar la URL del objeto, o el raspador OG no raspa la URL correctamente.
Sin embargo, cuando tomo la URL que la aplicación está generando para la publicación en Facebook y uso manualmente la gema HTTParty para publicarla, funciona.
Aquí está mi código:
class Post < ActiveRecord::Base
FB_CONFIG = YAML.load_file("#{Rails.root}/config/initializers/facebook.yml")[Rails.env]
def self.to_facebook_og(obj, obj_id, verb, auth, extra)
#requires that a user has granted `publish_actions`
found_obj = obj.classify.constantize.find(obj_id) #find the actual object we're talking about
post_url = self.construct_facebook_action_url(obj, found_obj, verb, auth, extra) #create the URL
begin
ret = HTTParty.post(post_url)
logger.info "Facebook Post Action Response = #{ret}"
rescue HTTParty::ResponseError => e #handle any errors
logger.error {"FACEBOOK Response #{ret.code} / #{e.inspect}"}
flash.alert {"There was a Facebook problem. Please try again."}
return
end
end
def self.construct_facebook_action_url(obj, found_obj, verb, auth, extra)
base = 'https://graph.facebook.com/'
uid = auth.uid
namespace = FB_CONFIG['namespace']
token = "?access_token=#{auth.token}"
og_url = "#{obj}=http://theshortestfiction.com/#{obj.pluralize}/#{found_obj.id}"
fb_url = base + uid + '/' + namespace + ':' + verb + token + '&' + og_url + extra
logger.info fb_url
fb_url
end
def self.lint_og_object(obj_url)
lint_ret = HTTParty.post("https://developers.facebook.com/tools/lint/?url=#{obj_url}&format=json")
logger.info "Facebook Linter Response = #{lint_ret}"
end
end
Cuando se lee un objeto a través del método de exhibición de su controlador, la aplicación llama Post.to_facebook
. De mis registros, puedo ver que eso Post.construct_facebook_action_url
está construyendo la URL adecuada (porque, como dije, puedo sacar la URL de los registros y publicarla manualmente desde la consola). Entonces, ¿supongo que hay un problema con cómo estoy pasando la URL a HttParty? Facebook parece capaz de decir qué objeto url es debería estar mirando. ¿Por qué el código que he escrito no funciona, sino manualmente en la consola, lo hace?
Aún más extraño: una vez que ha habido una acción posterior exitosa en el objeto una vez, el código parece funcionar de manera consistente. Facebook insiste en El problema es que las URL de los objetos no pueden accesibles, pero no puedo entender cómo no lo son, ya que puedo navegar con ellas.
Solución
Creo que este es en realidad un problema de tiempo de espera.
Tuve exactamente el mismo problema que usted, usando HTTParty y no se puede alcanzar la URL.
Moví el código a un proceso de fondo usando Resque y solucionó el problema.