Автоответчик на сообщение WhatsApp в фоновом режиме

Я только что проверяю приложение, автоматически отвечает в сообщение WhatsApp в фоновом режиме. Я тоже пытаюсь это сделать, но у меня ничего не получается. Я пробовал:

 Intent sendIntent = new Intent();
 sendIntent.setAction(Intent.ACTION_SEND);
 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
 sendIntent.setType("text/plain");
 sendIntent.setPackage("com.whatsapp");
 startActivity(sendIntent);

Но он открывает приложение WhatsApp :(, а не отправляет сообщение.

Я просматриваю несколько ссылок: Question1, Question2 также < href = "https://medium.com/@polidea/how-to-respond-to-any-messaging-notification-on-android-7befa483e2d7" rel = "noreferrer"> статья, но не получение удовлетворительного ответа.

Приложение обращается к уведомлениям, чтобы получать сообщения, и отвечая на него, я также пробовал читать уведомления с помощью NotificationListenerService и успешно прочитал сообщение :), но не могу отправить на него ответ, Я хочу знать, как они отправляют сообщения в фоновом режиме, не открывая приложение.


person Rocky    schedule 12.06.2018    source источник
comment
Вам нужен номер для отправки сообщения. Вы должны отправить на определенный номер.   -  person AA Shakil    schedule 18.06.2018
comment
@AAShakil вы проверили приложение, о котором я упоминал выше в приложении, оно не требует ввода данных пользователем, оно напрямую отвечает на сообщение WhatsApp.   -  person Rocky    schedule 19.06.2018
comment
честно говоря, я думаю, что они сделали обходной путь, чтобы нажать в чат. Вы можете попробовать открыть его в настраиваемом веб-просмотре и щелкнуть кнопку по коду. Но не уверен   -  person Pier Giorgio Misley    schedule 19.06.2018
comment
stackoverflow .com / questions / 28980078 /.   -  person Sunny Kumar Aditya    schedule 20.06.2018
comment
@Rocky, у тебя есть решение!   -  person bhanu kaushik    schedule 23.07.2019


Ответы (2)



На устройстве с root-доступом вы можете просто вставить сообщение в базу данных /data/data/com.whatsapp/databases/msgstore.db следующим образом.

Сначала получите контакты из базы данных. WhatsApp использует свои собственные идентификаторы для контактов (а не номера пользователей) в столбце jid, нужно будет получить его и display name.

 class Contact{
public String jid;
public String displayName;
public Contact(String displayName,String jid){
this.displayName = displayName;
this.jid = jid;
}
}
public List<Contact> getContacts(){
     Shell.SU.run("am force-stop com.whatsapp");
     Shell.SU.run("chmod 777 /data/data/com.whatsapp");
                        db = SQLiteDatabase.openOrCreateDatabase(new File("/data/data/com.whatsapp/databases/wa.db"), null);
                        List<Contact> contactList = new LinkedList<>();
                        String selectQuery = "SELECT  jid, display_name FROM wa_contacts where phone_type is not null and is_whatsapp_user = 1";
                        Cursor cursor = db.rawQuery(selectQuery, null);
                        if (cursor.moveToFirst()) {
                            do {
                                Contact contact = new Contact(cursor.getString(1), cursor.getString(0));
                                contactList.add(contact);
                            } while (cursor.moveToNext());
                        }
                        db.close();
}

