LoginSignup
3
4

More than 5 years have passed since last update.

LineBotをGo言語で作ってみた

Last updated at Posted at 2017-11-30

機能↓

1512019429423.jpg

ソースコード↓※初心者が書いたのでとても汚いです(汚くて見る気失せたらごめんね)

bot.go
package main

import (
    "log"
    "net/http"
    "fmt"
    "math/rand"
    "strconv"
    "strings"
    "time"
    "github.com/leekchan/timeutil"
    "github.com/line/line-bot-sdk-go/linebot"
)


func random(min,mac int) int {
    rand.Seed(time.Now().Unix())
    return rand.Intn(mac - min) + min
}

func main(){
    cl,err := linebot.New(
        "シークレット",
        "トークン",
        )
    if err != nil{
        log.Fatal(err)
    }
    http.HandleFunc("/callback",func(w http.ResponseWriter, req *http.Request) {
        res ,err := cl.ParseRequest(req)
        if err != nil{
            log.Fatal(err)
        }
        for _, re := range res{
            if re.Type == linebot.EventTypeJoin{
                cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("こんにちは!\n「help」と発言していただければコマンド一覧を出します!")).Do()
            }
            if re.Type == linebot.EventTypeFollow{
                n := time.Now()
                NowT := timeutil.Strftime(&n,"%Y年%m月%d日%H時%M分%S秒")
                p,_ := cl.GetProfile(re.Source.UserID).Do()
                cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("よろしくお願いします!\n"+p.DisplayName+"さん\n\n"+NowT)).Do()
                log.Println("DisplayName:"+p.DisplayName)
            }
            if re.Type == linebot.EventTypeMessage{
                switch msg := re.Message.(type){
                case *linebot.TextMessage:
                    if msg.Text == "test"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("success")).Do()
                    }else if msg.Text == "groupid"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage(string(re.Source.GroupID))).Do()
                    }else if msg.Text == "byebye"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewStickerMessage("3","187")).Do()
                        _,err := cl.LeaveGroup(re.Source.GroupID).Do()
                        if err != nil{
                            cl.LeaveRoom(re.Source.RoomID).Do()
                        }
                    }else if msg.Text == "help"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("helpです\n・[image:画像のurl]=画像のurlから画像を送信します\n・[speed]=返答速度の測定をします\n・[groupid]=GroupIDを送信します\n・[roomid]=RoomIDを送信します\n・[byebye]=グループから退会します\n・[author]=作者のtwitterを送信します\n・[me]=送信者の情報を送信します\n・[test]=動いてるか確認します\n・[now]=現在の時刻を送信します\n・[mid]=送信者のmidを送信します\n・[Sticker]=ランダムでスタンプを送信します\n\nその他機能\n位置情報を送ると同じのを返します\nスタンプを送るとidを返します\n追加時にメッセージを送ります")).Do()
                    }else if msg.Text == "check"{
                        fmt.Println(msg)
                    }else if msg.Text == "now"{
                        n := time.Now()
                        NowT := timeutil.Strftime(&n,"%Y年%m月%d日%H時%M分%S秒")
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage(NowT)).Do()
                    }else if msg.Text == "mid"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage(re.Source.UserID)).Do()
                    }else if msg.Text == "roomid"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage(re.Source.RoomID)).Do()
                    }else if msg.Text == "ひで"{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("ひでしね")).Do()
                    }else if msg.Text == "えろいさん"{
                        _,err := cl.ReplyMessage(re.ReplyToken,linebot.NewImageMessage("https://pbs.twimg.com/media/DP3CXalVwAArqm8.jpg:large","https://pbs.twimg.com/media/DP3CXalVwAArqm8.jpg:large")).Do()
                        if err != nil{
                            log.Fatal(err)
                        }
                    }else if msg.Text == "Sticker"{
                        stid := random(180,259)
                        stidx := strconv.Itoa(stid)
                        _,err := cl.ReplyMessage(re.ReplyToken,linebot.NewStickerMessage("3",stidx)).Do()
                        if err != nil{
                            log.Fatal(err)
                        }
                    }else if msg.Text == "me"{
                        mid := re.Source.UserID
                        p,err := cl.GetProfile(mid).Do()
                        if err != nil{
                            cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("追加して同意してください"))
                        }

                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("mid:"+mid+"\nname:"+p.DisplayName+"\nstatusMessage:"+p.StatusMessage)).Do()
                    }else if msg.Text == "speed"{
                        replytoken := re.ReplyToken
                        start := time.Now()
                        cl.ReplyMessage(replytoken,linebot.NewTextMessage("..")).Do()
                        end := time.Now()
                        result := fmt.Sprintf("%f [sec]",(end.Sub(start)).Seconds())
                        _,err := cl.PushMessage(re.Source.GroupID,linebot.NewTextMessage(result)).Do()
                        if err != nil{
                            _,err := cl.PushMessage(re.Source.RoomID,linebot.NewTextMessage(result)).Do()
                            if err != nil{
                                _,err := cl.PushMessage(re.Source.UserID,linebot.NewTextMessage(result)).Do()
                                if err != nil{
                                    log.Fatal(err)
                                }
                            }
                        }
                    }else if res := strings.Contains(msg.Text,"Hello");res == true{
                        cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("Hello!"),linebot.NewTextMessage("my name is bot")).Do()
                    }else if res := strings.Contains(msg.Text,"image:");res == true{
                        image_url := strings.Replace(msg.Text,"image:","",-1)
                        cl.ReplyMessage(re.ReplyToken,linebot.NewImageMessage(image_url,image_url)).Do()
                    }else if msg.Text == "author"{
                        _,err := cl.ReplyMessage(re.ReplyToken,linebot.NewTemplateMessage(
                            "twitter",
                            linebot.NewButtonsTemplate(
                                "https://cdn.downdetector.com/static/uploads/c/300/661ed/twitter-logo_10.png",
                                "作者twitter",
                                "フォローしてね!",
                                linebot.NewURITemplateAction("follow","https://twitter.com/intent/follow?screen_name=HomoRiron"),
                                ),
                            )).Do()
                        if err != nil{
                            log.Println(err)
                        }
                    }
                case *linebot.StickerMessage:
                    cl.ReplyMessage(re.ReplyToken,linebot.NewTextMessage("StickerId:"+msg.StickerID+"\nPackageId:"+msg.PackageID)).Do()
                case *linebot.LocationMessage:
                    cl.ReplyMessage(re.ReplyToken,linebot.NewLocationMessage(
                        msg.Title,
                        msg.Address,
                        msg.Latitude,
                        msg.Longitude)).Do()
                }
            }
        }
        })
    if err := http.ListenAndServe(":443", nil); err != nil {
        log.Fatal(err)
    }
}

動かし方↓
npm install -g ngrok
ngrok http 443

上記で取得したurl(https)に:443/callbackと付け加えてWebhook URLにセットする

3
4
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
4