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,25 @@
1
+ module FbRuby
2
+
3
+ class Exception < StandardError
4
+ attr_reader :message
5
+
6
+ def initialize(message = "Terjadi kesalahan :(")
7
+ @message = message
8
+ end
9
+
10
+ def to_s
11
+ return @message
12
+ end
13
+ end
14
+
15
+ module Exceptions
16
+ class AccountCheckPoint < FbRuby::Exception; end
17
+ class LoginFailed < FbRuby::Exception; end
18
+ class InvalidCookies < FbRuby::Exception; end
19
+ class AccountTemporaryBanned < FbRuby::Exception; end
20
+ class AccountDisabled < FbRuby::Exception; end
21
+ class PageNotFound < FbRuby::Exception; end
22
+ class SessionExpired < FbRuby::Exception; end
23
+ class FacebookError < FbRuby::Exception; end
24
+ end
25
+ end
@@ -0,0 +1,453 @@
1
+ require 'erb'
2
+ require 'date'
3
+ require 'tempfile'
4
+ require_relative 'user.rb'
5
+ require_relative 'utils.rb'
6
+ require_relative 'posts.rb'
7
+ require_relative 'login.rb'
8
+ require_relative 'groups.rb'
9
+ require_relative 'messenger.rb'
10
+ require_relative 'exceptions.rb'
11
+
12
+ module FbRuby
13
+
14
+ # class Facebook di gunakan agar penggunaan library jadi lebih mudah dan cepat
15
+ class Facebook < FbRuby::Login::Cookie_Login
16
+
17
+ # Inisialisasi Object Facebook
18
+ #
19
+ # @param cookies[String] Cookie akun facebook dalam format string
20
+ # @param free_facebook[Boolean] Gunakan web free facebook ketika login
21
+ # @param headers[Hash] Headers Yang akan di gunakan untuk requests sessions
22
+ # @param save_device[Boolean] Simpan Informasi Login
23
+ def initialize(cookies, free_facebook: false, headers: {}, save_device: true)
24
+ super
25
+ end
26
+
27
+ # Mengembalikan string representasi dari objek Facebook.
28
+ #
29
+ # @return [String] Representasi string dari objek Facebook.
30
+ def to_s
31
+ return "Facebook: host=#{@url} account=#{get_cookie_hash['c_user']}"
32
+ end
33
+
34
+ # Mengembalikan string representasi dari objek Facebook.
35
+ #
36
+ # @return [String] Representasi string dari objek Facebook.
37
+ def inspect
38
+ return to_s
39
+ end
40
+
41
+ # Parsing Profile Pengguna
42
+ #
43
+ # @param username[String] Username atau id akun facebook
44
+ # @return [User]
45
+ def get_profile(username)
46
+ return FbRuby::User.new(username: username, requests_sessions: @sessions)
47
+ end
48
+
49
+ # Parsing Groups
50
+ #
51
+ # @param group_id[String] Id group
52
+ # @return [Groups]
53
+ def get_groups(group_id)
54
+ return FbRuby::Groups.new(group_id: group_id, requests_sessions: @sessions)
55
+ end
56
+
57
+ # Parsing Postingan
58
+ #
59
+ # @param post_url[String] Link postingan
60
+ # @return [Posts]
61
+ def post_parser(post_url)
62
+ return FbRuby::Posts.new(post_url: post_url, request_session: @sessions)
63
+ end
64
+
65
+ # Parsing Messenger
66
+ #
67
+ # @return [Messenger]
68
+ def messenger
69
+ return FbRuby::Messenger.new(request_session: @sessions)
70
+ end
71
+
72
+ # Dapatkan Foto Dari Akun Pengguna
73
+ #
74
+ # @param target[String] Id / username akun facebook
75
+ # @param limit[Integer] Jumblah foto yang akan di ambil
76
+ # @param albums_url[String] Url dari album foto
77
+ def get_photo(target, limit, albums_url = nil)
78
+ return get_profile(target).get_photo(limit, albums_url)
79
+ end
80
+
81
+ # Dapatkan Album Dari Akun Pengguna
82
+ #
83
+ # @param target[String] Id / username akun facebook
84
+ # @param limit[Integer] Jumblah maksimal album yang akan di ambil
85
+ def get_albums(target, limit)
86
+ return get_profile(target).get_albums(limit)
87
+ end
88
+
89
+ # Dapatkan Postingan dari Akun Pengguna
90
+ # @param target[String] Id / username akun facebook
91
+ # @param limit[Integer] Jumblah maksimal Postingan yang akan di ambil
92
+ def get_posts_user(target, limit)
93
+ return get_profile(target).get_posts(limit)
94
+ end
95
+
96
+ # Dapatkan Postingan dari Group Facebook
97
+ # @param target[String] Id / username akun facebook
98
+ # @param limit[Integer] Jumblah maksimal Postingan yang akan di ambil
99
+ def get_posts_groups(target, limit)
100
+ return get_groups(target).get_posts(limit)
101
+ end
102
+
103
+ # Dapatkan postingan dari beranda
104
+ #
105
+ # @param limit[Integer] Jumblah maksimal Postingan yang akan di ambil
106
+ def get_home_posts(limit)
107
+ post = []
108
+ html = @sessions.get(URI.join(@url, "home.php")).parse_html
109
+
110
+ while post.length < limit
111
+ url = html.css("a[href*='#footer_action_list']")
112
+
113
+ for i in url
114
+ break if post.length >= limit
115
+ post << post_parser((i['href'].include?('http') ? i['href'] : URI.join(@url, i['href']).to_s))
116
+ end
117
+
118
+ next_url = html.at_css("a[href^='/stories.php?aftercursorr']")
119
+ break if next_url.nil? or post.length >= limit
120
+ html = @sessions.get(URI.join(@url, next_url['href'])).parse_html
121
+ end
122
+
123
+ return post
124
+ end
125
+
126
+ # Buat Postingan di akun pengguna
127
+ #
128
+ # @param target[String] Id / Username akun facebook
129
+ # @param message[String] Caption dari postingan
130
+ # @param file[String] Path dari foto (hanya bisa posting 1 foto)
131
+ # @param location[String] Nama Kota / Nama tempat
132
+ # @param feeling[String] Nama Perasaan
133
+ # @param filter_type[String] Tipe Filter
134
+ # Ada 3 tipe filter
135
+ # -1 Tanpa Filter
136
+ # 2 Hitam Putih
137
+ # 3 Retro
138
+ def create_timeline_user(target,message, file: nil, location: nil,feeling: nil,filter_type: '-1', **kwargs)
139
+ return get_profile(target).create_timeline(message, file:file, location:location,feeling:feeling,filter_type:filter_type, **kwargs)
140
+ end
141
+
142
+ # Buat Postingan di Grup
143
+ #
144
+ # @param target[String] Id / Username akun facebook
145
+ # @param message[String] Caption dari postingan
146
+ # @param file[String] Path dari foto (hanya bisa posting 1 foto)
147
+ # @param location[String] Nama Kota / Nama tempat
148
+ # @param feeling[String] Nama Perasaan
149
+ # @param filter_type[String] Tipe Filter
150
+ # Ada 3 tipe filter
151
+ # -1 Tanpa Filter
152
+ # 2 Hitam Putih
153
+ # 3 Retro
154
+ def create_timeline_groups(target,message, file: nil, location: nil,feeling: nil,filter_type: '-1', **kwargs)
155
+ return get_groups(target).create_timeline(message, file:file, location:location,feeling:feeling,filter_type:filter_type, **kwargs)
156
+ end
157
+
158
+ # Buat Grup Baru
159
+ #
160
+ # @param name [String] Nama Group
161
+ # @param privacy [String] Privasi Grup "public,private"
162
+ def create_new_group(name, privacy)
163
+ privacy.downcase!
164
+ priv = ['public','private']
165
+ raise FbRuby::Exceptions::FacebookError.new("Invalid Privacy!!!") if !priv.include? (privacy)
166
+ html = @sessions.get(URI.join(@url, 'groups/create')).parse_html
167
+ formName = html.at_css("form[action^='/groups/create']")
168
+ formData = {"group_name"=>name,"verify"=>"Submit"}
169
+ formName.css("input[type = 'hidden']").each{|i| formData[i['name']] = i['value']}
170
+ namaSubmit = @sessions.get(URI.join(@url, formName['action']), formData).parse_html
171
+
172
+ if !namaSubmit.at_css("input[name='group_name'][type = 'text']").nil?
173
+ errMsg = namaSubmit.at_css("form[action^='/groups/create'] span")
174
+ errMsg = (errMsg.nil? ? "Terjadi Kesalahan :(" : errMsg.text)
175
+ raise FbRuby::Exceptions::FacebookError.new(errMsg)
176
+ end
177
+
178
+ formPrivacy = namaSubmit.at_css("form[action^='/groups/create/privacy']")
179
+ formPrivacyData = {"verify"=>"Submit"}
180
+ privasi = formPrivacy.css("input[type = 'radio']")
181
+ formPrivacy.css("input[type = 'hidden']").each{|i| formPrivacyData[i['name']] = i['value']}
182
+ privacyIndex = priv.index(privacy)
183
+ formPrivacyData[privasi[privacyIndex]['name']] = privasi[privacyIndex]['value']
184
+ create = @sessions.post(URI.join(@url, formPrivacy['action']), data = formPrivacyData).parse_html
185
+ gpUid = create.at_css("a[href^='/groups/'][href*='view=members']")
186
+
187
+ if gpUid.nil? and !create.at_css("input[name='group_name'][type = 'text']").nil?
188
+ errMsg = create.at_css("form[action^='/groups/create'] span")
189
+ errMsg = (errMsg.nil? ? "Terjadi Kesalahan :(" : errMsg.text)
190
+ raise FbRuby::Exceptions::FacebookError.new(errMsg)
191
+ end
192
+
193
+ return get_groups((gpUid['href'].match(/\/groups\/(\d+)/)[1]).strip)
194
+ end
195
+
196
+ # Tambahkan Teman
197
+ #
198
+ # @param target [String] Username / id akun target
199
+ def add_friends(target)
200
+ return get_profile(target).add_friends()
201
+ end
202
+
203
+ # Batalkan permintaan pertemanan
204
+ #
205
+ # @param target [String] Username / id akun target
206
+ def cancel_friends_requests(target)
207
+ return get_profile(target).cancel_friends_requests()
208
+ end
209
+
210
+ # Terima Permintaan Pertemanan
211
+ #
212
+ # @param target [String] Username / id akun target
213
+ def accept_friends_request(target)
214
+ return get_profile(target).accept_friends_requests()
215
+ end
216
+
217
+ # Hapus Permintaan Pertemanan
218
+ #
219
+ # @param target [String] Username / id akun target
220
+ def delete_friends_requests(target)
221
+ return get_profile(target).delete_friends_requests()
222
+ end
223
+
224
+ # Tambahkan Teman
225
+ #
226
+ # @param target [String] Username / id akun target
227
+ def remove_friends(target)
228
+ return get_profile(target).remove_friends()
229
+ end
230
+
231
+ # Dapatkan daftar teman
232
+ #
233
+ # @param target [String] Username / id akun target
234
+ # @param return_hash [Boolean] Kembalikan Hash jika true
235
+ def get_friends(target, limit, return_hash = true)
236
+ return get_profile(target).get_friends(limit, return_hash)
237
+ end
238
+
239
+ # Dapatkan daftar permintaan pertemanan
240
+ #
241
+ # @param limit [Integer] Batas maksimal
242
+ # @param return_hash [Boolean] Kembalikan Hash jika true
243
+ def get_friends_requests(limit, return_hash = true)
244
+ return getFriendsCenter("/friends/center/requests","/friends/center/requests",limit, return_hash)
245
+ end
246
+
247
+ # Dapatkan daftar permintaan pertemanan terkirim
248
+ #
249
+ # @param limit [Integer] Batas maksimal
250
+ # @param return_hash [Boolean] Kembalikan Hash jika true
251
+ def get_friends_requests_send(limit, return_hash = true)
252
+ return getFriendsCenter("/friends/center/requests/outgoing","/friends/center/requests/outgoing",limit, return_hash)
253
+ end
254
+
255
+ # Dapatkan daftar saran pertemanan
256
+ #
257
+ # @param limit [Integer] Batas maksimal
258
+ # @param return_hash [Boolean] Kembalikan Hash jika true
259
+ def get_sugest_friends(limit, return_hash = true)
260
+ return getFriendsCenter("/friends/center/suggestions/","/friends/center/suggestions/",limit, return_hash)
261
+ end
262
+
263
+ # Cari postingan di pencarian
264
+ #
265
+ # @param keyword [String] Keyword Pencarian
266
+ # @param limit [Integer] Limit Pencarian
267
+ def get_posts_by_search(keyword, limit = 5)
268
+ return searchPosts(keyword,"posts",limit)
269
+ end
270
+
271
+ # Cari Akun di pencarian
272
+ #
273
+ # @param keyword [String] Keyword Pencarian
274
+ # @param limit [Integer] Limit Pencarian
275
+ def get_people_by_search(keyword, limit = 5)
276
+ user = []
277
+ html = @sessions.get(URI.join(@url, "/search/people?q=#{ERB::Util.url_encode(keyword)}")).parse_html
278
+
279
+ while user.length < limit
280
+ for usr in html.css("img[alt*='profile picture']")
281
+ next if usr.parent['href'].nil?
282
+ break if user.length >= limit
283
+ findUid = usr.parent['href'].match(/\/(?:profile\.php\?id=(\d+)|([a-zA-Z0-9_.-]+)\?)/)
284
+ uid = (findUid[1].nil? ? findUid[2] : findUid[1])
285
+ user << FbRuby::User.new(username: uid, requests_sessions: @sessions)
286
+ end
287
+
288
+ next_url = html.at_css("a[href*='/search/people']")
289
+
290
+ break if next_url.nil? or user.length >= limit
291
+ html = @sessions.get(next_url['href']).parse_html
292
+ end
293
+
294
+ return user
295
+ end
296
+
297
+ # Cari Video di pencarian
298
+ #
299
+ # @param keyword [String] Keyword Pencarian
300
+ # @param limit [Integer] Limit Pencarian
301
+ def get_video_by_search(keyword, limit = 5)
302
+ return searchPosts(keyword,"videos",limit)
303
+ end
304
+
305
+ # Cari photo di pencarian
306
+ #
307
+ # @param keyword [String] Keyword Pencarian
308
+ # @param limit [Integer] Limit Pencarian
309
+ def get_photo_by_search(keyword, limit = 5)
310
+ return searchPosts(keyword,"photos",limit)
311
+ end
312
+
313
+ # Dapatkan notifikasi terbaru
314
+ #
315
+ # @param limit [Integer] Batas maksimal notifikasi yang di ambil
316
+ def get_notifications(limit)
317
+ notif = []
318
+ html = @sessions.get(URI.join(@url, "/notifications.php")).parse_html
319
+
320
+ while notif.length < limit
321
+ for i in html.css("a[href^='/a/notifications.php']")
322
+ break if notif.length >= limit
323
+ next if !i.at_css("img").nil?
324
+ notifData = {"message"=>nil,"time"=>nil,"redirect_url"=>URI.join(@url, i['href']).to_s}
325
+ msg = i.at_css("div span")
326
+ time = i.at_css("div abbr")
327
+ notifData["message"] = msg.text if !msg.nil?
328
+ notifData["time"] = time.text if !time.nil?
329
+ notif << notifData
330
+ end
331
+
332
+ next_url = html.at_css("a[href^='/notifications.php?more&']")
333
+ break if notif.length >= limit or next_url.nil?
334
+ html = @sessions.get(URI.join(@url, next_url['href'])).parse_html
335
+ end
336
+
337
+ return notif
338
+ end
339
+
340
+ # Dapat daftar grup saya
341
+ #
342
+ # @param limit [Integer] Batas maksimal grup yang di ambil
343
+ def get_mygroups(limit = 5)
344
+ group = []
345
+ html = @sessions.get(URI.join(@url, "/groups/?seemore")).parse_html
346
+
347
+ while group.length < limit
348
+ for url in html.css("a[href^='http'][href*='/groups'], a[href^='/groups']")
349
+ break if group.length >= limit
350
+ uid = url['href'].match(/\/groups\/(\d+)/)
351
+ next if uid.nil?
352
+ group << get_groups(uid[1])
353
+ end
354
+
355
+ next_url = html.at_css("a[href^='/groups?seemore']")
356
+ break if group.length >= limit or next_url.nil?
357
+ html = @sessions.get(URI.join(@url, next_url['href'])).parse_html
358
+ end
359
+
360
+ return group
361
+ end
362
+
363
+ # Dukung author
364
+ def support_author
365
+ kata = ['Hallo Kak @[100053033144051:] :)\n\nSaya suka library buatan kakak:)','Semangat ya kak ngodingnya:)','Semoga kak @[100053033144051:] Sehat selalu ya:)','Hai kak @[100053033144051:] :v','Hai kak Rahmet:)']
366
+ rahmat = get_profile("Anjay.pro098")
367
+ rahmat.follow()
368
+
369
+ planet = ['Matahari','Merkurius','Venus','Bumi','Mars','Jupiter','Saturnus','Uranus','Neptunus','Pluto']
370
+ motivasi = ['"Dia memang indah, namun tanpanya, hidupmu masih punya arti."','"Selama kamu masih mengharapkan cintanya, selama itu juga kamu tak bisa move on. Yang berlalu biarlah berlalu."','"Seseorang hadir dalam hidup kita, tidak harus selalu kita miliki selamanya. Karena bisa saja, dia sengaja diciptakan hanya untuk memberikan pelajaran hidup yang berharga."','"Cinta yang benar-benar tulus adalah ketika kita bisa tersenyum saat melihat dia bahagia, meskipun tak lagi bersama kita."','"Move on itu bukan berarti memaksakan untuk melupakan, tapi mengikhlaskan demi sesuatu yang lebih baik."','"Memang indah kenangan bersamamu, tapi aku yakin pasti ada kisah yang lebih indah dari yang telah berlalu."','"Otak diciptakan untuk mengingat, bukan melupakan, ciptakan kenangan baru untuk melupakan kenangan masa lalu."','"Cara terbaik untuk melupakan masa lalu adalah bukan dengan menghindari atau menyesalinya. Namun dengan menerima dan memafkannya."']
371
+
372
+ waktu = DateTime.now()
373
+ myPost = post_parser("https://www.facebook.com/100053033144051/posts/pfbid0ghCoMGdxGoSSxudGSthM5ZoxJPYujgow4Rvm8RpS6keHpXngFeD15uP22iv3oBvbl/?app=fbl")
374
+
375
+ if waktu.day == 13 and waktu.month == 1
376
+ myPost.send_comment("Selamat ulang tahun yang ke #{waktu.year - 2006} tahun kak @[100053033144051:] :)\n\nSemoga panjang umur dan terus bahagia.")
377
+ elsif waktu.day == 18 and waktu.month == 5
378
+ myPost.send_comment("Selamat ulang tahun yang ke #{waktu.year - 2007} tahun:)")
379
+ else
380
+ my_profile = get_profile("me")
381
+ photo = my_profile.profile_pict
382
+ temp = Tempfile.new(["photo-profile",".png"])
383
+ temp.write(@sessions.get(photo).body)
384
+ temp.rewind
385
+ asal = my_profile.living.values.last
386
+ asal = "Planet #{planet.sample}" if asal.nil?
387
+ time = DateTime.now()
388
+ komen = "Hallo kak @[100053033144051:], perkenalkan nama saya #{my_profile.name} saya tinggal di #{asal}.\n\n\n#{motivasi.sample}\n\n#{myPost.post_url}\n\nKomentar ini di tulis oleh bot\n[#{time.strftime('Pukul : %H:%M:%S')}]\n- #{time.strftime('%A, %d %B %Y')} -"
389
+ myPost.send_react("love")
390
+ send = myPost.send_comment(komen, file = temp.path)
391
+ temp.close
392
+ temp.unlink
393
+
394
+ return send
395
+ end
396
+ end
397
+
398
+ private
399
+ def getFriendsCenter(url, nextUrl, limit, return_hash = true)
400
+ minta = []
401
+ html = @sessions.get(URI.join(@url,url)).parse_html
402
+ while minta.length < limit
403
+ friends = html.at_css("div[id='friends_center_main']").css("div[class] table[class][role='presentation']").select{|i| !i.at_css("img[alt*='profile picture']").nil?}
404
+ break if friends.length.zero?
405
+
406
+ if return_hash
407
+ friends.each do |f|
408
+ name = f.at_css("a").text
409
+ uid = f.at_css("a")['href'].match(/(?:subject_id|uid)=(\d+)/)[1]
410
+ img = f.at_css("img")['src']
411
+ minta << {"name"=>name,"profile_pict"=>img,"username"=>uid}
412
+ end
413
+ else
414
+ thread = FbRuby::Utils::ThreadPool.new(size: 5)
415
+ friends.each do |f|
416
+ thread.schedule do
417
+ username = f.at_css("a")['href'].match(/uid=(\d+)/)[1]
418
+ minta << FbRuby::User.new(username: username, requests_sessions: @sessions)
419
+ end
420
+ end
421
+ thread.shutdown
422
+ end
423
+
424
+ next_url = html.at_css("a[href*='/#{nextUrl}'][href*='ppk']")
425
+ break if minta.length >= limit or next_url.nil?
426
+ html = @sessions.get(URI.join(@url, next_url['href'])).parse_html
427
+ end
428
+
429
+ return minta[0...limit]
430
+ end
431
+
432
+ def searchPosts(keyword,type, limit = 5)
433
+ posts = []
434
+ html = @sessions.get(URI.join(@url, "/search/#{type}?q=#{ERB::Util.url_encode(keyword)}")).parse_html
435
+
436
+ while posts.length < limit
437
+ for po in html.css("div[role = 'article'], div[id]")
438
+ url = po.at_css("a[href^='/story.php'][href*='#footer_action_list'], a[href^='https://'][href*='groups'][href*='permalink'][href*='#footer_action_list'], a[href^='/photo.php']")
439
+ next if url.nil?
440
+ break if posts.length >= limit
441
+ url = (url['href'].include?('http') ? url['href'] : URI.join(@url, url['href']).to_s)
442
+ posts << FbRuby::Posts.new(post_url: url, request_session: @sessions)
443
+ end
444
+
445
+ next_url = html.at_css("a[href*='/search/#{type}']")
446
+ break if next_url.nil? or posts.length >= limit
447
+ html = @sessions.get(next_url['href']).parse_html
448
+ end
449
+
450
+ return posts
451
+ end
452
+ end
453
+ end