[PYTHON] Créer un bot pour Skype sur EC2 (CentOS)

Gardez un bot sur Skype

C'est terriblement nouveau, mais j'ai décidé d'inviter le bot sur Skype. C'est un mémo de travail à l'époque.

chatbot.gif

Configuration EC2

Le bot hut est EC2 (CentOS6).

skype4py-bot-house.gif

item value
region ap-northeast-1
AMI CentOS 6 (ami-25436924)

Installation

skype4py-install.gif

Voici une liste de commandes supposant que vous êtes connecté avec les privilèges root.

Préparation préalable

Yum installez ce dont vous avez besoin à l'avance.

ec2# yum install -y http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
ec2# yum install -y qtwebkit.i686 webkitgtk.i686 alsa-lib.i686 libXv.i686 libXScrnSaver.i686 gtk2-engines.i686 PackageKit-gtk-module.i686 libcanberra.i686 libcanberra-gtk2.i686 pulseaudio-libs.i686 alsa-plugins-pulseaudio.i686
ec2# yum install -y x11vnc ipa-gothic-fonts xauth Xvfb dbus-x11 wget

Installez Skype

Installation

ec2# cd /usr/src
ec2# wget http://www.skype.com/go/getskype-linux-beta-dynamic -O skype-4.3.0.37.tar.bz2
ec2# tar xjvf /usr/src/skype-4.3.0.37.tar.bz2 -C /usr/local
ec2# dbus-uuidgen > /var/lib/dbus/machine-id
ec2# ln -s /usr/local/skype-4.3.0.37 /usr/local/skype
ec2# ln -s /usr/local/skype /usr/share/skype
ec2# ln -s /usr/local/skype/skype /usr/local/bin/skype
ec2# useradd skype
ec2# mkdir /var/db/skype /var/run/skype/ /var/log/skype/
ec2# chown skype:skype /var/db/skype /var/run/skype/ /var/log/skype/

Créer un script de démarrage

Créez un script de démarrage comme celui ci-dessous.

/etc/init.d/skype


#!/bin/bash
#
# Init file for daemonized Skype service
#
### BEGIN INIT INFO
# Provides:          skype
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# X-Interactive:     false
# Short-Description: Start/stop daemonized Skype service
### END INIT INFO
#
# chkconfig: 345 80 10
#
# processname: skype
#
# pidfile: /var/run/skype.pid
#

