0

J'essaie de faire une demande directe POST à ​​Facebook, à partir de mon modèle (user.rb), pour envoyer un message simple à cet utilisateur dans Messenger. Mais je reçois cette erreur:POST à ​​Facebook Messenger avec Ruby Net :: Erreur HTTP 100

{"error":{"message":"(#100) param recipient must be non-empty.","type":"OAuthException","code":100,"fbtrace_id":"F07BNxzgciW"}} 

Voici ma méthode:

def send_message(msg) 
    url = "https://graph.facebook.com/v2.6/me/messages?access_token="+ENV['PAGE_ACCESS_TOKEN'] 
    data = { 
     'recipient': { 
     'id': self.facebook_id 
     }, 
     'message': { 
     'text': msg 
     } 
    } 
    #data = JSON.pretty_generate(data) 
    puts data 
    uri = URI(url) 
    res = Net::HTTP.post_form(uri, data) 
    puts res.body 
end 

On dirait que les données ne sont pas dans le bon format, de sorte que l'ID utilisateur n'est pas beeing reconnu.

décommenter les ligne de #data je reçois cette erreur, parce que les données est une chaîne, et non un Hash:

NoMethodError: undefined method `map' for #<String:0x000000034bd248> 

Ceci est l'exemple de demande de Facebook Docs que je suis en train de reproduire:

curl -X POST -H "Content-Type: application/json" -d '{ 
    "recipient": { 
    "id": "USER_ID" 
    }, 
    "message": { 
    "text": "hello, world!" 
    } 
}' "https://graph.facebook.com/v2.6/me/messages?access_token=PAGE_ACCESS_TOKEN" 

Répondre

1

Essayez avec ceci:

Ruby/Rails:

uri = URI("https://graph.facebook.com/v2.6/me/messages?access_token="+ENV['PAGE_ACCESS_TOKEN']) 
req = Net::HTTP::Post.new(uri) 
req["Accept"] = "application/json" 
req["Content-Type"] = "application/json" 
req.body = { 
    'recipient': { 
    'id': self.facebook_id 
    }, 
    'message': { 
    'text': msg 
    } 
}.to_json 

res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| 
    http.request(req) 
end 
puts res.body 

Cela peut être refactorisé à une fonction, puis être appelé chaque fois que vous le souhaitez. Cette fonction est un peu plus avancé que ce que nécessaire à la demande précédente

def http_post(url, payload='', headers={}, auth=false) #basic auth is passed as an array of ['user', 'password'] 
    uri = URI(url) 
    req = Net::HTTP::Post.new(uri) 
    headers.each do |k,v| 
     req[k.to_s] = v 
    end 
    req.body = payload.is_a?(Hash) ? payload.to_json : payload.to_s 
    req.basic_auth(*auth) if auth 
    res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http| 
     log_this(req.inspect) 
     http.request(req) 
    end 
    return res 
    end 

# you can now use like: 
url = "https://graph.facebook.com/v2.6/me/messages?access_token="+ENV['PAGE_ACCESS_TOKEN'] 
headers = { 
    "Accept": "application/json" 
    "Content-Type": "application/json" 
} 
payload = { 
    'recipient': { 
    'id': self.facebook_id 
    }, 
    'message': { 
    'text': msg 
    } 
} 
response = http_post(url, payload, options) 

Avec boucle, vous pouvez faire la même demande avec:

curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d "{ \"recipient\": { \"id\": \"substitute_with_user_id\" }, \"message\": { \"text\": \"Your message goes here\" } }" https://graph.facebook.com/v2.6/me/messages?access_token=substitute_with_your_access_token 

En général, vous n'avez pas besoin d'échapper (« \ ») les guillemets doubles, à la place vous pouvez simplement utiliser des guillemets simples (') comme délimiteur du corps json parce que curl lib le fera pour vous dans la plupart des OS où il est utilisé, mais sur windows il semble que vous le devez, et effectivement, il finir par être échappé sous le capot, c'est donc la forme correcte je suppose.

+0

Génial !! travaillé parfaitement, vous avez sauvé ma journée. Merci! – mknarciso

+0

Micael, pouvez-vous convertir ce code en PHP avec demande curl ou avec l'objet Facebook? –

+1

@YasirIjaz vient de faire –