매크로

조회 수 3492 추천 2 댓글 16

만드느라 힘들었네요 ㅎㅎ

Gui는 센스가 없어서 아직 못 꾸미고 천천히 만들려고 합니다.

구현 못한게 많은데..

loop문이 아닌 hook을 이용해서 카톡서브윈도우 깜박거릴때 인식되게하는거랑,

메시지보낼때 비활성에선 되는데 최소화에서 postmessage로 엔터 입력안되는부분..은 숙제입니다.

사용방법은 소통할 채팅방의 제목을 스크립트 전역변수 선언부분에 수동으로 입력해줍니다 관리할 갯수만큼.

카톡자동반응() 함수안에서 자동반응할 내용들을 입력하면 됩니다.

카톡메시지전송(), 카톡파일전송(), 카톡사진전송() 함수로 만드실 수 있습니다.

심심하지마시라고 스마트폰에서 원격으로 !음악켜 하면 컴퓨터 스피커로 음악 들을 수 있게 음악틀기()함수도 넣었으니 응용해보세요 ㅎ

모든카톡채팅은 채팅버퍼에 저장됬다가 1줄씩 뱉어냅니다.

그리고 약간의 도배방지 처리되있어서 한명이 연속으로 같은 문장 입력하면 읽씹합니다. ㅋ

부족하지만 소스 오픈합니다. 함수들 필요하신거 맘대로 가져가시고,

이 스크립트를 성능 개선하실 분은 더욱 유용한 프로그램 만드셨으면 좋겠습니다.



#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.

#Warn  ; Recommended for catching common errors.

SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.

SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

#WinActivateForce ; 오토핫키에 특정윈도우활성화권한을 줌


; 글로벌 변수 선언


채팅방수:=10 ; 생성할 총 채팅방수를 입력합니다.

자동반응속도:=500 ; 자동반응속도 밀리초단위입니다.

제외할이름=하이요,오핫초보 ; 응답하지 않을 닉네임들을 입력합니다. 본인이름 작성, 또는 상대방. 여러명 추가시 콤마로 구분합니다.

loop,% 채팅방수

소통할채팅방%a_index%:=""

소통할채팅방1=오토핫키 개발자 모임 ; 소통할카톡방 타이틀, 방갯수에 따라 넘버링

소통할채팅방2=오토핫키 개발자들의 모임

소통할채팅방3=정


loop,% 채팅방수

채팅버퍼%a_index%:="" ; 채팅버퍼, 카톡방수 만큼 자동 넘버링



return


/* 카톡자동응답에 매크로를 작성합니다.

*/

카톡자동응답(방이름,이름,시간,내용,메시지종류)

{

global 제외할이름

if ( 메시지종류="채팅" )

{

트레이출력(방이름,메시지종류,이름,시간,내용)

if 이름 contains %제외할이름%

return false

else if 내용 contains 안녕,ㅎㅇ,하이

카톡메시지전송(방이름,이름 "님 안녕하세요~")

else if 내용 contains 계신,계시

카톡메시지전송(방이름,이름 "님 필요하신거라도..? ㅎ")

else if 내용 contains hello,hi

카톡메시지전송(방이름,"hi " 이름 "~")

else if 내용 contains !실검

{

실검=네이버실시간검색순위

카톡메시지전송(방이름,실검)

}

else if 내용 contains !현재상황

카톡사진전송(방이름)

else if 내용 contains !사진파일

카톡파일전송(방이름,"test1")

else if 내용 contains !노래켜,!노래틀,!음악켜,!음악틀

노래틀기("on")

else if 내용 contains !노래꺼,!노래멈,!음악켜,!음악멈

노래틀기("off")

}

else if ( 메시지종류="시스템" )

{

if ( 내용 = "입장" )

카톡메시지전송(방이름,이름 "님 어서오세요(방긋)")

if ( 내용 = "퇴장" )

카톡메시지전송(방이름,이름 "님 안녕히가세요(눈물)")

}

return true

}


시작() ; 카톡방 여러개를 동시에 관리하려면 여기서 추가해줍니다. 채팅버퍼2, 소통할채팅방2.... 위에서 전역변수 설정 필요합니다.

