3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Discord.py を使って、安っぽいLINEスタンプをつくるDiscordbotを作ったよ

Posted at

#1.はじめに
情報工学を大学で専攻していますが、全然プログラミングわからないので、他人のコードをコピペして作りました。
じゃあ何故この記事を投稿しようと思ったの?というと、Discord.pyでプログラミング初心者が遊ぶ際に、遊び方を提示したいなと思ったからです(参考になるの?)
#2.参照元URL一覧

これらを読めば作れると思いますが、これじゃ記事にした意味がないので詰まったポイント、要点などをまとめます。

#3.ポイントごとのTips
###discordまわりの処理?
Discord Bot 最速チュートリアル【Python&Heroku&GitHub】
まず、この記事に書いてあるをすべてやるとbotがとりあえず完成します。わーい
最速と銘打っているだけあり、簡単にわかりやすく丁寧に書いてあります。

この記事で詰まったポイントは、僕は普段、VSCodeで書いているので、VSCodeからGithubにGUIでpushしたかったんですが、SSLの設定にてんやわんやしました。SSL通信についてはよくわかっていないですが、この記事を参考にgithubに無事pushできるようになりました。
GitHubにssh接続できるようにする

botに/pingと打つと、pongと帰ってきたならば、コマンドの追加です。

discord_server.py
@bot.command()
async def urlimg(ctx, *args):
    message = args[1] 
    message = message.replace('_',' ')
    if len(args) == 2:
        fontcolor = '#FF5555'
    else:
        fontcolor = args[2]
    imgurl = args[0]
    file_name = './images/download.png'
    r = requests.get(imgurl)
    img = Image.open(io.BytesIO(r.content))
    img.save(file_name)
    img = makegotoitaly.img_add_msg(file_name, message,fontcolor)
    img.save("./images/result.png")
    await ctx.send(file=discord.File("./images/result.png"))

このコマンドは、

discordチャット
/urlimg http://~/hoge.png  こんにちは yellow

と打つと、
chibakun.png
こんなスタンプがつくれたり、
result (5).png
こんなスタンプがつくれたりします。


###ゆるい解説。
####messageの処理
 args[1]は2つ目の引数で、スタンプメッセージをここに書きます。英文が使えるよう、雑ではありますが_を空白に置き換える処理をすることで対応しています(これ対応できるならぜひ教えていただきたい…)
####argsの扱い
 pythonで引数を複数取るとき、*argsという書き方をするとargs[引数]の形で使えるようになります。このコードでは第3引数があるかないかで、なければデフォルトのフォントカラーを指定すると言う処理をしています。
####写真の処理について
 requestsでURLの画像を持ってきて、一旦保存しています。そしてPillowでそれを開き、makegotoitaly.img_add_msgという処理に渡しています。
 そして./images/result.pngにセーブ、await ctx send(file=(ファイル名))というコマンドでdiscord上に送信します。

###makegotoitalyって何?
 これは、PILで写真と文字をスタンプ化する自作モジュールです。

makegotoitaly.py
# coding: utf-8
from PIL import Image, ImageFont, ImageDraw
import numpy as np
import sys
import math

# 画像に文字を入れる関数
def img_add_msg(img, message, fontcolor = "#FF5555"):
    font_path = './fonts/Noto.otf'
    font_size = 30
    fontcustom = ImageFont.truetype(font_path, font_size, 0, encoding='utf-8') 
    img = Image.open(img).convert("RGBA")
    iw, ih = img.size
    iwm, ihm = img.size
    while(iw > 200 or ih > 200):
        iw *= 0.99
        ih *= 0.99
        iw = math.floor(iw)
        ih = math.floor(ih)
    if(iwm != 320 and ihm != 320):
        img = img.resize((iw,ih))
    bg = Image.new("RGBA", (320,320), (0,0,0,0))
    draw = ImageDraw.Draw(bg)
    w , h = draw.textsize(message, font=fontcustom)
    while(w > 320):
        font_size -= 1
        fontcustom = ImageFont.truetype(font_path, font_size, 0, encoding='utf-8')
        w , h = draw.textsize(message, font=fontcustom)
    x = (320 - w)/2
    y = 250
    centery = 0
    centerx = 0
    if (ihm != 320 and iwm != 320):
        centerx = math.floor((320 - iw) / 2)
        centery = math.floor((320 - ih) / 2) - 20
    bg.paste(img,(centerx,centery),img)

    draw.text((x, y), message, font=fontcustom, fill=fontcolor)
    return bg 

###読みづらすぎる

変数の名前とかぐちゃぐちゃです。コピペしたのに自分で書き直したりしたから…
キャンバスを作り、受け取った画像をリサイズして貼り付け、文字を載せてます。
文字も画像もはみ出さないようにサイズを調整してます。whileで回してるから大きい画像とかだと時間ちょっと掛かりそうです
320x320に画像サイズを合わせているのは、LINEスタンプのサイズにするためです。ゆくゆくはこのbotでスタンプを作りたい金を稼ごうと思っています。
gotoitalyの由来ですが、タイの方がおそらくGoogle翻訳の日本語訳を使っただろう意味不明なスタンプを量産されている方の名前を取っています。かなり中毒性があり、このシリーズのスタンプを3つほど所持しています。みんなも使おうgotoitaly。
go to italyさんのLINEスタンプの一例

#最後に

いかがでしたか?
記事を書く、というか普段Twitterでオタク構文で適当なTweetしかしていないので全然読めるものが作れませんでした。文章力工場のためにもQiitaやはてなぶろぐでもっとブログを書きます。
ごめんなさい…

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?