본문 바로가기

프로그래밍/Java 자바

디스코드 봇으로 간편하게 프로필 사진 가져오기!

디스코드를 하면서 다른 사람의 프로필 사진이 잘 안보이거나 프로필 사진이 예뻐서 다운받고 싶었던 적이 있으실 거 같은데요. 프로필 사진을 개발자 콘솔로 찾을 수도 있지만 이 방법은 좀 귀찮은 것 같아 봇으로 만들어 간편하게 프로필 사진을 가져오는 방법을 알려드릴려고 해요


저는 자바로 만들었고 JDA API 를 사용했어요


봇을 생성하고 초대하는 방법은

https://homosapi.tistory.com/9

에서 설명해놓았어요!




1. 이클립스에 Gradle 설치



먼저 Help - Eclipse Marketplace 에서 



맨위에 코끼리 모양 Buildship Gradle Integration 3.0을 설치하고 재시작해줘요






2. Gradle 프로젝트 생성



File - New - Other 에서



Gradle - Gradle Project 선택하고 Next



프로젝트 이름은 아무렇게나 하고 Finish 해줘요 저는 DiscordProfile 로 했어요



3. Gradle 설정


API는 총 2개가 필요한데요

하나는 JDA로 디스코드에 봇을 넣기 위해 필요한 것이고 하나는 okhttp API 예요

okhttp가 필요한 이유는 별거 없는데요

JDA가 업데이트를 하면서 okhttp API를 따로 적용시켜줘야 오류없이 실행이 되더군요




방금 만든 프로젝트를 열어보면 폴더랑 파일이 많이 있는데요

build.gradle를 열어보면 저렇게 나와요



그리고 dependencies 블록 안에다가 


compile 'com.squareup.okhttp3:okhttp:3.5.0'

compile 'net.dv8tion:JDA:4.1.0_95'


이 두줄을 써줘요

각각 okhttp와 JDA를 불러온다는 소리예요


4. 코드 작성

이제 코드를 작성하면 되는데요


파일은 어디다가 만드냐면




src/main/java에다가 패키지랑 클래스를 하나 아무렇게나 만들어줘요



이렇게요



이제 코드를 짜면 되는데요 제가 짠 코드를 보여드릴게요



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import javax.security.auth.login.LoginException;
 
import net.dv8tion.jda.api.AccountType;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
 
public class ProfileBot extends ListenerAdapter {
    public static void main(String[] args) throws LoginException, InterruptedException{
        JDABuilder jda = new JDABuilder(AccountType.BOT);
        jda.setToken("이곳은 봇의 토큰을 넣는 곳이에요");
        jda.addEventListeners(new ProfileBot());
        jda.build();
        
    }
    
    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        try {
        Message msg = event.getMessage();
        MessageChannel mc = event.getChannel();
        String str = msg.getContentRaw();
        String order = str.substring(07);
        JDA jda = event.getJDA();
        
        if(order.equals("!GetAva")) {
            
            String tag = str.substring(8);
            User usr = jda.getUserByTag(tag);
            
            mc.sendMessage(usr.getAvatarUrl()).queue();
            System.out.println("성공");
        }
        }catch(Exception e) {}
    }
}
cs


저는 코드를 이렇게 짜 봤어요


결론적으로는 !GetAva를 쓰고 그 뒤에 유저의 디스코드 태그를 쓰면

프로필 사진 링크를 알려줘요



하나하나 설명해드릴게요


1
2
3
4
5
6
7
8
public class ProfileBot extends ListenerAdapter {
    public static void main(String[] args) throws LoginException, InterruptedException{
        JDABuilder jda = new JDABuilder(AccountType.BOT);
        jda.setToken("토큰을 쓰는곳!");
        jda.addEventListeners(new ProfileBot());
        jda.build();
    }
}
cs


먼저 이벤트를 처리하기 위해 ListenerAdapter를 상속해줘요



1
JDABuilder jda = new JDABuilder(AccountType.BOT);
cs


위 코드는 BOT을 생성한다는 거예요


1
2
3
jda.setToken("토큰!");
jda.addEventListeners(new ProfileBot());
jda.build();
cs


위 코드는

setToken 토큰을 지정해주는거예요 자신의 봇의 토큰을 넣어주시면 돼요!

addEventListeners는 이벤트 리스너를 지정해주는거예요 저는 main 함수가 있는 클래스에 바로 만들었기 때문에 클래스명을 넣으면 돼요

build는 말그대로 봇을 빌드하는 거예요




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Override
    public void onMessageReceived(MessageReceivedEvent event) {
        try {
        Message msg = event.getMessage();
        MessageChannel mc = event.getChannel();
        String str = msg.getContentRaw();
        String order = str.substring(07);
        JDA jda = event.getJDA();
        
        if(order.equals("!GetAva")) {
            
            String tag = str.substring(8);
            User usr = jda.getUserByTag(tag);
            
            mc.sendMessage(usr.getAvatarUrl()).queue();
            System.out.println("성공");
        }
        }catch(Exception e) {}
}
cs


이벤트 리스너 부분이예요


onMessageReceived(MessageReceivedEvent event)

