FbRuby 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,260 @@
1
+ require_relative 'utils.rb'
2
+ require_relative 'user.rb'
3
+ require_relative 'posts.rb'
4
+ require_relative 'exceptions.rb'
5
+
6
+ module FbRuby
7
+ # class Groups di gunakan untuk parsing grup facebook
8
+ class Groups
9
+
10
+ attr_reader :group_id, :name, :privacy, :total_members, :join
11
+
12
+ # Inisialisasi Object Groups
13
+ #
14
+ # @param group_id [String] Id Dari Group Facebook
15
+ # @param requests_sessions [Session] Object Session
16
+ def initialize(group_id:, requests_sessions:)
17
+ @group_id = group_id
18
+ @sessions = requests_sessions
19
+ @url = URI("https://mbasic.facebook.com/")
20
+ @html = @sessions.get(URI.join(@url,"groups/#{group_id}")).parse_html
21
+ @name = @html.at_xpath("//h1")
22
+ @privacy = @name.nil? ? "unknow" : @name.next_element.text
23
+ @name = @name.nil? ? "unknow" : @name.text
24
+ @formJoin = @html.at_xpath("//form[starts-with(@action, '/a/group/join')]")
25
+ @join = @formJoin.nil?
26
+ @membersTag = @html.at_css("a[href^='/groups/'][href*='view=members']").ancestors("tr")
27
+ @total_members = @membersTag.nil? ? "unknow" : @membersTag.at_css("span[class][id]").text.to_i
28
+ end
29
+
30
+ # Mengembalikan string representasi dari objek Groups.
31
+ #
32
+ # @return [String] Representasi string dari objek Groups.
33
+ def to_s
34
+ return "Facebook Groups : name=#{@name} total_members=#{@total_members} privacy=#{@privacy} id=#{@group_id} join=#{@join}"
35
+ end
36
+
37
+ # Mengembalikan string representasi dari objek Groups.
38
+ #
39
+ # @return [String] Representasi string dari objek Groups.
40
+ def inspect
41
+ return to_s
42
+ end
43
+
44
+ # Refresh Halaman dan update data
45
+ def refresh
46
+ initialize(group_id: @group_id, requests_sessions: @sessions)
47
+ end
48
+
49
+ # Undang Teman ke grup
50
+ #
51
+ # @param members [Array, String] Daftar anggota grup atau string yang dipisahkan koma
52
+ # @param exceptions [Boolean] Menentukan apakah akan mengangkat pengecualian jika gagal.
53
+ def invite_friends(members, exceptions: true)
54
+ members = members.split(',') if members.class == String
55
+ addTag = @html.at_xpath("//a[starts-with(@href,'/groups/members/search')]")
56
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat invite teman ke group ini:(") if addTag.nil?
57
+ html = @sessions.get(URI.join(@url, addTag['href'])).parse_html
58
+ form = html.at_xpath("//form[starts-with(@action,'/groups/members/search')]")
59
+ raise FbRuby::Exceptions::FacebookError.new("Terjadi kesalahan, coba lagi nanti") if form.nil?
60
+ formData = {}
61
+ friends = []
62
+ form.css("input[@type = 'hidden']").each{|i| formData[i['name']] = i['value']}
63
+ suges = html.xpath("//input[@type = 'checkbox' and starts-with(@name,'addees[') and not(@checked)]")
64
+ raise FbRuby::Exceptions::FacebookError.new("Tidak ada saran teman untuk di tambahkan ke grup, pastikan akun facebook kamu memiliki teman!") if suges.length.zero?
65
+
66
+ for name in members
67
+ name = name.to_s.strip
68
+ if name.match?(/^\d+$/)
69
+ friends << name
70
+ else
71
+ cariData = formData.clone
72
+ cariData['query_term'] = name
73
+ cari = @sessions.post(URI.join(@url,form['action']), data = cariData).parse_html
74
+ result = cari.at_xpath("//input[@type = 'checkbox' and starts-with(@name,'addees[') and not(@checked)]")
75
+ if (result.nil? or result.parent.text != name)
76
+ raise FbRuby::Exceptions::FacebookError.new("Akun facebook dengan nama #{name} tidak di temukan") if exceptions
77
+ else
78
+ friends << result['value']
79
+ end
80
+ end
81
+ end
82
+
83
+ friends.each{|i| formData["addees[#{i}]"] = i}
84
+ formData['add'] = 'Submit'
85
+ invite = @sessions.post(URI.join(@url, form['action']), data = formData)
86
+
87
+ return invite.ok?
88
+ end
89
+
90
+ # Gabung ke grup
91
+ def join_groups
92
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat join ke grup ini, mungkin kamu sudah bergabung ke grup ini^^") if @join
93
+ data = {}
94
+ @formJoin.css("input[@type='hidden']").each{|i| data[i['name']] = i['value']}
95
+ @sessions.post(URI.join(@url, @formJoin['action']), data = data).parse_html
96
+ refresh()
97
+ return @join
98
+ end
99
+
100
+ # Keluar Dari Grup
101
+ def leave_groups
102
+ raise FbRuby::Exceptions::FacebookError.new("Kamu belum bergabung ke group ini") if !@join
103
+ html = @sessions.get(URI.join(@url,"#{@group_id}?view=info")).parse_html
104
+ leaveUrl = html.at_xpath("//a[starts-with(@href,'/group/leave')]")
105
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat keluar dari groups ini:(") if leaveUrl.nil?
106
+ leaveHtml = @sessions.get(URI.join(@url, leaveUrl['href'])).parse_html
107
+ leaveForm = leaveHtml.at_xpath("//form[starts-with(@action,'/a/group/leave')]")
108
+ leaveData = {}
109
+ leaveForm.css("input[type = 'hidden']").each{|i| leaveData[i['name']] = i['value']}
110
+ leaveData['confirm'] = "Submit"
111
+ submit = @sessions.post(URI.join(@url, leaveForm['action']), data = leaveData)
112
+ return submit.ok?
113
+ end
114
+
115
+ # Ikuti Grup Ini
116
+ def follow
117
+ html = @sessions.get(URI.join(@url,"#{@group_id}?view=info")).parse_html
118
+ followUrl = html.at_xpath("//a[starts-with(@href,'/a/subscriptions/add')]")
119
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat follow grup ini, mungkin kamu sebelum nya sudah follow ke grup ini") if followUrl.nil?
120
+ ikuti = @sessions.get(URI.join(@url, followUrl['href']))
121
+ return ikuti.ok?
122
+ end
123
+
124
+ # Berhenti ikuti grup ini
125
+ def unfollow
126
+ html = @sessions.get(URI.join(@url,"#{@group_id}?view=info")).parse_html
127
+ unfollowUrl = html.at_xpath("//a[starts-with(@href,'/a/subscriptions/remove')]")
128
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat unfollow group ini") if unfollowUrl.nil?
129
+ stop = @sessions.get(URI.join(@url, unfollowUrl['href']))
130
+ return stop.ok?
131
+ end
132
+
133
+ # Dapatkan daftar admin dan moderator grup
134
+ #
135
+ # @param limit [Integer] Jumblah maksimal yang akan di ambil
136
+ # @param return_hash [Boolean] Kembalikan Hash jika true
137
+ def get_admin_moderator(limit, return_hash = true)
138
+ getProfile('list_admin_moderator',limit, return_hash)
139
+ end
140
+
141
+ # Dapatkan daftar member yang di undang
142
+ #
143
+ # @param limit [Integer] Jumblah maksimal yang akan di ambil
144
+ # @param return_hash [Boolean] Kembalikan Hash jika true
145
+ def get_invited_members(limit, return_hash = true)
146
+ getProfile('list_invited',limit,return_hash)
147
+ end
148
+
149
+ # Dapatkan daftar member selain dari teman
150
+ #
151
+ # @param limit [Integer] Jumblah maksimal yang akan di ambil
152
+ # @param return_hash [Boolean] Kembalikan Hash jika true
153
+ def get_other_members(limit, return_hash = true)
154
+ getProfile('list_nonfriend_nonadmin',limit,return_hash)
155
+ end
156
+
157
+
158
+ # Dapatkan daftar member yang berteman
159
+ #
160
+ # @param limit [Integer] Jumblah maksimal yang akan di ambil
161
+ # @param return_hash [Boolean] Kembalikan Hash jika true
162
+ def get_friends_members(limit, return_hash = true)
163
+ getProfile('list_friend',limit, return_hash)
164
+ end
165
+
166
+ # Dapatkan pengumuman grup
167
+ #
168
+ # @return [Array<Posts>,Posts]
169
+ def get_announcements
170
+ posts = []
171
+ html = @sessions.get(URI.join(@url,"/groups/#{@group_id}?view=announcements")).parse_html
172
+ url = html.css("a[href^='https://'][href*='groups'][href*='permalink'][href*='#footer_action_list']")
173
+ url.each{|i| posts << FbRuby::Posts.new(post_url: i['href'], request_session: @sessions)}
174
+
175
+ return posts
176
+ end
177
+
178
+ # Dapatkan postingan dari grup
179
+ #
180
+ # @param limit [Integer] Jumblah postingan yang akan di ambil
181
+ def get_posts(limit = 5)
182
+ posts = []
183
+ html = @html.clone
184
+
185
+ while posts.length < limit
186
+ url = html.css("a[href^='https://'][href*='groups'][href*='permalink'][href*='#footer_action_list']")
187
+ url.each{|i| posts << FbRuby::Posts.new(post_url: i['href'], request_session: @sessions)}
188
+ next_url = html.at_css("a[href^='/groups'][href*='bacr']")
189
+ break if posts.length >= limit or next_url.nil?
190
+ puts next_url['href']
191
+ html = @sessions.get_without_sessions(URI.join(@url, next_url['href'])).parse_html
192
+
193
+ end
194
+
195
+ return posts[0...limit]
196
+ end
197
+
198
+ # Buat Postingan di Grup
199
+ #
200
+ # @param message[String] Caption dari postingan
201
+ # @param file[String] Path dari foto (hanya bisa posting 1 foto)
202
+ # @param location[String] Nama Kota / Nama tempat
203
+ # @param feeling[String] Nama Perasaan
204
+ # @param filter_type[String] Tipe Filter
205
+ # Ada 3 tipe filter
206
+ # -1 Tanpa Filter
207
+ # 2 Hitam Putih
208
+ # 3 Retro
209
+ def create_timeline(message, file: nil, location: nil,feeling: nil,filter_type: '-1', **kwargs)
210
+ fullForm = @html.at_xpath("//form[starts-with(@action,'/composer/mbasic')]")
211
+ raise FbRuby::Exceptions::FacebookError.new("Tidak dapat membuat postingan ke group ini :(") if fullForm.nil?
212
+ fullFormData = {}
213
+ fullForm.css("input[type = 'hidden']").each{|i| fullFormData[i['name']] = i['value']}
214
+ html = @sessions.post(URI.join(@url, fullForm['action']), data = fullFormData).parse_html
215
+ return FbRuby::Utils::create_timeline(html,@sessions, message, file, location, feeling, filter_type, **kwargs)
216
+ end
217
+
218
+ private
219
+ def getProfile(type, limit, return_hash)
220
+ userList = []
221
+ membersUrl = URI.join(@url,"/browse/group/members/?id=#{@group_id}&start=0&listType=#{type}")
222
+
223
+ loop do
224
+ tmpUsr = []
225
+ html = @sessions.get(membersUrl).parse_html
226
+ members = html.css('img[alt]')
227
+ members.delete(members.first) if members.length > 1
228
+
229
+ for user in members
230
+ userTag = user.parent.parent.at_css('a')
231
+ userUrl = URI.join(@url, userTag['href'])
232
+ next if userUrl.to_s.match?(/\/home\.php/)
233
+ imgUrl = user['src']
234
+ findUid = userUrl.to_s.match(/\/(?:profile\.php\?id=(\d+)|([a-zA-Z0-9_.-]+)\?)/)
235
+ username = (findUid[1].nil? ? findUid[2] : findUid[1])
236
+ tmpUsr << {"name"=>userTag.text,"username"=>username,"profile_url"=>userUrl.to_s,"profile_pict"=>imgUrl}
237
+ end
238
+
239
+ if return_hash
240
+ tmpUsr.each do |i|
241
+ break if userList.length >= limit
242
+ userList << i
243
+ end
244
+ else
245
+ threadPool = FbRuby::Utils::ThreadPool.new(size: 5)
246
+ tmpUsr[0...(limit - userList.length)].each do |profile|
247
+ threadPool.schedule {userList << FbRuby::User.new(username: profile['username'], requests_sessions: @sessions)}
248
+ end
249
+ threadPool.shutdown
250
+ end
251
+
252
+ next_url = html.at_xpath("//a[starts-with(@href,'/browse/group/members')]")
253
+ break if members.length >= limit or next_url.nil?
254
+ membersUrl = URI.join(@url, next_url['href'])
255
+ end
256
+
257
+ return userList
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,297 @@
1
+ require 'uri'
2
+ require 'json'
3
+ require 'digest'
4
+ require 'nokogiri'
5
+ require 'rest-client'
6
+ require_relative 'utils.rb'
7
+ require_relative 'exceptions.rb'
8
+
9
+ module FbRuby
10
+ # Login Ke Akun Facebook
11
+ module Login
12
+ # Login ke akun menggunakan metode Cookie
13
+ class Cookie_Login
14
+
15
+ attr_reader :cookies, :headers, :sessions, :req, :res, :url
16
+ attr_accessor :free_facebook
17
+
18
+ # Inisialisasi Object Cookie_Login
19
+ #
20
+ # @param cookies[String] Cookie akun facebook dalam format string
21
+ # @param free_facebook[Boolean] Gunakan web free facebook ketika login
22
+ # @param headers[Hash] Headers Yang akan di gunakan untuk requests sessions
23
+ # @param save_device[Boolean] Simpan Informasi Login
24
+ def initialize(cookies, free_facebook: false, headers: {}, save_device: true)
25
+ @url = URI(free_facebook ? "https://free.facebook.com" : "https://mbasic.facebook.com")
26
+ @cookies = cookies
27
+ @free_facebook = free_facebook
28
+ @headers = headers
29
+ @save_device = save_device
30
+
31
+ @sessions = FbRuby::Utils::Session.new(@headers, cookies)
32
+ @login_url = URI.join(@url, get_cookie_dict.member?("c_user") ? "/login.php?next=#{URI.join(@url, '/' + get_cookie_dict['c_user'])}" : "/login.php")
33
+ @req = @sessions.get(@login_url)
34
+ @res = @req.parse_html
35
+
36
+ if not @res.at_xpath("//form[starts-with(@action,\"/login/device-based/validate-pin\")]").nil?
37
+ raise FbRuby::Exceptions::SessionExpired.new("Waktu sesi sudah kadaluarsa")
38
+ elsif @req.request.url.include? ('checkpoint')
39
+ raise FbRuby::Exceptions::AccountCheckPoint.new("Akun Facebook anda terkena checkpoint")
40
+ elsif @req.request.url.include? ('login.php')
41
+ raise FbRuby::Exceptions::InvalidCookies.new("Cookie tidak valid atau waktu sesi sudah habis")
42
+ end
43
+
44
+ if @save_device and @req.request.url.include? ('login/save-device/')
45
+ save_device_form = @res.at_xpath("//form[starts-with(@action,\"/login\")]")
46
+ save_device_action = URI.join(@url,save_device_form['action'])
47
+ save_device_data = {}
48
+ save_device_form.xpath("//input[@type=\"hidden\"]").each{|inp| save_device_data[inp['name']] = inp['value']}
49
+ save_device_data[save_device_form.at_xpath("//input[@type=\"submit\"] | //button[@type=\"submit\"]")['value']] = "submit"
50
+
51
+ @sessions.post(save_device_action, save_device_data)
52
+
53
+ elsif not @save_device and @req.request.url.include? ('login/save-device')
54
+ @sessions.get(URI.join(@url, @res.at_xpath("//a[starts-with(@href, \"/login/save-device/cancel\")]")['href']))
55
+ end
56
+
57
+ form_zero = @res.at_xpath("//form[starts-with(@action,\"/zero/optin/write\")]")
58
+ data_zero = {}
59
+
60
+ unless form_zero.nil?
61
+ form_zero.xpath("//input[@type=\"hidden\"]").each {|element| data_zero[element['name']] = element['value']}
62
+
63
+ if free_facebook
64
+ action = URI.join(@url,form_zero['action'])
65
+ button = form_zero.at_xpath("//input[@type=\"submit\"]")
66
+ data_zero[button['value']] = button['type'] unless button.nil?
67
+ @sessions.post(action, data = data_zero)
68
+ else
69
+ data_mode = @sessions.get(URI.join(@url, form_zero.at_xpath("//a[starts-with(@href, \"/zero/optin/write\")]")['href'])).parse_html
70
+ data_form = data_mode.at_xpath("//form[starts-with(@action, \"/zero/optin/write\")]")
71
+
72
+ unless data_form.nil?
73
+ data_form.xpath("//input[@type=\"hidden\"]").each {|element| data_zero[element['name']] = element['value']}
74
+ button = data_form.at_xpath("//input[@type=\"submit\"]")
75
+ data_zero[button['value']] = button['type'] unless button.nil?
76
+ @sessions.post(URI.join(@url, data_form['action']), data = data_zero)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ # Mengembalikan string representasi dari objek Cookie_Login.
83
+ #
84
+ # @return [String] Representasi string dari objek Cookie_Login.
85
+ def to_s
86
+ return "Facebook Cookie_Login: cookies='#{cookies}' free_facebook=#{free_facebook}"
87
+ end
88
+
89
+ # Mengembalikan string representasi dari objek Cookie_Login.
90
+ #
91
+ # @return [String] Representasi string dari objek Cookie_Login.
92
+ def inspect
93
+ return self.to_s
94
+ end
95
+
96
+ # Dapatkan cookie dalam format string
97
+ def get_cookie_str
98
+ if @cookies.instance_of? (Hash)
99
+ return FbRuby::Utils::cookie_hash_to_str
100
+ else
101
+ return @cookies
102
+ end
103
+ end
104
+
105
+ # Dapatkan cookie dalam format Hash
106
+ def get_cookie_dict
107
+ unless @cookies.instance_of? (Hash)
108
+ return FbRuby::Utils::parse_cookies_header(@cookies)
109
+ else
110
+ return @cookies
111
+ end
112
+ end
113
+
114
+ # Alias untuk get_cookie_dict
115
+ def get_cookie_hash
116
+ return get_cookie_dict
117
+ end
118
+
119
+ # Dapatkan akses token pengguna
120
+ def get_token
121
+ data = {'user-agent'=>@headers.member?('user-agent') ? @headers['user-agent'] : FbRuby::Utils::Session.default_user_agent,'referer'=>'https://www.facebook.com/','host'=>'business.facebook.com','origin'=>'https://business.facebook.com','upgrade-insecure-requests'=>'1','accept-language'=>'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7','cache-control'=>'max-age=0','accept'=>'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','content-type'=>'text/html; charset=utf-8'}
122
+ req = @sessions.get("https://business.facebook.com/business_locations", data = data, cookies = get_cookie_dict)
123
+ token = req.body.match(/(EAAG\w+)/)
124
+
125
+ return token[0]
126
+ end
127
+
128
+ # Keluar Dari Akun Facebook
129
+ # @param save_device [Boolean] Simpan informasi login
130
+ def logout(save_device = true)
131
+ data = {}
132
+ case @url.host
133
+ when /(mbasic|free)\.facebook\.com/
134
+ req = @sessions.get(URI.join(@url, '/menu/bookmarks'))
135
+ res = req.parse_html
136
+ link = res.at_css("//a#mbasic_logout_button")
137
+
138
+ unless link.nil?
139
+ link = URI.join(@url, link['href'])
140
+ keluar = @sessions.get(link)
141
+ form_logout = keluar.parse_html.css('//form')
142
+ baye = save_device ? form_logout[0] : form_logout[-1]
143
+ baye_data = {}
144
+ baye_submit = baye.at_xpath("//input[@type=\"submit\"]")
145
+ baye.xpath("//input[@type=\"hidden\"]").each{|inp| baye_data[inp['name']] = inp['value']}
146
+ baye_data[baye_submit['value']] = "submit"
147
+ kirim = @sessions.post(URI.join(@url, baye['action']), data = baye_data)
148
+
149
+ return kirim.ok?
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ # Login ke akun facebook menggunakan web mbasic
156
+ class Web_Login < Cookie_Login
157
+
158
+ attr_reader :url, :email, :password, :free_facebook, :headers, :save_device, :sessions
159
+
160
+ # Inisialisasi object Web_Login
161
+ #
162
+ # @param email [String] Email akun facebook, kamu juga bisa menggunakan id atau nama pengguna
163
+ # @param password [String] Kata sandi akun facebook
164
+ # @param free_facebook[Boolean] Gunakan web free facebook ketika login
165
+ # @param headers[Hash] Headers Yang akan di gunakan untuk requests sessions
166
+ # @param save_device[Boolean] Simpan Informasi Login
167
+ def initialize(email,password, free_facebook: false, headers: {}, save_device: true)
168
+ @url = URI(free_facebook ? "https://free.facebook.com" : "https://mbasic.facebook.com")
169
+ @email = email
170
+ @password = password
171
+ @free_facebook = free_facebook
172
+ @headers = headers
173
+ @save_device = save_device
174
+ @sessions = FbRuby::Utils::Session.new(@headers)
175
+
176
+ @req = @sessions.get(@url)
177
+ @res = @req.parse_html
178
+
179
+ login_form = @res.at_xpath("//form[starts-with(@action,'/login/device-based/regular')]")
180
+ login_data = {"email"=>@email,"pass"=>@password,"login"=>"submit"}
181
+ login_action = URI.join(@url, login_form['action'])
182
+ login_form.css("input[type = 'hidden'][name][value]").each{|inp| login_data[inp['name']] = inp['value']}
183
+
184
+ @submit = @sessions.post(login_action.to_s,login_data)
185
+ @submit_res = @submit.parse_html
186
+ @formSelect = @submit_res.at_css("form[action^='/login/device-based/validate-pin']")
187
+
188
+ if !@formSelect.nil?
189
+ dataSelect = {}
190
+ @formSelect.css("input[type = 'hidden']").each{|i| dataSelect[i['name']] = i['value']}
191
+ @click = @sessions.post(URI.join(@url, @formSelect['action']), data = dataSelect).parse_html
192
+ @logForm = @click.at_css("form[action^='/login/device-based/validate-password']")
193
+ @logData = {"pass"=>@password}
194
+ @logForm.css("input[type = 'hidden']").each{|i| @logData[i['name']] = i['value']}
195
+ @submit = @sessions.post(URI.join(@url, @logForm['action']), data = @logData)
196
+ @submit_res = @submit.parse_html
197
+ end
198
+
199
+ if @submit.request.url.include? ('checkpoint')
200
+ raise FbRuby::Exceptions::AccountCheckPoint.new("Akun Facebook anda terkena checkpoint :(")
201
+ elsif !@submit.request.cookies.member? ('c_user')
202
+ raise FbRuby::Exceptions::LoginFailed.new("Gagal login ke akun, pastikan email dan password anda sudah benar :)")
203
+ end
204
+
205
+ if @save_device and @submit.request.url.include? ('login/save-device/')
206
+ save_device_form = @submit_res.at_xpath("//form[starts-with(@action,\"/login\")]")
207
+ save_device_action = URI.join(@url,save_device_form['action'])
208
+ save_device_data = {}
209
+ save_device_form.xpath("//input[@type=\"hidden\"]").each{|inp| save_device_data[inp['name']] = inp['value']}
210
+ save_device_data[save_device_form.at_xpath("//input[@type=\"submit\"] | //button[@type=\"submit\"]")['value']] = "submit"
211
+
212
+ @res = @sessions.post(save_device_action, save_device_data)
213
+
214
+ elsif !@save_device and @submit.request.url.include? ('login/save-device/')
215
+ unsave_device_url = URI.join(@url, @submit_res.at_xpath("//a[starts-with(@href, \"/login/save-device/cancel\")]")['href'])
216
+
217
+ @res = @sessions.get(unsave_device_url)
218
+ end
219
+
220
+ super(cookies = @sessions.get_cookie_str, free_facebook: @free_facebook, headers: @headers, save_device: @save_device)
221
+ end
222
+
223
+
224
+ # Mengembalikan string representasi dari objek Web_Login.
225
+ #
226
+ # @return [String] Representasi string dari objek Web_Login.
227
+ def to_s
228
+ return "Facebook Web_Login: email='#{@email}' password='#{@password}' free_facebook=#{@free_facebook} save_device=#{@save_device}"
229
+ end
230
+
231
+ # Mengembalikan string representasi dari objek Web_Login.
232
+ #
233
+ # @return [String] Representasi string dari objek Web_Login.
234
+ def inspect
235
+ return self.to_s
236
+ end
237
+ end
238
+
239
+ # Login ke akun facebook menggunakan metode api
240
+ class Api_Login < Cookie_Login
241
+
242
+ attr_reader :email, :password
243
+
244
+ # Inisialisasi object Api_Login
245
+ #
246
+ # @param email [String] Email akun facebook, kamu juga bisa menggunakan id atau nama pengguna
247
+ # @param password [String] Kata sandi akun facebook
248
+ # @param headers[Hash] Headers Yang akan di gunakan untuk requests sessions
249
+ def initialize(email,password,headers = {})
250
+ @email = email
251
+ @password = password
252
+ @headers = headers
253
+ @sessions = FbRuby::Utils::Session.new(@headers)
254
+ @access_token = nil
255
+ @cookies = nil
256
+
257
+ a = 'api_key=882a8490361da98702bf97a021ddc14dcredentials_type=passwordemail=' + email + 'format=JSONgenerate_machine_id=1generate_session_cookies=1locale=en_USmethod=auth.loginpassword=' + password + 'return_ssl_resources=0v=1.062f8ce9f74b12f84c123cc23437a4a32'
258
+ b = {'api_key'=> '882a8490361da98702bf97a021ddc14d', 'credentials_type'=> 'password', 'email': email, 'format'=> 'JSON', 'generate_machine_id'=> '1', 'generate_session_cookies'=> '1', 'locale'=> 'en_US', 'method'=> 'auth.login', 'password'=> password, 'return_ssl_resources'=> '0', 'v'=> '1.0'}
259
+ c = Digest::MD5.new
260
+ c.update(a)
261
+ d = c.hexdigest
262
+ b.update({'sig': d})
263
+ uri = URI("https://api.facebook.com/restserver.php")
264
+ login = JSON.parse(@sessions.get(uri, params = b).body)
265
+
266
+ if login.key?("access_token")
267
+ @cookies = login['session_cookies'].map {|i| "#{i['name']}=#{i['value']};"}.join
268
+ @access_token = login['access_token']
269
+ super(cookies = @cookies, free_facebook: false, headers: @headers, save_device: true)
270
+ elsif ((login.key? ('error_msg')) and (login['error_msg'].include? ('www.facebook.com') or login['error_msg'].include? ('SMS')))
271
+ raise FbRuby::Exceptions::AccountCheckPoint.new("Akun Facebook kamu terkena checkpoin:(")
272
+ else
273
+ raise FbRuby::Exceptions::LoginFailed.new(login['error_msg'])
274
+ end
275
+ end
276
+
277
+ # Dapatkan token akses pengguna
278
+ def get_token
279
+ return @access_token
280
+ end
281
+
282
+ # Mengembalikan string representasi dari objek Api_Login.
283
+ #
284
+ # @return [String] Representasi string dari objek Api_Login.
285
+ def to_s
286
+ return "Facebook Api_Login: email='#{@email}' password='#{@password}'"
287
+ end
288
+
289
+ # Mengembalikan string representasi dari objek Api_Login.
290
+ #
291
+ # @return [String] Representasi string dari objek Api_Login.
292
+ def inspect
293
+ return to_s
294
+ end
295
+ end
296
+ end
297
+ end