Discord, Sms/mms, Macrodroid et bottle/Flask

Honimoura

Member
Ah ! Double bonnes nouvelles ca ! Donc en exec je met directement mon .py, en argu je mets [ls=Application], [ls=Expediteur] et [ls=Message] l'un au dessus de l'autre puis dans mon script py j'appel la variable avec sys.argv1, sys.argv2, sys.argv3 ?
 

Honimoura

Member
Me revoila ! Bon j'ai du chercher mais j'ai fini par réussir ! Depuis 19h30 je ne comprenais pas pourquoi en envoyant 3 données, le serveur ne traitait que la première... et pour être franc je ne comprends toujours pas pourquoi l'envoi de 3 données dans la même fonction pose problème bref. J'ai triché mais ca fonctionne ! Il reste juste un souci a régler pour les téls non rooté (comme moi), la fermeture de termux une fois fini... (exit ne le ferme pas vraiment)

C'EST PARTIE POUR LE TUTO !!! MAIS !!!! Avant tout !!! Faites un gros bisou a Dimlos et Endercraft !!!!! Sans eux j'en serais encore a sucer mon pouce !!!!

Donc ! En premier, le serveur, pour moi c'est en pyton. Du coup... on installe python (googlez et prenez l'exécutable pour Windows) et un éditeur de code. Perso j'utilise quelque chose de léger, "Notepad++" Une fois que c'est fait, on lance "Notepad++" ou tout autres éditeur de code prenant le langage python et on copie/colle le code ci dessous qu'on sauvegarde en Python ".py" (ne prenez pas les #///// c'est juste pour délimiter) :

Python:
#///////////////////////////////////////

import socket



def receive_data_from_phone():

    host = '0.0.0.0'

    port = 1234

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    s.bind((host, port))

    s.listen(1)



    data1 = ""

    data2 = ""

    data3 = ""

    data_count = 0



    while True:

        conn, addr = s.accept()

        data = conn.recv(1024).decode()

        conn.close()



        # Sauvegarde des données dans les variables appropriées

        if data_count == 0:

            data1 = data

            data_count += 1

        elif data_count == 1:

            data2 = data

            data_count += 1

        elif data_count == 2:

            data3 = data

            data_count += 1



        # Une fois les trois données reçues, affichage et réinitialisation du compteur

        if data_count == 3:

            print("Donnée 1 :", data1)

            print("Donnée 2 :", data2)

            print("Donnée 3 :", data3)

            data_count = 0



receive_data_from_phone()

#///////////////////////////////////////

