Как запустить Python Discord бота на cPanel (o2switch) - PullRequest
0 голосов
/ 15 января 2020

Я начал размещать своего бота Discord на cPanel (o2switch), но я не знаю, как запустить бота. Я должен определить точку входа для своего приложения, но я не знаю, как это должно быть. Я пытался установить его как функцию, которая просто возвращает "Launched!", но это не работает.

# imports

def application():
    return "Launched!"

# bot code

Кто-нибудь знает, какой код я должен добавить для запуска своего бота?


РЕДАКТИРОВАТЬ: Добавлена ​​вещь "бегун". Бот все еще не запускается, но у меня есть этот журнал:

App 16078 output: /opt/passenger-5.3.7-5.el7.cloudlinux/src/helper-scripts/wsgi-loader.py:26: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
App 16078 output:   import sys, os, re, imp, threading, signal, traceback, socket, select, struct, logging, errno
App 16078 output: [ pid=16078, time=2020-01-15 16:18:24,002 ]: PyNaCl is not installed, voice will NOT be supported
App 16078 output: [ pid=16078, time=2020-01-15 16:18:24,033 ]: WSGI application raised an exception!
App 16078 output: Traceback (most recent call last):
App 16078 output:   File "/opt/passenger-5.3.7-5.el7.cloudlinux/src/helper-scripts/wsgi-loader.py", line 199, in main_loop
App 16078 output:     socket_hijacked = self.process_request(env, input_stream, client)
App 16078 output:   File "/opt/passenger-5.3.7-5.el7.cloudlinux/src/helper-scripts/wsgi-loader.py", line 333, in process_request
App 16078 output:     result = self.app(env, start_response)
App 16078 output:   File "/home/bist1484/virtualenv/bot/3.7/lib/python3.7/site-packages/discord/client.py", line 598, in run
App 16078 output:     return future.result()
App 16078 output:   File "/home/bist1484/virtualenv/bot/3.7/lib/python3.7/site-packages/discord/client.py", line 579, in runner
App 16078 output:     await self.start(*args, **kwargs)
App 16078 output:   File "/home/bist1484/virtualenv/bot/3.7/lib/python3.7/site-packages/discord/client.py", line 542, in start
App 16078 output:     await self.login(*args, bot=bot)
App 16078 output: TypeError: login() takes 2 positional arguments but 4 positional arguments (and 1 keyword-only argument) were given

Ответы [ 3 ]

1 голос
/ 15 января 2020

cPanel предназначен для веб-хостинга, а не для таких приложений, как боты Discord.
Точка входа в приложение предназначена для каркасов веб-приложений, поддерживающих WSGI . Это не относится к ботам Discord.

1 голос
/ 16 января 2020

Я сам размещаю своего бота на cPanel. Я помогу вам с хостингом вашего бота. Убедитесь, что ваш бот находится в домашнем каталоге с разрешениями 755 .

Вам понадобится стартовый скрипт и скрипт остановки. Создайте новый файл в cgi-bin вашего public_ html, и вы сможете запустить бота по адресу yourmaindomain.com/cgi-bin/startbot.py, учитывая, что вы называете стартовый скрипт startbot.py. Поместите следующий код в сценарий запуска:

#!/usr/bin/python3.6

import os, subprocess, signal

print("Content-Type: text/html\n\n")

counter = 0
p = subprocess.Popen(['ps', '-u', 'username'], stdout=subprocess.PIPE)
# must match your username --------^^^^^^^^

out, err = p.communicate()
for line in out.splitlines():
  if 'heliobot.py'.encode('utf-8') in line:
#     ^^^^^^^^^^^----- this has to match the filename of your bot script

    counter += 1
    print("Bot already running.")

if counter == 0:
  subprocess.Popen("/home/username/heliobot.py")
#                         ^^^^^^^^-- be sure to update it to your username

  print("Bot started!")

Для сценария остановки вы можете создать файл stopbot.py в том же бункере cgi, где вы сможете остановить бота на своем домене. com / cgi-bin / stopbot.py, поместите следующий код в скрипт:

!/usr/bin/python3.6

import os, subprocess, signal

print("Content-Type: text/html\n\n")

counter = 0
p = subprocess.Popen(['ps', '-u', 'username'], stdout=subprocess.PIPE)
# must match your username --------^^^^^^^^

out, err = p.communicate()
for line in out.splitlines():
  if 'heliobot.py'.encode('utf-8') in line:
#     ^^^^^^^--- this has to match the filename of your loop

    counter += 1
    pid = int(line.split(None, 1)[0])
    print("Stopping bot.")
    os.kill(pid, signal.SIGTERM)

if counter == 0:
  print("Already stopped.")

Замените первую строку, это шебанг, на путь Python вашего хостинг-провайдера. Убедитесь, что используемые модули установлены, иначе попросите хост установить его для вас. Кроме того, убедитесь, что разрешения всех этих файлов 755, в противном случае вы получите внутренние ошибки сервера.

Не забудьте заменить те параметры, которые я выделил в сценариях. Именно так я размещаю своего бота на бесплатном хостинге cPanel с тех пор, как начал разработку. У меня никогда не было денег, чтобы получить VPS, так что это был лучший и, казалось бы, единственный вариант для меня. (Я не предпочитаю Heroku и другие хосты приложений по разным причинам). Надеюсь, что это поможет и решит вашу проблему! Если вам нужна помощь с чем-то еще, просто прокомментируйте это, и я постараюсь помочь вам. :)

С уважением,
Саян Бхаттачарья.

0 голосов
/ 15 января 2020

Вам нужно позвонить Client.run. В частности, похоже, что вам нужно подготовить частичную функцию, которую вы можете передать этому другому приложению:

from functools import partial
from discord import Client

client = Client()

@client.event
async def on_message(message):
    print(message.content)

runner = partial(client.run, "your token")  # runner() then starts the bot
...