디스코드를 하면서 다른 사람의 프로필 사진이 잘 안보이거나 프로필 사진이 예뻐서 다운받고 싶었던 적이 있으실 거 같은데요. 프로필 사진을 개발자 콘솔로 찾을 수도 있지만 이 방법은 좀 귀찮은 것 같아 봇으로 만들어 간편하게 프로필 사진을 가져오는 방법을 알려드릴려고 해요
저는 자바로 만들었고 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(0, 7); 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(0, 7); 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타입으로 변환시키는 메소드가 없어요 그래서 먼저 getMessage로 Message 타입을 얻어와 거기서 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(0, 7); 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 |
코딩이 어려우신 분들은 코드를 복사해서 쓰셔도 돼요!
'프로그래밍 > Java 자바' 카테고리의 다른 글
안드로이드 스튜디오 | 뷰 겹치는 현상 (0) | 2020.02.11 |
---|---|
자바 Zulu Open JDK 설치 & 설정 (0) | 2020.01.12 |