<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Python on My Life</title><link>https://dig06161.github.io/tags/python/</link><description>Recent content in Python on My Life</description><generator>Hugo -- 0.145.0</generator><language>ko-kr</language><lastBuildDate>Sun, 01 May 2022 17:30:00 +0900</lastBuildDate><atom:link href="https://dig06161.github.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>discord.py로 금지어 삭제봇 개발하기</title><link>https://dig06161.github.io/2022/05/01/discord.py-start/</link><pubDate>Sun, 01 May 2022 17:30:00 +0900</pubDate><guid>https://dig06161.github.io/2022/05/01/discord.py-start/</guid><description>&lt;p>요즘 게임과 각종 온라인 커뮤니케이션 수단으로 디스코드를 많이 사용하는 것 같다. 어떤 대회나 컨퍼런스 등등 문의사항이나 커뮤니케이션을 위한 디스코드 채널을 개설하는걸 많이 봤기 때문이다.&lt;/p>
&lt;p>필자 또한 친구들과 게임을 하거나 단톡방 느낌으로 디스코드 채널을 이용하고 있는데 채널 안에 여러 사람이 있을 시 발생하는 여러가지 문제점이 있다.&lt;/p>
&lt;p>이는 카카오톡을 이용할 떄에도 비슷하게 발생하는데, 각종 욕설이나 금지어 등등 이런 룰을 정해 숙지하는 편이다.&lt;/p>
&lt;p>필자가 속한 채널은 금지어를 작성하면 필자와 다른 관리자 인원이 해당 채팅을 지우는 방식을 사용하고 있는데 이는 관리자 들에게 많은 피로감을 가져왔고, 관리자가 자리를 비웠 때 발생하는 비매너 채팅에 대해서 반응할 수 없다는 단점이 있었다. 따라서 여기서 디스코드 봇을 만들기로 생각했다.&lt;/p></description><content:encoded><![CDATA[<p>요즘 게임과 각종 온라인 커뮤니케이션 수단으로 디스코드를 많이 사용하는 것 같다. 어떤 대회나 컨퍼런스 등등 문의사항이나 커뮤니케이션을 위한 디스코드 채널을 개설하는걸 많이 봤기 때문이다.</p>
<p>필자 또한 친구들과 게임을 하거나 단톡방 느낌으로 디스코드 채널을 이용하고 있는데 채널 안에 여러 사람이 있을 시 발생하는 여러가지 문제점이 있다.</p>
<p>이는 카카오톡을 이용할 떄에도 비슷하게 발생하는데, 각종 욕설이나 금지어 등등 이런 룰을 정해 숙지하는 편이다.</p>
<p>필자가 속한 채널은 금지어를 작성하면 필자와 다른 관리자 인원이 해당 채팅을 지우는 방식을 사용하고 있는데 이는 관리자 들에게 많은 피로감을 가져왔고, 관리자가 자리를 비웠 때 발생하는 비매너 채팅에 대해서 반응할 수 없다는 단점이 있었다. 따라서 여기서 디스코드 봇을 만들기로 생각했다.</p>
<p>봇이 사용자들의 메시지를 인식해 금지어가 포함되어 있으면 자동으로 삭제하는 루틴이다.</p>
<p>기본적으로 사용할 환경은 Python에 discord.py 라이브러리를 이용할 예정이고 서버는 집에 남는 orangepi를 이용하려고 한다. 서버같은 경우 데스크탑을 24시간 돌리기 부담스러워 이런 방법을 선택했으나 heroku를 이용해 서버 호스팅도 가능하다.</p>
<p>개발하는 사람이 편한 방법을 찾으면 될것 같다. 필자는 직접 서버를 구축해 사용하기 때문에 orangepi에 docker를 설치에 서버를 만들었다.</p>
<p>우선 여기서 사용할 라이브러리는 discord.py라는 라이브러리로, 파이썬 코루틴(비동기)기반으로 작동하는 라이브러리이다.</p>
<p>기본적으로 코드는 <a href="https://discordpy-ko.github.io/">https://discordpy-ko.github.io/</a> 의 가이드를 따라했다.</p>
<p><a href="https://discord.com/developers/applications">https://discord.com/developers/applications</a> 에서 봇을 생성하고 기본적인 봇에대한 정보를 설정해 준다.</p>
<center><img src="/img/discord.py_start/discord-create-bot.png" width="80%" height="80%"></center>
<p>우측 상단에 New Application을 누르면 위 사진처럼 뜬다. 봇 이름을 적고 create를 누른다.
그럼 다음과 같은 페이지가 나온다.</p>
<center><img src="/img/discord.py_start/discord-created-bot.png" width="80%" height="80%"></center>
<p>General Information에서 기본적인 정보를 수정하고 좌측에 있는 Bot을 클릭한다.</p>
<center><img src="/img/discord.py_start/addbot.png" width="80%" height="80%"></center>
<p>여기서 add bot 버튼을 누르면 이 엑션은 되돌릴수 없다는 경고문이 뜨는데 다음을 눌러 진행한다.</p>
<center><img src="/img/discord.py_start/createdBot-setting.png" width="80%" height="80%"></center>
<p>여기서 봇 사용을 위한 권한 설정을 해준다. 그런 다음 reset token을 누르면 해당 봇에 대한 엑세스 토큰이 발행된다. 이 토큰값이 유출되면 외부에서 부정 사용이 발생할 수 있으니 안전한 곳에 백업해 두길 바란다.</p>
<p>이제 죄측 메유늬 OAuth2 &gt; URL Generator로 들어간다. 여기서 자기가 만들고자 하는 봇에 필요한 권한을 설정해 봇을 추가하기 위한 URL을 생성할 수 있다.</p>
<center><img src="/img/discord.py_start/setting-bot-permissions.png" width="80%" height="80%"></center>
<p>필자는 메시지 제어를 위해 Text permissions의 모든 권한을 부여했다. 이후 Genrated URL 부분에 URL를 복사해 브라우저에 붙여넣기를 하면 본인이 봇을 추가할 수 있는 채널의 리스트가 보이며 추가가 완료된다.</p>
<p><br><br></p>
<p>이제 파이썬 사용을 위해서 다음 명령어를 통해 discord.py 라이브러리를 설치한다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">pip3 install discord.py
</span></span></code></pre></div><p>이후 import discord 구문을 통해 라이브러리를 불러온다.</p>
<p>다음 코드는 discord.py에서 올려준 빠른시작 코드이다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">discord</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;We have logged in as </span><span class="si">{0.user}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">client</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">author</span> <span class="o">==</span> <span class="n">client</span><span class="o">.</span><span class="n">user</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;$hello&#39;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">        <span class="k">await</span> <span class="n">message</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;Hello!&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">&#39;your token here&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 코드는 on_ready 구문을 통해 봇이 준비되면 &ldquo;We have logged in as bot#tag&quot;를 출력한다. 여기서 bot#tag는 봇의 이름이다.</p>
<p>필자가 작성한 코드는 다음과 같다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">discord</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">sqlite3</span><span class="o">,</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">commands</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">muyahoDB</span> <span class="k">as</span> <span class="nn">db</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">drawTableModule</span> <span class="k">as</span> <span class="nn">dt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">dirctory</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#logger setting</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;discord&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">FileHandler</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">&#39;discord.log&#39;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf-8&#39;</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;w&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">handler</span><span class="o">.</span><span class="n">setFormatter</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Formatter</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(asctime)s</span><span class="s1">:</span><span class="si">%(levelname)s</span><span class="s1">:</span><span class="si">%(name)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="n">logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#discord setting</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">bot</span> <span class="o">=</span> <span class="n">commands</span><span class="o">.</span><span class="n">Bot</span><span class="p">(</span><span class="n">command_prefix</span><span class="o">=</span><span class="s1">&#39;$&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#db connect</span>
</span></span><span class="line"><span class="cl"><span class="n">con</span> <span class="o">=</span> <span class="n">sqlite3</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="s1">&#39;muyaho.db&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">db</span><span class="o">.</span><span class="n">initDB</span><span class="p">(</span><span class="n">con</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_ready</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">	<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;We have logged in as </span><span class="si">{0.user}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">client</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">help</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showTextBL	=&gt;	텍스트 블랙리스트 출력</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLAllT		=&gt;	인수로 받은 단어를 모든사용자 대상의 블랙리스트로 지정</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLUserT	=&gt;	첫번째 인수로 대상 사용자이름, 두번째 인수로 지정할 </span><span class="se">\n\t\t\t\t\t\t\t\t\t</span><span class="s2"> 블랙리스트 단어를 적용</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showLog		=&gt;	삭제된 텍스트의 로그를 출력, 인수로 출력할 로그의 라인 수를 지정&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$showAtmBL	=&gt;	첨부파일 블랙리스트 출력</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLAllA		=&gt;	인수로 받은 첨부파일을 모든사용자 대상의 블랙리스트로 지정</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$addBLUserA	=&gt;	첫번째 인수로 대상 사용자이름, 두번째 인수로 지정할 </span><span class="se">\n\t\t\t\t\t\t\t\t\t</span><span class="s2"> 블랙리스트 첨부파일을 적용</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$rmTextBL	=&gt;	지정한 pk의 텍스트 BL를 삭제, 인수는 int</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="n">_return</span> <span class="o">+=</span> <span class="s2">&#34;$rmAtmBL	=&gt;	지정한 pk의 첨부파일 BL를 삭제, 인수는 int</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">_return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">commandCheck</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLAllT&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLAllT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLUserT&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLUserT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$rmTextBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">rmTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLAllA&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLAllA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$addBLUserA&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">addBLUserA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$rmAtmBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">rmAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="c1">#출력부분</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showTextBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showAtmBL&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$showLog&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="n">result</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">showLog</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span> <span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">else</span><span class="p">:</span> <span class="k">return</span> <span class="n">result</span>
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&#34;$help&#34;</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="n">help</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">100</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#@client.event</span>
</span></span><span class="line"><span class="cl"><span class="c1">#async def on_message(message):</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	if message.author == client.user:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		return</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1">#	if message.content.startswith(&#39;$hello&#39;):</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		await message.channel.send(&#39;Hello!&#39;)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#		print(&#34;Hello print! to &#34;+message.author.name)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@client.event</span>
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">on_message</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span> <span class="o">==</span> <span class="n">client</span><span class="o">.</span><span class="n">user</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">db</span><span class="o">.</span><span class="n">checkUser</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&#34;개발자 user ID&#34;</span><span class="p">):</span> <span class="c1">#개발자만 명령어 사용 가능</span>
</span></span><span class="line"><span class="cl">		<span class="n">commandReturn</span> <span class="o">=</span> <span class="n">commandCheck</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">if</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">pass</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">1</span><span class="p">):</span><span class="c1">#return 값 bool 확인</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;명령어에 오류가 발생했습니다&#39;</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">==</span> <span class="mi">0</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">&#39;적용 완료&#39;</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">==</span> <span class="s2">&#34;logData&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="n">txt</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="s2">&#34;delLog.txt&#34;</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="n">dirctory</span><span class="o">+</span><span class="s2">&#34;/delLog.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">txt</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">commandReturn</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s2">&#34;.txt&#34;</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span><span class="c1"># return 값 bool 아닌 명령어들</span>
</span></span><span class="line"><span class="cl">			<span class="n">txt</span> <span class="o">=</span> <span class="n">discord</span><span class="o">.</span><span class="n">File</span><span class="p">(</span><span class="n">commandReturn</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="n">dirctory</span><span class="o">+</span><span class="s2">&#34;/&#34;</span><span class="o">+</span><span class="n">commandReturn</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">txt</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">elif</span><span class="p">(</span><span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">commandReturn</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">):</span><span class="c1"># return 값 bool 아닌 명령어들</span>
</span></span><span class="line"><span class="cl">			<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">channel</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">commandReturn</span><span class="p">);</span><span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span> <span class="o">==</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">elif</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span> <span class="o">!=</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span><span class="p">)</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">attachments</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">db</span><span class="o">.</span><span class="n">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">				<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;delete =&gt;  &#34;</span><span class="o">+</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="n">db</span><span class="o">.</span><span class="n">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">i</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="s2">&#34;text&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="k">await</span> <span class="n">msg</span><span class="o">.</span><span class="n">delete</span><span class="p">();</span> <span class="k">return</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="s1">&#39;your token&#39;</span><span class="p">)</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">initDB</span><span class="p">(</span><span class="n">con</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;SELECT name FROM sqlite_master WHERE type=&#39;table&#39;;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span> <span class="o">==</span> <span class="p">[]):</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span><span class="p">(</span><span class="s2">&#34;DB 	=&gt;	empty DB! init start, create tables&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE user (pk integer not null primary key autoincrement, userName text not null, userId text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE textBL (pk integer not null primary key autoincrement, BL text not null, userId text not null, userName text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE atmBL (pk integer not null primary key autoincrement, BL text not null, userId text not null, userName text not null)&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE TABLE delLog (pk integer not null primary key autoincrement, userId text not null, userName text not null, BL text not null, target text not null, type text not null, delTime TIMESTAMP DEFAULT (DATETIME(&#39;now&#39;, &#39;localtime&#39;)))&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">logging</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">type</span> <span class="o">==</span> <span class="s2">&#34;text&#34;</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into delLog (userId, userName, BL, target, type) values (?, ?, ?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="s2">&#34;text&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into delLog (userId, userName, BL, target, type) values (?, ?, ?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">BL</span><span class="p">,</span> <span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="p">,</span> <span class="s2">&#34;atm&#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showLog</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$showLog &#34;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="nb">print</span><span class="p">(</span><span class="n">temp</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select pk, userName, BL, target, delTime from delLog order by pk desc limit (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,))</span>
</span></span><span class="line"><span class="cl">		<span class="n">_return</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">_tuple</span> <span class="ow">in</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">			<span class="n">_return</span><span class="o">+=</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">_tuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;delLog.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">_return</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="s2">&#34;logData&#34;</span><span class="c1">#&#34;delLog.txt&#34;</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">checkUser</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId from user&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">())</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">))</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into user (userName, userId) values (?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">name</span><span class="p">),</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">)))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> <span class="c1">#text blackList 보기</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select * from textBL&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnData</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">dbTuple</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">returnData</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">dbTuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;textBL.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">returnData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">(</span><span class="s2">&#34;textBL.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">showAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span> <span class="c1">#attachments blackList 보기</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select * from atmBL&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnData</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">dbTuple</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="n">returnData</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">dbTuple</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34;</span><span class="se">\n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&#34;atmBL.txt&#34;</span><span class="p">,</span> <span class="s2">&#34;w&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">returnData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">(</span><span class="s2">&#34;atmBL.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">selectTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">returnList</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from textBL where userId = &#39;all&#39;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from textBL where userId = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">returnList</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">selectAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">returnList</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from atmBL where userId = &#39;all&#39;&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select BL from atmBL where userId = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">author</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">dbTuples</span> <span class="o">=</span> <span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">dbTuples</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="n">returnList</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLAllT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLAllT &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into textBL (BL, userId, userName) values(?, &#39;all&#39;, &#39;all&#39;)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLUserT</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#text</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLUserT &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">argList</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">temp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">userName</span> <span class="o">=</span> <span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="k">del</span> <span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">		<span class="n">BL</span> <span class="o">=</span> <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="n">count</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">argList</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">			<span class="k">if</span><span class="p">(</span><span class="n">count</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">argList</span><span class="p">)):</span>
</span></span><span class="line"><span class="cl">				<span class="n">BL</span> <span class="o">=</span> <span class="n">BL</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="n">BL</span> <span class="o">=</span>  <span class="n">BL</span> <span class="o">+</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="s2">&#34; &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId, userName from user where userName = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">userName</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnText</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into textBL (BL, userId, userName) values(?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">BL</span><span class="p">,</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLAllA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLAllA &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into atmBL (BL, userId, userName) values(?, &#39;all&#39;, &#39;all&#39;)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">addBLUserA</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span><span class="c1">#attachments</span>
</span></span><span class="line"><span class="cl">	<span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$addBLUserA &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="n">argList</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">temp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;select userId, userName from user where userName = ?&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">argList</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">		<span class="n">returnText</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">cur</span><span class="o">.</span><span class="n">fetchall</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">		<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;insert into atmBL (BL, userId, userName) values(?, ?, ?)&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">argList</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">returnText</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span>
</span></span><span class="line"><span class="cl">		<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">	<span class="k">except</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">rmTextBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$rmTextBL &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;delete from textBL where pk = (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">rmAtmBL</span><span class="p">(</span><span class="n">con</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">	<span class="n">temp</span> <span class="o">=</span> <span class="n">arg</span><span class="o">.</span><span class="n">content</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s2">&#34;$rmAtmBL &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span> <span class="o">=</span> <span class="n">con</span><span class="o">.</span><span class="n">cursor</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="n">cur</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;delete from atmBL where pk = (cast(? as integer))&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="p">))</span>
</span></span><span class="line"><span class="cl">	<span class="n">con</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">	<span class="k">return</span> <span class="mi">0</span>
</span></span></code></pre></div><p>처음에는 텍스트 파일을 메시지 액션이 있을때 마다 BlackList로 읽어 문자열을 검색했지만 sqlite3로 대체하면서 db 쿼리문이 포함된 함수들을 따로 만들어 주었다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext</span> <span class="kn">import</span> <span class="n">commands</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">discord.ext.commands</span> <span class="kn">import</span> <span class="n">Bot</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">bot</span> <span class="o">=</span> <span class="n">commands</span><span class="o">.</span><span class="n">Bot</span><span class="p">(</span><span class="n">command_prefix</span><span class="o">=</span><span class="s1">&#39;$&#39;</span><span class="p">)</span>
</span></span></code></pre></div><p>위 구문을 이용해서 bot.command를 쓰면 명령어를 더 편하게 쓸 수 있지만 어떤 이유에서인지 on_message와 bot.command가 같이 동작하지 않아, on_message 안에서 commandCheck 함수를 통해 명령어 기능을 적용했다. 이렇게 되면 명령어를 추가 해야하는 시점에서 commandCheck와 다른 함수들일 직접 구현해야 하지만 실시간으로 올라오는 모든 메시지에 대해서 금지어 검사를 위해 위처럼 코드를 작성했다.</p>
<p>여러 서버에서 사용하려면 서버ID, 채널ID 등을 추가로 DB로 만들어 비교하는 코드를 짜주면 된다.</p>
<p>msg.attachments를 통해 첨부파일의 유무도 확인할 수 있는데, 등록한 문자열이 첨부파일 이름이나 링크에 추가되어 있으면 이 또한 메시지가 삭제된다. 주로 이미지를 삭제하기 위해 만든 기능인데, 이미지 이름을 바꾸면 쉽게 우회가 가능해서 다음에는 openCV를 통해 이미지 유사도 검사기능을 넣어 비교하는것을 테스트 할 생각이다. 다만 비교하는데 얼만큼의 리소스 사용, 걸리는 시간 등을 잘 판단해 어떤 방식이 더 득이 많을지 생각해 봐야할 문제이다.</p>
<p>전체사용자에 대한 금지어 설정도 가능하지만 사용자들이 채팅을 입력하면 db에 사용자 이름과 고유 USER ID를 저장하며 비교하므로 <code>$addBLUserT 유저이름 금지어</code> 를 통해 지정도 가능하다. 물론 첨부파일도 마찬가지이다.</p>
<p>삭제로그 출력의 경우 일부 로그는 상관 없지만 2000글자가 넘어가는 대용량 로그의 경우 디스코드에서 막아둔것 같다. 이 때문에 로그를 txt 파일로 만들어 첨부파일 형태로 보내는 방식을 이용했다. PC에서는 파일 미리보기를 통해 쉽게 확인이 가능하지만, 스마트폰에서는 파일을 직접 다운받아 열어봐야하는 단점이 있다.</p>
<p>블랙리스트 출력 또한 위 txt 파일 업로드 방식을 사용했다.</p>
<p>봇 커멘드의 경우 $help를 치면 출력이 되도록 설정했다.</p>
]]></content:encoded></item><item><title>Python Http POST요청 자동화 코드</title><link>https://dig06161.github.io/2022/01/25/python-automated-http-post/</link><pubDate>Tue, 25 Jan 2022 20:13:00 +0900</pubDate><guid>https://dig06161.github.io/2022/01/25/python-automated-http-post/</guid><description>&lt;p>ISMS-P(정보보호 및 개인정보보호관리체계)인증을 충족하기 위해 웹 모의 해킹을 진행했던 경험이 있습니다. 이 ISMS-P 검사 항목중에 자동화 공격에 대한 진단 항목이 있습니다. 이 항목을 진단할때 python코드를 작성해 반복문으로 POST요청을 다량으로 발생시켜 공격을 시도 했습니다.&lt;/p>
&lt;p>이에 관련된 코드를 올려봅니다.&lt;/p>
&lt;p>단순히 while문으로 반복적인 요청을 보내는 코드입니다.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">urllib.parse&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">urllib.request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">while&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">a&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#웹 POST요청에 대한 파라미터들을 json형식으로 정의해 줍니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">details&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">parse&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlencode&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;mm&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;voc&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;sm&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;ins&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;pg&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;regCd&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;regName&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Title&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;취약점 점검중&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;WriterName&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;yunjoker&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Tel1&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Tel2&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Tel3&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;EmailId&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;123&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;EmailDomain&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;naver.com&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;agree1&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;Content&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="s1">&amp;#39;ㅁㄴㅇㄹ&amp;#39;&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#인코딩 유형을 설정합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">details&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">details&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">encode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;UTF-8&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#요청 URL을 추가합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Request&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;https://***/common/process/process.inquiry.php&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">details&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Burp Suite 등의 프로그램이나 기능을 이용해 쿠키값들을 그대로 헤더에 추가해 줍니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;POST&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;/common/process/process.inquiry.php HTTP/1.1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Host&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;***&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Connection&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;close&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Content-Length&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;360&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;application/json, text/javascript, */*; q=0.01&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;X-Requested-With&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;XMLHttpRequest&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;User-Agent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Sec-Fetch-Mode&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;cors&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Content-Type&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;application/x-www-form-urlencoded&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Sec-Fetch-Site&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;same-origin&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Referer&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;***&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept-Encoding&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;gzip, deflate&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Accept-Language&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">url&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">add_header&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Cookie&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;_ga=GA1.2.1167119943.1572314702; _gid=GA1.2.304601219.1572314702; PHPSESSID=n07lta0bu412bcsk0q9jejvoh7; _gat_gtag_UA_74704901_2=1&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#POST요청 후 리스폰스 데이터를 ResponseData 변수에 저장합니다.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ResponseData&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">urllib&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">urlopen&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">decode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#리스폰스 데이터를 출력합니다&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ResponseData&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr></description><content:encoded><![CDATA[<p>ISMS-P(정보보호 및 개인정보보호관리체계)인증을 충족하기 위해 웹 모의 해킹을 진행했던 경험이 있습니다. 이 ISMS-P 검사 항목중에 자동화 공격에 대한 진단 항목이 있습니다. 이 항목을 진단할때 python코드를 작성해 반복문으로 POST요청을 다량으로 발생시켜 공격을 시도 했습니다.</p>
<p>이에 관련된 코드를 올려봅니다.</p>
<p>단순히 while문으로 반복적인 요청을 보내는 코드입니다.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">urllib.parse</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">urllib.request</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span><span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#웹 POST요청에 대한 파라미터들을 json형식으로 정의해 줍니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">details</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">parse</span><span class="o">.</span><span class="n">urlencode</span><span class="p">({</span><span class="s1">&#39;mm&#39;</span><span class="p">:</span><span class="s1">&#39;voc&#39;</span><span class="p">,</span> <span class="s1">&#39;sm&#39;</span><span class="p">:</span><span class="s1">&#39;ins&#39;</span><span class="p">,</span> <span class="s1">&#39;pg&#39;</span><span class="p">:</span><span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;regCd&#39;</span><span class="p">:</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="s1">&#39;regName&#39;</span><span class="p">:</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;Title&#39;</span><span class="p">:</span><span class="s1">&#39;취약점 점검중&#39;</span><span class="p">,</span> <span class="s1">&#39;WriterName&#39;</span><span class="p">:</span><span class="s1">&#39;yunjoker&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;Tel1&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;Tel2&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;Tel3&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span> <span class="s1">&#39;EmailId&#39;</span><span class="p">:</span><span class="s1">&#39;123&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                     <span class="s1">&#39;EmailDomain&#39;</span><span class="p">:</span><span class="s1">&#39;naver.com&#39;</span><span class="p">,</span> <span class="s1">&#39;agree1&#39;</span><span class="p">:</span><span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="s1">&#39;Content&#39;</span><span class="p">:</span><span class="s1">&#39;ㅁㄴㅇㄹ&#39;</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="c1">#인코딩 유형을 설정합니다</span>
</span></span><span class="line"><span class="cl">    <span class="n">details</span> <span class="o">=</span> <span class="n">details</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-8&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">#요청 URL을 추가합니다</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="s2">&#34;https://***/common/process/process.inquiry.php&#34;</span><span class="p">,</span> <span class="n">details</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#Burp Suite 등의 프로그램이나 기능을 이용해 쿠키값들을 그대로 헤더에 추가해 줍니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;POST&#34;</span><span class="p">,</span> <span class="s2">&#34;/common/process/process.inquiry.php HTTP/1.1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Host&#34;</span><span class="p">,</span> <span class="s2">&#34;***&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Connection&#34;</span><span class="p">,</span> <span class="s2">&#34;close&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Content-Length&#34;</span><span class="p">,</span> <span class="s2">&#34;360&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept&#34;</span><span class="p">,</span> <span class="s2">&#34;application/json, text/javascript, */*; q=0.01&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;X-Requested-With&#34;</span><span class="p">,</span> <span class="s2">&#34;XMLHttpRequest&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;User-Agent&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                   <span class="s2">&#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Sec-Fetch-Mode&#34;</span><span class="p">,</span> <span class="s2">&#34;cors&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Content-Type&#34;</span><span class="p">,</span> <span class="s2">&#34;application/x-www-form-urlencoded&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Sec-Fetch-Site&#34;</span><span class="p">,</span> <span class="s2">&#34;same-origin&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Referer&#34;</span><span class="p">,</span> <span class="s2">&#34;***&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept-Encoding&#34;</span><span class="p">,</span> <span class="s2">&#34;gzip, deflate&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Accept-Language&#34;</span><span class="p">,</span> <span class="s2">&#34;ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span><span class="o">.</span><span class="n">add_header</span><span class="p">(</span><span class="s2">&#34;Cookie&#34;</span><span class="p">,</span> <span class="s2">&#34;_ga=GA1.2.1167119943.1572314702; _gid=GA1.2.304601219.1572314702; PHPSESSID=n07lta0bu412bcsk0q9jejvoh7; _gat_gtag_UA_74704901_2=1&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#POST요청 후 리스폰스 데이터를 ResponseData 변수에 저장합니다.</span>
</span></span><span class="line"><span class="cl">    <span class="n">ResponseData</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">url</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="c1">#리스폰스 데이터를 출력합니다</span>
</span></span><span class="line"><span class="cl">    <span class="nb">print</span><span class="p">(</span><span class="n">ResponseData</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="n">a</span> <span class="o">=</span> <span class="n">a</span><span class="o">+</span><span class="mi">1</span>
</span></span></code></pre></div><hr>]]></content:encoded></item></channel></rss>