Comme le titre l'indique,
root@4c506a68cd26:~# python --version
Python 3.7.7
root@4c506a68cd26:~# mecab --version
mecab of 0.996
Je vais l'omettre car il ne suit que «l'article référencé».
Je n'ai pas compris un point, ou mal compris, je pensais qu'il y avait un paramètre pour spécifier le point de terminaison lors du déploiement local ou sur heroku, alors j'ai cherché de diverses manières.
Je ne l'ai écrit nulle part, mais d'une manière ou d'une autre, je suis arrivé à une conclusion, donc si je l'écris pour ne pas l'oublier,
Qu'il soit local ou en cours d'exécution sur un serveur sur Internet, il se connecte au serveur Discord et est reconnu comme étant en ligne pendant que client.run (TOKEN)
est en cours d'exécution. Je pense que c'est ce que cela signifie.
Je n'ai pas lu le code source et ce n'est pas une information fiable, mais je pense que c'est probablement le cas.
Connectez-vous à heroku depuis la CLI.
heroku login
Connectez-vous à heroku avec votre navigateur.
Connectez-vous au registre des conteneurs sur Heroku.
heroku container:login
Réglez le jeton Discord.
heroku config:set TOKEN=hogehoge
FROM python:3.7-slim
ENV HOME=/app
WORKDIR /app
#Utilisé pour installer NEologd
RUN apt-get update && apt-get install -y \
build-essential \
curl \
git \
openssl \
sudo \
zip \
file
#Installez MeCab
RUN apt-get update && apt-get install -y \
mecab \
libmecab-dev \
mecab-ipadic \
mecab-ipadic-utf8
RUN cd /usr/share/mecab && \
git clone https://github.com/neologd/mecab-ipadic-neologd.git && \
cd mecab-ipadic-neologd/ && \
./bin/install-mecab-ipadic-neologd -n -a -y -p /usr/share/mecab/dic/mecab-ipadic-neologd/
COPY requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
COPY . .
# discord_bot.Exécutez py pour lancer le bot
CMD ["python", "discord_bot.py"]
requirements.txt
mecab-python3
discord.py
De tous les messages sans utiliser de commandes
discord_bot.py
import os
import MeCab
import discord
TOKEN = os.environ["TOKEN"]
PREFIX = "mecab "
client = discord.Client()
@client.event
async def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('------')
@client.event
async def on_message(message):
print("received message: " + str(message))
if message.content.startswith(PREFIX):
#Ne répond pas si l'expéditeur est un bot
if client.user != message.author:
print(message.content)
splited_message = message.content.split() #Diviser par l'espace
splited_message.pop(0) #Le début est"mecab"Si inutile
content = splited_message.pop() #Traitez la fin comme une chaîne de caractères à analyser
option = ' '.join(splited_message) # "mecab "De"{Chaîne de caractères cible}"Concaténer les chaînes entre
mecab = MeCab.Tagger(option)
m = "```" + mecab.parse(content) + "```"
print(m)
#Envoyer un message au canal auquel le message a été envoyé
await message.channel.send(m)
client.run(TOKEN)
heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app
Une fois le déploiement réussi, cochez ** SCOPES ** sur la page OAuth2 de la page des développeurs Discord pour accéder à l'URL affichée en bas et connecter le bot au serveur.
Cela devrait faire fonctionner le robot.
mecab L'environnement d'exploitation se reflète dans ce référentiel public. Lorsque vous envoyez un message
Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Général,*,*,*,*,*
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Action substantif,Changer de connexion,*,*,*,*,mouvement,Dousa,Dosa
Substantif environnemental,Général,*,*,*,*,environnement,Kankyo,Kankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS
Je reçois une réponse comme celle-ci.
mecab -d / usr / share / mecab / dic / mecab-ipadic-neologd / Tout d'abord, préparons la chaîne de caractères cible. Si vous spécifiez un dictionnaire NEologd comme
,
Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Nomenclature propriétaire,Général,*,*,*,Dépôt,Dépôt,Dépôt
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Environnement d'exploitation substantif,Nomenclature propriétaire,Général,*,*,*,Environnement d'exploitation,Dousakankyo,Dosakankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS
Seul l '«environnement opérationnel» a changé, mais il semble que le dictionnaire NEologd soit utilisé correctement.
Avec cette implémentation, il reçoit tous les messages du serveur auquel le bot est connecté et vérifie si la chaîne mecab
existe (je pense, peut-être).
C'est du gaspillage car le traitement de la plupart des messages non pertinents coûte de l'argent.
Si vous implémentez la commande, vous ne pourrez recevoir le message que si la chaîne de préfixe et la chaîne de commande sont présentes (devrait, peut-être).
discord_command_bot.py
import os
import MeCab
import discord
from discord.ext import commands
TOKEN = os.environ["TOKEN"]
bot = commands.Bot(command_prefix='!', description='Output to results of morphological analysis.')
@bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('------')
@bot.command()
async def mecab(ctx, *args):
print("received message: " + str(args))
if bot.user != ctx.message.author:
l = list(args)
content = l.pop() #Traitez la fin comme une chaîne de caractères à analyser
print(content)
option = ' '.join(l)
mecab = MeCab.Tagger(option)
m = "```" + mecab.parse(content) + "```"
print(m)
#Envoyer un message au canal auquel le message a été envoyé
await ctx.send(m)
bot.run(TOKEN)
La différence avec la version sans commande est
client (discord.Client)
est maintenant bot (commands.Bot)
.mecab
.Réécrivez le Dockerfile pour l'exécuter dans la version de commande.
CMD ["python", "discord_commmand_bot.py"]
Déployez-vous sur heroku.
heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app
La commande ! Mecab
devrait maintenant être valide.
`! mecab L'environnement d'exploitation est reflété dans ce référentiel public. ''
Ici nomenclature,Synonyme,Général,*,*,*,Ici,Cliquez ici,Cliquez ici
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Nomenclature publique,Changer de connexion,*,*,*,*,Libération,Kokai,Kokai
Nomenclature du référentiel,Général,*,*,*,*,*
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Action substantif,Changer de connexion,*,*,*,*,mouvement,Dousa,Dosa
Substantif environnemental,Général,*,*,*,*,environnement,Kankyo,Kankyo
Auxiliaire,Assistant de cas,Général,*,*,*,À,Wo,Wo
Reflet substantif,Changer de connexion,*,*,*,*,Réfléchir,Hanei,Hanei
Verbe shi,Indépendance,*,*,Sahen / Suru,Type continu,Faire,Shi,Shi
Te assistant,Assistant de connexion,*,*,*,*,main,Te,Te
Oui verbe,Non indépendant,*,*,Cinq étapes, La ligne,Type continu,y a-t-il,Ali,Ali
Masu verbe auxiliaire,*,*,*,Spécial / masse,Forme basique,Masu,truite,truite
.. symbole,Phrase,*,*,*,*,。,。,。
EOS
`mecab L'environnement d'exploitation se reflète dans ce référentiel public. ''
Pas de réaction.
Succès.
Il fonctionne comme un robot pendant quelques minutes après le déploiement, mais se déconnecte rapidement. De plus, si vous déployez ou activez / désactivez le dynamomètre, il reviendra, mais je veux le maintenir en marche tout le temps.
https://teratail.com/questions/242975
Quand je l'ai recherché, il semble qu'il n'était pas bon de pousser le conteneur en tant que «web» au moment du déploiement.
heroku container:push web --app discord-bot-sample-app
heroku container:release web --app discord-bot-sample-app
Redéployez en tant que travailleur.
heroku container:push worker --app discord-bot-sample-app
heroku container:release worker --app discord-bot-sample-app
Cela ne s'est certainement pas arrêté.