Panduan Penggunaan WAPI untuk WhatsApp
Panduan Penggunaan WAPI untuk WhatsApp
* Skrip ini berisi fungsi WAPI yang harus dijalankan dalam konteks halaman web
*/
/**
* Penemuan otomatis referensi objek webpack dari instance yang berisi semua fungsi
yang digunakan oleh WAPI
* berfungsi dan membuat objek Store.
*/
jika (![Link]) {
(fungsi () {
fungsi getStore(modul) {
biarkan foundCount = 0;
biarkan Obyek yang dibutuhkan = [
{ id: "Store", kondisi: (modul) => ([Link] &&
[Link] && [Link]) ? [Link] : null },
{ id: "MediaCollection", kondisi: (modul) => ([Link] &&
[Link] && [Link]) ?
[Link] : null },
{ id: "Proses Media", kondisi: (modul) => ([Link]) ? modul :
null },
{ id: "Wap", kondisi: (modul) => ([Link]) ? modul :
null },
{ id: "ServiceWorker", kondisi: (module) => ([Link] &&
[Link]) ? modul : null },
{ id: "State", kondisi: (modul) => ([Link] &&
[Link]) ? modul : null },
{ id: "WapDelete", kondisi: (module) =>
([Link] && [Link] == 2) ?
modul : null },
{ id: "Conn", kondisi: (modul) => ([Link] &&
[Link] && [Link]) ? [Link] : null },
{ id: "WapQuery", kondisi: (modul) => ([Link]) ? modul :
(([Link] && [Link]) ? [Link] : null) },
{ id: "CryptoLib", kondisi: (modul) => (module.decryptE2EMedia) ?
modul : null },
{ id: "OpenChat", kondisi: (modul) => ([Link] &&
[Link] && [Link]) ? [Link] :
null },
{ id: "UserConstructor", kondisi: (module) => ([Link] &&
[Link] && [Link] &&
[Link]) ? [Link] : null },
{ id: "SendTextMsgToChat", kondisi: (module) =>
([Link]) ? [Link] : null },
{ id: "SendSeen", kondisi: (module) => ([Link]) ?
[Link] : null },
{ id: "sendDelete", kondisi: (module) => ([Link]) ?
[Link] : null }
];
untuk (biarkan idx dalam modul) {
if ((typeof modules[idx] === "objek") && (modules[idx] !== null)) {
[Link]((needObj) => {
jika (![Link] || [Link])
kembali;
biarkan needModule = [Link](modules[idx]);
if (neededModule !== null) {
ditemukan Hitung++;
[Link] = needModule;
}
});
if (foundCount == [Link]) {
merusak;
}
}
}
jendela [Link];
}
},
fungsi (o, e, t) {
biarkan modul = [];
untuk (biarkan idx di om) {
biarkan modul = o(idx);
[Link](modul);
}
getStore(modul);
}
]);
}
})();
}
[Link] = {
lastRead: {}
};
kembalikan [Link]([Link]._serializeRawObj(obj), {
jenis : [Link],
isGroup : [Link],
kontak : obj['kontak'] ? [Link]._serializeContactObj(obj['kontak']):
null,
groupMetadata: obj["groupMetadata"] ?
[Link]._serializeRawObj(obj["groupMetadata"]): null,
kehadiran : obj["kehadiran"] ?
[Link]._serializeRawObj(obj["kehadiran"]): null,
pesan: null
});
};
kembalikan [Link]([Link]._serializeRawObj(obj), {
formattedName : [Link],
isHighLevelVerified: [Link],
isMe : [Link],
isMyContact : [Link],
isPSA : [Link],
isUser : [Link],
isVerified : [Link],
isWAContact : [Link],
profilePicThumbObj : [Link] ?
WAPI._serializeProfilePicThumb([Link]): {},
statusMute : [Link],
pesan: null
});
};
kembalikan [Link]([Link]._serializeRawObj(obj), {
id : [Link]._serialized,
pengirim : obj["senderObj"] ? WAPI._serializeContactObj(obj["senderObj"]):
nol,
cap waktu : obj["t"],
isi : obj["tubuh"],
isGroupMsg : [Link],
isLink : [Link],
isMMS : [Link],
isMedia : [Link],
isNotification: [Link],
isPSA : [Link],
ketik : [Link],
obrolan : WAPI._serializeChatObj(obj['chat']),
chatId : [Link],
dikutipMsgObj : WAPI._serializeMessageObj(obj['_quotedMsgObj']),
mediaData : [Link]._serializeRawObj(obj['mediaData'])
});
};
mengembalikan [Link]({}, {
id : [Link],
status : [Link],
isBusiness : ([Link] === benar),
canReceiveMessage: ([Link] === 200)
});
};
mengembalikan [Link]({}, {
eurl : [Link],
id : [Link],
img : [Link],
imgFull: [Link],
mentah : [Link],
tag : [Link]
});
}
/**
* Mengambil semua objek kontak dari toko, memfilternya
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar kontak
*/
[Link] = fungsi (selesai) {
const kontak = [Link]((kontak) => [Link] ===
true).map((kontak) => WAPI._serializeContactObj(kontak));
if (selesai !== undefined) selesai(kontak);
kontak kembali;
};
/**
* Mengambil objek kontak dari toko dengan ID
*
* @param id ID kontak
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek kontak
*/
[Link] = function (id, selesai) {
const ditemukan = [Link](id);
/**
* Mengambil semua objek obrolan dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar obrolan
*/
[Link] = fungsi (selesai) {
const obrolan = [Link]((obrolan) =>
WAPI._serializeChatObj(obrolan));
/**
* Mengambil semua ID obrolan dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar id obrolan
*/
[Link] = fungsi (selesai) {
const chatIds = [Link]((chat) => [Link]._serialized ||
[Link]);
/**
* Mengambil semua objek grup dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar obrolan
*/
[Link] = fungsi (selesai) {
grup const = [Link]((chat) => [Link]);
/**
* Mengambil objek obrolan dari toko dengan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek obrolan
*/
[Link] = fungsi (id, selesai) {
id = typeof id == "string" ? id : id._serialized;
const ditemukan = [Link](id);
[Link] = ([Link]) ? [Link] : function
() { return [Link](ini, argumen); };
if (selesai !== undefined) selesai(ditemukan);
kembali ditemukan;
}
[Link] = [Link]();
[Link] = chatId;
msgWithImg.t = [Link](new Date().getTime() / 1000);
[Link] = chatId;
[Link](msgWithImg).lalu(fungsi (e) {
[Link] = Keterangan lama;
});
kembali benar;
};
[Link] = fungsi () {
var teks = "";
var mungkin = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
/**
* Saya mengembalikan semua pesan yang belum dibaca dari obrolan yang diminta dan
menandainya sebagai sudah dibaca.
*
* :param id: id obrolan
* :ketik id: string
*
* :param includeMe: menunjukkan apakah pesan pengguna harus disertakan
* :ketik includeMe: boolean
*
* :param includeNotifications: menunjukkan apakah notifikasi harus disertakan
* :type includeNotifications: boolean
*
* :param selesai: panggilan balik diteruskan oleh Selenium
* :ketik selesai: fungsi
*
* :returns: daftar pesan yang belum dibaca dari chat yang ditanyakan
* :rtype: objek
*/
[Link] = function (id, includeMe,
includeNotifications, done) {
// dapatkan obrolan dan pesannya
biarkan obrolan = [Link](id);
biarkan pesan = [Link]._models;
// cari pesan yang belum dibaca, yang terbaru ada di akhir array
for (biarkan i = [Link] - 1; i >= 0; i--) {
// pesan sistem: lewati saja
if (i === "hapus") {
melanjutkan;
}
// dapatkan pesan
biarkan pesanObj = pesan[i];
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
[Link] = fungsi (id, selesai) {
const ditemukan = [Link](id);
if (selesai !== undefined) {
[Link]().then(fungsi () {
selesai()
});
} kalau tidak {
[Link]();
}
};
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID
*
* @param id ID obrolan
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
[Link] = fungsi (id, selesai) {
const ditemukan = [Link](id);
x = fungsi () {
if (![Link]) {
[Link]().then(x);
} lain jika (selesai) {
selesai();
}
};
x();
};
/**
* Muat lebih banyak pesan di objek obrolan dari toko berdasarkan ID hingga tanggal
tertentu
*
* @param id ID obrolan
* @param lastMessage stempel waktu UTC dari pesan terakhir yang akan dimuat
* @param selesai Fungsi callback opsional untuk eksekusi async
* @mengembalikan Tidak ada
*/
/**
* Mengambil semua objek metadata grup dari toko
*
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Array|*} Daftar metadata grup
*/
[Link] = fungsi (selesai) {
const groupData = [Link]((groupData) => [Link]);
/**
* Mengambil objek metadata grup dari penyimpanan berdasarkan ID
*
* @param id ID grup
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {T|*} Objek metadata grup
*/
[Link] = fungsi async (id, selesai) {
biarkan output = [Link](id);
};
/**
* Mengambil peserta grup
*
* @param id ID grup
* @returns {Janji.<*>} Menghasilkan metadata grup
* @pribadi
*/
[Link]._getGroupParticipants = fungsi async (id) {
const metadata = menunggu [Link](id);
mengembalikan [Link];
};
/**
* Mengambil ID peserta grup
*
* @param id ID grup
* @param selesai Fungsi callback opsional untuk eksekusi async
* @returns {Janji.<Array|*>} Menghasilkan daftar ID
*/
[Link] = fungsi async (id, selesai) {
output const = (menunggu WAPI._getGroupParticipants(id))
.map((peserta) => [Link]);
/**
* Mendapat objek yang mewakili pengguna yang masuk
*
* @returns {Array|*|$[Link]}
*/
[Link] = fungsi (selesai) {
const rawMe = [Link]([Link]);
var percobaan = 0;
pemeriksaan fungsi() {
for (biarkan i = [Link] - 1; i >= 0; i--) {
biarkan msg = [Link][i];
firstChat = [Link][0];
var originalID = [Link];
[Link] = typeof originalID === "string" ? id : jendela
[Link](id, { sengajaUsePrivateConstructor: true });
if (selesai !== undefined) {
[Link](pesan).lalu(fungsi () {
[Link] = ID asli;
selesai(benar);
});
kembali benar;
} kalau tidak {
[Link](pesan);
[Link] = ID asli;
kembali benar;
}
}
if (selesai !== undefined) selesai(false);
kembali salah;
}
var percobaan = 0;
pemeriksaan fungsi() {
for (biarkan i = [Link] - 1; i >= 0; i--) {
biarkan msg = [Link][i];
function isChatMessage(pesan) {
jika ([Link]) {
kembali salah;
}
if ([Link]) {
kembali salah;
}
if (![Link]) {
kembali salah;
}
kembali benar;
}
[Link] = [];
if ([Link] > 0) {
[Link](messageGroup);
} else { // tidak ada pesan dengan isNewMsg benar
jika (use_unread_count) {
biarkan n = [Link]; // akan menggunakan
atribut unreadCount untuk mengambil n pesan terakhir dari pengirim
for (biarkan i = [Link] - 1; i >= 0; i--) {
biarkan pesanObj = pesan[i];
jika (n > 0) {
if (![Link]) {
biarkan pesan = [Link](messageObj,
includeMe, includeNotifications);
[Link](message);
n -= 1;
}
} else if (n === -1) { // obrolan ditandai sebagai belum dibaca
sehingga akan mengambil pesan terakhir sebagai belum dibaca
if (![Link]) {
biarkan pesan = [Link](messageObj,
includeMe, includeNotifications);
[Link](message);
merusak;
}
} else { // unreadCount = 0
merusak;
}
}
if ([Link] > 0) {
[Link] = 0; // setel ulang penghitung yang
belum dibaca
[Link](messageGroup);
}
}
}
}
if (selesai !== undefined) {
selesai (keluaran);
}
kembali keluaran;
};
};
grup = [Link]();
[Link] = fungsi () {
jika ([Link] == 4) {
if ([Link] == 200) {
biarkan pembaca = new FileReader();
[Link]([Link]);
[Link] = fungsi (e) {
selesai([Link]([Link](',') + 1))
};
} kalau tidak {
[Link]([Link]);
}
} kalau tidak {
[Link](err);
selesai (salah);
}
};
[Link] = fungsi () {
jika ([Link] == 4) {
if ([Link] == 200) {
biarkan pembaca = new FileReader();
[Link]([Link]);
[Link] = fungsi (e) {
selesai([Link]([Link](',') + 1))
};
} kalau tidak {
[Link]([Link]);
}
} kalau tidak {
[Link](err);
selesai (salah);
}
};
if (! percakapan) {
if (selesai !== undefined) {
selesai (salah);
}
kembali salah;
}
kembali benar;
};
jika(!percakapan) {
if(selesai !== undefined) {
selesai (salah);
}
kembali salah;
}
if () {
PesanArray = [PesanArray];
}
biarkan pesanToDelete = [Link](msgId => [Link](msgId));
jika (cabut) {
[Link](messagesToDelete, percakapan);
} kalau tidak {
[Link](messagesToDelete, percakapan);
}
kembali benar;
};
kembali benar;
};
/**
* Pesan baru fungsi yang dapat diamati.
*/
[Link]._newMessagesQueue = [];
[Link]._newMessagesBuffer = ([Link]('saved_msgs') != null) ?
[Link]([Link]('saved_msgs')) : [];
[Link]._newMessagesDebouncer = null;
[Link]._newMessagesCallbacks = [];
[Link]('tambahkan');
[Link]('saved_msgs');
[Link]._newMessagesDebouncer = null;
[Link]._newMessagesQueue = [];
[Link]._newMessagesCallbacks.forEach(fungsi (callbackObj) {
if ([Link] !== undefined) {
[Link](queuedMessages);
}
jika ([Link] === benar) {
[Link](callbackObj);
}
});
/**
* Mendaftarkan panggilan balik untuk dipanggil saat pesan baru tiba di WAPI.
* @param rmCallbackAfterUse - Boolean - Tentukan apakah callback hanya perlu
dijalankan sekali
* @param selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan baru
tiba.
* @returns {boolean}
*/
[Link] = fungsi (rmCallbackAfterUse = true, selesai) {
[Link]._newMessagesCallbacks.push({ callback: selesai, rmAfterUse:
rmCallbackAfterUse });
kembali benar;
};
/**
* Membaca pesan baru buffered.
* @param selesai - fungsi - Fungsi panggilan balik untuk dipanggil berisi pesan
buffer.
* @returns {Array}
*/
[Link] = fungsi (selesai) {
biarkan bufferedMessages = [Link]._newMessagesBuffer;
[Link]._newMessagesBuffer = [];
if (selesai !== undefined) {
selesai(bufferedMessages);
}
kembali pesan buffered;
};
/** Mengakhiri pesan baru fungsi yang dapat diamati **/
[Link] = function (imgBase64, chatid, nama file, caption, selesai) {
//var idUser = jendela [Link](chatid);
var idUser = jendela [Link](chatid,
{ sengajaUsePrivateConstructor: true });
// buat obrolan baru
return [Link](idUser).then((chat) => {
var mediaBlob = [Link].base64ImageToFile(imgBase64, namafile);
var mc = [Link](obrolan);
[Link]([{file: mediaBlob}, 1], obrolan, 1).then(() => {
var media = [Link][0];
[Link](obrolan, { keterangan: keterangan });
if (selesai !== undefined) selesai(benar);
});
});
}
sementara (n--) {
u8arr[n] = [Link](n);
}
/**
* Kirim kartu kontak ke obrolan tertentu menggunakan id obrolan
*
* @param {string} ke '000000000000@[Link]'
* @param {string|array} kontak '111111111111@[Link]' | ['222222222222@[Link]',
'333333333333@[Link], ... 'nnnnnnnnnnnn@[Link]']
*/
[Link] = fungsi (untuk, kontak) {
if () {
kontak = [kontak];
}
kontak = [Link]((c) => {
return [Link](c).__x_contact;
});
/**
* Buat ID obrolan berdasarkan yang dikloning
*
* @param {string} chatId '000000000000@[Link]'
*/
[Link] = function (chatId) {
var newMsgId = [Link][0].__x_id.clone();
[Link] = true;
[Link] = [Link]().toUpperCase();
[Link] = chatId;
newMsgId._serialized = `${[Link]}_${[Link]}_${[Link]}`
return newMsgId;
};
/**
* Kirim VCard Khusus tanpa perlu kontak menjadi Kontak Whatsapp
*
* @param {string} chatId '000000000000@[Link]'
* @param {objek|array} vcard { displayName: 'Nama Kontak', vcard: 'BEGIN:VCARD\
nVERSION:3.0\nN:;Nama Kontak;;;\nEND:VCARD' } | [{ displayName: 'Nama Kontak 1',
vcard: 'BEGIN:VCARD\nVERSI:3.0\nN:;Nama Kontak 1;;;\nEND:VCARD' }, { displayName:
'Nama Kontak 2', vcard: 'BEGIN :VCARD\nVERSION:3.0\nN:;Nama Kontak 2;;;\nEND:VCARD'
}]
*/
[Link] = function (chatId, vcard) {
var obrolan = [Link](chatId);
var tempMsg = [Link]([Link](msg => msg.__x_isSentByMe)
[0]);
var newId = [Link](chatId);
var memperpanjang = {
ack : 0,
id : id baru,
lokal : !0,
diri : "keluar",
t : parseInt(new Date().getTime() / 1000),
ke : chatId,
isNewMsg: !0,
};
if ([Link](vcard)) {
[Link](memperpanjang, {
ketik : "multi_vcard",
vcardList: vcard
});
hapus [Link];
} kalau tidak {
[Link](memperpanjang, {
ketik : "vcard",
subtipe: [Link],
body : [Link]
});
hapus [Link];
}
[Link](tempMsg, perpanjang);
[Link](tempMsg);
};
/**
* Blokir kontak
* @param {string} id '000000000000@[Link]'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
[Link] = fungsi (id, selesai) {
kontak const = [Link](id);
if (kontak !== undefined) {
[Link](!0);
selesai(benar);
kembali benar;
}
selesai (salah);
kembali salah;
}
/**
* buka Blokir kontak
* @param {string} id '000000000000@[Link]'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
[Link] = fungsi (id, selesai) {
kontak const = [Link](id);
if (kontak !== undefined) {
[Link](!1);
selesai(benar);
kembali benar;
}
selesai (salah);
kembali salah;
}
/**
* Hapus peserta Grup
* @param {*} idGroup '0000000000-00000000@[Link]'
* @param {*} idParticipant '000000000000@[Link]'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
[Link] = function (idGroup, idParticipant, selesai) {
[Link](idGroup, [idParticipant]).then(() => {
const metaDataGroup = [Link](id)
checkParticipant = [Link]._index[idParticipant];
if (checkParticipant === undefined) {
selesai(benar); kembali benar;
}
})
}
/**
* Promosikan Peserta menjadi Admin di Grup
* @param {*} idGroup '0000000000-00000000@[Link]'
* @param {*} idParticipant '000000000000@[Link]'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
[Link] = function (idGroup, idParticipant,
selesai) {
[Link](idGroup, [idParticipant]).then(() =>
{
const metaDataGroup = [Link](id)
checkParticipant = [Link]._index[idParticipant];
if (checkParticipant !== undefined && [Link]) {
selesai(benar); kembali benar;
}
selesai (salah); kembali salah;
})
}
/**
* Turunkan Admin Grup
* @param {*} idGroup '0000000000-00000000@[Link]'
* @param {*} idParticipant '000000000000@[Link]'
* @param {*} selesai - fungsi - Fungsi panggilan balik untuk dipanggil saat pesan
baru masuk.
*/
[Link] = function (idGroup, idParticipant,
selesai) {
[Link](idGroup, [idParticipant]).then(() => {
const metaDataGroup = [Link](id)
if (metaDataGroup === tidak terdefinisi) {
selesai (salah); kembali salah;
}
checkParticipant = [Link]._index[idParticipant];
if (checkParticipant !== undefined && [Link]) {
selesai (salah); kembali salah;
}
selesai(benar); kembali benar;
})
}