Затем отправьте сообщение так

    private void sendBigMessage(String jid, String msg, String file, String mimeType) {

     Shell.SU.run("am force-stop com.whatsapp");
 db = SQLiteDatabase.openOrCreateDatabase(new File("/data/data/com.whatsapp/databases/msgstore.db"), null);

            long l1;
            long l2;
            int k;
            String query2, query1;

            Random localRandom = new Random(20L);
            l1 = System.currentTimeMillis();
            l2 = l1 / 1000L;
            k = localRandom.nextInt();

            int mediaType = 0;

            if (mimeType == null || mimeType.length() < 2)
                mediaType = 0;
            else
                mediaType = (mimeType.contains("video")) ? 3
                        : (mimeType.contains("image")) ? 1
                        : (mimeType.contains("audio")) ? 2
                        : 0;

            ContentValues initialValues = new ContentValues();
            initialValues.put("key_remote_jid", jid);
            initialValues.put("key_from_me", 1);
            initialValues.put("key_id", l2 + "-" + k);
            initialValues.put("status", 1);
            initialValues.put("needs_push", 0);
            initialValues.put("timestamp", l1);
            initialValues.put("media_wa_type", mediaType);
            initialValues.put("media_name", file);
            initialValues.put("latitude", 0.0);
            initialValues.put("longitude", 0.0);
            initialValues.put("received_timestamp", l1);
            initialValues.put("send_timestamp", -1);
            initialValues.put("receipt_server_timestamp", -1);
            initialValues.put("receipt_device_timestamp", -1);
            initialValues.put("raw_data", -1);
            initialValues.put("recipient_count", 0);
            initialValues.put("media_duration", 0);

            if (!TextUtils.isEmpty(file) && !TextUtils.isEmpty(mimeType)) {
                //boolean isVideo = mimeType.contains("video");
                Bitmap bMap = null;
                File spec;
                if (mediaType == 3) {
                    spec = new File(vidFolder, file);
                    bMap = ThumbnailUtils.createVideoThumbnail(spec.getAbsolutePath(), MediaStore.Video.Thumbnails.MICRO_KIND);
                } else if(mediaType == 2) {
                    spec = new File(audFolder, file);
                }else{
                    spec = new File(imgFolder, file);
                    bMap = BitmapFactory.decodeFile(spec.getAbsolutePath());
                }
                long mediaSize = (file.equals("")) ? 0 : spec.length();
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                if(mediaType == 1 || mediaType ==3) {
                    bMap = Bitmap.createScaledBitmap(bMap, 100, 59, false);
                    bMap.compress(Bitmap.CompressFormat.JPEG, 60, bos);
                }
                byte[] bArray = bos.toByteArray();

                MediaData md = new MediaData();
                md.fileSize = mediaSize;
                md.file = spec;
                md.autodownloadRetryEnabled = true;
                byte[] arr = SerializationUtils.serialize(md);

                initialValues.put("thumb_image", arr);
                initialValues.put("quoted_row_id", 0);
                //initialValues.put("media_mime_type", mimeType);
                //initialValues.put("media_hash", "9vZ3oZyplgiZ40jJvo/sLNrk3c1fuLOA+hLEhEjL+rg=");
                initialValues.put("raw_data", bArray);
                initialValues.put("media_size", mediaSize);
                initialValues.put("origin", 0);
                initialValues.put("media_caption", msg);
            } else
                initialValues.put("data", msg);

            long idm = db.insert("messages", null, initialValues);

            query1 = " insert into chat_list (key_remote_jid) select '" + jid
                    + "' where not exists (select 1 from chat_list where key_remote_jid='" + jid + "');";

            query2 = " update chat_list set message_table_id = (select max(messages._id) from messages) where chat_list.key_remote_jid='" + jid + "';";


            ContentValues values = new ContentValues();
            values.put("docid", idm);
            values.put("c0content", "null  ");
            db.insert("messages_fts_content", null, values);


            db.execSQL(query1 + query2);
 db.close();
        }
person Niza Siwale    schedule 21.06.2018
comment
Я хотел знать, как это сделать на некорневом устройстве. - person Rocky; 21.06.2018
comment
На устройствах без рута, вероятно, есть широковещательный приемник, который Google и WhatsApp используют для связи. К сожалению, это не публично - person Niza Siwale; 21.06.2018
comment
на самом деле это не работает. В моем приложении у меня есть привилегия читать и писать во внешнюю память, Whatsapp правильно завершается командой su, но команда SQLiteDatabase.openOrCreateDatabase не может открыть базу данных. Я получаю следующий ЖУРНАЛ: Код ошибки: 1806 (SQLITE_CANTOPEN_EACCES) Причина: у приложения нет разрешения на открытие указанного файла базы данных - person Gaucho; 17.11.2018
comment
@Gaucho Я сейчас очень много работаю, я рассмотрю эту проблему и вернусь к вам - person Niza Siwale; 19.11.2018
comment
@Gaucho, вызовите chmod, чтобы добавить разрешение Shell.SU.run("chmod 777 /data/data/com.whatsapp");. Посмотрите обновленный ответ - person Niza Siwale; 19.11.2018
comment
Боже мой, он в сети уже год. Я люблю тебя @niza - person Gaucho; 20.11.2018