if [ -r /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
    log_daemon_msg() {
        msg=$1
        prog=$2
        echo -n $"$msg $prog: "
    }
    log_end_msg() {
        if [ "$1" = "0" ]; then
            success
        elif [ "$1" = "1" ]; then
            failure
        fi
        echo
    }
elif [ -r /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
else
    echo "Could not find a helper script needed to run this script."
    exit 1
fi

DAEMON_USER=skype
PROGNAME=`basename $0`
PIDFILE=/var/run/skype.pid
XSERVERNUM=20
XAUTHFILE=/home/skype/.Xauthority
LOGFILE=/var/log/skype/error.log
DBPATH=/var/log/skype/
XAUTHPROTO=.
SKYPE=/usr/local/skype-4.3.0.37/skype
USERNAME= #Veuillez lister le nombre de skype pour le bot
PASSWORD= #Veuillez entrer le mot de passe de compte skype pour le bot

[ -f /etc/sysconfig/skype ] && . /etc/sysconfig/skype

prog="skype"
RETVAL=0

dircheck() {
    if [ ! -d `dirname "$1"` ]; then
        echo "`dirname \"$1\"` does not exist"
        return 1
    else
        return 0
    fi
}

start() {
    log_daemon_msg "Starting" "skype"
    if ! dircheck "$LOGFILE" || ! dircheck "$XAUTHFILE"; then
        log_end_msg 1
        echo
        RETVAL=1
        return 
    fi 
    MCOOKIE=`mcookie` && \
    sudo -u "$DAEMON_USER" env XAUTHORITY=$XAUTHFILE sh -c "xauth add \":$XSERVERNUM\" \"$XAUTHPROTO\" \"$MCOOKIE\" >> \"$LOGFILE\" 2>&1" && \
    sudo -u "$DAEMON_USER" env XAUTHORITY=$XAUTHFILE sh -c "Xvfb :$XSERVERNUM -screen 0 800x600x8 -nolisten tcp >> \"$LOGFILE\" 2>&1 & echo \$!" >"$PIDFILE" &&
    sleep 3 && \
    ( sudo -u "$DAEMON_USER" env LD_LIBRARY_PATH=/usr/local/skype-4.3.0.37/:$LD_LIBRARY_PATH DISPLAY=:$XSERVERNUM XAUTHORITY=$XAUTHFILE SKYPE="$SKYPE" sh -c "echo \"$USERNAME $PASSWORD\" | nohup \"$SKYPE\" --dbpath=\"$DBPATH\" --pipelogin &") >> "$LOGFILE" 2>&1 && \
    (log_end_msg 0 && [ -d /var/lock/subsys ] && touch /var/lock/subsys/skype || true) \
        || (RETVAL=$?; kill -TERM `cat $PIDFILE`; log_end_msg 1)
}

stop() {
    log_daemon_msg "Stopping" "skype"
    if [ -e "$PIDFILE" ]; then
        kill -TERM `cat $PIDFILE` && \
        rm -f $PIDFILE && \
        if [ -d /var/lock/subsys ]; then rm -f /var/lock/subsys/skype; fi && \
        log_end_msg 0 || log_end_msg 1
    else
        log_end_msg 1
        RETVAL=1
    fi
}

usage() {
    echo "Usage: $PROGNAME {start|stop|restart}"
}

case $1 in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        usage
        RETVAL=255
        ;;
esac

exit $RETVAL

Accordez l'autorisation d'exécution.

ec2# chmod +x /etc/init.d/skype

Lancer Skype

ec2# /etc/init.d/skype start

Accès avec VNC

Paramètres iptables

Ouvrons le port 5900 utilisé par VNC.

ec2# vi /etc/sysconfig/iptables
ec2# service iptables restart

Démarrez VNC

ec2# x11vnc -display :20

Accédez au VNC démarré avec VNC Viewer

Téléchargez et installez le logiciel client à partir de la page d'accueil japonaise du projet TigerVNC - Local.JP.

Vous pouvez vérifier l'adresse IP globale de l'instance EC2 à laquelle vous êtes actuellement connecté avec la commande suivante.

ec2# curl http://169.254.169.254/latest/meta-data/public-ipv4;echo

Lancez TigerVNC Viewer et connectez-vous à (adresse IP EC2): 5900 VNC-Viewer-Access.gif

Une fois connecté, sélectionnez une langue et cliquez sur «J'accepte» VNC-Skype-01.gif

L'écran de connexion apparaîtra, mais si vous le laissez tel quel Avec USERNAME / PASSWORD décrit dans le script de démarrage, Connectez-vous sans autorisation. VNC-Skype-02.gif

Lorsque l'écran après la connexion apparaît, quittez VNC Viewer pendant un moment Revenez au travail côté serveur.

Conversation avec le bot

Installez Skype4Py

ec2# wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
ec2# tar xpvf distribute-0.6.49.tar.gz
ec2# python distribute-0.6.49/setup.py install
ec2# easy_install Skype4Py

Ecrire un script de bot

Comme échantillon Quand vous l'appelez "bot" Écrivez un script qui renvoie "| ΦωΦ) ...".

bot.py


# encoding: utf-8

import Skype4Py
import time

def handler(msg, event):
    if event == u"RECEIVED":
        if msg.Body == u"Bot":
            msg.Chat.SendMessage(u"|ΦωΦ) ...")

def main():
    skype = Skype4Py.Skype(Transport='x11')
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1) 

if __name__ == "__main__":
    main()

Lancer le bot

ec2# export DISPLAY=:20;
ec2# python bot.py

Du côté de la visionneuse VNC qui a été laissé tel quel, Le message suivant sera affiché, donc Cochez "Mémoriser cette sélection" et cliquez sur "Oui". VNC-Skype-03.gif

Essayez de parler au bot depuis un autre Skype

unnamed.png

Bravo ☆

Nettoyer

Fermons le serveur VNC. (Skype est toujours en cours d'exécution, donc il n'y a pas de problème)

Élever un bot

Installons diverses réactions sur le bot.

# encoding: utf-8

import Skype4Py
import time
import re #← Ajouter

def handler(msg, event):

    if event == u"RECEIVED":

        #----Correspondance parfaite
        if msg.Body == u"je suis":
            msg.Chat.SendMessage(u"En toi")
            return

        #----Chercher
        if re.search(u"tu", msg.Body, re.S):
            msg.Chat.SendMessage(u"Avec moi")

        #----Plusieurs lignes
        if re.search(u"Se lever", msg.Body, re.S):
            gataMsg = u"""Oh!!
    ∧∧ ∩
    (`・ Ω ・)/
⊂ Non
    (Tsuno
     (Non
 ___/(___
/  (___/
 ̄ ̄ ̄ ̄ ̄ ̄
"""
            msg.Chat.SendMessage(gataMsg)

        #----Extraction de liste
        if re.search(u'je', msg.Body, re.S):
            list = re.findall(u'je', msg.Body, re.S)
            cnt = len(list)
            msg.Chat.SendMessage(u"[Avertissement de conscience de soi] I: "+str(cnt))

        #----Remplacement de la chaîne
        # note: python 2.Série 6 re.les drapeaux ne peuvent pas être utilisés en sous...
        #       http://docs.python.jp/2/library/re.html#re.sub
        if re.search(u'je', msg.Body):
            lines = msg.Body.splitlines()
            msg.Chat.SendMessage(u'compris.')
            for line in lines :
                you = re.sub(u'tu', u'-tu-', line)
                you = re.sub(u'je', u'tu', you)
                you = re.sub(u'-tu-', u'je', you)
                msg.Chat.SendMessage(you)
            msg.Chat.SendMessage(u'C'est vrai.')

def main():
    skype = Skype4Py.Skype(Transport='x11')
    skype.OnMessageStatus = handler
    skype.Attach()
    while True:
        time.sleep(1) 

if __name__ == "__main__":
    main()

skype-bot-chat-05.gif

Inviter le bot dans un groupe

Il existe des éléments «basés sur le cloud» et «basés sur le P2P» dans le chat Skype. Le groupe récemment créé semble être un chat "basé sur le cloud".

"Quels sont les commandes et les rôles du chat? - FAQ sur l'assistance Skype " https://support.skype.com/ja/faq/FA10042/

···alors, S'agit-il d'une spécification SkypeApi, d'une spécification Skype4Py ou d'un problème avec mon style d'écriture? Pour les groupes "basés sur le cloud", les bots ne reconnaissaient pas bien le groupe.

Donc, "Invitez des robots dans le groupe" Si vous souhaitez "notifier les bots au groupe de messages" J'utiliserai la "base P2P".

Le groupe actuellement ouvert Pour vérifier s'il est "basé sur le cloud" ou "basé sur le P2P" Dans le champ de saisie du message, lancez la commande suivante.

/get name

D'après l'explication sur la page Skype-FAQ ci-dessus, il semble que cela puisse être déterminé comme suit.

Si la réponse au nom du groupe commence par "19: ...", vous utilisez le chat basé sur le cloud. Si la réponse au nom du groupe commence par "#skypename ...", vous utilisez un chat basé sur le P2P.

Pour créer un groupe «basé sur le P2P» Dans le champ de saisie du message (toute discussion est OK), lancez la commande suivante.

/createmoderatedchat

Si possible, il est souhaitable que le bot lui-même lance cette commande. (Parce que le bot résident peut devenir administrateur)

C'est aussi un problème à faire depuis VNC Viewer, alors connectez-vous à votre compte bot sur votre PC Je pense qu'il vaut mieux y travailler.

Ajoutons des membres au nouveau groupe "basé sur le P2P".

Notifier un message

Ce n’est pas seulement une réaction passive, Je souhaite être activement notifié par le bot.

Aux utilisateurs

Veuillez modifier le nom d'utilisateur de la destination de notification selon le cas. En enregistrant la commande suivante dans le planificateur, etc. À tout moment (ponctualité, événement, etc.) Il est possible de notifier le message, Il peut être utilisé comme rappel ou notification d'alerte.

Script de notification

send_message_for_user.py


# -*- coding: utf-8 -*-
import Skype4Py
import sys

user = 'username' #Réécriture requise

argvs = sys.argv
acnt = len(argvs)

skype = Skype4Py.Skype(Transport='x11')
skype.Attach()

msg = argvs[1] if acnt > 1 and argvs[1] else 'énergie?'

chat = skype.CreateChatWith(user)
chat.SendMessage(msg)

Commande de notification

ec2# export DISPLAY=:20;
ec2# python send_message_for_group.py 'L'animation commencera dans 30 minutes'

Au groupe

Les notifications aux groupes sont un peu spéciales Trouvez le groupe cible dans la liste des chats auxquels vous appartenez J'essaie de notifier le message uniquement lorsqu'il s'agit du groupe correspondant.

Script de notification

send_message_for_group.py


# -*- coding: utf-8 -*-
import Skype4Py
import sys

argvs = sys.argv
acnt = len(argvs)

skype = Skype4Py.Skype(Transport='x11')
skype.Attach()

msg = argvs[1] if acnt > 1 and argvs[1] else 'énergie?'

for chat in skype.Chats :
    if chat.Name == '#skype_group_name/$1234567890abcdef': #Réécriture requise
        chat.SendMessage(msg)

Commande de notification

ec2# export DISPLAY=:20;
ec2# python send_message_for_group.py 'C'est l'heure du déjeuner, tout le monde.'

finalement

Lorsque vous l'utilisez à des fins professionnelles, faites attention à la sécurité.

Site référencé

■ aws marketplace : CentOS 6 (x86_64) - with Updates https://aws.amazon.com/marketplace/ordering?productId=adc4348e-1dc3-41df-b833-e86ba57a33d6

■ Créer SkypeBot (Skype4Py) sur CentOS 6.3 [2013/03/09] https://mistymagich.wordpress.com/2013/03/09/centos6-3%E3%81%ABskypebot%E3%82%92%E6%A7%8B%E7%AF%89/

■ Comment créer un bot pour Skype qui s'exécute sous Linux [2010/09/26] http://d.hatena.ne.jp/moriyoshi/20100926/1285517353

Recommended Posts

Créer un bot pour Skype sur EC2 (CentOS)
Faire de Jupyter Notebook un service sur CentOS
Créer un robot LINE de retour de perroquet avec AWS Cloud9
[Pour jouer] Essayez de faire de Yuma un robot LINE (Python)
Procédure de création d'un Line Bot sur AWS Lambda
Faisons un robot Discord.
Créer un LINE BOT (chat)
Créez un environnement python sur CentOS 7.7 pour votre serveur domestique
Créer une boîte à Tweet pour Pepper
Comment créer un bot slack
Créer un environnement python dans centos
Créer un environnement python3 sur CentOS7
Créez un robot de notification de pluie pour Hangouts Chat à une vitesse explosive
Créez un Discord Bot qui peut rechercher et coller des images
Un mémo contenant Python2.7 et Python3 dans CentOS
Faire de Unity Accelerator un service sous Linux
Qt pour l'application de bureau de l'application Python
Cours ROS 107 Créer un client pour rosblidge
Créez un modèle d'échiquier pour l'étalonnage de la caméra
Faisons un bot Twitter avec Python!
Faisons un plug-in backend pour Errbot
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Créer un bot Twitter Trend avec heroku + Python
Créer un LINE BOT avec Minette pour Python
Créez un environnement python avec ansible sur centos6
Faire un histogramme pour le moment (matplotlib)
Un mémorandum pour toucher Python Flask avec Heroku
Créer un environnement Kubernetes pour le développement sur Ubuntu
Créer un bot LINE WORKS avec Amazon Lex
Faisons un module pour Python en utilisant SWIG
Quoi qu'il en soit, je suis à la maison, alors faisons un bot de fonction de capture d'écran (site) avec Discord!
Faites pour VB6.
Paramètres initiaux pour l'utilisation de Python3.8 et pip sur CentOS8
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Spécifiez le volume sous Linux et jouez le son
# 2 Créez un environnement Python avec une instance EC2 d'AWS (ubuntu18.04)
Procédure d'installation manuelle de Java (jdk1.8) sous Linux (CentOS7)
Créez un environnement de développement local pour Laravel6.X sur votre Mac
Créez un code QR pour l'URL sous Linux
Construire l'extension Python E-Cell 4 sur Windows 7 (64 bits)
Créez un BOT qui raccourcit l'URL Discord
Faites de votre curseur une photo de votre choix sous Linux
Préparation au traitement des images pbm pixel par pixel
Remarques sur l'installation de Chainer 1.5 pour GPU sous Windows
Faire un point d'arrêt sur la couche c avec python
[Partie 2] Construisons un serveur Web avec EC2 Linux
Faire du modèle une chaîne sur le modèle HTML Django
Procédure de création d'un environnement CDK sous Windows (Python)
[Super facile] Faisons un LINE BOT avec Python.
Les débutants créeront un bot de trading automatique Bitcoin visant beaucoup d'argent! Partie 3 [Bot local]
Les débutants créeront un bot de trading automatique Bitcoin visant beaucoup d'argent! Partie 4 [sans serveur]