Il attend de recevoir les 3 données avant de les afficher (moins d'une seconde une fois la notif reçue). Dans l'ordre suivant :
Application (suivant si vous utilisez discord, sms, ou autres)
Expediteur
Message

Concernant Macrodroid.
Il faut installer termux depuis le site officiel F-Droid (ou installer leur appli, c'est pas dégueu) et non par google play !!! TRES IMPORTANT !!! Ensuite, installez le plugin termux:tasker (certaines versions ne l'acceptent pas, d'ou la nécéssité de ne pas prendre la version google play)

Lancez termux et installez python avec les lignes suivantes (une par une):
pkg upgrade
pkg install python
print("Hello, World") #Si Hello, World s'affiche... on est bon !

Creez votre macro, déclencheur, "Notification reçue", selectionnez l'appli et toutes les notifications (je n'ai testé que sur Discord pour le moment, mais ca doit être semblable pour la plupart dont les sms).

Ensuite créez trois variables (En bas, "variables locales", "+", Le nom que vous voulez mais faut s'en souvenir, type de variable = chaine), une pour l'appli (pratique si vous voulez utiliser ce programme pour plusieurs appli/sms, vous saurez d'ou ca provient) une pour l'expediteur (c'est mieux de savoir de qui ca vient) et une pour le message (Wé c'est un peu le but).

Laissez macrodroid de coté pour le moment.

Ensuite, le script.py qui doit se trouver dans .termux/tasker du téléphone (OBLIGATOIRE) avec les lignes suivantes dans termux:
cd ~/.termux/tasker/
nano nomduscript.py

Puis copiez/collez le code ci dessous ou réécrivez le. Une fois fini : touche de la fenêtre "ctrl" + x pour sauvegarder et fermer, acceptez les modifications et le nom si c'est celui que vous voulez.

Python:
#/////////////////////////////////////////

#!/bin/env python

import socket
import sys
from signal import signal, SIGPIPE, SIG_DFL #Annule les erreurs PIPE... ce qui arrivait de temps en temps
signal(SIGPIPE, SIG_DFL)

def send():
    data1=sys.argv[1]
    host = 'IP de votre serveur'
    port = 1234
    s.socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.sendall(data1.encode())
    s.close
    send2()

def send2():
    data2=sys.argv[2]
    host = 'IP de votre serveur'
    port = 1234
    s.socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.sendall(data2.encode())
    s.close
    send3()

def send3():
    data3=sys.argv[3]
    host = 'IP de votre serveur'
    port = 1234
    s.socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    s.sendall(data3.encode())
    s.close
send()

#///////////////////////////////////
EDIT: Remplacez "IPde votre serveur" par l'ip de votre ordinateur"

Pour une raison que j'ignore, si vous ne faites qu'une fonction pour envoyer les 3 données, le serveur n'en recoit qu'une... Voila pourquoi il y a trois fonctions.

Ensuite, retournez sur Macrodroid, dans votre macro, "Actions", "+", catégorie "Variables" (En bas), définir une variable, puis a chacune de vos trois variables, vous la selectionnez et selectionnez une valeur grace a l'icone a droite de "valeur" mais pas n'importe laquelle !!!

Les valeurs de chaque variable !
Pour l'appli "{not_app_name}" AVEC LES GUILLEMETS POUR TOUTES LES VALEURS !!! IMPORTANT !!
pour l'expediteur "{not_title}"
pour le message "{notification}"

Les guillemets sont importantes car si le nom de l'appli ou l'expéditeur a un espace, il passe en valeur suivante...

Ensuite on ajoute une dernière "Actions" en dessous de nos petites variables, catégorie "Applications", en bas tasker/plugin Locale, termux:tasker, termux.

Configuration, tres simple, dans excutable, le nom du script fait avec termux. nomduscript.py, dans arguments (remplacez les noms par les noms de vos variables) :

[lv=Application]
[lv=Expediteur]
[lv=Message]

Ce n'est pas un "i" majuscule mais bien un "L" minuscule suivit d'un "v". Je ne sais pas si la casse est importante, dans le doute mettez EXACTEMENT le même nom a chaque argument et l'un en dessous de l'autre. On sauvegarde et on revient en arrière.

Ensuite ! ET DANS CETTE ORDRE ! On va dans le dossier de notre script.py sur le serveur (Votre ordinateur), clique droit dans le dossier (sans rien selectionner) et on ouvre powershell ou cmd (Terminal). Et on lance le serveur avec la ligne "Python Nomduscript.py" (sans les guillemets). Le curseur passe a la ligne et attend. Le serveur est pret. (Si vous êtes a l'aise avec python, modifiez le code serveur pour en faire ce que vous voulez des résultats des notifications). Et maintenant, activez votre macro dans Macrodroid. Testez !

Fini !

Bonus !!!!

Si, comme moi vous voulez faire ca sur votre tél principal qui vous suit partout ! Vous pouvez ajouter 2 conditions qui éviterons a votre tél de faire tout ca si vous n'êtes pas chez vous ! La première est d'ajouter la condition "si vous êtes connecté au wifi SSID "TaMaisonàToi" ca évitera a votre tél de le faire pour rien. La seconde condition qui peut être intéressante, c'est un autre "SI"... "Si" le ping de votre tél arrive a joindre votre serveur ! (IP de votre ordinateur) Parce que si il est éteint... ca marche moins bien ! Donc deux petites "clause if", l'un pour "connectivité"/ "SSID" et l'autre pour un "Request HTTP". Je n'ai pas la procédure exacte (Il est 3h30 chui HS mais comme promis, je partage) mais ce n'est pas très compliqué et google n'est jamais loin.

GENERIQUE DE FIN

Il n'y a pas d'interface autre que le Terminal dans ce que je donne, le tuto est déjà bien long... faut pas déconner ;)
Je tiens a préciser que j'ai commencer a coder il y a 4 mois environ... donc oui il peut LARGEMENT être optimisé. Faites vous plaisir et partagez !
Pensez TOUJOURS a lancer le serveur avant TOUTES choses !
Je tiens a nouveau a remercier Dimlos et Endercraft sans qui tout ca ne serait pas là ! DES DIEUX BORDEL !!! DES DIEUX !!!!! Si vous modifiez et partager, s'il vous plait, citez ces deux âmes charitables ! Moi ca ne sert a rien, j'ai fait qu'écouter (mais y a fallut m'expliquer longtemps)

J'espère que ca servira a d'autres, prenez du kiffe !!!! Et si y a une erreur ou un souci, j'essayerais d'aider comme je peux !
 
Last edited:

Honimoura

Member
Petite question, vu que l'on peut prendre la valeur d'une variable des arguments de termux avec (par exemple) "data = sys.argv[1]", peut on faire l'inverse "sys.argv[1] = data" pour lui donner la valeur de data ? Et si oui, le type de variable reste bien le même ? Car j'ai essayé et je rencontre la fameuse erreur "out of range"
 

Dimlos

Well-known member
Voulez-vous dire passer des variables de Termux à MacroDroid ?
Si vous imprimez en Python, vous pouvez le passer à une variable spécifiée dans Standard Output car il sera imprimé sur la sortie standard.
Dans ce cas, le type de la variable sera une chaîne de caractères.
 

Honimoura

Member
Je vais être plus précis afin de comprendre ma démarche. La ce projet fonctionne bien pour recevoir les notifs. Mais du coup, gourmandise oblige ! Je me dis, mais attend, faudrait pousser le truc et pouvoir répondre a ces méssages ! Du coup sur le serveur (qui est une IA vocale) une fois le méssage entendu, l'IA propose si on veut répondre, elle écoute et sauvegarde la réponse dans une variable puis renvoie la même valeur en appli, la même valeur en expediteur et le méssage que l'on vient de lui donner. Puis renvoie les 3 données au script du tel(que j'ai modifier pour attendre un retour de 1 ("non" et se coupe) ou 3 données (appli, expe, message)).

De là je cherche comment utiliser ces valeurs pour les renvoyer sur la même appli a la même personne...
Et je pense que dans tout les cas il faut sauvegarder ces 3 valeurs avant toutes choses.

Qu'en pensez vous ? Faisable ? Je rêve ?
 

Honimoura

Member
Par contre, je ne connais pas votre methode Standard Output, vous voulez dire "print(data1) > sys.argv[1]" ?
Ayant appris principalement seul et avec chatgpt, niveau therme je suis pas du tout op

Ok donc avec Macrodroid on peut récuperer ce que l'on affiche dans le terminal ? (si j'ai fini par comprendre)
 

Endercraft

Moderator (& bug finder :D)
Ok donc avec Macrodroid on peut récuperer ce que l'on affiche dans le terminal ? (si j'ai fini par comprendre)
C'est ça.
Pas forcément python mais tout ce qui est imprimé sur le terminal.
Je vais être plus précis afin de comprendre ma démarche. La ce projet fonctionne bien pour recevoir les notifs. Mais du coup, gourmandise oblige ! Je me dis, mais attend, faudrait pousser le truc et pouvoir répondre a ces méssages ! Du coup sur le serveur (qui est une IA vocale) une fois le méssage entendu, l'IA propose si on veut répondre, elle écoute et sauvegarde la réponse dans une variable puis renvoie la même valeur en appli, la même valeur en expediteur et le méssage que l'on vient de lui donner. Puis renvoie les 3 données au script du tel(que j'ai modifier pour attendre un retour de 1 ("non" et se coupe) ou 3 données (appli, expe, message)).

De là je cherche comment utiliser ces valeurs pour les renvoyer sur la même appli a la même personne...
Et je pense que dans tout les cas il faut sauvegarder ces 3 valeurs avant toutes choses.

Qu'en pensez vous ? Faisable ? Je rêve ?
Je vois bien une solution mais il est 1 heure du matin franchement là je veux juste dormir. Et il fait très chaud... Je crois que je vais faire comme mon chat... Dormir par terre sur avoir moins chaud
 

Honimoura

Member
:D :D :D
Je comprends tout a fait ! Mais si vous pensez a une solution, ca me rassure déjà de ne pas avoir continué pour rien ! ^^
Reposez vous bien, je viendrais jeter un œil un autre jour. En tout cas merci infiniment !!
 

Dimlos

Well-known member
Vous pouvez sauvegarder la sortie standard dans une variable lorsque vous exécutez un script depuis termux.
Cependant, cela n'est pas suffisant pour obtenir la fonctionnalité interactive que vous recherchez.
 

Attachments

  • Output.jpg
    Output.jpg
    471.1 KB · Views: 1

Honimoura

Member
Hhhhhmmmm, interessant ca ! Bon j'ai pas interet a ce qu'il y ai une erreur ou autre, sinon il va m'enregistrer tout et n'importe quoi. Mais c'est deja un bon debut.
Apres j'ai pensé faire autrement, faire en sorte qu'une fois la réponse obtenue, voir si avec macrodroid je peux ouvrir la notif initiale, comme ca je serais sur la bonne appli au bonne expediteur, faire que le script ecrive la réponse et appuyer sur "enter". Et refermer l'appli. De là ca devrait fonctionner nan ?

Avec une sauvegarde de la reponse avec votre methode "Standard Output " pour sauvegarder dans la variable "MessageR", puis "Afficher boite de Dialogue", Titre de la boite de dialogue" = "{not_title}", "Saisir le texte de la boite de dialogue" = "{lv=MessageReponse}" Ca devrait le faire nan ?
 

Honimoura

Member
Re bonjour. J'ai enfin réussi a passer la notif réponse au tel, qui la sauvegarde dans une variable. Cependant, j'ai beau chercher dans toutes les catégories, je n'ai pas trouvé d'action "répondre a une notification" :s
 

Endercraft

Moderator (& bug finder :D)
 

Honimoura

Member
Alors effectivement la nouvelle version donne bien plus d'options. Cependant maintenant il ne veut plus lancer mon script (que j'ai placé a nouveau dans le dossier tasker de termux)

Même en "testant l'action" du script dans un terminal il ne le lance pas. Par contre depuis termux j'arrive a le lancer
 
Top