Skip to content

Latest commit

 

History

History

2014-04-21

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Facebook Bot responds with code output

#!/usr/bin/env ruby

Author : Emad Elsaid (https://github.com/blazeeboy) Usage :

  • ruby evalin_comodor.rb <accesstoken> this will get a long term access token from the short term one
  • ruby evalin_comodor.rb will start the script
require './evalin.rb' # https://github.com/blazeeboy/RubyScripts/blob/master/2014-3-30/evalin.rb
require 'koala' # gem install koala

create a facebook app and get access token from here https://developers.facebook.com/tools/explorer scopes required : public_profile, basic_info, publish_checkins, status_update, photo_upload, video_upload, create_note, share_item, publish_stream, manage_notifications, publish_actions, user_friends

APP_ID      = 'xxxxxxxxxxxxxxxx'
APP_SECRET  = 'xxxxxxxxxxxxxxxx'
NOTIFICATIONS_LIMIT = 100

if ARGV.size > 0
  oauth = Koala::Facebook::OAuth.new(APP_ID, APP_SECRET)
    new_access_info = oauth.exchange_access_token_info ARGV.first
    File.write 'token', new_access_info['access_token']
  puts 'New Access Token written'
  exit
end

respond to comment with mention

def respond_to(graph, comment_id, post_id)

  comment = graph.get_object(comment_id)

  username = comment['from']['name']
  message = comment['message']
  puts "responding to : #{message}"

read comment parts languages and code

  groups = message.scan /#{$name}\s+([a-zA-Z+]+)(.+)/m
  return if groups.length != 1

  language = groups.first[0]
  code = groups.first[1].strip
  return unless output = evalin(code, language)

posting comment reply

  graph.put_object post_id, 'comments', {message: "#{username} \n#{output}"}

end

loop do
  begin

yes each time will read token in case you started it then added access token or refreshed it you won't need to restart it

    oauth_access_token = File.read('token')
    $graph = Koala::Facebook::API.new(oauth_access_token)

get your name

    $name = $graph.get_object('me')['name']

get notifications

    notifications = []
    page = $graph.get_connections('me','notifications')
    begin
      notifications += page
    end while page = page.next_page and notifications.length<=NOTIFICATIONS_LIMIT

Now lets head to parse and respond to them

    notifications.reverse_each do |n|
      begin
        if n['application'] and n['application']['name'] == 'Groups' and n['title'].include? 'mentioned you'

          ids = n['link'].scan /comment_id=([0-9]+)&/
          post_ids = n['link'].scan /permalink\/([0-9]+)\//
          if ids.size == 1 and post_ids.size == 1
            respond_to $graph, ids.first.first, post_ids.first.first 
          end

        end
      rescue 

ignore it

      end

mark notification as read

      $graph.put_object(n['id'],'', {unread: false})
    end
    puts "Notifications found : #{notifications.size}"

please rescue if something went wrong thanks,

  rescue Exception => e
    puts "Error : #{e}"
  end

wait for 60 seconds and try again

  sleep 60
end