이 메소드는 어떤 누군가의 메세지를 받으면 일어나는 메소드예요


자세히 설명하자면

내가 메세지를 보내거나 누군가가 메세지를 보내면

봇은 이 메세지가 온 것을 이벤트로 받아들여요

온 메세지는 event 변수명에 담아요

그럼 이제 봇은 이 메세지(즉, event) 로 무언가의 행동을 해요



Message msg = event.getMessage();

메세지(event)의 문자적인 정보를 얻어와(getMessage) msg 변수에 담아요



MessageChannel mc = event.getChannel();

메세지(event)의 채널의 정보를 얻어와(getChannel) mc 변수에 담아요


여기서 채널의 정보를 얻는 이유는

봇이 메세지를 보내려는데

봇은 메세지를 어디에 보낼 지 몰라요

그래서 메세지를 받은 곳(event)의 채널에 메세지를 보내기 위해 

받은 메세지(event)의 채널을 얻어오는 거예요



String str = msg.getContentRaw();


msg를 String 타입으로 변환시켜주는 것이 getContentRaw예요

여기서 처음부터 String 타입으로 변환시키면 되지 왜 getMessage를 하고 String타입으로 바꾸지?

라는 생각이 들 수도 있는데


MessageReceivedEvent 타입에는 바로 String타입으로 변환시키는 메소드가 없어요 그래서 먼저 getMessageMessage 타입을 얻어와 거기서 String 타입으로 바꾸는 메소드를 사용하는 거예요


String order = str.substring(0, 7);

order는 str에서 0번째 부터 6번째까지의 문자열을 담게 했어요


JDA jda = event.getJDA();

JDA 클래스는 디스코드 API의 기본적인 메소드가 있는 곳들이예요

필요한 메소드가 이 안에 있기 때문에 jda 변수에 JDA 클래스를 넣었어요



1
2
3
4
5
6
7
8
if(order.equals("!GetAva")) {
            
            String tag = str.substring(8);
            User usr = jda.getUserByTag(tag);
            
            mc.sendMessage(usr.getAvatarUrl()).queue();
            System.out.println("성공");
}
cs


order가 !GetAva 와 같다면

즉 받아온 메세지의 0번째 부터 6번째까지의 문자가 !GetAva라면


저는 !GetAva를 명령어 시작으로 했어요

다른 분들은 자신만의 명령어를 만들어보세요



String tag = str.substring(8);

tag에다가는 8번째 부터 끝까지의 문자를 담게했어요

8번째부터는 디스코드 태그가 있을테니까요


User usr = jda.getUserBytag(tag);

jda에 있는 getUserBytag는 매개변수에 있는 디스코드 태그(문자열)의 맞는 유저를 반환시켜요

홍길동#1234 를 매개변수로 넣었으면 usr 변수에는 홍길동#1234

유저의 정보들을 usr 변수에서 사용할 수 있어요


mc.sendMessage(usr.getAvatarUrl()).queue();

메세지를 받은 채널(mc)에 메세지를 보내요(sendMessage, queue)

유저의 아바타 링크(usr.getAvatarUrl)를



아 그리고 onMessageReceived 메소드를 보면 try - catch 로 예외처리를 해줬는데 메세지를 받았는데 !GetAva가 아니면 오류가 나서 표면상으로는

괜찮아보이지만

콘솔창에는 계속 오류가 났다고 떠요 그래서 try - catch 로 잡아준거예요


이제 남은거는


5. 실행



프로젝트 파일을 우클릭 해서 Gradle - Refresh Gradle Project로 라이브러리 적용을 해줘요


그리고 Run 실행을 하면..!



잘 되네요!!


이제 디스코드에서도 사용해보죠


!GetAva를 쓰고 뒤에 제 디스코드 태그를

쓰니 봇이 프로필 주소를 알려주네요!

성공했어요!




이번에는 봇으로 프로필 사진 가져오기를 해보았는데요

개발자 콘솔로 찾는 거보다는 봇으로 하는 편이 더 간편하네요!



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import javax.security.auth.login.LoginException;
 
import net.dv8tion.jda.api.AccountType;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageChannel;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
 
public class DisPro extends ListenerAdapter {
    public static void main(String[] args) throws LoginException, InterruptedException{
        JDABuilder jda = new JDABuilder(AccountType.BOT);
        jda.setToken("봇의 토큰을 쓰는 곳이에요!");
        jda.addEventListeners(new DisPro());
        jda.build();
        
    }
    
    @Override
    public void onMessageReceived(MessageReceivedEvent event) {
        try {
        Message msg = event.getMessage();
        MessageChannel mc = event.getChannel();
        String str = msg.getContentRaw();
        String order = str.substring(07);
        JDA jda = event.getJDA();
        
        if(order.equals("!GetAva")) {
            
            String tag = str.substring(8);
            User usr = jda.getUserByTag(tag);
            
            mc.sendMessage(usr.getAvatarUrl()).queue();
            System.out.println("성공");
        }
        }catch(Exception e) {}
    }
}
cs


코딩이 어려우신 분들은 코드를 복사해서 쓰셔도 돼요!