{

global 채팅버퍼1, 소통할채팅방1,자동반응속도

반환된이름:="", 반환된시간:="", 반환된내용:="", 반환된메시지종류:=""

Clipboard:= ; 클립보드 내용을 지웁니다.


loop

{

loop,10

{

if not ( 소통할채팅방%a_Index%="" )

if 새로운카톡문자가져오기(채팅버퍼%a_index%,소통할채팅방%a_index%,반환된이름,반환된시간,반환된내용,반환된메시지종류)

카톡자동응답(소통할채팅방%a_index%,반환된이름,반환된시간,반환된내용,반환된메시지종류)

}

자동반응속도:= (자동반응속도<100) ? 100 : 자동반응속도 ; 자동반응속도 100이하는 100으로 자동조정 됩니다.

sleep,% 자동반응속도

}

return

}


카톡메시지전송(방이름,문장) ;카톡으로 메시지 보내기

{

IfWinExist, %방이름%

{

SendMessage, 0xC, 0, &문장, RichEdit20W1, %방이름% ; 문장을 콘트롤에 set 합니다.

sleep,1

PostMessage, 0x100, 0xd, 0x1c0001,RichEdit20W1, %방이름% ; Enter키를 입력합니다.

}

}


카톡사진전송(방이름) ; 클립보드에 있는 이미지를 보냅니다

{

send,{PrintScreen}

ControlSend,EVA_VH_ListControl_Dblclk1,{Ctrl down}v{Ctrl up},%방이름%

WinWait,ahk_class #32770,,1

WinGetClass,팝업확인,%방이름%

PostMessage, 0x100, 0xd, 0x1c0001, , ahk_class %팝업확인%

}


; 확장자명을 생략하면 PNG입니다. 복수개 파일보낼때는 가름자로 `n을 사용합니다. ex)카톡파일전송("test1.bmp`ntest2") -> test1.bmp와 test2.png를 동시에!

카톡파일전송(방이름,fname)

{

PostMessage, 0x233, HDrop(fname), 0,, % 방이름

WinWait,ahk_class EVA_Window_Dblclk,,1

PostMessage, 0x100, 0xd, 0x1c0001,, ahk_class EVA_Window_Dblclk

}


HDrop(fnames,x=0,y=0) 

