如何防止机器人发送垃圾邮件? | Twitch.py​​ |不和谐.py

问题描述

我是 Python 新手,正在制作 discord 机器人。所以在这里我有 twitch 通知功能,但是当有人是 live bot 时才开始发送垃圾邮件,我想是因为 idk 如何从嵌入中获取 content。请帮我。代码

import os
import json
import discord
import requests
from discord.ext import tasks,commands
from discord.utils import get

intents = discord.Intents.all()
bot = commands.Bot(command_prefix='$',intents=intents)

TOKEN = os.getenv('token')

# Authentication with Twitch API.
client_id = os.getenv('client_id')
client_secret = os.getenv('Dweller_token')
body = {
    'client_id': client_id,'client_secret': client_secret,"grant_type": 'client_credentials'
}
r = requests.post('https://id.twitch.tv/oauth2/token',body)
keys = r.json()
headers = {
    'Client-ID': client_id,'Authorization': 'Bearer ' + keys['access_token']
}

'''user_info = twitch.get_users(logins=['turb4ik'])
user_id = user_info['data'][0]['id']
print(user_info)'''

# Returns true if online,false if not.
def checkuser(streamer_name):
    stream = requests.get('https://api.twitch.tv/helix/streams?user_login=' + streamer_name,headers=headers)
    stream_data = stream.json()

    if len(stream_data['data']) == 1:
        return True,stream_data
    else:
        return False,stream_data


# Executes when bot is started
@bot.event
async def on_ready():
    # Defines a loop that will run every 10 seconds (checks for live users every 10 seconds).
    @tasks.loop(seconds=10)
    async def live_notifs_loop():
        # username = stream_data['data'][0]['user_name']
        # stream_title = stream_data['data'][0]['title']
        # game_being_played = stream_data['data'][0]['game_name']

        # Opens and reads the json file
        with open('streamers.json','r') as file:
            streamers = json.loads(file.read())
        # Makes sure the json isn't empty before continuing.
        if streamers is not None:
            # Gets the guild,'twitch streams' channel,and streaming role.
            guild = bot.get_guild(690995360411156531)
            channel = bot.get_channel(798127930295058442)
            role = get(guild.roles,id=835581408272580649)
            # Loops through the json and gets the key,value which in this case is the user_id and twitch_name of
            # every item in the json.
            for user_id,twitch_name in streamers.items():
                print("checking" + " " + str(twitch_name))
                # Takes the given twitch_name and checks it using the checkuser function to see if they're live.
                # Returns either true or false.
                status,stream_data = checkuser(twitch_name)
                # Gets the user using the collected user_id in the json
                user = bot.get_user(int(user_id))
                # Makes sure they're live
                if status is True:
                    # Checks to see if the live message has already been sent.
                    async for message in channel.history(limit=200):
                        print("yes")
                        twitch_embed = discord.Embed(
                                title=f":red_circle: **LIVE**\n{user.name} is Now streaming on Twitch! \n \n {stream_data['data'][0]['title']}",color=0xac1efb,url=f'\nhttps://www.twitch.tv/{twitch_name}'
                            )
                        twitch_embed.add_field(
                              name = '**Game**',value = stream_data['data'][0]['game_name'],inline = True
                            )
                        twitch_embed.add_field(
                              name = '**Viewers**',value = stream_data['data'][0]['viewer_count'],inline = True
                            )
                        twitch_embed.set_author(
                                name = str(twitch_name),icon_url = stream_data['data'][0]['thumbnail_url']
                                                            )
                        twitch_embed.set_image(url = f'https://www.twitch.tv/{twitch_name}')
                        print("yes2")
                        try:
                            embed_title = twitch_embed.title
                            embed_description = twitch_embed.description
                        except Exception as e:
                            break
                        print("yes3")

                        # If it has,break the loop (do nothing).
                        if embed_title == True:
                            break
                        # If it hasn't,assign them the streaming role and send the message.
                        else:
                            # Gets all the members in your guild.
                            async for member in guild.fetch_members(limit=None):
                                # If one of the id's of the members in your guild matches the one from the json and
                                # they're live,give them the streaming role.
                                if member.id == int(user_id):
                                    await member.add_roles(role)
                            # Sends the live notification to the 'twitch streams' channel then breaks the loop.
                            await channel.send(
                                content = f"hey @everyone! {user.name} is Now streaming on Twitch! Go check it out: https://www.twitch.tv/{twitch_name}",embed=twitch_embed)
                            print(f"{user} started streaming. Sending a notification.")
                            break
                # If they aren't live do this:
                else:
                    # Gets all the members in your guild.
                    async for member in guild.fetch_members(limit=None):
                        # If one of the id's of the members in your guild matches the one from the json and they're not
                        # live,remove the streaming role.
                        if member.id == int(user_id):
                            await member.remove_roles(role)
                    # Checks to see if the live notification was sent.
                    async for message in channel.history(limit=200):
                        try:
                            embed_title = message.embeds[0].title
                            embed_description = message.embeds[0].description
                        except Exception as e:
                            break
                        # If it was,delete it.
                        if user.mention in embed_title and "is Now playing" in embed_title:
                            print(f"{user} stopped streaming. Removing the notification.")
                            await message.delete()
    # Start your loop.
    live_notifs_loop.start()


# Command to add Twitch usernames to the json.
@bot.command(name='addtwitch',help='Adds your Twitch to the live notifs.',pass_context=True)
async def add_twitch(ctx,twitch_name):
    # Opens and reads the json file.
    with open('streamers.json','r') as file:
        streamers = json.loads(file.read())

    # Gets the users id that called the command.
    user_id = ctx.author.id
    # Assigns their given twitch_name to their discord id and adds it to the streamers.json.
    streamers[user_id] = twitch_name

    # Adds the changes we made to the json file.
    with open('streamers.json','w') as file:
        file.write(json.dumps(streamers))
    # Tells the user it worked.
    await ctx.send(f"Added {twitch_name} for {ctx.author} to the notifications list.")


print('Server Running')
bot.run(TOKEN) 

解决方法

只是为了其他人的情况,他向我展示了不和谐的错误,所以我通过这个问题回答他!

伙计,我发现了错误。

代码中的第 106 行是:

await message.channel.send(msg)

现在这个 msg 变量发送所有细节,但我们只想要它的内容而不是其他任何东西。

因此将其更改为:

await message.channel.send(msg.content)

谢谢! :D