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.
- checksums.yaml +7 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +876 -0
- data/lib/FbRuby/chats.rb +369 -0
- data/lib/FbRuby/comments.rb +178 -0
- data/lib/FbRuby/createaccount.rb +142 -0
- data/lib/FbRuby/exceptions.rb +25 -0
- data/lib/FbRuby/facebook.rb +453 -0
- data/lib/FbRuby/groups.rb +260 -0
- data/lib/FbRuby/login.rb +297 -0
- data/lib/FbRuby/messenger.rb +272 -0
- data/lib/FbRuby/posts.rb +267 -0
- data/lib/FbRuby/settings.rb +282 -0
- data/lib/FbRuby/tempmail.rb +56 -0
- data/lib/FbRuby/user.rb +550 -0
- data/lib/FbRuby/utils.rb +412 -0
- data/lib/FbRuby.rb +21 -0
- metadata +114 -0
@@ -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
|
data/lib/FbRuby/login.rb
ADDED
@@ -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
|