{

characterSize := A_IsUnicode ? 2 : 1

fns:=RegExReplace(fnames,"\n$")

fns:=RegExReplace(fns,"^\n")


/*

함수 첫번째 파라메터에 파일명 리스트를 라인피드로 구분해서 작성하면 여러 파일도 한번에 전달이 됩니다.

라인피드는 오토핫키에서 `n 입니다.

fnames=%A_ScriptDir%\Green.png`n%A_ScriptDir%\BALLOON2.png

이런식으로요

너무 길어질거 같으면 변수입력시에는 파일명만 입력하고

경로는 함수내에서 입력할 수 있도록 처리해주면 되죠

위 함수의 fns:=RegExReplace(fns,"^\n") 바로 아랫라인에 아래 코드를 삽입해 보세요

절대경로인 경우는 그대로 사용

상대경로인 경우는 스크립트 경로를 앞에 추가

확장자가 없으면 .png 추가 하는 스크립트입니다. by Hangoon 님

*/

   Loop,Parse,fns,`n,`r

   {

      SplitPath, A_LoopField,OutFileName, OutDir, OutExtension, OutNameNoExt, OutDrive

      tmp := (!OutDrive ? A_ScriptDir "\" : "" ) A_LoopField (!OutExtension ? ".png" : "")

      fns := (A_Index=1) ? tmp : fns "`n" tmp

   }

   

   hDrop:=DllCall("GlobalAlloc","UInt",0x42,"UInt",20+(StrLen(fns)*characterSize)+characterSize*2)

   p:=DllCall("GlobalLock","UInt",hDrop)

   NumPut(20, p+0)  ;offset

   NumPut(x,  p+4)  ;pt.x

   NumPut(y,  p+8)  ;pt.y

   NumPut(0,  p+12) ;fNC

   NumPut(A_IsUnicode ? 1 : 0,  p+16) ;fWide


   p2:=p+20

   Loop,Parse,fns,`n,`r

   {

      DllCall("RtlMoveMemory","UInt",p2,"Str",A_LoopField,"UInt",StrLen(A_LoopField)*characterSize)

      p2+=StrLen(A_LoopField)*characterSize + characterSize

   }

   DllCall("GlobalUnlock","UInt",hDrop)

   Return hDrop

}


트레이출력(방이름,메시지종류,이름,시간,내용)

{

TrayTip,%방이름%,% 메시지종류 ", " 이름 ", " 시간 ", " 내용

return

}


노래틀기(스위치)

{

if ( 스위치="on" )

{

Random, track, 1, 6

soundset,100

soundplay,%A_WorkingDir%\sound\bosstime%track%.wma

}

else if ( 스위치="off" )

SoundPlay, Nonexistent.avi

return

}


; 채팅버퍼에 새로운 채팅 기록, 없으면 채팅마지막줄 기록, 수정된 채팅버퍼값 유지를 위해 byref로 되돌립니다.

채팅버퍼에새로운문장기록(ByRef 채팅버퍼,방이름)

{

카톡채팅2클립보드(방이름) ; 카톡방의 채팅을 클립보드로 가져옵니다.

if not 채팅버퍼="" ; 도배에 대한 예외처리. 채팅버퍼에 내용이 있을때

{

도배채팅갯수:=0

while InStr(Clipboard,채팅버퍼,false,1,A_Index) ; 같은문장이 있으면 1이상의 포지션을 반환하는걸로 if문 판별

도배채팅갯수++

loop,% 도배채팅갯수-1 ; 도배된문장중 마지막 하나만 빼고 ""으로 다바꿉니다

StringReplace, Clipboard, Clipboard, %채팅버퍼%

}

if not Clipboard=""

채팅버퍼:= 채팅버퍼="" ? SubStr(Clipboard,InStr(Clipboard,"`n",false,0,2)+1) : SubStr(Clipboard,InStr(Clipboard,채팅버퍼))

/*

채팅버퍼가 빈값이면, 클립보드에서 `n문장을 뒤부터 찾아 두번째 `n의시작위치를 반환하고, 시작위치에+1을 더해 `n을제거한후 문장 끝까지를 다시 채팅버퍼에 기록합니다. 즉 마지막채팅기록이 들어가게됩니다.

채팅버퍼에 기존내용(마지막채팅기록)이 있으면, 클립보드에서 채팅버퍼의 문장을 찾아 시작위치를 반환하고, 시작위치 부터 끝까지를 다시 채팅버퍼에 기록합니다.

*/

Clipboard:= ; 클립보드 내용을 지웁니다.

return

}


카톡채팅2클립보드(방이름)

{

ControlSend,EVA_VH_ListControl_Dblclk1,{Ctrl down}a{Ctrl up},%방이름% ; 비활성 ctrl+a

sleep,1

ControlSend,EVA_VH_ListControl_Dblclk1,{Ctrl down}c{Ctrl up},%방이름% ; 비활성 ctrl+c

;PostMessage, 0x301,0,0,ahk_id 0x70872,%방이름% ; 비활성 ctrl+c

;PostMessage, 0x100,3,0,EVA_VH_ListControl_Dblclk1,%방이름% ; 비활성 ctrl+c

;ControlClick,EVA_VH_ListControl_Dblclk1,%방이름% ; 비활성 카톡방 에디트콘트롤 클릭, 선택된화면을 없에기 위함.

return

}



; 버퍼에서 1줄씩 로딩해서 세부내용을 함수밖으로 반환합니다.

새로운카톡문자가져오기(ByRef 채팅버퍼,방이름,ByRef 반환될이름,ByRef 반환될시간,ByRef 반환될내용,ByRef 반환될메시지종류)

{

채팅버퍼에새로운문장기록(채팅버퍼,방이름) ; 새로운 채팅이 있으면 버퍼에 추가합니다.

sPos:=InStr(채팅버퍼,"`n")+1 ; 채팅버퍼에서 두번째문장(새로운첫채팅) 시작위치, ""이거나 새로운문장이 있을 수 있습니다.

if not SubStr(채팅버퍼,sPos,1)="" ; 새로운 문장이 있으면

{

채팅버퍼:=SubStr(채팅버퍼,sPos) ; 채팅버퍼에서 최상위1줄을 제외(삭제)하고 다시 저장합니다.


if InStr(채팅버퍼,"[")=1 ; instr()함수는 변수 채팅버퍼%a_index%의 문자열에서 [ 문자의 위치값을 리턴합니다.

{

반환될메시지종류:="채팅"

StringGetPos,ep, 채팅버퍼,]

StringGetPos,ep2, 채팅버퍼,],L2

StringGetPos,ep3, 채팅버퍼,`r

StringMid,반환될이름, 채팅버퍼, 2, % ep-1

StringMid,반환될시간, 채팅버퍼, % ep+4, % ep2-ep-3

StringMid,반환될내용, 채팅버퍼, % ep2+3, % ep3-ep2-2

; [아무개] [오후 2:23] 사진 <--- 누군가 사진을 보냈을때 형식

}

else ; 카톡 시스템 메시지입니다.

{

반환될메시지종류:="시스템"

if Position:=InStr(채팅버퍼,"나갔습니다.")

{

반환될내용:="퇴장"

StringLeft, 반환될이름, 채팅버퍼, Position-1

}

else if Position:=InStr(채팅버퍼,"님이 들어왔습니다.")

{

반환된내용:="입장"

StringLeft, 반환될이름, 채팅버퍼, Position-1

}

}

return true ; 새로운문장이 있음을 반환합니다.

}

else

return false ; 새로운문장이 없음을 반환합니다.

}


F1::Pause

Insert::시작()


Delete::

GuiClose:


exitapp



  • sama 2018.10.25 01:04
    네이버 파싱해서 !실시간검색어 !환율 자동응답 만들려구했는데 네이버 웹문서 가져오는 방법이 막혔네요..
    그리고 이거 시작은 스크립트 구동하고 insert키 눌러야됩니다. 소통할 카톡창은 켜져있어야 작동합니다.
  • 이아이온 2018.10.25 15:04

    감사합니다 피씨카톡 어떻게 해야 할지 몰라 다른걸 찾아봐야하나 했었는데 sama님 덕분에 쉽게 해결되었네요


  • sama 2018.10.26 10:32
    추천감사합니다^^
  • 빵글빵글 2018.10.26 11:49

    감사합니다!

    업무 자동화에

    한번 적용하고 응용해보겠습니다.


  • 빵글빵글 2018.10.26 14:06

    #include 해서

    카톡사진전송() 함수만 빼서 쓰면 작동 안하나요..?


    F2::

    카톡사진전송(대화방이름)


    하면 함수 호출 오류나네요 ~


    제가 무엇을 잘못하고 있는걸까여

  • sama 2018.10.26 16:51
    #Include 카톡자동반응.ahk
    F2::카톡사진전송("방이름")
    또는

    #Include 카톡자동반응.ahk
    F2::
    카톡사진전송("방이름")
    return

    함수인자값은 문자형이라 직접입력할때는 "쌍따옴표안에 방이름을 넣어야합니다. 변수명은 "쌍따옴표 없이 씁니다.

  • sama 2018.10.26 16:56

    피드백주시면 감사하겠습니다~

  • sama 2018.10.26 17:05

    업무에 쓰실거면 카톡파일전송() 함수가 더 유용할거에요. 저장된 이미지 파일 동시에 여러개 보낼 수 있거든요.

    카톡사진전송()은 클립보드에 저장된 이미지를 보내는데, 함수안에서 전체화면스샷을 클립보드로 저장하게 되있거든요.

    클라이언트나, 특정영역을 드래그해서 선택하고 보낼려면,

    단순하게 send,{PrintScreen} 라인대신, 클라이언트2클립보드()나 드래그2클립보드() 함수를 만들어서 클립보드값을 다르게 해줘야합니다.

  • 빵글빵글 2018.10.26 23:50
    쌍따옴표 해본거 같은데!!!
    음 퇴근하고 집인지라
    집엔 오핫을 안해놨네요.
    주말 보내고 출근해서 다시 해보겠습니다.

    즐거운 연휴 보내십셔!
  • sama 2018.10.27 00:09
    감사합니다^^ 양지신사님도 즐거운주말되세요
  • 푸리푸은 2018.11.10 23:36

    안녕하세요 요즘 오핫에 빠져있는데

    혹시 채팅방에 글들을 분석해서 !확인 으로했을때

    입장을치고 퇴장을 안친 사람을 찾거나 할수도있나요?

  • sama 2018.11.11 05:18
    네 가능합니다.
    제가 만든 스크립트는 매번 전체채팅을 불러오고
    채팅창 마지막채팅이후 채팅이 쌓여있으면 순차적으로 1줄씩 뱉어내서 그 채팅에 반응하게 되있는데.
    !확인 <--- 채팅에 반응할 문장. 일때 최근입장() 함수를 실행하게해서
    함수 최근입장() 에 입장을한사람 목록을 만든후 퇴장한사람을 목록에서 제거한후
    퇴장한사람을 출력하게 하면됩니다.
    Gui형태로 만들고 버튼으로 그 기능을 넣어도 좋을거 같네요.
  • 푸리푸은 2018.11.13 11:37
    오 감사합니다 한번 검색과 머리싸매며 도전해봐야겟군요
  • 마기아스 2018.11.22 08:42

    안녕하세요. 카카오토로 게임 매크로 제작중인데. 비활성 카톡메세지 보내기 공부하다 이글을 보게 됬습니다.

    PostMessage 를 쓰면 클립보드에 있는 메세지는 보내기가 쉬운데, 클립보드에 있는 이미지 전송부분에서

    막혀서 이글을 참조하는 중인데 


    WinWait,ahk_class #32770,,1

    WinGetClass,팝업확인,%방이름%

    PostMessage, 0x100, 0xd, 0x1c0001, , ahk_class %팝업확인%


    이구문 설명좀 부탁드려도 될까요?

  • sama 2018.11.24 04:45
    클립보드 이미지를 피씨카톡에 전송하면 확인 누르는 팝업창이 나오는데. 이걸 winwait로 해당창을 기다립니다. 포슷메세지에 사용하기 위해 wingetclass로 클래스네임을 얻어 왔습니다.
  • aqswde94 2018.11.26 07:08
    고생하셔서 만드셧네요 ㅋㅋ 재밋는 자료인 것 같습니다.

List of Articles
분류 제목 글쓴이 최근변경 추천
질문 핫린이 한수 여쭙습니다 ^^ 3 ddd123 2023.02.24 2/0
질문 안녕하세요 ! 돌키우기 유대횽 2023.02.24 0/0
질문 오토핫키 이미지서치 여러장 서치하는방법좀 봐주세요 ... 4 매크로찾아삼 2023.02.24 1/0
자유 오토핫키 제작의뢰 냠냐미잉 2023.02.24 0/0
질문 Pause 명령어가 안먹어요 토오키 2023.02.24 0/0
질문 포스트메시지로 클릭되는 표시는뜨는데 작동안됨 1 건낚 2023.02.24 0/0
질문 오토핫키 이미지 서치 문의 1 닉길동무 2023.02.24 0/0
자유 언패킹 . 디컴파일 . 부탁드려요 사례 O 게임X 시방초 2023.02.24 0/0
질문 오토핫키 텔레그램이나 오픈톡 방 있나요? 1 타조농장 2023.02.24 0/0
질문 오토핫키 관련 질문좀 드리겠습니다.(고수분들) 2 베오토핫 2023.02.24 0/0
질문 오토핫키는 퍼플 작동 방법이 없을까요? 우후훅 2022.02.09 0/0
질문 간단한 매크로 만들때 어떤 프로그램으로 공부하는게 ... 에임1 2021.11.19 0/0
질문 오토핫키 튕김 1 초보오토핫 2023.02.24 1/0
질문 이미지맥스와 오토핫키 비활성클릭 질문 2 츠카다카즈오 2023.02.24 1/0
자유 오토핫키에 대한 고찰 2 fefe12 2023.02.24 1/0
자유 오핫 연구같이하실분 2 fefe12 2023.02.24 0/0
질문 오핫 커뮤니티 활성화된곳있나여? 1 푸파재대결 2023.02.24 0/0
질문 혹시 이미지인식이 옛날 온라인게임도 가능할까요? 노가다게임 2023.02.24 0/0
질문 바람의나라 불홍 심투핵 구합니다. 오뎅윙기 2023.02.24 0/-1
질문 오토핫키 질문 드립니다!! 1 반수현 2023.02.24 0/0
Board Pagination Prev 1 ... 67891011121314 ... 208 Next
/ 208

전체 최신 인기글

전체 주간 인기글