Como funciona a comunicação entre softwares? Como posso programar algo que faça isso?

Boa noite para todos vocês do GUJ. Minha pergunta é essa do título. Irei explicá-la…
Essa comunicação a que me refiro é o seguinte (darei um exemplo):
Exemplo básico (ao meu ver) >> um app de frases que dá pra compartilhar as frases no whatsapp. O app de frases se comunica com o whatsapp, pede pra acessar aquela interface com os contatos. (mais abstrato): um programa que se comunica com um outro programa afim de que o primeiro use alguma função do segundo para auxiliar seu trabalho, para agilizar tbm.
Exemplo avançado >> um programa que calcula quantas fotos de gatos tem no seu Google Fotos, a partir da quantidade de fotos presentes quando você pesquisa “gatos” no Google Fotos… Tem mt coisa envolvida, inclusive IA. Então é muito avançado isso.

Como eu faço um negócio desses? Eu já pesquisei mas meio que não entendi. Tem a ver com API?? Suspeito que sim.
Ou é outra coisa?
Claro que não vou usar isso com o Facebook, Office ou G Fotos, por exemplo. Eu daria uma facilitada, talvez com alguns FOSS, porque sou iniciante.

Eu entendi que isso é realmente importante, pois estudando e analisando eu percebi que softwares (web, mobile, desktop etc.) estão o tempo inteiro se comunicando, mesmo que eles estejam distantes (graças à internet e à nuvem).
Pronto, aí está toda a informação. Aguardo a resposta.

é via API sim, quando você não tem um acesso a API vc pode fazer um scrapper (que seria raspar dados de um site).

Esse exemplo que vc deu do Whatsapp seria mais ou menos isso:

O app vai acessar essa URL (exemplo)
POST https://meusite.com.br/api/v1/app/enviar-mensagem

A minha requisição vai ser do tipo POST, nela eu vou passar:

mensagem: "oi, tudo bem?"
telefone: "5511912345678"

Quando eu clicar em um botão, a minha aplicação vai enviar uma requisição para esse “site” (que tem todo um backend por trás) e vai ser responsável por enviar essa mensagem.

Em Java eu gosto de usar o OkHttp

https://square.github.io/okhttp/

Essa requisição ficaria assim:

String nome = "nome aleatorio";

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("mensagem", "Eai " + nome  + ", tudo bem?")
        .addFormDataPart("telefone", "5511912345678")
        .build();

Request request = new Request.Builder()
        .url("https://meusite.com.br/api/v1/app/enviar-mensagem")
        .post(requestBody)
        .build();
1 curtida

Legal. Não sabia desse scrapper! Obrigado pela resposta. Vou procurar mais informações sobre essas duas técnicas aí. Valeu!!